blob: 6c13bb9bd9391c6b8c180f33afdf5f789f16a7f1 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000054#define ILLEGAL_DYNAMIC_SCOPE \
55"%.100s: exec or 'import *' makes names ambiguous in nested scope"
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000056
Jeremy Hylton29906ee2001-02-27 04:23:34 +000057#define GLOBAL_AFTER_ASSIGN \
58"name '%.400s' is assigned to before global declaration"
59
60#define GLOBAL_AFTER_USE \
61"name '%.400s' is used prior to global declaration"
62
63#define LOCAL_GLOBAL \
64"name '%.400s' is a function paramter and declared global"
65
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000066#define LATE_FUTURE \
67"from __future__ imports must occur at the beginning of the file"
68
Jeremy Hylton897b8212001-03-23 14:08:38 +000069#define ASSIGN_DEBUG \
70"can not assign to __debug__"
71
Jeremy Hyltone36f7782001-01-19 03:21:30 +000072#define MANGLE_LEN 256
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000075
76static struct memberlist code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
78 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000079 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000080 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000081 {"co_code", T_OBJECT, OFF(co_code), READONLY},
82 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
83 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000084 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000085 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
86 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000087 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000088 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000089 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
90 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000091 {NULL} /* Sentinel */
92};
93
Guido van Rossum79f25d91997-04-29 20:08:16 +000094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_getattr(PyCodeObject *co, char *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 return PyMember_Get((char *)co, code_memberlist, name);
Guido van Rossum3f5da241990-12-20 15:06:42 +000098}
Guido van Rossum10dc2e81990-11-18 17:27:39 +000099
100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000101code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000102{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_code);
104 Py_XDECREF(co->co_consts);
105 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000106 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000107 Py_XDECREF(co->co_freevars);
108 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109 Py_XDECREF(co->co_filename);
110 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000111 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000112 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000116code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000117{
118 char buf[500];
119 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000120 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000121 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000122
Guido van Rossuma396a882000-04-07 01:21:36 +0000123 if (co->co_firstlineno != 0)
124 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000126 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000128 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000129 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
130 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000131 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000132}
133
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000134static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000136{
137 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000138 cmp = PyObject_Compare(co->co_name, cp->co_name);
139 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000140 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000141 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000142 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000143 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000144 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000146 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000147 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000149 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000151 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000153 if (cmp) return cmp;
154 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
155 if (cmp) return cmp;
156 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157 return cmp;
158}
159
160static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000163 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000164 h0 = PyObject_Hash(co->co_name);
165 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000166 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000167 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000169 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000171 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000174 h5 = PyObject_Hash(co->co_freevars);
175 if (h5 == -1) return -1;
176 h6 = PyObject_Hash(co->co_cellvars);
177 if (h6 == -1) return -1;
178 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000179 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000180 if (h == -1) h = -2;
181 return h;
182}
183
Jeremy Hylton78891072001-03-01 06:09:34 +0000184/* XXX code objects need to participate in GC? */
185
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186PyTypeObject PyCode_Type = {
187 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000188 0,
189 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000191 0,
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000192 (destructor)code_dealloc, /*tp_dealloc*/
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000193 0, /*tp_print*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000194 (getattrfunc)code_getattr, /*tp_getattr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000195 0, /*tp_setattr*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000196 (cmpfunc)code_compare, /*tp_compare*/
197 (reprfunc)code_repr, /*tp_repr*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000198 0, /*tp_as_number*/
199 0, /*tp_as_sequence*/
200 0, /*tp_as_mapping*/
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000201 (hashfunc)code_hash, /*tp_hash*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000202};
203
Guido van Rossum644a12b1997-04-09 19:24:53 +0000204#define NAME_CHARS \
205 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
206
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000207/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
208
209static int
210all_name_chars(unsigned char *s)
211{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000212 static char ok_name_char[256];
213 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000214
Guido van Rossumcd90c202001-02-09 15:06:42 +0000215 if (ok_name_char[*name_chars] == 0) {
216 unsigned char *p;
217 for (p = name_chars; *p; p++)
218 ok_name_char[*p] = 1;
219 }
220 while (*s) {
221 if (ok_name_char[*s++] == 0)
222 return 0;
223 }
224 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225}
226
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000227static int
228intern_strings(PyObject *tuple)
229{
230 int i;
231
232 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
233 PyObject *v = PyTuple_GET_ITEM(tuple, i);
234 if (v == NULL || !PyString_Check(v)) {
235 Py_FatalError("non-string found in code slot");
236 PyErr_BadInternalCall();
237 return -1;
238 }
239 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
240 }
241 return 0;
242}
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000245PyCode_New(int argcount, int nlocals, int stacksize, int flags,
246 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000247 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
248 PyObject *filename, PyObject *name, int firstlineno,
249 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000250{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000252 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000253 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000254 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000255 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000256 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 consts == NULL || !PyTuple_Check(consts) ||
258 names == NULL || !PyTuple_Check(names) ||
259 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000260 freevars == NULL || !PyTuple_Check(freevars) ||
261 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 name == NULL || !PyString_Check(name) ||
263 filename == NULL || !PyString_Check(filename) ||
264 lnotab == NULL || !PyString_Check(lnotab)) {
265 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000266 return NULL;
267 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000268 pb = code->ob_type->tp_as_buffer;
269 if (pb == NULL ||
270 pb->bf_getreadbuffer == NULL ||
271 pb->bf_getsegcount == NULL ||
272 (*pb->bf_getsegcount)(code, NULL) != 1)
273 {
274 PyErr_BadInternalCall();
275 return NULL;
276 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 intern_strings(names);
278 intern_strings(varnames);
279 if (freevars == NULL)
280 freevars = PyTuple_New(0);
281 intern_strings(freevars);
282 if (cellvars == NULL)
283 cellvars = PyTuple_New(0);
284 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000285 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 for (i = PyTuple_Size(consts); --i >= 0; ) {
287 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000289 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 continue;
292 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000295 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000296 co->co_argcount = argcount;
297 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000298 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000301 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000307 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 Py_INCREF(freevars);
309 co->co_freevars = freevars;
310 Py_INCREF(cellvars);
311 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000313 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000315 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000316 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000318 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000319 }
320 return co;
321}
322
323
324/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000325
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000326/* The compiler uses two passes to generate bytecodes. The first pass
327 builds the symbol table. The second pass generates the bytecode.
328
329 The first pass uses a single symtable struct. The second pass uses
330 a compiling struct for each code block. The compiling structs
331 share a reference to the symtable.
332
333 The two passes communicate via symtable_load_symbols() and via
334 is_local() and is_global(). The former initializes several slots
335 in the compiling struct: c_varnames, c_locals, c_nlocals,
336 c_argcount, c_globals, and c_flags.
337*/
338
Tim Peters2a7f3842001-06-09 09:26:21 +0000339/* All about c_lnotab.
340
341c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
342mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
343to source code line #s (when needed for tracebacks) via c_lnotab instead.
344The array is conceptually a list of
345 (bytecode offset increment, line number increment)
346pairs. The details are important and delicate, best illustrated by example:
347
348 byte code offset source code line number
349 0 1
350 6 2
351 50 7
352 350 307
353 361 308
354
355The first trick is that these numbers aren't stored, only the increments
356from one row to the next (this doesn't really work, but it's a start):
357
358 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
359
360The second trick is that an unsigned byte can't hold negative values, or
361values larger than 255, so (a) there's a deep assumption that byte code
362offsets and their corresponding line #s both increase monotonically, and (b)
363if at least one column jumps by more than 255 from one row to the next, more
364than one pair is written to the table. In case #b, there's no way to know
365from looking at the table later how many were written. That's the delicate
366part. A user of c_lnotab desiring to find the source line number
367corresponding to a bytecode address A should do something like this
368
369 lineno = addr = 0
370 for addr_incr, line_incr in c_lnotab:
371 addr += addr_incr
372 if addr > A:
373 return lineno
374 lineno += line_incr
375
376In order for this to work, when the addr field increments by more than 255,
377the line # increment in each pair generated must be 0 until the remaining addr
378increment is < 256. So, in the example above, com_set_lineno should not (as
379was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
380255, 0, 45, 255, 0, 45.
381*/
382
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000383struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000384 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000386 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000388 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyObject *c_globals; /* dictionary (value=None) */
390 PyObject *c_locals; /* dictionary (value=localID) */
391 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000392 PyObject *c_freevars; /* dictionary (value=None) */
393 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000394 int c_nlocals; /* index of next local */
395 int c_argcount; /* number of top-level arguments */
396 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000397 int c_nexti; /* index into c_code */
398 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000399 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000400 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000402 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000403 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000404 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000406 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000407 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000408 int c_stacklevel; /* Current stack level */
409 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000410 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000411 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000412 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000413 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000414 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000415 int c_nested; /* Is block nested funcdef or lamdef? */
416 int c_closure; /* Is nested w/freevars? */
417 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000418 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000419};
420
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000421static int
422is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000423{
424 if ((v & (USE | DEF_FREE))
425 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
426 return 1;
427 if (v & DEF_FREE_CLASS)
428 return 1;
429 return 0;
430}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000431
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000433com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000434{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000435 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
436
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000437 if (c == NULL) {
438 /* Error occurred via symtable call to
439 is_constant_false */
440 PyErr_SetString(exc, msg);
441 return;
442 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000443 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000444 if (c->c_lineno < 1 || c->c_interactive) {
445 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000447 return;
448 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000449 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000450 if (v == NULL)
451 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000452
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000453 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000454 if (line == NULL) {
455 Py_INCREF(Py_None);
456 line = Py_None;
457 }
458 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
459 Py_None, line);
460 if (t == NULL)
461 goto exit;
462 w = Py_BuildValue("(OO)", v, t);
463 if (w == NULL)
464 goto exit;
465 PyErr_SetObject(exc, w);
466 exit:
467 Py_XDECREF(t);
468 Py_XDECREF(v);
469 Py_XDECREF(w);
470 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000471}
472
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473/* Interface to the block stack */
474
475static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000476block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000477{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000478 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 com_error(c, PyExc_SystemError,
480 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000481 }
482 else {
483 c->c_block[c->c_nblocks++] = type;
484 }
485}
486
487static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000488block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000489{
490 if (c->c_nblocks > 0)
491 c->c_nblocks--;
492 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494 }
495}
496
Guido van Rossum681d79a1995-07-18 14:51:37 +0000497/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498
Tim Petersdbd9ba62000-07-09 03:09:57 +0000499static int com_init(struct compiling *, char *);
500static void com_free(struct compiling *);
501static void com_push(struct compiling *, int);
502static void com_pop(struct compiling *, int);
503static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000504static void com_node(struct compiling *, node *);
505static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000506static void com_addbyte(struct compiling *, int);
507static void com_addint(struct compiling *, int);
508static void com_addoparg(struct compiling *, int, int);
509static void com_addfwref(struct compiling *, int, int *);
510static void com_backpatch(struct compiling *, int);
511static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
512static int com_addconst(struct compiling *, PyObject *);
513static int com_addname(struct compiling *, PyObject *);
514static void com_addopname(struct compiling *, int, node *);
515static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000516static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000518static void com_assign(struct compiling *, node *, int, node *);
519static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000520static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000521static PyCodeObject *jcompile(node *, char *, struct compiling *,
522 PyCompilerFlags *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523static PyObject *parsestrplus(node *);
524static PyObject *parsestr(char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000525static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000526
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000527static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000528
529/* symtable operations */
530static int symtable_build(struct compiling *, node *);
531static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000532static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000533static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000534static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000535static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000536static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537
538static void symtable_node(struct symtable *, node *);
539static void symtable_funcdef(struct symtable *, node *);
540static void symtable_default_args(struct symtable *, node *);
541static void symtable_params(struct symtable *, node *);
542static void symtable_params_fplist(struct symtable *, node *n);
543static void symtable_global(struct symtable *, node *);
544static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000545static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546static void symtable_list_comprehension(struct symtable *, node *);
547
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000548static int symtable_update_free_vars(struct symtable *);
549static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
550static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
551
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552/* helper */
553static void
554do_pad(int pad)
555{
556 int i;
557 for (i = 0; i < pad; ++i)
558 fprintf(stderr, " ");
559}
560
561static void
562dump(node *n, int pad, int depth)
563{
564 int i;
565 if (depth == 0)
566 return;
567 do_pad(pad);
568 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
569 if (depth > 0)
570 depth--;
571 for (i = 0; i < NCH(n); ++i)
572 dump(CHILD(n, i), pad + 1, depth);
573}
574
575#define DUMP(N) dump(N, 0, -1)
576
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000578com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000579{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000580 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
582 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000583 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000585 goto fail;
586 if ((c->c_const_dict = PyDict_New()) == NULL)
587 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 goto fail;
590 if ((c->c_name_dict = PyDict_New()) == NULL)
591 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
595 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000596 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000597 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000598 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000599 c->c_freevars = NULL;
600 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000601 c->c_nlocals = 0;
602 c->c_argcount = 0;
603 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000604 c->c_nexti = 0;
605 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000606 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000607 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000608 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000609 c->c_begin = 0;
610 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000611 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000612 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000613 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000614 c->c_stacklevel = 0;
615 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000616 c->c_firstlineno = 0;
617 c->c_last_addr = 0;
618 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000619 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000620 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000621 c->c_nested = 0;
622 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000623 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000624 return 1;
625
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000626 fail:
627 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000628 return 0;
629}
630
631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000632com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_XDECREF(c->c_code);
635 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000636 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000638 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_XDECREF(c->c_globals);
640 Py_XDECREF(c->c_locals);
641 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000642 Py_XDECREF(c->c_freevars);
643 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000645 if (c->c_future)
646 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000647}
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000651{
652 c->c_stacklevel += n;
653 if (c->c_stacklevel > c->c_maxstacklevel)
654 c->c_maxstacklevel = c->c_stacklevel;
655}
656
657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000658com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000659{
660 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000661 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000662 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
663 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000664 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000665 c->c_stacklevel = 0;
666 }
667 else
668 c->c_stacklevel -= n;
669}
670
671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000672com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000673{
674 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000676 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682{
683 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000684 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000685 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 com_error(c, PyExc_SystemError,
688 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000689 }
690 if (c->c_code == NULL)
691 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000693 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000694 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000695 c->c_errors++;
696 return;
697 }
698 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700}
701
702static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000703com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000705 com_addbyte(c, x & 0xff);
706 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707}
708
709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711{
712 int size;
713 char *p;
714 if (c->c_lnotab == NULL)
715 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000717 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000719 c->c_errors++;
720 return;
721 }
722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000724 *p++ = addr;
725 *p++ = line;
726 c->c_lnotab_next += 2;
727}
728
729static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000730com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000731{
732 c->c_lineno = lineno;
733 if (c->c_firstlineno == 0) {
734 c->c_firstlineno = c->c_last_line = lineno;
735 }
736 else {
737 int incr_addr = c->c_nexti - c->c_last_addr;
738 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000739 while (incr_addr > 255) {
740 com_add_lnotab(c, 255, 0);
741 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000743 while (incr_line > 255) {
744 com_add_lnotab(c, incr_addr, 255);
745 incr_line -=255;
746 incr_addr = 0;
747 }
748 if (incr_addr > 0 || incr_line > 0)
749 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000750 c->c_last_addr = c->c_nexti;
751 c->c_last_line = lineno;
752 }
753}
754
755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000756com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000757{
Fred Drakeef8ace32000-08-24 00:32:09 +0000758 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000759 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000761 if (Py_OptimizeFlag)
762 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000763 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000764 if (extended_arg){
765 com_addbyte(c, EXTENDED_ARG);
766 com_addint(c, extended_arg);
767 arg &= 0xffff;
768 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000769 com_addbyte(c, op);
770 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771}
772
773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
776 /* Compile a forward reference for backpatching */
777 int here;
778 int anchor;
779 com_addbyte(c, op);
780 here = c->c_nexti;
781 anchor = *p_anchor;
782 *p_anchor = here;
783 com_addint(c, anchor == 0 ? 0 : here - anchor);
784}
785
786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000788{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000790 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000791 int dist;
792 int prev;
793 for (;;) {
794 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000795 prev = code[anchor] + (code[anchor+1] << 8);
796 dist = target - (anchor+2);
797 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000798 dist >>= 8;
799 code[anchor+1] = dist;
800 dist >>= 8;
801 if (dist) {
802 com_error(c, PyExc_SystemError,
803 "com_backpatch: offset too large");
804 break;
805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 if (!prev)
807 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 anchor -= prev;
809 }
810}
811
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000812/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000813
814static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000815com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000817 PyObject *w, *t, *np=NULL;
818 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000819
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000820 t = Py_BuildValue("(OO)", v, v->ob_type);
821 if (t == NULL)
822 goto fail;
823 w = PyDict_GetItem(dict, t);
824 if (w != NULL) {
825 n = PyInt_AsLong(w);
826 } else {
827 n = PyList_Size(list);
828 np = PyInt_FromLong(n);
829 if (np == NULL)
830 goto fail;
831 if (PyList_Append(list, v) != 0)
832 goto fail;
833 if (PyDict_SetItem(dict, t, np) != 0)
834 goto fail;
835 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000836 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000837 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000838 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000839 fail:
840 Py_XDECREF(np);
841 Py_XDECREF(t);
842 c->c_errors++;
843 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
852static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000858static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000859mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000860{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000861 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000862 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000863 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
865 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000866 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000867 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868 return 0; /* Don't mangle __extremely_long_names */
869 if (name[nlen-1] == '_' && name[nlen-2] == '_')
870 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000871 /* Strip leading underscores from class name */
872 while (*p == '_')
873 p++;
874 if (*p == '\0')
875 return 0; /* Don't mangle if class is just underscores */
876 plen = strlen(p);
877 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000878 plen = maxlen-nlen-2; /* Truncate class name if too long */
879 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 buffer[0] = '_';
881 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000882 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000883 return 1;
884}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000892
893 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000895 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 c->c_errors++;
897 i = 255;
898 }
899 else {
900 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000903 com_addoparg(c, op, i);
904}
905
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000906#define NAME_LOCAL 0
907#define NAME_GLOBAL 1
908#define NAME_DEFAULT 2
909#define NAME_CLOSURE 3
910
911static int
912com_lookup_arg(PyObject *dict, PyObject *name)
913{
914 PyObject *v = PyDict_GetItem(dict, name);
915 if (v == NULL)
916 return -1;
917 else
918 return PyInt_AS_LONG(v);
919}
920
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921static void
922com_addop_varname(struct compiling *c, int kind, char *name)
923{
924 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000925 int i, reftype;
926 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927 int op = STOP_CODE;
928 char buffer[MANGLE_LEN];
929
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000930 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931 name = buffer;
932 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
933 c->c_errors++;
934 i = 255;
935 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000936 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 reftype = get_ref_type(c, name);
939 switch (reftype) {
940 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000941 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942 scope = NAME_LOCAL;
943 break;
944 case GLOBAL_EXPLICIT:
945 scope = NAME_GLOBAL;
946 break;
947 case GLOBAL_IMPLICIT:
948 if (c->c_flags & CO_OPTIMIZED)
949 scope = NAME_GLOBAL;
950 break;
951 case FREE:
952 case CELL:
953 scope = NAME_CLOSURE;
954 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955 }
956
957 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000958 if (scope == NAME_LOCAL)
959 i = com_lookup_arg(c->c_locals, v);
960 else if (reftype == FREE)
961 i = com_lookup_arg(c->c_freevars, v);
962 else if (reftype == CELL)
963 i = com_lookup_arg(c->c_cellvars, v);
964 if (i == -1) {
965 c->c_errors++; /* XXX no exception set */
966 i = 255;
967 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968 }
969 Py_DECREF(v);
970
971 switch (kind) {
972 case VAR_LOAD:
973 switch (scope) {
974 case NAME_LOCAL:
975 op = LOAD_FAST;
976 break;
977 case NAME_GLOBAL:
978 op = LOAD_GLOBAL;
979 break;
980 case NAME_DEFAULT:
981 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000982 break;
983 case NAME_CLOSURE:
984 op = LOAD_DEREF;
985 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986 }
987 break;
988 case VAR_STORE:
989 switch (scope) {
990 case NAME_LOCAL:
991 op = STORE_FAST;
992 break;
993 case NAME_GLOBAL:
994 op = STORE_GLOBAL;
995 break;
996 case NAME_DEFAULT:
997 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000998 break;
999 case NAME_CLOSURE:
1000 op = STORE_DEREF;
1001 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001002 }
1003 break;
1004 case VAR_DELETE:
1005 switch (scope) {
1006 case NAME_LOCAL:
1007 op = DELETE_FAST;
1008 break;
1009 case NAME_GLOBAL:
1010 op = DELETE_GLOBAL;
1011 break;
1012 case NAME_DEFAULT:
1013 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001014 break;
1015 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001016 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001017 sprintf(buf, DEL_CLOSURE_ERROR, name);
1018 com_error(c, PyExc_SyntaxError, buf);
1019 i = 255;
1020 break;
1021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022 }
1023 break;
1024 }
1025done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026 com_addoparg(c, op, i);
1027}
1028
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001030com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001031{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001032 char *name;
1033 char buffer[1000];
1034 /* XXX it is possible to write this code without the 1000
1035 chars on the total length of dotted names, I just can't be
1036 bothered right now */
1037 if (TYPE(n) == STAR)
1038 name = "*";
1039 else if (TYPE(n) == dotted_name) {
1040 char *p = buffer;
1041 int i;
1042 name = buffer;
1043 for (i = 0; i < NCH(n); i += 2) {
1044 char *s = STR(CHILD(n, i));
1045 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001047 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001048 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049 break;
1050 }
1051 if (p != buffer)
1052 *p++ = '.';
1053 strcpy(p, s);
1054 p = strchr(p, '\0');
1055 }
1056 }
1057 else {
1058 REQ(n, NAME);
1059 name = STR(n);
1060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001061 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001062}
1063
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001065parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001066{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001067 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001069 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001070#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001071 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001072 int imflag;
1073#endif
1074
Guido van Rossum282914b1991-04-04 10:42:56 +00001075 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001076 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001077#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001078 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001079#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001080 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001082 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001084 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001086 if (*end == '\0') {
1087 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001089 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 return NULL;
1091 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001094 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
1096 if (imflag) {
1097 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001098 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001100 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001103 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001104#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001105 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
1107 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111}
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001114parsestr(char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001117 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 char *buf;
1119 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001120 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001122 int first = *s;
1123 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001124 int rawmode = 0;
1125 int unicode = 0;
1126 if (isalpha(quote) || quote == '_') {
1127 if (quote == 'u' || quote == 'U') {
1128 quote = *++s;
1129 unicode = 1;
1130 }
1131 if (quote == 'r' || quote == 'R') {
1132 quote = *++s;
1133 rawmode = 1;
1134 }
1135 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001136 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138 return NULL;
1139 }
1140 s++;
1141 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001142 if (len > INT_MAX) {
1143 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1144 return NULL;
1145 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001146 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148 return NULL;
1149 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 if (len >= 4 && s[0] == quote && s[1] == quote) {
1151 s += 2;
1152 len -= 2;
1153 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 return NULL;
1156 }
1157 }
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001158 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001159 if (rawmode)
1160 return PyUnicode_DecodeRawUnicodeEscape(
1161 s, len, NULL);
1162 else
1163 return PyUnicode_DecodeUnicodeEscape(
1164 s, len, NULL);
1165 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001166 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 return PyString_FromStringAndSize(s, len);
1168 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001169 if (v == NULL)
1170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 end = s + len;
1173 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 if (*s != '\\') {
1175 *p++ = *s++;
1176 continue;
1177 }
1178 s++;
1179 switch (*s++) {
1180 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001181 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182 case '\\': *p++ = '\\'; break;
1183 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001184 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001185 case 'b': *p++ = '\b'; break;
1186 case 'f': *p++ = '\014'; break; /* FF */
1187 case 't': *p++ = '\t'; break;
1188 case 'n': *p++ = '\n'; break;
1189 case 'r': *p++ = '\r'; break;
1190 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1192 case '0': case '1': case '2': case '3':
1193 case '4': case '5': case '6': case '7':
1194 c = s[-1] - '0';
1195 if ('0' <= *s && *s <= '7') {
1196 c = (c<<3) + *s++ - '0';
1197 if ('0' <= *s && *s <= '7')
1198 c = (c<<3) + *s++ - '0';
1199 }
1200 *p++ = c;
1201 break;
1202 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001203 if (isxdigit(Py_CHARMASK(s[0]))
1204 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001205 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001206 c = Py_CHARMASK(*s);
1207 s++;
1208 if (isdigit(c))
1209 x = c - '0';
1210 else if (islower(c))
1211 x = 10 + c - 'a';
1212 else
1213 x = 10 + c - 'A';
1214 x = x << 4;
1215 c = Py_CHARMASK(*s);
1216 s++;
1217 if (isdigit(c))
1218 x += c - '0';
1219 else if (islower(c))
1220 x += 10 + c - 'a';
1221 else
1222 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001223 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 break;
1225 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001226 PyErr_SetString(PyExc_ValueError,
1227 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001228 Py_DECREF(v);
1229 return NULL;
1230 default:
1231 *p++ = '\\';
1232 *p++ = s[-1];
1233 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 }
1235 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 return v;
1238}
1239
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001241parsestrplus(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001242{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001244 int i;
1245 REQ(CHILD(n, 0), STRING);
1246 if ((v = parsestr(STR(CHILD(n, 0)))) != NULL) {
1247 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001248 for (i = 1; i < NCH(n); i++) {
1249 PyObject *s;
1250 s = parsestr(STR(CHILD(n, i)));
1251 if (s == NULL)
1252 goto onError;
1253 if (PyString_Check(v) && PyString_Check(s)) {
1254 PyString_ConcatAndDel(&v, s);
1255 if (v == NULL)
1256 goto onError;
1257 }
1258 else {
1259 PyObject *temp;
1260 temp = PyUnicode_Concat(v, s);
1261 Py_DECREF(s);
1262 if (temp == NULL)
1263 goto onError;
1264 Py_DECREF(v);
1265 v = temp;
1266 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267 }
1268 }
1269 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001270
1271 onError:
1272 Py_XDECREF(v);
1273 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001274}
1275
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001276static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001277com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001279 int anchor = 0;
1280 int save_begin = c->c_begin;
1281
1282 /* list_iter: for v in expr [list_iter] */
1283 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001284 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001285 c->c_begin = c->c_nexti;
1286 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001287 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001289 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001290 c->c_loops++;
1291 com_list_iter(c, n, e, t);
1292 c->c_loops--;
1293 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1294 c->c_begin = save_begin;
1295 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297}
1298
1299static void
1300com_list_if(struct compiling *c, node *n, node *e, char *t)
1301{
1302 int anchor = 0;
1303 int a = 0;
1304 /* list_iter: 'if' test [list_iter] */
1305 com_addoparg(c, SET_LINENO, n->n_lineno);
1306 com_node(c, CHILD(n, 1));
1307 com_addfwref(c, JUMP_IF_FALSE, &a);
1308 com_addbyte(c, POP_TOP);
1309 com_pop(c, 1);
1310 com_list_iter(c, n, e, t);
1311 com_addfwref(c, JUMP_FORWARD, &anchor);
1312 com_backpatch(c, a);
1313 /* We jump here with an extra entry which we now pop */
1314 com_addbyte(c, POP_TOP);
1315 com_backpatch(c, anchor);
1316}
1317
1318static void
1319com_list_iter(struct compiling *c,
1320 node *p, /* parent of list_iter node */
1321 node *e, /* element expression node */
1322 char *t /* name of result list temp local */)
1323{
1324 /* list_iter is the last child in a listmaker, list_for, or list_if */
1325 node *n = CHILD(p, NCH(p)-1);
1326 if (TYPE(n) == list_iter) {
1327 n = CHILD(n, 0);
1328 switch (TYPE(n)) {
1329 case list_for:
1330 com_list_for(c, n, e, t);
1331 break;
1332 case list_if:
1333 com_list_if(c, n, e, t);
1334 break;
1335 default:
1336 com_error(c, PyExc_SystemError,
1337 "invalid list_iter node type");
1338 }
1339 }
1340 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001342 com_push(c, 1);
1343 com_node(c, e);
1344 com_addoparg(c, CALL_FUNCTION, 1);
1345 com_addbyte(c, POP_TOP);
1346 com_pop(c, 2);
1347 }
1348}
1349
1350static void
1351com_list_comprehension(struct compiling *c, node *n)
1352{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001353 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001355 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001356 com_addoparg(c, BUILD_LIST, 0);
1357 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1358 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359 com_addop_name(c, LOAD_ATTR, "append");
1360 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001361 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001362 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001363 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001364 --c->c_tmpname;
1365}
1366
1367static void
1368com_listmaker(struct compiling *c, node *n)
1369{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001370 /* listmaker: test ( list_for | (',' test)* [','] ) */
1371 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 com_list_comprehension(c, n);
1373 else {
1374 int len = 0;
1375 int i;
1376 for (i = 0; i < NCH(n); i += 2, len++)
1377 com_node(c, CHILD(n, i));
1378 com_addoparg(c, BUILD_LIST, len);
1379 com_pop(c, len-1);
1380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001385{
1386 int i;
1387 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1388 for (i = 0; i+2 < NCH(n); i += 4) {
1389 /* We must arrange things just right for STORE_SUBSCR.
1390 It wants the stack to look like (value) (dict) (key) */
1391 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001393 com_node(c, CHILD(n, i+2)); /* value */
1394 com_addbyte(c, ROT_TWO);
1395 com_node(c, CHILD(n, i)); /* key */
1396 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001397 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001398 }
1399}
1400
1401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403{
1404 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406 int i;
1407 REQ(n, atom);
1408 ch = CHILD(n, 0);
1409 switch (TYPE(ch)) {
1410 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 com_push(c, 1);
1414 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 else
1416 com_node(c, CHILD(n, 1));
1417 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001418 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
1422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001424 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001426 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001429 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001430 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 break;
1432 case BACKQUOTE:
1433 com_node(c, CHILD(n, 1));
1434 com_addbyte(c, UNARY_CONVERT);
1435 break;
1436 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001437 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 i = 255;
1439 }
1440 else {
1441 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
1444 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001445 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 break;
1447 case STRING:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001448 v = parsestrplus(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001449 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 c->c_errors++;
1451 i = 255;
1452 }
1453 else {
1454 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 }
1457 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 break;
1460 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001461 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001462 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 break;
1464 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 com_error(c, PyExc_SystemError,
1466 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 }
1468}
1469
1470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472{
1473 if (NCH(n) == 1) {
1474 com_addbyte(c, op);
1475 }
1476 else if (NCH(n) == 2) {
1477 if (TYPE(CHILD(n, 0)) != COLON) {
1478 com_node(c, CHILD(n, 0));
1479 com_addbyte(c, op+1);
1480 }
1481 else {
1482 com_node(c, CHILD(n, 1));
1483 com_addbyte(c, op+2);
1484 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 }
1487 else {
1488 com_node(c, CHILD(n, 0));
1489 com_node(c, CHILD(n, 2));
1490 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001491 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 }
1493}
1494
Guido van Rossum635abd21997-01-06 22:56:52 +00001495static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001496com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1497{
1498 if (NCH(n) == 1) {
1499 com_addbyte(c, DUP_TOP);
1500 com_push(c, 1);
1501 com_addbyte(c, SLICE);
1502 com_node(c, augn);
1503 com_addbyte(c, opcode);
1504 com_pop(c, 1);
1505 com_addbyte(c, ROT_TWO);
1506 com_addbyte(c, STORE_SLICE);
1507 com_pop(c, 2);
1508 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1509 com_node(c, CHILD(n, 0));
1510 com_addoparg(c, DUP_TOPX, 2);
1511 com_push(c, 2);
1512 com_addbyte(c, SLICE+1);
1513 com_pop(c, 1);
1514 com_node(c, augn);
1515 com_addbyte(c, opcode);
1516 com_pop(c, 1);
1517 com_addbyte(c, ROT_THREE);
1518 com_addbyte(c, STORE_SLICE+1);
1519 com_pop(c, 3);
1520 } else if (NCH(n) == 2) {
1521 com_node(c, CHILD(n, 1));
1522 com_addoparg(c, DUP_TOPX, 2);
1523 com_push(c, 2);
1524 com_addbyte(c, SLICE+2);
1525 com_pop(c, 1);
1526 com_node(c, augn);
1527 com_addbyte(c, opcode);
1528 com_pop(c, 1);
1529 com_addbyte(c, ROT_THREE);
1530 com_addbyte(c, STORE_SLICE+2);
1531 com_pop(c, 3);
1532 } else {
1533 com_node(c, CHILD(n, 0));
1534 com_node(c, CHILD(n, 2));
1535 com_addoparg(c, DUP_TOPX, 3);
1536 com_push(c, 3);
1537 com_addbyte(c, SLICE+3);
1538 com_pop(c, 2);
1539 com_node(c, augn);
1540 com_addbyte(c, opcode);
1541 com_pop(c, 1);
1542 com_addbyte(c, ROT_FOUR);
1543 com_addbyte(c, STORE_SLICE+3);
1544 com_pop(c, 4);
1545 }
1546}
1547
1548static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001550{
1551 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001552 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001553 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001554 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001556 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001557 }
1558 else {
1559 com_node(c, CHILD(n, 0));
1560 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001561 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 }
1563 m = n;
1564 do {
1565 m = CHILD(m, 0);
1566 } while (NCH(m) == 1);
1567 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001568 /* f(lambda x: x[0] = 3) ends up getting parsed with
1569 * LHS test = lambda x: x[0], and RHS test = 3.
1570 * SF bug 132313 points out that complaining about a keyword
1571 * then is very confusing.
1572 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001574 TYPE(m) == lambdef ?
1575 "lambda cannot contain assignment" :
1576 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
1578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001580 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001582 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001584 else if (*pkeywords == NULL) {
1585 c->c_errors++;
1586 Py_DECREF(v);
1587 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 if (PyDict_GetItem(*pkeywords, v) != NULL)
1589 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 "duplicate keyword argument");
1591 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001592 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001593 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001594 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001595 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001597 }
1598 }
1599 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001600}
1601
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001603com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604{
1605 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607 }
1608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001611 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001612 int star_flag = 0;
1613 int starstar_flag = 0;
1614 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001616 na = 0;
1617 nk = 0;
1618 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001619 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001620 if (TYPE(ch) == STAR ||
1621 TYPE(ch) == DOUBLESTAR)
1622 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001623 if (ch->n_lineno != lineno) {
1624 lineno = ch->n_lineno;
1625 com_addoparg(c, SET_LINENO, lineno);
1626 }
1627 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001628 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629 na++;
1630 else
1631 nk++;
1632 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001634 while (i < NCH(n)) {
1635 node *tok = CHILD(n, i);
1636 node *ch = CHILD(n, i+1);
1637 i += 3;
1638 switch (TYPE(tok)) {
1639 case STAR: star_flag = 1; break;
1640 case DOUBLESTAR: starstar_flag = 1; break;
1641 }
1642 com_node(c, ch);
1643 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 com_error(c, PyExc_SyntaxError,
1646 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001647 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001648 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001649 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 star_flag + (starstar_flag << 1);
1651 else
1652 opcode = CALL_FUNCTION;
1653 com_addoparg(c, opcode, na | (nk << 8));
1654 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 }
1656}
1657
1658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660{
1661 com_addopname(c, LOAD_ATTR, n);
1662}
1663
1664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001665com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001666{
1667 int i=0;
1668 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001669 node *ch;
1670
1671 /* first argument */
1672 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001674 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001675 i++;
1676 }
1677 else {
1678 com_node(c, CHILD(n,i));
1679 i++;
1680 REQ(CHILD(n,i),COLON);
1681 i++;
1682 }
1683 /* second argument */
1684 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1685 com_node(c, CHILD(n,i));
1686 i++;
1687 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001688 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001690 com_push(c, 1);
1691 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001692 /* remaining arguments */
1693 for (; i < NCH(n); i++) {
1694 ns++;
1695 ch=CHILD(n,i);
1696 REQ(ch, sliceop);
1697 if (NCH(ch) == 1) {
1698 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 }
1702 else
1703 com_node(c, CHILD(ch,1));
1704 }
1705 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001706 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001707}
1708
1709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001711{
1712 node *ch;
1713 REQ(n, subscript);
1714 ch = CHILD(n,0);
1715 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001716 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001717 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_push(c, 1);
1719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001720 else {
1721 /* check for slice */
1722 if ((TYPE(ch) == COLON || NCH(n) > 1))
1723 com_sliceobj(c, n);
1724 else {
1725 REQ(ch, test);
1726 com_node(c, ch);
1727 }
1728 }
1729}
1730
1731static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001732com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001733{
1734 int i, op;
1735 REQ(n, subscriptlist);
1736 /* Check to make backward compatible slice behavior for '[i:j]' */
1737 if (NCH(n) == 1) {
1738 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001739 /* 'Basic' slice, should have exactly one colon. */
1740 if ((TYPE(CHILD(sub, 0)) == COLON
1741 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1742 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1743 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001744 switch (assigning) {
1745 case OP_DELETE:
1746 op = DELETE_SLICE;
1747 break;
1748 case OP_ASSIGN:
1749 op = STORE_SLICE;
1750 break;
1751 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001752 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001753 break;
1754 default:
1755 com_augassign_slice(c, sub, assigning, augn);
1756 return;
1757 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001758 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001759 if (op == STORE_SLICE)
1760 com_pop(c, 2);
1761 else if (op == DELETE_SLICE)
1762 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001763 return;
1764 }
1765 }
1766 /* Else normal subscriptlist. Compile each subscript. */
1767 for (i = 0; i < NCH(n); i += 2)
1768 com_subscript(c, CHILD(n, i));
1769 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001770 if (NCH(n) > 1) {
1771 i = (NCH(n)+1) / 2;
1772 com_addoparg(c, BUILD_TUPLE, i);
1773 com_pop(c, i-1);
1774 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001775 switch (assigning) {
1776 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001777 op = DELETE_SUBSCR;
1778 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001779 break;
1780 default:
1781 case OP_ASSIGN:
1782 op = STORE_SUBSCR;
1783 i = 3;
1784 break;
1785 case OP_APPLY:
1786 op = BINARY_SUBSCR;
1787 i = 1;
1788 break;
1789 }
1790 if (assigning > OP_APPLY) {
1791 com_addoparg(c, DUP_TOPX, 2);
1792 com_push(c, 2);
1793 com_addbyte(c, BINARY_SUBSCR);
1794 com_pop(c, 1);
1795 com_node(c, augn);
1796 com_addbyte(c, assigning);
1797 com_pop(c, 1);
1798 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001800 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001801 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001802}
1803
1804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001805com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806{
1807 REQ(n, trailer);
1808 switch (TYPE(CHILD(n, 0))) {
1809 case LPAR:
1810 com_call_function(c, CHILD(n, 1));
1811 break;
1812 case DOT:
1813 com_select_member(c, CHILD(n, 1));
1814 break;
1815 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001816 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001817 break;
1818 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001820 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821 }
1822}
1823
1824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001825com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001826{
1827 int i;
1828 REQ(n, power);
1829 com_atom(c, CHILD(n, 0));
1830 for (i = 1; i < NCH(n); i++) {
1831 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1832 com_factor(c, CHILD(n, i+1));
1833 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001834 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001835 break;
1836 }
1837 else
1838 com_apply_trailer(c, CHILD(n, i));
1839 }
1840}
1841
1842static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001843com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001845 REQ(n, factor);
1846 if (TYPE(CHILD(n, 0)) == PLUS) {
1847 com_factor(c, CHILD(n, 1));
1848 com_addbyte(c, UNARY_POSITIVE);
1849 }
1850 else if (TYPE(CHILD(n, 0)) == MINUS) {
1851 com_factor(c, CHILD(n, 1));
1852 com_addbyte(c, UNARY_NEGATIVE);
1853 }
Guido van Rossum7928cd71991-10-24 14:59:31 +00001854 else if (TYPE(CHILD(n, 0)) == TILDE) {
1855 com_factor(c, CHILD(n, 1));
1856 com_addbyte(c, UNARY_INVERT);
1857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001858 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001859 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860 }
1861}
1862
1863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001864com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001865{
1866 int i;
1867 int op;
1868 REQ(n, term);
1869 com_factor(c, CHILD(n, 0));
1870 for (i = 2; i < NCH(n); i += 2) {
1871 com_factor(c, CHILD(n, i));
1872 switch (TYPE(CHILD(n, i-1))) {
1873 case STAR:
1874 op = BINARY_MULTIPLY;
1875 break;
1876 case SLASH:
1877 op = BINARY_DIVIDE;
1878 break;
1879 case PERCENT:
1880 op = BINARY_MODULO;
1881 break;
1882 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001884 "com_term: operator not *, / or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001885 op = 255;
1886 }
1887 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001888 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001889 }
1890}
1891
1892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001893com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001894{
1895 int i;
1896 int op;
1897 REQ(n, arith_expr);
1898 com_term(c, CHILD(n, 0));
1899 for (i = 2; i < NCH(n); i += 2) {
1900 com_term(c, CHILD(n, i));
1901 switch (TYPE(CHILD(n, i-1))) {
1902 case PLUS:
1903 op = BINARY_ADD;
1904 break;
1905 case MINUS:
1906 op = BINARY_SUBTRACT;
1907 break;
1908 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001910 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001911 op = 255;
1912 }
1913 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001914 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001915 }
1916}
1917
1918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001919com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001920{
1921 int i;
1922 int op;
1923 REQ(n, shift_expr);
1924 com_arith_expr(c, CHILD(n, 0));
1925 for (i = 2; i < NCH(n); i += 2) {
1926 com_arith_expr(c, CHILD(n, i));
1927 switch (TYPE(CHILD(n, i-1))) {
1928 case LEFTSHIFT:
1929 op = BINARY_LSHIFT;
1930 break;
1931 case RIGHTSHIFT:
1932 op = BINARY_RSHIFT;
1933 break;
1934 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001936 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001937 op = 255;
1938 }
1939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001940 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001941 }
1942}
1943
1944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001946{
1947 int i;
1948 int op;
1949 REQ(n, and_expr);
1950 com_shift_expr(c, CHILD(n, 0));
1951 for (i = 2; i < NCH(n); i += 2) {
1952 com_shift_expr(c, CHILD(n, i));
1953 if (TYPE(CHILD(n, i-1)) == AMPER) {
1954 op = BINARY_AND;
1955 }
1956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001958 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001959 op = 255;
1960 }
1961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001962 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 }
1964}
1965
1966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001967com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001968{
1969 int i;
1970 int op;
1971 REQ(n, xor_expr);
1972 com_and_expr(c, CHILD(n, 0));
1973 for (i = 2; i < NCH(n); i += 2) {
1974 com_and_expr(c, CHILD(n, i));
1975 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
1976 op = BINARY_XOR;
1977 }
1978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001980 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 op = 255;
1982 }
1983 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001985 }
1986}
1987
1988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001989com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990{
1991 int i;
1992 int op;
1993 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001994 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996 com_xor_expr(c, CHILD(n, i));
1997 if (TYPE(CHILD(n, i-1)) == VBAR) {
1998 op = BINARY_OR;
1999 }
2000 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002002 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003 op = 255;
2004 }
2005 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002006 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 }
2008}
2009
2010static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002011cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012{
2013 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002014 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2016 if (NCH(n) == 1) {
2017 n = CHILD(n, 0);
2018 switch (TYPE(n)) {
2019 case LESS: return LT;
2020 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002021 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002023 case LESSEQUAL: return LE;
2024 case GREATEREQUAL: return GE;
2025 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2027 if (strcmp(STR(n), "is") == 0) return IS;
2028 }
2029 }
2030 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002032 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2033 return NOT_IN;
2034 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2035 return IS_NOT;
2036 }
2037 }
2038 return BAD;
2039}
2040
2041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002042com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043{
2044 int i;
2045 enum cmp_op op;
2046 int anchor;
2047 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2048 com_expr(c, CHILD(n, 0));
2049 if (NCH(n) == 1)
2050 return;
2051
2052 /****************************************************************
2053 The following code is generated for all but the last
2054 comparison in a chain:
2055
2056 label: on stack: opcode: jump to:
2057
2058 a <code to load b>
2059 a, b DUP_TOP
2060 a, b, b ROT_THREE
2061 b, a, b COMPARE_OP
2062 b, 0-or-1 JUMP_IF_FALSE L1
2063 b, 1 POP_TOP
2064 b
2065
2066 We are now ready to repeat this sequence for the next
2067 comparison in the chain.
2068
2069 For the last we generate:
2070
2071 b <code to load c>
2072 b, c COMPARE_OP
2073 0-or-1
2074
2075 If there were any jumps to L1 (i.e., there was more than one
2076 comparison), we generate:
2077
2078 0-or-1 JUMP_FORWARD L2
2079 L1: b, 0 ROT_TWO
2080 0, b POP_TOP
2081 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002083 ****************************************************************/
2084
2085 anchor = 0;
2086
2087 for (i = 2; i < NCH(n); i += 2) {
2088 com_expr(c, CHILD(n, i));
2089 if (i+2 < NCH(n)) {
2090 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002091 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 com_addbyte(c, ROT_THREE);
2093 }
2094 op = cmp_type(CHILD(n, i-1));
2095 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002097 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 if (i+2 < NCH(n)) {
2102 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2103 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106 }
2107
2108 if (anchor) {
2109 int anchor2 = 0;
2110 com_addfwref(c, JUMP_FORWARD, &anchor2);
2111 com_backpatch(c, anchor);
2112 com_addbyte(c, ROT_TWO);
2113 com_addbyte(c, POP_TOP);
2114 com_backpatch(c, anchor2);
2115 }
2116}
2117
2118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
2121 REQ(n, not_test); /* 'not' not_test | comparison */
2122 if (NCH(n) == 1) {
2123 com_comparison(c, CHILD(n, 0));
2124 }
2125 else {
2126 com_not_test(c, CHILD(n, 1));
2127 com_addbyte(c, UNARY_NOT);
2128 }
2129}
2130
2131static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002132com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133{
2134 int i;
2135 int anchor;
2136 REQ(n, and_test); /* not_test ('and' not_test)* */
2137 anchor = 0;
2138 i = 0;
2139 for (;;) {
2140 com_not_test(c, CHILD(n, i));
2141 if ((i += 2) >= NCH(n))
2142 break;
2143 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2144 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147 if (anchor)
2148 com_backpatch(c, anchor);
2149}
2150
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002151static int
2152com_make_closure(struct compiling *c, PyCodeObject *co)
2153{
2154 int i, free = PyTuple_GET_SIZE(co->co_freevars);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002155 /* If the code is compiled with st->st_nested_scopes == 0,
2156 then no variable will ever be added to co_freevars.
2157 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002158 if (free == 0)
2159 return 0;
2160 for (i = 0; i < free; ++i) {
2161 /* Bypass com_addop_varname because it will generate
2162 LOAD_DEREF but LOAD_CLOSURE is needed.
2163 */
2164 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2165 int arg, reftype;
2166
2167 /* Special case: If a class contains a method with a
2168 free variable that has the same name as a method,
2169 the name will be considered free *and* local in the
2170 class. It should be handled by the closure, as
2171 well as by the normal name loookup logic.
2172 */
2173 reftype = get_ref_type(c, PyString_AS_STRING(name));
2174 if (reftype == CELL)
2175 arg = com_lookup_arg(c->c_cellvars, name);
2176 else /* (reftype == FREE) */
2177 arg = com_lookup_arg(c->c_freevars, name);
2178 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002179 fprintf(stderr, "lookup %s in %s %d %d\n"
2180 "freevars of %s: %s\n",
2181 PyObject_REPR(name),
2182 c->c_name,
2183 reftype, arg,
2184 PyString_AS_STRING(co->co_name),
2185 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002186 Py_FatalError("com_make_closure()");
2187 }
2188 com_addoparg(c, LOAD_CLOSURE, arg);
2189
2190 }
2191 com_push(c, free);
2192 return 1;
2193}
2194
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002196com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002198 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002199 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002200 PyObject *co;
2201 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002202 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002203 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2204 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002205 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002206 if (co == NULL) {
2207 c->c_errors++;
2208 return;
2209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002210 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002211 i = com_addconst(c, co);
2212 closure = com_make_closure(c, (PyCodeObject *)co);
2213 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002214 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002215 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002216 if (closure)
2217 com_addoparg(c, MAKE_CLOSURE, ndefs);
2218 else
2219 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002222 else {
2223 int anchor = 0;
2224 int i = 0;
2225 for (;;) {
2226 com_and_test(c, CHILD(n, i));
2227 if ((i += 2) >= NCH(n))
2228 break;
2229 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2230 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002231 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002232 }
2233 if (anchor)
2234 com_backpatch(c, anchor);
2235 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
2241 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002242 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002243 com_node(c, CHILD(n, 0));
2244 }
2245 else {
2246 int i;
2247 int len;
2248 len = (NCH(n) + 1) / 2;
2249 for (i = 0; i < NCH(n); i += 2)
2250 com_node(c, CHILD(n, i));
2251 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002252 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253 }
2254}
2255
2256
2257/* Begin of assignment compilation */
2258
Thomas Wouters434d0822000-08-24 20:11:32 +00002259
2260static void
2261com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2262{
2263 com_addbyte(c, DUP_TOP);
2264 com_push(c, 1);
2265 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_addbyte(c, ROT_TWO);
2270 com_addopname(c, STORE_ATTR, n);
2271 com_pop(c, 2);
2272}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273
2274static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002275com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276{
2277 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002282com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 REQ(n, trailer);
2285 switch (TYPE(CHILD(n, 0))) {
2286 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 com_error(c, PyExc_SyntaxError,
2288 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 break;
2290 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002291 if (assigning > OP_APPLY)
2292 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2293 else
2294 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002296 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002297 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 break;
2299 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 }
2302}
2303
2304static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002305com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306{
2307 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002308 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002310 if (assigning) {
2311 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002312 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002313 com_push(c, i-1);
2314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002316 com_assign(c, CHILD(n, i), assigning, NULL);
2317}
2318
2319static void
2320com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2321{
2322 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002323 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002324 com_push(c, 1);
2325 com_node(c, augn);
2326 com_addbyte(c, opcode);
2327 com_pop(c, 1);
2328 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329}
2330
2331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002332com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333{
2334 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002335 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 if (assigning)
2337 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338}
2339
2340static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002341com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342{
2343 /* Loop to avoid trivial recursion */
2344 for (;;) {
2345 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 case exprlist:
2348 case testlist:
2349 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002350 if (assigning > OP_APPLY) {
2351 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002352 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002353 return;
2354 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002355 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 return;
2357 }
2358 n = CHILD(n, 0);
2359 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 case test:
2362 case and_test:
2363 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002366 case xor_expr:
2367 case and_expr:
2368 case shift_expr:
2369 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002371 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002374 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 return;
2376 }
2377 n = CHILD(n, 0);
2378 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002379
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002380 case power: /* atom trailer* ('**' power)*
2381 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002382 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002384 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 return;
2386 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002387 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 int i;
2389 com_node(c, CHILD(n, 0));
2390 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002391 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002393 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002394 return;
2395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 com_apply_trailer(c, CHILD(n, i));
2397 } /* NB i is still alive */
2398 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 return;
2401 }
2402 n = CHILD(n, 0);
2403 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002404
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 case atom:
2406 switch (TYPE(CHILD(n, 0))) {
2407 case LPAR:
2408 n = CHILD(n, 1);
2409 if (TYPE(n) == RPAR) {
2410 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002412 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 return;
2414 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002415 if (assigning > OP_APPLY) {
2416 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002417 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 return;
2419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 break;
2421 case LSQB:
2422 n = CHILD(n, 1);
2423 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002425 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 return;
2427 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY) {
2429 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002430 "augmented assign to list not possible");
2431 return;
2432 }
2433 if (NCH(n) > 1
2434 && TYPE(CHILD(n, 1)) == list_for) {
2435 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002436 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002437 return;
2438 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002439 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 return;
2441 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002442 if (assigning > OP_APPLY)
2443 com_augassign_name(c, CHILD(n, 0),
2444 assigning, augn);
2445 else
2446 com_assign_name(c, CHILD(n, 0),
2447 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 return;
2449 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002451 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 return;
2453 }
2454 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002455
2456 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 com_error(c, PyExc_SyntaxError,
2458 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002459 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002460
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002462 com_error(c, PyExc_SystemError,
2463 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002464 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002465
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 }
2467 }
2468}
Guido van Rossum7c531111997-03-11 18:42:21 +00002469
Thomas Wouters434d0822000-08-24 20:11:32 +00002470static void
2471com_augassign(struct compiling *c, node *n)
2472{
2473 int opcode;
2474
2475 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2476 case '+': opcode = INPLACE_ADD; break;
2477 case '-': opcode = INPLACE_SUBTRACT; break;
2478 case '/': opcode = INPLACE_DIVIDE; break;
2479 case '%': opcode = INPLACE_MODULO; break;
2480 case '<': opcode = INPLACE_LSHIFT; break;
2481 case '>': opcode = INPLACE_RSHIFT; break;
2482 case '&': opcode = INPLACE_AND; break;
2483 case '^': opcode = INPLACE_XOR; break;
2484 case '|': opcode = INPLACE_OR; break;
2485 case '*':
2486 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2487 opcode = INPLACE_POWER;
2488 else
2489 opcode = INPLACE_MULTIPLY;
2490 break;
2491 default:
2492 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2493 return;
2494 }
2495 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2496}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497
2498static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002499com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002500{
Thomas Wouters434d0822000-08-24 20:11:32 +00002501 REQ(n, expr_stmt);
2502 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002503 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002504 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002505 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 if (NCH(n) == 1) {
2507 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002508 if (c->c_interactive)
2509 com_addbyte(c, PRINT_EXPR);
2510 else
2511 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 else if (TYPE(CHILD(n,1)) == augassign)
2515 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 else {
2517 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002518 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002519 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 com_push(c, 1);
2523 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002524 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 }
2526 }
2527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002531{
2532 int a = 0, b = 0;
2533 int i;
2534 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2535 /* Generate code like for
2536
2537 if __debug__:
2538 if not <test>:
2539 raise AssertionError [, <message>]
2540
2541 where <message> is the second test, if present.
2542 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002543
Guido van Rossum228d7f31997-04-02 05:24:36 +00002544 if (Py_OptimizeFlag)
2545 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002547 com_push(c, 1);
2548 com_addfwref(c, JUMP_IF_FALSE, &a);
2549 com_addbyte(c, POP_TOP);
2550 com_pop(c, 1);
2551 com_node(c, CHILD(n, 1));
2552 com_addfwref(c, JUMP_IF_TRUE, &b);
2553 com_addbyte(c, POP_TOP);
2554 com_pop(c, 1);
2555 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002556 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002557 com_push(c, 1);
2558 i = NCH(n)/2; /* Either 2 or 4 */
2559 if (i > 1)
2560 com_node(c, CHILD(n, 3));
2561 com_addoparg(c, RAISE_VARARGS, i);
2562 com_pop(c, i);
2563 /* The interpreter does not fall through */
2564 /* All jumps converge here */
2565 com_backpatch(c, a);
2566 com_backpatch(c, b);
2567 com_addbyte(c, POP_TOP);
2568}
2569
2570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002571com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002573 int i = 1;
2574 node* stream = NULL;
2575
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002576 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002577
2578 /* are we using the extended print form? */
2579 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2580 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002581 com_node(c, stream);
2582 /* stack: [...] => [... stream] */
2583 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002584 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2585 i = 4;
2586 else
2587 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002589 for (; i < NCH(n); i += 2) {
2590 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002591 com_addbyte(c, DUP_TOP);
2592 /* stack: [stream] => [stream stream] */
2593 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002594 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002595 /* stack: [stream stream] => [stream stream obj] */
2596 com_addbyte(c, ROT_TWO);
2597 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002598 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002599 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002600 com_pop(c, 2);
2601 }
2602 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002603 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002604 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002605 com_addbyte(c, PRINT_ITEM);
2606 com_pop(c, 1);
2607 }
2608 }
2609 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002610 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002611 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002612 /* must pop the extra stream object off the stack */
2613 com_addbyte(c, POP_TOP);
2614 /* stack: [... stream] => [...] */
2615 com_pop(c, 1);
2616 }
2617 }
2618 else {
2619 if (stream != NULL) {
2620 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002621 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002622 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002623 com_pop(c, 1);
2624 }
2625 else
2626 com_addbyte(c, PRINT_NEWLINE);
2627 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002628}
2629
2630static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002631com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002632{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002633 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002634 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002636 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002637 if (c->c_flags & CO_GENERATOR) {
2638 if (NCH(n) > 1) {
2639 com_error(c, PyExc_SyntaxError,
2640 "'return' with argument inside generator");
2641 }
2642 com_addoparg(c, LOAD_CONST,
2643 com_addconst(c, PyExc_StopIteration));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 com_push(c, 1);
Tim Peters5ca576e2001-06-18 22:08:13 +00002645 com_addoparg(c, RAISE_VARARGS, 1);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002646 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002647 else {
2648 if (NCH(n) < 2) {
2649 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
2650 com_push(c, 1);
2651 }
2652 else
2653 com_node(c, CHILD(n, 1));
2654 com_addbyte(c, RETURN_VALUE);
2655 }
2656 com_pop(c, 1);
2657}
2658
2659static void
2660com_yield_stmt(struct compiling *c, node *n)
2661{
2662 REQ(n, yield_stmt); /* 'yield' testlist */
2663 if (!c->c_infunction) {
2664 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2665 }
2666 com_node(c, CHILD(n, 1));
2667 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002669}
2670
2671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002672com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002674 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002675 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2676 if (NCH(n) > 1) {
2677 com_node(c, CHILD(n, 1));
2678 if (NCH(n) > 3) {
2679 com_node(c, CHILD(n, 3));
2680 if (NCH(n) > 5)
2681 com_node(c, CHILD(n, 5));
2682 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002683 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002684 i = NCH(n)/2;
2685 com_addoparg(c, RAISE_VARARGS, i);
2686 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687}
2688
2689static void
Thomas Wouters52152252000-08-17 22:55:00 +00002690com_from_import(struct compiling *c, node *n)
2691{
2692 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2693 com_push(c, 1);
2694 if (NCH(n) > 1) {
2695 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2696 com_error(c, PyExc_SyntaxError, "invalid syntax");
2697 return;
2698 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002699 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002700 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002701 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002702 com_pop(c, 1);
2703}
2704
2705static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002706com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707{
2708 int i;
2709 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002710 /* 'import' dotted_name (',' dotted_name)* |
2711 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002713 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002714 /* 'from' dotted_name 'import' ... */
2715 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002716
2717 if (TYPE(CHILD(n, 3)) == STAR) {
2718 tup = Py_BuildValue("(s)", "*");
2719 } else {
2720 tup = PyTuple_New((NCH(n) - 2)/2);
2721 for (i = 3; i < NCH(n); i += 2) {
2722 PyTuple_SET_ITEM(tup, (i-3)/2,
2723 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002724 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002725 }
2726 }
2727 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002728 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002729 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002730 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002731 if (TYPE(CHILD(n, 3)) == STAR)
2732 com_addbyte(c, IMPORT_STAR);
2733 else {
2734 for (i = 3; i < NCH(n); i += 2)
2735 com_from_import(c, CHILD(n, i));
2736 com_addbyte(c, POP_TOP);
2737 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 }
2740 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002741 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002743 node *subn = CHILD(n, i);
2744 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002745 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002746 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002747 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002748 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002749 int j;
2750 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002751 com_error(c, PyExc_SyntaxError,
2752 "invalid syntax");
2753 return;
2754 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002755 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2756 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002757 CHILD(CHILD(subn, 0),
2758 j));
2759 com_addop_varname(c, VAR_STORE,
2760 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002761 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002762 com_addop_varname(c, VAR_STORE,
2763 STR(CHILD(CHILD(subn, 0),
2764 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 }
2767 }
2768}
2769
2770static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002771com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002772{
2773 REQ(n, exec_stmt);
2774 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2775 com_node(c, CHILD(n, 1));
2776 if (NCH(n) >= 4)
2777 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002779 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002780 com_push(c, 1);
2781 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002782 if (NCH(n) >= 6)
2783 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002785 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002786 com_push(c, 1);
2787 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002788 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002789 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002790}
2791
Guido van Rossum7c531111997-03-11 18:42:21 +00002792static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002793is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002794{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002795 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002796 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002797 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002798
2799 /* Label to avoid tail recursion */
2800 next:
2801 switch (TYPE(n)) {
2802
2803 case suite:
2804 if (NCH(n) == 1) {
2805 n = CHILD(n, 0);
2806 goto next;
2807 }
2808 /* Fall through */
2809 case file_input:
2810 for (i = 0; i < NCH(n); i++) {
2811 node *ch = CHILD(n, i);
2812 if (TYPE(ch) == stmt) {
2813 n = ch;
2814 goto next;
2815 }
2816 }
2817 break;
2818
2819 case stmt:
2820 case simple_stmt:
2821 case small_stmt:
2822 n = CHILD(n, 0);
2823 goto next;
2824
2825 case expr_stmt:
2826 case testlist:
2827 case test:
2828 case and_test:
2829 case not_test:
2830 case comparison:
2831 case expr:
2832 case xor_expr:
2833 case and_expr:
2834 case shift_expr:
2835 case arith_expr:
2836 case term:
2837 case factor:
2838 case power:
2839 case atom:
2840 if (NCH(n) == 1) {
2841 n = CHILD(n, 0);
2842 goto next;
2843 }
2844 break;
2845
2846 case NAME:
2847 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2848 return 1;
2849 break;
2850
2851 case NUMBER:
2852 v = parsenumber(c, STR(n));
2853 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002854 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002855 break;
2856 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002857 i = PyObject_IsTrue(v);
2858 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002859 return i == 0;
2860
2861 case STRING:
Guido van Rossum6af0c001997-03-11 21:25:55 +00002862 v = parsestr(STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002863 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002864 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002865 break;
2866 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002867 i = PyObject_IsTrue(v);
2868 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002869 return i == 0;
2870
2871 }
2872 return 0;
2873}
2874
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002875static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002876com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877{
2878 int i;
2879 int anchor = 0;
2880 REQ(n, if_stmt);
2881 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
2882 for (i = 0; i+3 < NCH(n); i+=4) {
2883 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002884 node *ch = CHILD(n, i+1);
Guido van Rossum7c531111997-03-11 18:42:21 +00002885 if (is_constant_false(c, ch))
2886 continue;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002887 if (i > 0)
2888 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00002889 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 com_addfwref(c, JUMP_IF_FALSE, &a);
2891 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 com_node(c, CHILD(n, i+3));
2894 com_addfwref(c, JUMP_FORWARD, &anchor);
2895 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002896 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 com_addbyte(c, POP_TOP);
2898 }
2899 if (i+2 < NCH(n))
2900 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00002901 if (anchor)
2902 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903}
2904
2905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002906com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907{
2908 int break_anchor = 0;
2909 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002910 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
2912 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002913 block_push(c, SETUP_LOOP);
2914 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002915 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 com_node(c, CHILD(n, 1));
2917 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2918 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002919 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002920 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002922 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002923 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2924 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002926 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927 com_addbyte(c, POP_TOP);
2928 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002929 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002930 if (NCH(n) > 4)
2931 com_node(c, CHILD(n, 6));
2932 com_backpatch(c, break_anchor);
2933}
2934
2935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002936com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002937{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002938 int break_anchor = 0;
2939 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002940 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 REQ(n, for_stmt);
2942 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
2943 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002944 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002946 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002947 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002948 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002949 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002951 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002952 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00002954 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002955 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2956 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002958 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002960 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 if (NCH(n) > 8)
2962 com_node(c, CHILD(n, 8));
2963 com_backpatch(c, break_anchor);
2964}
2965
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002966/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002967
2968 SETUP_FINALLY L
2969 <code for S>
2970 POP_BLOCK
2971 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002972 L: <code for Sf>
2973 END_FINALLY
2974
2975 The special instructions use the block stack. Each block
2976 stack entry contains the instruction that created it (here
2977 SETUP_FINALLY), the level of the value stack at the time the
2978 block stack entry was created, and a label (here L).
2979
2980 SETUP_FINALLY:
2981 Pushes the current value stack level and the label
2982 onto the block stack.
2983 POP_BLOCK:
2984 Pops en entry from the block stack, and pops the value
2985 stack until its level is the same as indicated on the
2986 block stack. (The label is ignored.)
2987 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00002988 Pops a variable number of entries from the *value* stack
2989 and re-raises the exception they specify. The number of
2990 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002991
2992 The block stack is unwound when an exception is raised:
2993 when a SETUP_FINALLY entry is found, the exception is pushed
2994 onto the value stack (and the exception condition is cleared),
2995 and the interpreter jumps to the label gotten from the block
2996 stack.
2997
2998 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00002999 (The contents of the value stack is shown in [], with the top
3000 at the right; 'tb' is trace-back info, 'val' the exception's
3001 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003002
3003 Value stack Label Instruction Argument
3004 [] SETUP_EXCEPT L1
3005 [] <code for S>
3006 [] POP_BLOCK
3007 [] JUMP_FORWARD L0
3008
Guido van Rossum3f5da241990-12-20 15:06:42 +00003009 [tb, val, exc] L1: DUP )
3010 [tb, val, exc, exc] <evaluate E1> )
3011 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3012 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3013 [tb, val, exc, 1] POP )
3014 [tb, val, exc] POP
3015 [tb, val] <assign to V1> (or POP if no V1)
3016 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003017 [] <code for S1>
3018 JUMP_FORWARD L0
3019
Guido van Rossum3f5da241990-12-20 15:06:42 +00003020 [tb, val, exc, 0] L2: POP
3021 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003022 .............................etc.......................
3023
Guido van Rossum3f5da241990-12-20 15:06:42 +00003024 [tb, val, exc, 0] Ln+1: POP
3025 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003026
3027 [] L0: <next statement>
3028
3029 Of course, parts are not generated if Vi or Ei is not present.
3030*/
3031
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003033com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003034{
3035 int except_anchor = 0;
3036 int end_anchor = 0;
3037 int else_anchor = 0;
3038 int i;
3039 node *ch;
3040
3041 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3042 block_push(c, SETUP_EXCEPT);
3043 com_node(c, CHILD(n, 2));
3044 com_addbyte(c, POP_BLOCK);
3045 block_pop(c, SETUP_EXCEPT);
3046 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3047 com_backpatch(c, except_anchor);
3048 for (i = 3;
3049 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3050 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003052 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003053 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003054 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003055 break;
3056 }
3057 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003059 com_addoparg(c, SET_LINENO, ch->n_lineno);
3060 if (NCH(ch) > 1) {
3061 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003062 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003063 com_node(c, CHILD(ch, 1));
3064 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003065 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003066 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3067 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003069 }
3070 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003071 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003072 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003073 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003074 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003075 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_pop(c, 1);
3077 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003078 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003080 com_node(c, CHILD(n, i+2));
3081 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3082 if (except_anchor) {
3083 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 /* We come in with [tb, val, exc, 0] on the
3085 stack; one pop and it's the same as
3086 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003087 com_addbyte(c, POP_TOP);
3088 }
3089 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 /* We actually come in here with [tb, val, exc] but the
3091 END_FINALLY will zap those and jump around.
3092 The c_stacklevel does not reflect them so we need not pop
3093 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003094 com_addbyte(c, END_FINALLY);
3095 com_backpatch(c, else_anchor);
3096 if (i < NCH(n))
3097 com_node(c, CHILD(n, i+2));
3098 com_backpatch(c, end_anchor);
3099}
3100
3101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103{
3104 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003105 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003106
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003107 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3108 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003110 com_addbyte(c, POP_BLOCK);
3111 block_pop(c, SETUP_FINALLY);
3112 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003113 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003114 /* While the generated code pushes only one item,
3115 the try-finally handling can enter here with
3116 up to three items. OK, here are the details:
3117 3 for an exception, 2 for RETURN, 1 for BREAK. */
3118 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003119 com_backpatch(c, finally_anchor);
3120 ch = CHILD(n, NCH(n)-1);
3121 com_addoparg(c, SET_LINENO, ch->n_lineno);
3122 com_node(c, ch);
3123 com_addbyte(c, END_FINALLY);
3124 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003126}
3127
3128static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003129com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003130{
3131 REQ(n, try_stmt);
3132 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3133 | 'try' ':' suite 'finally' ':' suite */
3134 if (TYPE(CHILD(n, 3)) != except_clause)
3135 com_try_finally(c, n);
3136 else
3137 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138}
3139
Guido van Rossum8b993a91997-01-17 21:04:03 +00003140static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003141get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003142{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003143 int i;
3144
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145 /* Label to avoid tail recursion */
3146 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003147 switch (TYPE(n)) {
3148
3149 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 if (NCH(n) == 1) {
3151 n = CHILD(n, 0);
3152 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003153 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003154 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003155 case file_input:
3156 for (i = 0; i < NCH(n); i++) {
3157 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 if (TYPE(ch) == stmt) {
3159 n = ch;
3160 goto next;
3161 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003162 }
3163 break;
3164
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003165 case stmt:
3166 case simple_stmt:
3167 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 n = CHILD(n, 0);
3169 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003170
3171 case expr_stmt:
3172 case testlist:
3173 case test:
3174 case and_test:
3175 case not_test:
3176 case comparison:
3177 case expr:
3178 case xor_expr:
3179 case and_expr:
3180 case shift_expr:
3181 case arith_expr:
3182 case term:
3183 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003184 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 if (NCH(n) == 1) {
3186 n = CHILD(n, 0);
3187 goto next;
3188 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003189 break;
3190
3191 case atom:
3192 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003193 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003194 break;
3195
3196 }
3197 return NULL;
3198}
3199
Guido van Rossum79f25d91997-04-29 20:08:16 +00003200static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003201get_docstring(node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202{
Guido van Rossum541563e1999-01-28 15:08:09 +00003203 /* Don't generate doc-strings if run with -OO */
3204 if (Py_OptimizeFlag > 1)
3205 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 n = get_rawdocstring(n);
3207 if (n == NULL)
3208 return NULL;
3209 return parsestrplus(n);
3210}
3211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003213com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214{
3215 REQ(n, suite);
3216 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3217 if (NCH(n) == 1) {
3218 com_node(c, CHILD(n, 0));
3219 }
3220 else {
3221 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003222 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 node *ch = CHILD(n, i);
3224 if (TYPE(ch) == stmt)
3225 com_node(c, ch);
3226 }
3227 }
3228}
3229
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003230/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003232com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003233{
3234 int i = c->c_nblocks;
3235 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3236 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3237 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003238 else if (i <= 0) {
3239 /* at the outer level */
3240 com_error(c, PyExc_SyntaxError,
3241 "'continue' not properly in loop");
3242 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003243 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003244 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003245 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003246 if (c->c_block[j] == SETUP_LOOP)
3247 break;
3248 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003249 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003250 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003251 for (; i > j; --i) {
3252 if (c->c_block[i] == SETUP_EXCEPT ||
3253 c->c_block[i] == SETUP_FINALLY) {
3254 com_addoparg(c, CONTINUE_LOOP,
3255 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003256 return;
3257 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003258 if (c->c_block[i] == END_FINALLY) {
3259 com_error(c, PyExc_SyntaxError,
3260 "'continue' not supported inside 'finally' clause");
3261 return;
3262 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003263 }
3264 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003265 com_error(c, PyExc_SyntaxError,
3266 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003267 }
3268 /* XXX Could allow it inside a 'finally' clause
3269 XXX if we could pop the exception still on the stack */
3270}
3271
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003273com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003275 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003276 if (TYPE(n) == lambdef) {
3277 /* lambdef: 'lambda' [varargslist] ':' test */
3278 n = CHILD(n, 1);
3279 }
3280 else {
3281 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3282 n = CHILD(n, 2);
3283 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3284 n = CHILD(n, 1);
3285 }
3286 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003287 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003288 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003289 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003290 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3291 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 nargs = 0;
3293 ndefs = 0;
3294 for (i = 0; i < nch; i++) {
3295 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003296 if (TYPE(CHILD(n, i)) == STAR ||
3297 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003298 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003299 nargs++;
3300 i++;
3301 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003302 t = RPAR; /* Anything except EQUAL or COMMA */
3303 else
3304 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 if (t == EQUAL) {
3306 i++;
3307 ndefs++;
3308 com_node(c, CHILD(n, i));
3309 i++;
3310 if (i >= nch)
3311 break;
3312 t = TYPE(CHILD(n, i));
3313 }
3314 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003315 /* Treat "(a=1, b)" as an error */
3316 if (ndefs)
3317 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003318 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003319 }
3320 if (t != COMMA)
3321 break;
3322 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003323 return ndefs;
3324}
3325
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003329 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003330 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003332 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003333 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3334 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003335 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003336 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003337 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338 c->c_errors++;
3339 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003340 int closure = com_make_closure(c, (PyCodeObject *)co);
3341 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003344 if (closure)
3345 com_addoparg(c, MAKE_CLOSURE, ndefs);
3346 else
3347 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003349 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003351 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003352 }
3353}
3354
3355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003356com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003357{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003358 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003359 REQ(n, testlist);
3360 /* testlist: test (',' test)* [','] */
3361 for (i = 0; i < NCH(n); i += 2)
3362 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 i = (NCH(n)+1) / 2;
3364 com_addoparg(c, BUILD_TUPLE, i);
3365 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003366}
3367
3368static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003369com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370{
Guido van Rossum25831651993-05-19 14:50:45 +00003371 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003372 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003373 char *name;
3374
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003376 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003377 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003378 c->c_errors++;
3379 return;
3380 }
3381 /* Push the class name on the stack */
3382 i = com_addconst(c, v);
3383 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003384 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003385 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003386 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003388 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 com_push(c, 1);
3390 }
Guido van Rossum25831651993-05-19 14:50:45 +00003391 else
3392 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003393 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003394 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003395 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003396 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003397 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003398 c->c_errors++;
3399 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003400 int closure = com_make_closure(c, (PyCodeObject *)co);
3401 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003402 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003403 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003404 if (closure)
3405 com_addoparg(c, MAKE_CLOSURE, 0);
3406 else
3407 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003408 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003409 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003410 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003411 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003412 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003413 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414}
3415
3416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003417com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003419 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003420 if (c->c_errors)
3421 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 switch (TYPE(n)) {
3423
3424 /* Definition nodes */
3425
3426 case funcdef:
3427 com_funcdef(c, n);
3428 break;
3429 case classdef:
3430 com_classdef(c, n);
3431 break;
3432
3433 /* Trivial parse tree nodes */
3434
3435 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003436 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003438 n = CHILD(n, 0);
3439 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003440
3441 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003442 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3443 com_addoparg(c, SET_LINENO, n->n_lineno);
3444 {
3445 int i;
3446 for (i = 0; i < NCH(n)-1; i += 2)
3447 com_node(c, CHILD(n, i));
3448 }
3449 break;
3450
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003452 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003453 n = CHILD(n, 0);
3454 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455
3456 /* Statement nodes */
3457
3458 case expr_stmt:
3459 com_expr_stmt(c, n);
3460 break;
3461 case print_stmt:
3462 com_print_stmt(c, n);
3463 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003464 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003465 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 case pass_stmt:
3468 break;
3469 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003470 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003471 com_error(c, PyExc_SyntaxError,
3472 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 com_addbyte(c, BREAK_LOOP);
3475 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003476 case continue_stmt:
3477 com_continue_stmt(c, n);
3478 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 case return_stmt:
3480 com_return_stmt(c, n);
3481 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003482 case yield_stmt:
3483 com_yield_stmt(c, n);
3484 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003485 case raise_stmt:
3486 com_raise_stmt(c, n);
3487 break;
3488 case import_stmt:
3489 com_import_stmt(c, n);
3490 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003491 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003492 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003493 case exec_stmt:
3494 com_exec_stmt(c, n);
3495 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003496 case assert_stmt:
3497 com_assert_stmt(c, n);
3498 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 case if_stmt:
3500 com_if_stmt(c, n);
3501 break;
3502 case while_stmt:
3503 com_while_stmt(c, n);
3504 break;
3505 case for_stmt:
3506 com_for_stmt(c, n);
3507 break;
3508 case try_stmt:
3509 com_try_stmt(c, n);
3510 break;
3511 case suite:
3512 com_suite(c, n);
3513 break;
3514
3515 /* Expression nodes */
3516
3517 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003518 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 break;
3520 case test:
3521 com_test(c, n);
3522 break;
3523 case and_test:
3524 com_and_test(c, n);
3525 break;
3526 case not_test:
3527 com_not_test(c, n);
3528 break;
3529 case comparison:
3530 com_comparison(c, n);
3531 break;
3532 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003533 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534 break;
3535 case expr:
3536 com_expr(c, n);
3537 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003538 case xor_expr:
3539 com_xor_expr(c, n);
3540 break;
3541 case and_expr:
3542 com_and_expr(c, n);
3543 break;
3544 case shift_expr:
3545 com_shift_expr(c, n);
3546 break;
3547 case arith_expr:
3548 com_arith_expr(c, n);
3549 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550 case term:
3551 com_term(c, n);
3552 break;
3553 case factor:
3554 com_factor(c, n);
3555 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003556 case power:
3557 com_power(c, n);
3558 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559 case atom:
3560 com_atom(c, n);
3561 break;
3562
3563 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003564 com_error(c, PyExc_SystemError,
3565 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 }
3567}
3568
Tim Petersdbd9ba62000-07-09 03:09:57 +00003569static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570
3571static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003572com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003573{
3574 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3575 if (TYPE(CHILD(n, 0)) == LPAR)
3576 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003578 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 com_pop(c, 1);
3580 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581}
3582
3583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003586 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587 if (NCH(n) == 1) {
3588 com_fpdef(c, CHILD(n, 0));
3589 }
3590 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003592 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003593 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003594 for (i = 0; i < NCH(n); i += 2)
3595 com_fpdef(c, CHILD(n, i));
3596 }
3597}
3598
3599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003600com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003601{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003602 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003604 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003605 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003606 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003607 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003608 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003609 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003610 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003611 node *ch = CHILD(n, i);
3612 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003613 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003614 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003615 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3616 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003617 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003618 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003619 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003620 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003621 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003622 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003623 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003624 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003625 ch = CHILD(n, i);
3626 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003627 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003628 else
3629 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003630 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003631 if (complex) {
3632 /* Generate code for complex arguments only after
3633 having counted the simple arguments */
3634 int ilocal = 0;
3635 for (i = 0; i < nch; i++) {
3636 node *ch = CHILD(n, i);
3637 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003638 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003639 break;
3640 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3641 fp = CHILD(ch, 0);
3642 if (TYPE(fp) != NAME) {
3643 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003644 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003645 com_fpdef(c, ch);
3646 }
3647 ilocal++;
3648 if (++i >= nch)
3649 break;
3650 ch = CHILD(n, i);
3651 if (TYPE(ch) == EQUAL)
3652 i += 2;
3653 else
3654 REQ(ch, COMMA);
3655 }
3656 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003657}
3658
3659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003660com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661{
3662 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003663 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003664 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003665 doc = get_docstring(n);
3666 if (doc != NULL) {
3667 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003668 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003669 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003671 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003673 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674 for (i = 0; i < NCH(n); i++) {
3675 node *ch = CHILD(n, i);
3676 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3677 com_node(c, ch);
3678 }
3679}
3680
3681/* Top-level compile-node interface */
3682
3683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003684compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003685{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003687 node *ch;
3688 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003689 c->c_name = STR(CHILD(n, 1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003690 doc = get_docstring(CHILD(n, 4));
3691 if (doc != NULL) {
3692 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003693 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003694 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003695 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003696 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003697 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3698 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003699 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003700 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003701 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003703 c->c_infunction = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +00003704 if (c->c_flags & CO_GENERATOR) {
3705 com_addoparg(c, LOAD_CONST,
3706 com_addconst(c, PyExc_StopIteration));
3707 com_push(c, 1);
3708 com_addoparg(c, RAISE_VARARGS, 1);
3709 com_pop(c, 1);
3710 }
3711 else {
3712 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3713 com_push(c, 1);
3714 com_addbyte(c, RETURN_VALUE);
3715 com_pop(c, 1);
3716 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003717}
3718
3719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003720compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003721{
Guido van Rossum590baa41993-11-30 13:40:46 +00003722 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003723 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003724 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003725
3726 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003727 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003728 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003729 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003730 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003731 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003732 else
3733 ch = CHILD(n, 2);
3734 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003735 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003736 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003737}
3738
3739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003740compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003741{
3742 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003743 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003744 REQ(n, classdef);
3745 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3746 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003747 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003748 ch = CHILD(n, NCH(n)-1); /* The suite */
3749 doc = get_docstring(ch);
3750 if (doc != NULL) {
3751 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003752 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003753 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003755 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003757 }
3758 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003759 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003760 com_node(c, ch);
3761 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003763 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003764 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003765}
3766
3767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003768compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003770 com_addoparg(c, SET_LINENO, n->n_lineno);
3771
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772 switch (TYPE(n)) {
3773
Guido van Rossum4c417781991-01-21 16:09:22 +00003774 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003776 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 n = CHILD(n, 0);
3778 if (TYPE(n) != NEWLINE)
3779 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003780 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003782 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003783 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003784 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003785 break;
3786
Guido van Rossum4c417781991-01-21 16:09:22 +00003787 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003789 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003790 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003791 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003792 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 break;
3794
Guido van Rossum590baa41993-11-30 13:40:46 +00003795 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003796 com_node(c, CHILD(n, 0));
3797 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003798 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003799 break;
3800
Guido van Rossum590baa41993-11-30 13:40:46 +00003801 case lambdef: /* anonymous function definition */
3802 compile_lambdef(c, n);
3803 break;
3804
Guido van Rossum4c417781991-01-21 16:09:22 +00003805 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003806 compile_funcdef(c, n);
3807 break;
3808
Guido van Rossum4c417781991-01-21 16:09:22 +00003809 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003810 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003811 break;
3812
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003814 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003815 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816 }
3817}
3818
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003819static PyObject *
3820dict_keys_inorder(PyObject *dict, int offset)
3821{
3822 PyObject *tuple, *k, *v;
3823 int i, pos = 0, size = PyDict_Size(dict);
3824
3825 tuple = PyTuple_New(size);
3826 if (tuple == NULL)
3827 return NULL;
3828 while (PyDict_Next(dict, &pos, &k, &v)) {
3829 i = PyInt_AS_LONG(v);
3830 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003831 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003832 PyTuple_SET_ITEM(tuple, i - offset, k);
3833 }
3834 return tuple;
3835}
3836
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003838PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003840 return PyNode_CompileFlags(n, filename, NULL);
3841}
3842
3843PyCodeObject *
3844PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3845{
3846 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003847}
3848
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003849struct symtable *
3850PyNode_CompileSymtable(node *n, char *filename)
3851{
3852 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003853 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003854
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003855 ff = PyNode_Future(n, filename);
3856 if (ff == NULL)
3857 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003858 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003859 if (st == NULL)
3860 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003861 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003862 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003863 if (st->st_errors > 0)
3864 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003865 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003866 if (st->st_errors > 0)
3867 goto fail;
3868
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003869 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003870 fail:
3871 PyMem_Free((void *)ff);
3872 st->st_future = NULL;
3873 PySymtable_Free(st);
3874 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003875}
3876
Guido van Rossum79f25d91997-04-29 20:08:16 +00003877static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003878icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003879{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003880 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003881}
3882
Guido van Rossum79f25d91997-04-29 20:08:16 +00003883static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003884jcompile(node *n, char *filename, struct compiling *base,
3885 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003886{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003888 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00003889 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003891 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003892 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003893 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003894 /* c_symtable still points to parent's symbols */
3895 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003896 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003897 sc.c_nested = 1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003898 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003899 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00003900 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003901 if (sc.c_future == NULL) {
3902 com_free(&sc);
3903 return NULL;
3904 }
3905 if (flags) {
3906 if (flags->cf_nested_scopes)
3907 sc.c_future->ff_nested_scopes = 1;
3908 else if (sc.c_future->ff_nested_scopes)
3909 flags->cf_nested_scopes = 1;
3910 }
3911 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003912 com_free(&sc);
3913 return NULL;
3914 }
3915 }
3916 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003917 if (symtable_load_symbols(&sc) < 0) {
3918 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003919 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003920 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003921 compile_node(&sc, n);
3922 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00003923 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003924 PyObject *consts, *names, *varnames, *filename, *name,
3925 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003926 consts = PyList_AsTuple(sc.c_consts);
3927 names = PyList_AsTuple(sc.c_names);
3928 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003929 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
3930 freevars = dict_keys_inorder(sc.c_freevars,
3931 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003932 filename = PyString_InternFromString(sc.c_filename);
3933 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003934 if (!PyErr_Occurred())
3935 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003936 sc.c_nlocals,
3937 sc.c_maxstacklevel,
3938 sc.c_flags,
3939 sc.c_code,
3940 consts,
3941 names,
3942 varnames,
3943 freevars,
3944 cellvars,
3945 filename,
3946 name,
3947 sc.c_firstlineno,
3948 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003949 Py_XDECREF(consts);
3950 Py_XDECREF(names);
3951 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003952 Py_XDECREF(freevars);
3953 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003954 Py_XDECREF(filename);
3955 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00003956 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00003957 else if (!PyErr_Occurred()) {
3958 /* This could happen if someone called PyErr_Clear() after an
3959 error was reported above. That's not supposed to happen,
3960 but I just plugged one case and I'm not sure there can't be
3961 others. In that case, raise SystemError so that at least
3962 it gets reported instead dumping core. */
3963 PyErr_SetString(PyExc_SystemError, "lost syntax error");
3964 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003965 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003966 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003967 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00003968 sc.c_symtable = NULL;
3969 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003971 return co;
3972}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003973
3974int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003975PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003976{
3977 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00003978 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00003979 int line = co->co_firstlineno;
3980 int addr = 0;
3981 while (--size >= 0) {
3982 addr += *p++;
3983 if (addr > addrq)
3984 break;
3985 line += *p++;
3986 }
3987 return line;
3988}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003989
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003990/* The test for LOCAL must come before the test for FREE in order to
3991 handle classes where name is both local and free. The local var is
3992 a method and the free var is a free var referenced within a method.
3993*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003994
3995static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003996get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003997{
3998 PyObject *v;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003999 if (c->c_symtable->st_nested_scopes) {
4000 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4001 return CELL;
4002 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4003 return LOCAL;
4004 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4005 return FREE;
4006 v = PyDict_GetItemString(c->c_globals, name);
4007 if (v) {
4008 if (v == Py_None)
4009 return GLOBAL_EXPLICIT;
4010 else {
4011 return GLOBAL_IMPLICIT;
4012 }
4013 }
4014 } else {
4015 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4016 return LOCAL;
4017 v = PyDict_GetItemString(c->c_globals, name);
4018 if (v) {
4019 if (v == Py_None)
4020 return GLOBAL_EXPLICIT;
4021 else {
4022 return GLOBAL_IMPLICIT;
4023 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004024 }
4025 }
4026 {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004027 char buf[350];
4028 sprintf(buf,
Jeremy Hylton51257732001-03-01 00:42:55 +00004029 "unknown scope for %.100s in %.100s(%s) "
4030 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
Jeremy Hylton483638c2001-02-01 20:20:45 +00004031 name, c->c_name,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004032 PyObject_REPR(c->c_symtable->st_cur->ste_id),
Jeremy Hylton51257732001-03-01 00:42:55 +00004033 c->c_filename,
4034 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4035 PyObject_REPR(c->c_locals),
4036 PyObject_REPR(c->c_globals)
4037 );
4038
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004039 Py_FatalError(buf);
4040 }
4041 return -1; /* can't get here */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004042}
4043
Guido van Rossum207fda62001-03-02 03:30:41 +00004044/* Helper functions to issue warnings */
4045
4046static int
4047issue_warning(char *msg, char *filename, int lineno)
4048{
4049 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4050 lineno, NULL, NULL) < 0) {
4051 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4052 PyErr_SetString(PyExc_SyntaxError, msg);
4053 PyErr_SyntaxLocation(filename, lineno);
4054 }
4055 return -1;
4056 }
4057 return 0;
4058}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004059
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004060static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004061symtable_warn(struct symtable *st, char *msg)
4062{
Guido van Rossum207fda62001-03-02 03:30:41 +00004063 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004064 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004065 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004066 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004067 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004068}
4069
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004070/* Helper function for setting lineno and filename */
4071
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004072static int
4073symtable_build(struct compiling *c, node *n)
4074{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004075 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004076 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004077 c->c_symtable->st_future = c->c_future;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004078 if (c->c_future->ff_nested_scopes)
4079 c->c_symtable->st_nested_scopes = 1;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004080 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004081 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4082 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004083 return -1;
4084 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004085 if (c->c_symtable->st_errors > 0)
4086 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004087 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004088 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004089 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004090 return 0;
4091}
4092
4093static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004094symtable_init_compiling_symbols(struct compiling *c)
4095{
4096 PyObject *varnames;
4097
4098 varnames = c->c_symtable->st_cur->ste_varnames;
4099 if (varnames == NULL) {
4100 varnames = PyList_New(0);
4101 if (varnames == NULL)
4102 return -1;
4103 c->c_symtable->st_cur->ste_varnames = varnames;
4104 Py_INCREF(varnames);
4105 } else
4106 Py_INCREF(varnames);
4107 c->c_varnames = varnames;
4108
4109 c->c_globals = PyDict_New();
4110 if (c->c_globals == NULL)
4111 return -1;
4112 c->c_freevars = PyDict_New();
4113 if (c->c_freevars == NULL)
4114 return -1;
4115 c->c_cellvars = PyDict_New();
4116 if (c->c_cellvars == NULL)
4117 return -1;
4118 return 0;
4119}
4120
4121struct symbol_info {
4122 int si_nlocals;
4123 int si_ncells;
4124 int si_nfrees;
4125 int si_nimplicit;
4126};
4127
4128static void
4129symtable_init_info(struct symbol_info *si)
4130{
4131 si->si_nlocals = 0;
4132 si->si_ncells = 0;
4133 si->si_nfrees = 0;
4134 si->si_nimplicit = 0;
4135}
4136
4137static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004138symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004139 struct symbol_info *si)
4140{
4141 PyObject *dict, *v;
4142
4143 /* Seperate logic for DEF_FREE. If it occurs in a function,
4144 it indicates a local that we must allocate storage for (a
4145 cell var). If it occurs in a class, then the class has a
4146 method and a free variable with the same name.
4147 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004148 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004149 /* If it isn't declared locally, it can't be a cell. */
4150 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4151 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004152 v = PyInt_FromLong(si->si_ncells++);
4153 dict = c->c_cellvars;
4154 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004155 /* If it is free anyway, then there is no need to do
4156 anything here.
4157 */
4158 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004159 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004160 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004161 v = PyInt_FromLong(si->si_nfrees++);
4162 dict = c->c_freevars;
4163 }
4164 if (v == NULL)
4165 return -1;
4166 if (PyDict_SetItem(dict, name, v) < 0) {
4167 Py_DECREF(v);
4168 return -1;
4169 }
4170 Py_DECREF(v);
4171 return 0;
4172}
4173
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004174/* If a variable is a cell and an argument, make sure that appears in
4175 co_cellvars before any variable to its right in varnames.
4176*/
4177
4178
4179static int
4180symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4181 PyObject *varnames, int flags)
4182{
4183 PyObject *v, *w, *d, *list = NULL;
4184 int i, pos;
4185
4186 if (flags & CO_VARARGS)
4187 argcount++;
4188 if (flags & CO_VARKEYWORDS)
4189 argcount++;
4190 for (i = argcount; --i >= 0; ) {
4191 v = PyList_GET_ITEM(varnames, i);
4192 if (PyDict_GetItem(*cellvars, v)) {
4193 if (list == NULL) {
4194 list = PyList_New(1);
4195 if (list == NULL)
4196 return -1;
4197 PyList_SET_ITEM(list, 0, v);
4198 Py_INCREF(v);
4199 } else
4200 PyList_Insert(list, 0, v);
4201 }
4202 }
4203 if (list == NULL || PyList_GET_SIZE(list) == 0)
4204 return 0;
4205 /* There are cellvars that are also arguments. Create a dict
4206 to replace cellvars and put the args at the front.
4207 */
4208 d = PyDict_New();
4209 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4210 v = PyInt_FromLong(i);
4211 if (v == NULL)
4212 goto fail;
4213 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4214 goto fail;
4215 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4216 goto fail;
4217 }
4218 pos = 0;
4219 i = PyList_GET_SIZE(list);
4220 Py_DECREF(list);
4221 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4222 w = PyInt_FromLong(i++); /* don't care about the old key */
4223 if (PyDict_SetItem(d, v, w) < 0) {
4224 Py_DECREF(w);
4225 goto fail;
4226 }
4227 Py_DECREF(w);
4228 }
4229 Py_DECREF(*cellvars);
4230 *cellvars = d;
4231 return 1;
4232 fail:
4233 Py_DECREF(d);
4234 return -1;
4235}
4236
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004237static int
4238symtable_freevar_offsets(PyObject *freevars, int offset)
4239{
4240 PyObject *name, *v;
4241 int pos;
4242
4243 /* The cell vars are the first elements of the closure,
4244 followed by the free vars. Update the offsets in
4245 c_freevars to account for number of cellvars. */
4246 pos = 0;
4247 while (PyDict_Next(freevars, &pos, &name, &v)) {
4248 int i = PyInt_AS_LONG(v) + offset;
4249 PyObject *o = PyInt_FromLong(i);
4250 if (o == NULL)
4251 return -1;
4252 if (PyDict_SetItem(freevars, name, o) < 0) {
4253 Py_DECREF(o);
4254 return -1;
4255 }
4256 Py_DECREF(o);
4257 }
4258 return 0;
4259}
4260
4261static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004262symtable_check_unoptimized(struct compiling *c,
4263 PySymtableEntryObject *ste,
4264 struct symbol_info *si)
4265{
4266 char buf[300];
4267
4268 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4269 || (ste->ste_nested && si->si_nimplicit)))
4270 return 0;
4271
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004272#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4273
4274#define ILLEGAL_IS "is a nested function"
4275
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004276#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004277"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004278
4279#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004280"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004281
4282#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4283"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004284"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004285
4286 /* XXX perhaps the linenos for these opt-breaking statements
4287 should be stored so the exception can point to them. */
4288
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004289 if (ste->ste_child_free) {
4290 if (ste->ste_optimized == OPT_IMPORT_STAR)
4291 sprintf(buf, ILLEGAL_IMPORT_STAR,
4292 PyString_AS_STRING(ste->ste_name),
4293 ILLEGAL_CONTAINS);
4294 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4295 sprintf(buf, ILLEGAL_BARE_EXEC,
4296 PyString_AS_STRING(ste->ste_name),
4297 ILLEGAL_CONTAINS);
4298 else {
4299 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4300 PyString_AS_STRING(ste->ste_name),
4301 ILLEGAL_CONTAINS);
4302 }
4303 } else {
4304 if (ste->ste_optimized == OPT_IMPORT_STAR)
4305 sprintf(buf, ILLEGAL_IMPORT_STAR,
4306 PyString_AS_STRING(ste->ste_name),
4307 ILLEGAL_IS);
4308 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4309 sprintf(buf, ILLEGAL_BARE_EXEC,
4310 PyString_AS_STRING(ste->ste_name),
4311 ILLEGAL_IS);
4312 else {
4313 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4314 PyString_AS_STRING(ste->ste_name),
4315 ILLEGAL_IS);
4316 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004317 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004318
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004319 if (c->c_symtable->st_nested_scopes) {
4320 PyErr_SetString(PyExc_SyntaxError, buf);
4321 PyErr_SyntaxLocation(c->c_symtable->st_filename,
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004322 ste->ste_opt_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004323 return -1;
Guido van Rossum207fda62001-03-02 03:30:41 +00004324 }
4325 else {
4326 return issue_warning(buf, c->c_filename, ste->ste_lineno);
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004327 }
4328 return 0;
4329}
4330
4331static int
4332symtable_check_shadow(struct symtable *st, PyObject *name, int flags)
4333{
4334 char buf[500];
4335 PyObject *children, *v;
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004336 PySymtableEntryObject *child = NULL;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004337 int i;
4338
4339 if (!(flags & DEF_BOUND))
4340 return 0;
Jeremy Hylton9c901052001-05-08 04:12:34 +00004341
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004342 /* The semantics of this code will change with nested scopes.
4343 It is defined in the current scope and referenced in a
4344 child scope. Under the old rules, the child will see a
4345 global. Under the new rules, the child will see the
4346 binding in the current scope.
4347 */
4348
4349 /* Find name of child function that has free variable */
4350 children = st->st_cur->ste_children;
4351 for (i = 0; i < PyList_GET_SIZE(children); i++) {
4352 int cflags;
4353 child = (PySymtableEntryObject *)PyList_GET_ITEM(children, i);
4354 v = PyDict_GetItem(child->ste_symbols, name);
4355 if (v == NULL)
4356 continue;
4357 cflags = PyInt_AS_LONG(v);
4358 if (!(cflags & DEF_BOUND))
4359 break;
4360 }
Jeremy Hyltonc1761322001-02-28 23:44:45 +00004361
4362 assert(child != NULL);
4363
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004364 sprintf(buf, "local name '%.100s' in '%.100s' shadows "
4365 "use of '%.100s' as global in nested scope '%.100s'",
4366 PyString_AS_STRING(name),
4367 PyString_AS_STRING(st->st_cur->ste_name),
4368 PyString_AS_STRING(name),
4369 PyString_AS_STRING(child->ste_name)
4370 );
4371
4372 return symtable_warn(st, buf);
4373}
4374
4375static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004376symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4377 struct symbol_info *si)
4378{
Jeremy Hylton061d1062001-03-22 02:32:48 +00004379 if (c->c_future && c->c_future->ff_nested_scopes)
4380 c->c_flags |= CO_NESTED;
Tim Peters5ca576e2001-06-18 22:08:13 +00004381 if (ste->ste_generator)
4382 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004383 if (ste->ste_type != TYPE_MODULE)
4384 c->c_flags |= CO_NEWLOCALS;
4385 if (ste->ste_type == TYPE_FUNCTION) {
4386 c->c_nlocals = si->si_nlocals;
4387 if (ste->ste_optimized == 0)
4388 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004389 else if (ste->ste_optimized != OPT_EXEC)
4390 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004391 }
4392 return 0;
4393}
4394
4395static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004396symtable_load_symbols(struct compiling *c)
4397{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004398 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004400 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004401 PyObject *name, *varnames, *v;
4402 int i, flags, pos;
4403 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004404
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004405 if (implicit == NULL) {
4406 implicit = PyInt_FromLong(1);
4407 if (implicit == NULL)
4408 return -1;
4409 }
4410 v = NULL;
4411
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004412 if (symtable_init_compiling_symbols(c) < 0)
4413 goto fail;
4414 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004415 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004416 si.si_nlocals = PyList_GET_SIZE(varnames);
4417 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004418
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004419 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 v = PyInt_FromLong(i);
4421 if (PyDict_SetItem(c->c_locals,
4422 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004423 goto fail;
4424 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425 }
4426
4427 /* XXX The cases below define the rules for whether a name is
4428 local or global. The logic could probably be clearer. */
4429 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004430 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4431 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004433 if (st->st_nested_scopes == 0
4434 && (flags & (DEF_FREE | DEF_FREE_CLASS))) {
4435 if (symtable_check_shadow(st, name, flags) < 0)
4436 goto fail;
4437 }
4438
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004439 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004440 /* undo the original DEF_FREE */
4441 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004443 /* Deal with names that need two actions:
4444 1. Cell variables, which are also locals.
4445 2. Free variables in methods that are also class
4446 variables or declared global.
4447 */
Jeremy Hylton9c901052001-05-08 04:12:34 +00004448 if (st->st_nested_scopes) {
4449 if (flags & (DEF_FREE | DEF_FREE_CLASS)) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004450 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton9c901052001-05-08 04:12:34 +00004451 }
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004452 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004453
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004454 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004455 c->c_argcount--;
4456 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004457 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004458 c->c_argcount--;
4459 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004460 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004462 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004463 if (flags & DEF_PARAM) {
4464 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004465 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004466 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004467 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004468 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004470 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004471 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4472 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004473 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004474 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004475 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4476 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004477 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004478 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004479 if (v == NULL)
4480 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004481 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004482 goto fail;
4483 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004484 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004485 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004487 } else if (is_free(flags)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004488 if (ste->ste_nested && st->st_nested_scopes) {
4489 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004490 if (v == NULL)
4491 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004492 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004493 goto fail;
4494 Py_DECREF(v);
4495 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004496 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004497 if (PyDict_SetItem(c->c_globals, name,
4498 implicit) < 0)
4499 goto fail;
Jeremy Hylton51257732001-03-01 00:42:55 +00004500 if (st->st_nscopes != 1) {
4501 v = PyInt_FromLong(flags);
4502 if (PyDict_SetItem(st->st_global,
4503 name, v))
4504 goto fail;
4505 Py_DECREF(v);
4506 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508 }
4509 }
4510
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004511 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4512
Jeremy Hylton9c901052001-05-08 04:12:34 +00004513 if (st->st_nested_scopes == 0)
4514 assert(si.si_nfrees == 0);
4515
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004516 if (si.si_ncells > 1) { /* one cell is always in order */
4517 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4518 c->c_varnames, c->c_flags) < 0)
4519 return -1;
4520 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004521 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4522 return -1;
4523 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004524 fail:
4525 /* is this always the right thing to do? */
4526 Py_XDECREF(v);
4527 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004528}
4529
4530static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004531symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532{
4533 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004534
4535 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4536 if (st == NULL)
4537 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538 st->st_pass = 1;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004539 st->st_nested_scopes = NESTED_SCOPES_DEFAULT;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004540 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542 goto fail;
4543 if ((st->st_symbols = PyDict_New()) == NULL)
4544 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004545 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004546 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 st->st_errors = 0;
4548 st->st_tmpname = 0;
4549 st->st_private = NULL;
4550 return st;
4551 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004552 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004553 return NULL;
4554}
4555
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004556void
4557PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558{
4559 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004561 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004562 PyMem_Free((void *)st);
4563}
4564
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004565/* When the compiler exits a scope, it must should update the scope's
4566 free variable information with the list of free variables in its
4567 children.
4568
4569 Variables that are free in children and defined in the current
4570 scope are cellvars.
4571
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004572 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004573 false), free variables in children that are not defined here are
4574 implicit globals.
4575
4576*/
4577
4578static int
4579symtable_update_free_vars(struct symtable *st)
4580{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004581 int i, j, def;
4582 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004583 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004584
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004586 def = DEF_FREE_CLASS;
4587 else
4588 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004589 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 int pos = 0;
4591
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004592 if (list)
4593 PyList_SetSlice(list, 0,
4594 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004595 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004596 PyList_GET_ITEM(ste->ste_children, i);
4597 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004598 int flags = PyInt_AS_LONG(o);
4599 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004601 if (list == NULL) {
4602 list = PyList_New(0);
4603 if (list == NULL)
4604 return -1;
4605 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004606 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004607 if (PyList_Append(list, name) < 0) {
4608 Py_DECREF(list);
4609 return -1;
4610 }
4611 }
4612 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004613 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004614 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004615 v = PyDict_GetItem(ste->ste_symbols, name);
4616 /* If a name N is declared global in scope A and
4617 referenced in scope B contained (perhaps
4618 indirectly) in A and there are no scopes
4619 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004620 is global in B. Unless A is a class scope,
4621 because class scopes are not considered for
4622 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004623 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004624 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004625 int flags = PyInt_AS_LONG(v);
4626 if (flags & DEF_GLOBAL) {
4627 symtable_undo_free(st, child->ste_id,
4628 name);
4629 continue;
4630 }
4631 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004632 if (ste->ste_nested) {
4633 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004634 name, def) < 0) {
4635 Py_DECREF(list);
4636 return -1;
4637 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004639 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004640 name) < 0) {
4641 Py_DECREF(list);
4642 return -1;
4643 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 }
4645 }
4646 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004647
4648 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 return 0;
4650}
4651
4652/* If the current scope is a non-nested class or if name is not
4653 defined in the current, non-nested scope, then it is an implicit
4654 global in all nested scopes.
4655*/
4656
4657static int
4658symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4659{
4660 PyObject *o;
4661 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004662 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004663
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004664 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004666 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004667 if (o == NULL)
4668 return symtable_undo_free(st, child, name);
4669 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004670
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004671 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004672 return symtable_undo_free(st, child, name);
4673 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004674 return symtable_add_def_o(st, ste->ste_symbols,
4675 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004676}
4677
4678static int
4679symtable_undo_free(struct symtable *st, PyObject *id,
4680 PyObject *name)
4681{
4682 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004683 PyObject *info;
4684 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004685
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004686 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4687 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004688 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004689
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004691 if (info == NULL)
4692 return 0;
4693 v = PyInt_AS_LONG(info);
4694 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004695 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004696 DEF_FREE_GLOBAL) < 0)
4697 return -1;
4698 } else
4699 /* If the name is defined here or declared global,
4700 then the recursion stops. */
4701 return 0;
4702
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004703 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4704 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004705 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004706 PyList_GET_ITEM(ste->ste_children, i);
4707 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004708 if (x < 0)
4709 return x;
4710 }
4711 return 0;
4712}
4713
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004714/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4715 This reference is released when the scope is exited, via the DECREF
4716 in symtable_exit_scope().
4717*/
4718
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004719static int
4720symtable_exit_scope(struct symtable *st)
4721{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004722 int end;
4723
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004724 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004725 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004726 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004727 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004728 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4729 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 if (PySequence_DelItem(st->st_stack, end) < 0)
4731 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004732 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004733}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004734
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004735static void
4736symtable_enter_scope(struct symtable *st, char *name, int type,
4737 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004738{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004739 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004740
4741 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 prev = st->st_cur;
4743 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4744 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004745 st->st_errors++;
4746 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 }
4748 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004749 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004750 PySymtableEntry_New(st, name, type, lineno);
4751 if (strcmp(name, TOP) == 0)
4752 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004753 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004754 if (PyList_Append(prev->ste_children,
4755 (PyObject *)st->st_cur) < 0)
4756 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004757 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004758}
4759
4760static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004761symtable_lookup(struct symtable *st, char *name)
4762{
4763 char buffer[MANGLE_LEN];
4764 PyObject *v;
4765 int flags;
4766
4767 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4768 name = buffer;
4769 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4770 if (v == NULL) {
4771 if (PyErr_Occurred())
4772 return -1;
4773 else
4774 return 0;
4775 }
4776
4777 flags = PyInt_AS_LONG(v);
4778 return flags;
4779}
4780
4781static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004782symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004784 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004786 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004788 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 name = buffer;
4790 if ((s = PyString_InternFromString(name)) == NULL)
4791 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004792 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4793 Py_DECREF(s);
4794 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795}
4796
4797/* Must only be called with mangled names */
4798
4799static int
4800symtable_add_def_o(struct symtable *st, PyObject *dict,
4801 PyObject *name, int flag)
4802{
4803 PyObject *o;
4804 int val;
4805
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004806 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004807 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004809 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004810 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004811 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004812 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004813 return -1;
4814 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004815 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004816 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004818 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004820 Py_DECREF(o);
4821 return -1;
4822 }
4823 Py_DECREF(o);
4824
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004826 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004827 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004828 } else if (flag & DEF_GLOBAL) {
4829 /* XXX need to update DEF_GLOBAL for other flags too;
4830 perhaps only DEF_FREE_GLOBAL */
4831 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004832 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004833 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004838 Py_DECREF(o);
4839 return -1;
4840 }
4841 Py_DECREF(o);
4842 }
4843 return 0;
4844}
4845
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004846#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847
4848static void
4849symtable_node(struct symtable *st, node *n)
4850{
4851 int i, start = 0;
4852
4853 loop:
4854 switch (TYPE(n)) {
4855 case funcdef: {
4856 char *func_name = STR(CHILD(n, 1));
4857 symtable_add_def(st, func_name, DEF_LOCAL);
4858 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004859 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 symtable_funcdef(st, n);
4861 symtable_exit_scope(st);
4862 break;
4863 }
4864 case lambdef:
4865 if (NCH(n) == 4)
4866 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004867 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004868 symtable_funcdef(st, n);
4869 symtable_exit_scope(st);
4870 break;
4871 case classdef: {
4872 char *tmp, *class_name = STR(CHILD(n, 1));
4873 symtable_add_def(st, class_name, DEF_LOCAL);
4874 if (TYPE(CHILD(n, 2)) == LPAR) {
4875 node *bases = CHILD(n, 3);
4876 int i;
4877 for (i = 0; i < NCH(bases); i += 2) {
4878 symtable_node(st, CHILD(bases, i));
4879 }
4880 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004881 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004882 tmp = st->st_private;
4883 st->st_private = class_name;
4884 symtable_node(st, CHILD(n, NCH(n) - 1));
4885 st->st_private = tmp;
4886 symtable_exit_scope(st);
4887 break;
4888 }
4889 case if_stmt:
4890 for (i = 0; i + 3 < NCH(n); i += 4) {
4891 if (is_constant_false(NULL, (CHILD(n, i + 1))))
4892 continue;
4893 symtable_node(st, CHILD(n, i + 1));
4894 symtable_node(st, CHILD(n, i + 3));
4895 }
4896 if (i + 2 < NCH(n))
4897 symtable_node(st, CHILD(n, i + 2));
4898 break;
4899 case global_stmt:
4900 symtable_global(st, n);
4901 break;
4902 case import_stmt:
4903 symtable_import(st, n);
4904 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004905 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004906 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907 symtable_node(st, CHILD(n, 1));
4908 if (NCH(n) > 2)
4909 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004910 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004911 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00004912 st->st_cur->ste_opt_lineno = n->n_lineno;
4913 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914 if (NCH(n) > 4)
4915 symtable_node(st, CHILD(n, 5));
4916 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004917
4918 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00004919 case assert_stmt:
4920 if (Py_OptimizeFlag)
4921 return;
4922 if (NCH(n) == 2) {
4923 n = CHILD(n, 1);
4924 goto loop;
4925 } else {
4926 symtable_node(st, CHILD(n, 1));
4927 n = CHILD(n, 3);
4928 goto loop;
4929 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004930 case except_clause:
4931 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004932 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004933 if (NCH(n) > 1) {
4934 n = CHILD(n, 1);
4935 goto loop;
4936 }
4937 break;
4938 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004939 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004940 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004941 case yield_stmt:
4942 st->st_cur->ste_generator = 1;
4943 n = CHILD(n, 1);
4944 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004945 case expr_stmt:
4946 if (NCH(n) == 1)
4947 n = CHILD(n, 0);
4948 else {
4949 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004950 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951 symtable_node(st, CHILD(n, 2));
4952 break;
4953 } else {
4954 int i;
4955 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004956 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004957 n = CHILD(n, NCH(n) - 1);
4958 }
4959 }
4960 goto loop;
4961 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 case argument:
4963 if (NCH(n) == 3) {
4964 n = CHILD(n, 2);
4965 goto loop;
4966 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 case listmaker:
4968 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00004969 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00004971 symtable_node(st, CHILD(n, 0));
4972 st->st_tmpname--;
4973 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004974 }
4975 case atom:
4976 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
4977 symtable_add_use(st, STR(CHILD(n, 0)));
4978 break;
4979 }
4980 case for_stmt:
4981 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004982 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 start = 3;
4984 }
4985 default:
4986 if (NCH(n) == 1) {
4987 n = CHILD(n, 0);
4988 goto loop;
4989 }
4990 for (i = start; i < NCH(n); ++i)
4991 if (TYPE(CHILD(n, i)) >= single_input)
4992 symtable_node(st, CHILD(n, i));
4993 }
4994}
4995
4996static void
4997symtable_funcdef(struct symtable *st, node *n)
4998{
4999 node *body;
5000
5001 if (TYPE(n) == lambdef) {
5002 if (NCH(n) == 4)
5003 symtable_params(st, CHILD(n, 1));
5004 } else
5005 symtable_params(st, CHILD(n, 2));
5006 body = CHILD(n, NCH(n) - 1);
5007 symtable_node(st, body);
5008}
5009
5010/* The next two functions parse the argument tuple.
5011 symtable_default_arg() checks for names in the default arguments,
5012 which are references in the defining scope. symtable_params()
5013 parses the parameter names, which are defined in the function's
5014 body.
5015
5016 varargslist:
5017 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5018 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5019*/
5020
5021static void
5022symtable_default_args(struct symtable *st, node *n)
5023{
5024 node *c;
5025 int i;
5026
5027 if (TYPE(n) == parameters) {
5028 n = CHILD(n, 1);
5029 if (TYPE(n) == RPAR)
5030 return;
5031 }
5032 REQ(n, varargslist);
5033 for (i = 0; i < NCH(n); i += 2) {
5034 c = CHILD(n, i);
5035 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5036 break;
5037 }
5038 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5039 symtable_node(st, CHILD(n, i));
5040 }
5041}
5042
5043static void
5044symtable_params(struct symtable *st, node *n)
5045{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005046 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047 node *c = NULL;
5048
5049 if (TYPE(n) == parameters) {
5050 n = CHILD(n, 1);
5051 if (TYPE(n) == RPAR)
5052 return;
5053 }
5054 REQ(n, varargslist);
5055 for (i = 0; i < NCH(n); i += 2) {
5056 c = CHILD(n, i);
5057 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5058 ext = 1;
5059 break;
5060 }
5061 if (TYPE(c) == test) {
5062 continue;
5063 }
5064 if (TYPE(CHILD(c, 0)) == NAME)
5065 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5066 else {
5067 char nbuf[10];
5068 sprintf(nbuf, ".%d", i);
5069 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005070 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071 }
5072 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005073 if (ext) {
5074 c = CHILD(n, i);
5075 if (TYPE(c) == STAR) {
5076 i++;
5077 symtable_add_def(st, STR(CHILD(n, i)),
5078 DEF_PARAM | DEF_STAR);
5079 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005080 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005081 c = NULL;
5082 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005083 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005084 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005085 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 i++;
5087 symtable_add_def(st, STR(CHILD(n, i)),
5088 DEF_PARAM | DEF_DOUBLESTAR);
5089 }
5090 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005091 if (complex >= 0) {
5092 int j;
5093 for (j = 0; j <= complex; j++) {
5094 c = CHILD(n, j);
5095 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005096 c = CHILD(n, ++j);
5097 else if (TYPE(c) == EQUAL)
5098 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005099 if (TYPE(CHILD(c, 0)) == LPAR)
5100 symtable_params_fplist(st, CHILD(c, 1));
5101 }
5102 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005103}
5104
5105static void
5106symtable_params_fplist(struct symtable *st, node *n)
5107{
5108 int i;
5109 node *c;
5110
5111 REQ(n, fplist);
5112 for (i = 0; i < NCH(n); i += 2) {
5113 c = CHILD(n, i);
5114 REQ(c, fpdef);
5115 if (NCH(c) == 1)
5116 symtable_add_def(st, STR(CHILD(c, 0)),
5117 DEF_PARAM | DEF_INTUPLE);
5118 else
5119 symtable_params_fplist(st, CHILD(c, 1));
5120 }
5121
5122}
5123
5124static void
5125symtable_global(struct symtable *st, node *n)
5126{
5127 int i;
5128
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005129 /* XXX It might be helpful to warn about module-level global
5130 statements, but it's hard to tell the difference between
5131 module-level and a string passed to exec.
5132 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005133
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005134 for (i = 1; i < NCH(n); i += 2) {
5135 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005136 int flags;
5137
5138 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005139 if (flags < 0)
5140 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005141 if (flags && flags != DEF_GLOBAL) {
5142 char buf[500];
5143 if (flags & DEF_PARAM) {
5144 PyErr_Format(PyExc_SyntaxError,
5145 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005146 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005147 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005148 st->st_cur->ste_lineno);
5149 st->st_errors++;
5150 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005151 }
5152 else {
5153 if (flags & DEF_LOCAL)
5154 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5155 name);
5156 else
5157 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005158 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005159 }
5160 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005161 symtable_add_def(st, name, DEF_GLOBAL);
5162 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005163}
5164
5165static void
5166symtable_list_comprehension(struct symtable *st, node *n)
5167{
5168 char tmpname[12];
5169
Jeremy Hylton23b42272001-03-19 20:38:06 +00005170 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005172 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 symtable_node(st, CHILD(n, 3));
5174 if (NCH(n) == 5)
5175 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176}
5177
5178static void
5179symtable_import(struct symtable *st, node *n)
5180{
5181 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005182 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 | 'from' dotted_name 'import'
5184 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005185 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005186 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005188 node *dotname = CHILD(n, 1);
5189 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5190 /* check for bogus imports */
5191 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5192 PyErr_SetString(PyExc_SyntaxError,
5193 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005194 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005195 n->n_lineno);
5196 st->st_errors++;
5197 return;
5198 }
5199 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005200 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005201 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005202 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 } else {
5204 for (i = 3; i < NCH(n); i += 2) {
5205 node *c = CHILD(n, i);
5206 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005207 symtable_assign(st, CHILD(c, 2),
5208 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005210 symtable_assign(st, CHILD(c, 0),
5211 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 }
5213 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005214 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005215 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005216 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 }
5218 }
5219}
5220
5221static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005222symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223{
5224 node *tmp;
5225 int i;
5226
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005227 loop:
5228 switch (TYPE(n)) {
5229 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005230 /* invalid assignment, e.g. lambda x:x=2. The next
5231 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005232 return;
5233 case power:
5234 if (NCH(n) > 2) {
5235 for (i = 2; i < NCH(n); ++i)
5236 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5237 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005239 if (NCH(n) > 1) {
5240 symtable_node(st, CHILD(n, 0));
5241 symtable_node(st, CHILD(n, 1));
5242 } else {
5243 n = CHILD(n, 0);
5244 goto loop;
5245 }
5246 return;
5247 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005248 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5249 /* XXX This is an error, but the next pass
5250 will catch it. */
5251 return;
5252 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005253 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005254 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005255 }
5256 return;
5257 case exprlist:
5258 case testlist:
5259 if (NCH(n) == 1) {
5260 n = CHILD(n, 0);
5261 goto loop;
5262 }
5263 else {
5264 int i;
5265 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005266 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005267 return;
5268 }
5269 goto loop;
5270 case atom:
5271 tmp = CHILD(n, 0);
5272 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5273 n = CHILD(n, 1);
5274 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005275 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005276 if (strcmp(STR(tmp), "__debug__") == 0)
5277 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005278 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005279 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280 return;
5281 case dotted_as_name:
5282 if (NCH(n) == 3)
5283 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005284 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005285 else
5286 symtable_add_def(st,
5287 STR(CHILD(CHILD(n,
5288 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005289 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005290 return;
5291 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005292 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005293 return;
5294 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005295 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005296 return;
5297 default:
5298 if (NCH(n) == 0)
5299 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005300 if (NCH(n) == 1) {
5301 n = CHILD(n, 0);
5302 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005303 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005304 /* Should only occur for errors like x + 1 = 1,
5305 which will be caught in the next pass. */
5306 for (i = 0; i < NCH(n); ++i)
5307 if (TYPE(CHILD(n, i)) >= single_input)
5308 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 }
5310}