blob: d238a302a5e568cbb8b5cf4823edab423f5b4b46 [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 *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000523static PyObject *parsestrplus(struct compiling*, node *);
524static PyObject *parsestr(struct compiling *, 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') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001087 if (errno != 0)
1088 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001091 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001092#ifndef WITHOUT_COMPLEX
1093 if (imflag) {
1094 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001095 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001096 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001097 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001100 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001101#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001102 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001103 PyFPE_START_PROTECT("atof", return 0)
1104 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001105 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001107 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001108}
1109
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001111parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001114 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115 char *buf;
1116 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001117 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001119 int first = *s;
1120 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001121 int rawmode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001122#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001123 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001124#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001125 if (isalpha(quote) || quote == '_') {
1126 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001127#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001128 quote = *++s;
1129 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001130#else
1131 com_error(com, PyExc_SyntaxError,
1132 "Unicode literals not supported in this Python");
1133 return NULL;
1134#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001135 }
1136 if (quote == 'r' || quote == 'R') {
1137 quote = *++s;
1138 rawmode = 1;
1139 }
1140 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001141 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 return NULL;
1144 }
1145 s++;
1146 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001147 if (len > INT_MAX) {
1148 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1149 return NULL;
1150 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001151 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153 return NULL;
1154 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001155 if (len >= 4 && s[0] == quote && s[1] == quote) {
1156 s += 2;
1157 len -= 2;
1158 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001160 return NULL;
1161 }
1162 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001163#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001164 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001165 if (rawmode)
1166 return PyUnicode_DecodeRawUnicodeEscape(
1167 s, len, NULL);
1168 else
1169 return PyUnicode_DecodeUnicodeEscape(
1170 s, len, NULL);
1171 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001172#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001173 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 return PyString_FromStringAndSize(s, len);
1175 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001176 if (v == NULL)
1177 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001179 end = s + len;
1180 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001181 if (*s != '\\') {
1182 *p++ = *s++;
1183 continue;
1184 }
1185 s++;
1186 switch (*s++) {
1187 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001188 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 case '\\': *p++ = '\\'; break;
1190 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001191 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 case 'b': *p++ = '\b'; break;
1193 case 'f': *p++ = '\014'; break; /* FF */
1194 case 't': *p++ = '\t'; break;
1195 case 'n': *p++ = '\n'; break;
1196 case 'r': *p++ = '\r'; break;
1197 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1199 case '0': case '1': case '2': case '3':
1200 case '4': case '5': case '6': case '7':
1201 c = s[-1] - '0';
1202 if ('0' <= *s && *s <= '7') {
1203 c = (c<<3) + *s++ - '0';
1204 if ('0' <= *s && *s <= '7')
1205 c = (c<<3) + *s++ - '0';
1206 }
1207 *p++ = c;
1208 break;
1209 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001210 if (isxdigit(Py_CHARMASK(s[0]))
1211 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001212 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001213 c = Py_CHARMASK(*s);
1214 s++;
1215 if (isdigit(c))
1216 x = c - '0';
1217 else if (islower(c))
1218 x = 10 + c - 'a';
1219 else
1220 x = 10 + c - 'A';
1221 x = x << 4;
1222 c = Py_CHARMASK(*s);
1223 s++;
1224 if (isdigit(c))
1225 x += c - '0';
1226 else if (islower(c))
1227 x += 10 + c - 'a';
1228 else
1229 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001230 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231 break;
1232 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001233 PyErr_SetString(PyExc_ValueError,
1234 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001235 Py_DECREF(v);
1236 return NULL;
1237 default:
1238 *p++ = '\\';
1239 *p++ = s[-1];
1240 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241 }
1242 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 return v;
1245}
1246
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001248parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001249{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001251 int i;
1252 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001253 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001254 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001255 for (i = 1; i < NCH(n); i++) {
1256 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001257 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001258 if (s == NULL)
1259 goto onError;
1260 if (PyString_Check(v) && PyString_Check(s)) {
1261 PyString_ConcatAndDel(&v, s);
1262 if (v == NULL)
1263 goto onError;
1264 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001265#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001266 else {
1267 PyObject *temp;
1268 temp = PyUnicode_Concat(v, s);
1269 Py_DECREF(s);
1270 if (temp == NULL)
1271 goto onError;
1272 Py_DECREF(v);
1273 v = temp;
1274 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001275#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001276 }
1277 }
1278 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001279
1280 onError:
1281 Py_XDECREF(v);
1282 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001283}
1284
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001285static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001286com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001287{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001288 int anchor = 0;
1289 int save_begin = c->c_begin;
1290
1291 /* list_iter: for v in expr [list_iter] */
1292 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001293 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001294 c->c_begin = c->c_nexti;
1295 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001298 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001299 c->c_loops++;
1300 com_list_iter(c, n, e, t);
1301 c->c_loops--;
1302 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1303 c->c_begin = save_begin;
1304 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001305 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001306}
1307
1308static void
1309com_list_if(struct compiling *c, node *n, node *e, char *t)
1310{
1311 int anchor = 0;
1312 int a = 0;
1313 /* list_iter: 'if' test [list_iter] */
1314 com_addoparg(c, SET_LINENO, n->n_lineno);
1315 com_node(c, CHILD(n, 1));
1316 com_addfwref(c, JUMP_IF_FALSE, &a);
1317 com_addbyte(c, POP_TOP);
1318 com_pop(c, 1);
1319 com_list_iter(c, n, e, t);
1320 com_addfwref(c, JUMP_FORWARD, &anchor);
1321 com_backpatch(c, a);
1322 /* We jump here with an extra entry which we now pop */
1323 com_addbyte(c, POP_TOP);
1324 com_backpatch(c, anchor);
1325}
1326
1327static void
1328com_list_iter(struct compiling *c,
1329 node *p, /* parent of list_iter node */
1330 node *e, /* element expression node */
1331 char *t /* name of result list temp local */)
1332{
1333 /* list_iter is the last child in a listmaker, list_for, or list_if */
1334 node *n = CHILD(p, NCH(p)-1);
1335 if (TYPE(n) == list_iter) {
1336 n = CHILD(n, 0);
1337 switch (TYPE(n)) {
1338 case list_for:
1339 com_list_for(c, n, e, t);
1340 break;
1341 case list_if:
1342 com_list_if(c, n, e, t);
1343 break;
1344 default:
1345 com_error(c, PyExc_SystemError,
1346 "invalid list_iter node type");
1347 }
1348 }
1349 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001350 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001351 com_push(c, 1);
1352 com_node(c, e);
1353 com_addoparg(c, CALL_FUNCTION, 1);
1354 com_addbyte(c, POP_TOP);
1355 com_pop(c, 2);
1356 }
1357}
1358
1359static void
1360com_list_comprehension(struct compiling *c, node *n)
1361{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001362 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001363 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001364 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001365 com_addoparg(c, BUILD_LIST, 0);
1366 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1367 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001368 com_addop_name(c, LOAD_ATTR, "append");
1369 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001370 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001371 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001372 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001373 --c->c_tmpname;
1374}
1375
1376static void
1377com_listmaker(struct compiling *c, node *n)
1378{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001379 /* listmaker: test ( list_for | (',' test)* [','] ) */
1380 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001381 com_list_comprehension(c, n);
1382 else {
1383 int len = 0;
1384 int i;
1385 for (i = 0; i < NCH(n); i += 2, len++)
1386 com_node(c, CHILD(n, i));
1387 com_addoparg(c, BUILD_LIST, len);
1388 com_pop(c, len-1);
1389 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390}
1391
1392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001393com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001394{
1395 int i;
1396 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1397 for (i = 0; i+2 < NCH(n); i += 4) {
1398 /* We must arrange things just right for STORE_SUBSCR.
1399 It wants the stack to look like (value) (dict) (key) */
1400 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001402 com_node(c, CHILD(n, i+2)); /* value */
1403 com_addbyte(c, ROT_TWO);
1404 com_node(c, CHILD(n, i)); /* key */
1405 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001407 }
1408}
1409
1410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412{
1413 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 int i;
1416 REQ(n, atom);
1417 ch = CHILD(n, 0);
1418 switch (TYPE(ch)) {
1419 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001420 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_push(c, 1);
1423 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 else
1425 com_node(c, CHILD(n, 1));
1426 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001427 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001430 com_push(c, 1);
1431 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001433 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001435 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001437 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001438 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001439 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 break;
1441 case BACKQUOTE:
1442 com_node(c, CHILD(n, 1));
1443 com_addbyte(c, UNARY_CONVERT);
1444 break;
1445 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001446 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 i = 255;
1448 }
1449 else {
1450 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 }
1453 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001454 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 break;
1456 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001457 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001458 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 c->c_errors++;
1460 i = 255;
1461 }
1462 else {
1463 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 }
1466 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001467 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 break;
1469 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001470 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001471 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 break;
1473 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 com_error(c, PyExc_SystemError,
1475 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 }
1477}
1478
1479static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001480com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481{
1482 if (NCH(n) == 1) {
1483 com_addbyte(c, op);
1484 }
1485 else if (NCH(n) == 2) {
1486 if (TYPE(CHILD(n, 0)) != COLON) {
1487 com_node(c, CHILD(n, 0));
1488 com_addbyte(c, op+1);
1489 }
1490 else {
1491 com_node(c, CHILD(n, 1));
1492 com_addbyte(c, op+2);
1493 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001494 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495 }
1496 else {
1497 com_node(c, CHILD(n, 0));
1498 com_node(c, CHILD(n, 2));
1499 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 }
1502}
1503
Guido van Rossum635abd21997-01-06 22:56:52 +00001504static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001505com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1506{
1507 if (NCH(n) == 1) {
1508 com_addbyte(c, DUP_TOP);
1509 com_push(c, 1);
1510 com_addbyte(c, SLICE);
1511 com_node(c, augn);
1512 com_addbyte(c, opcode);
1513 com_pop(c, 1);
1514 com_addbyte(c, ROT_TWO);
1515 com_addbyte(c, STORE_SLICE);
1516 com_pop(c, 2);
1517 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1518 com_node(c, CHILD(n, 0));
1519 com_addoparg(c, DUP_TOPX, 2);
1520 com_push(c, 2);
1521 com_addbyte(c, SLICE+1);
1522 com_pop(c, 1);
1523 com_node(c, augn);
1524 com_addbyte(c, opcode);
1525 com_pop(c, 1);
1526 com_addbyte(c, ROT_THREE);
1527 com_addbyte(c, STORE_SLICE+1);
1528 com_pop(c, 3);
1529 } else if (NCH(n) == 2) {
1530 com_node(c, CHILD(n, 1));
1531 com_addoparg(c, DUP_TOPX, 2);
1532 com_push(c, 2);
1533 com_addbyte(c, SLICE+2);
1534 com_pop(c, 1);
1535 com_node(c, augn);
1536 com_addbyte(c, opcode);
1537 com_pop(c, 1);
1538 com_addbyte(c, ROT_THREE);
1539 com_addbyte(c, STORE_SLICE+2);
1540 com_pop(c, 3);
1541 } else {
1542 com_node(c, CHILD(n, 0));
1543 com_node(c, CHILD(n, 2));
1544 com_addoparg(c, DUP_TOPX, 3);
1545 com_push(c, 3);
1546 com_addbyte(c, SLICE+3);
1547 com_pop(c, 2);
1548 com_node(c, augn);
1549 com_addbyte(c, opcode);
1550 com_pop(c, 1);
1551 com_addbyte(c, ROT_FOUR);
1552 com_addbyte(c, STORE_SLICE+3);
1553 com_pop(c, 4);
1554 }
1555}
1556
1557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001559{
1560 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001561 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001563 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001565 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001566 }
1567 else {
1568 com_node(c, CHILD(n, 0));
1569 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001570 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001571 }
1572 m = n;
1573 do {
1574 m = CHILD(m, 0);
1575 } while (NCH(m) == 1);
1576 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001577 /* f(lambda x: x[0] = 3) ends up getting parsed with
1578 * LHS test = lambda x: x[0], and RHS test = 3.
1579 * SF bug 132313 points out that complaining about a keyword
1580 * then is very confusing.
1581 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001583 TYPE(m) == lambdef ?
1584 "lambda cannot contain assignment" :
1585 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001586 }
1587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001589 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001591 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001592 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001593 else if (*pkeywords == NULL) {
1594 c->c_errors++;
1595 Py_DECREF(v);
1596 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 if (PyDict_GetItem(*pkeywords, v) != NULL)
1598 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001599 "duplicate keyword argument");
1600 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001602 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001603 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001604 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 }
1607 }
1608 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609}
1610
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613{
1614 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 }
1617 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001619 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001620 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001621 int star_flag = 0;
1622 int starstar_flag = 0;
1623 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001624 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001625 na = 0;
1626 nk = 0;
1627 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001628 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001629 if (TYPE(ch) == STAR ||
1630 TYPE(ch) == DOUBLESTAR)
1631 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001632 if (ch->n_lineno != lineno) {
1633 lineno = ch->n_lineno;
1634 com_addoparg(c, SET_LINENO, lineno);
1635 }
1636 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001637 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001638 na++;
1639 else
1640 nk++;
1641 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001643 while (i < NCH(n)) {
1644 node *tok = CHILD(n, i);
1645 node *ch = CHILD(n, i+1);
1646 i += 3;
1647 switch (TYPE(tok)) {
1648 case STAR: star_flag = 1; break;
1649 case DOUBLESTAR: starstar_flag = 1; break;
1650 }
1651 com_node(c, ch);
1652 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001653 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 com_error(c, PyExc_SyntaxError,
1655 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001656 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001657 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001658 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001659 star_flag + (starstar_flag << 1);
1660 else
1661 opcode = CALL_FUNCTION;
1662 com_addoparg(c, opcode, na | (nk << 8));
1663 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001664 }
1665}
1666
1667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001668com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001669{
1670 com_addopname(c, LOAD_ATTR, n);
1671}
1672
1673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001674com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001675{
1676 int i=0;
1677 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001678 node *ch;
1679
1680 /* first argument */
1681 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001683 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001684 i++;
1685 }
1686 else {
1687 com_node(c, CHILD(n,i));
1688 i++;
1689 REQ(CHILD(n,i),COLON);
1690 i++;
1691 }
1692 /* second argument */
1693 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1694 com_node(c, CHILD(n,i));
1695 i++;
1696 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001697 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_push(c, 1);
1700 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001701 /* remaining arguments */
1702 for (; i < NCH(n); i++) {
1703 ns++;
1704 ch=CHILD(n,i);
1705 REQ(ch, sliceop);
1706 if (NCH(ch) == 1) {
1707 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001709 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001710 }
1711 else
1712 com_node(c, CHILD(ch,1));
1713 }
1714 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001716}
1717
1718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001719com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001720{
1721 node *ch;
1722 REQ(n, subscript);
1723 ch = CHILD(n,0);
1724 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001726 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001727 com_push(c, 1);
1728 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001729 else {
1730 /* check for slice */
1731 if ((TYPE(ch) == COLON || NCH(n) > 1))
1732 com_sliceobj(c, n);
1733 else {
1734 REQ(ch, test);
1735 com_node(c, ch);
1736 }
1737 }
1738}
1739
1740static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001741com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001742{
1743 int i, op;
1744 REQ(n, subscriptlist);
1745 /* Check to make backward compatible slice behavior for '[i:j]' */
1746 if (NCH(n) == 1) {
1747 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001748 /* 'Basic' slice, should have exactly one colon. */
1749 if ((TYPE(CHILD(sub, 0)) == COLON
1750 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1751 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1752 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001753 switch (assigning) {
1754 case OP_DELETE:
1755 op = DELETE_SLICE;
1756 break;
1757 case OP_ASSIGN:
1758 op = STORE_SLICE;
1759 break;
1760 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001761 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001762 break;
1763 default:
1764 com_augassign_slice(c, sub, assigning, augn);
1765 return;
1766 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001767 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001768 if (op == STORE_SLICE)
1769 com_pop(c, 2);
1770 else if (op == DELETE_SLICE)
1771 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001772 return;
1773 }
1774 }
1775 /* Else normal subscriptlist. Compile each subscript. */
1776 for (i = 0; i < NCH(n); i += 2)
1777 com_subscript(c, CHILD(n, i));
1778 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 if (NCH(n) > 1) {
1780 i = (NCH(n)+1) / 2;
1781 com_addoparg(c, BUILD_TUPLE, i);
1782 com_pop(c, i-1);
1783 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001784 switch (assigning) {
1785 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001786 op = DELETE_SUBSCR;
1787 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001788 break;
1789 default:
1790 case OP_ASSIGN:
1791 op = STORE_SUBSCR;
1792 i = 3;
1793 break;
1794 case OP_APPLY:
1795 op = BINARY_SUBSCR;
1796 i = 1;
1797 break;
1798 }
1799 if (assigning > OP_APPLY) {
1800 com_addoparg(c, DUP_TOPX, 2);
1801 com_push(c, 2);
1802 com_addbyte(c, BINARY_SUBSCR);
1803 com_pop(c, 1);
1804 com_node(c, augn);
1805 com_addbyte(c, assigning);
1806 com_pop(c, 1);
1807 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001808 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001809 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001810 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001811}
1812
1813static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001814com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001815{
1816 REQ(n, trailer);
1817 switch (TYPE(CHILD(n, 0))) {
1818 case LPAR:
1819 com_call_function(c, CHILD(n, 1));
1820 break;
1821 case DOT:
1822 com_select_member(c, CHILD(n, 1));
1823 break;
1824 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001825 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826 break;
1827 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001829 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001830 }
1831}
1832
1833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001835{
1836 int i;
1837 REQ(n, power);
1838 com_atom(c, CHILD(n, 0));
1839 for (i = 1; i < NCH(n); i++) {
1840 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1841 com_factor(c, CHILD(n, i+1));
1842 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001843 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001844 break;
1845 }
1846 else
1847 com_apply_trailer(c, CHILD(n, i));
1848 }
1849}
1850
1851static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001852com_invert_constant(struct compiling *c, node *n)
1853{
1854 /* Compute the inverse of int and longs and use them directly,
1855 but be prepared to generate code for all other
1856 possibilities (invalid numbers, floats, complex).
1857 */
1858 PyObject *num, *inv = NULL;
1859 int i;
1860
1861 REQ(n, NUMBER);
1862 num = parsenumber(c, STR(n));
1863 if (num == NULL)
1864 i = 255;
1865 else {
1866 inv = PyNumber_Invert(num);
1867 if (inv == NULL) {
1868 PyErr_Clear();
1869 i = com_addconst(c, num);
1870 } else {
1871 i = com_addconst(c, inv);
1872 Py_DECREF(inv);
1873 }
1874 Py_DECREF(num);
1875 }
1876 com_addoparg(c, LOAD_CONST, i);
1877 com_push(c, 1);
1878 if (num != NULL && inv == NULL)
1879 com_addbyte(c, UNARY_INVERT);
1880}
1881
1882static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001883com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001885 int childtype = TYPE(CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001887 /* If the unary +, -, or ~ operator is applied to a constant,
1888 don't generate a UNARY_xxx opcode. Just store the
1889 approriate value as a constant. If the value is negative,
1890 extend the string containing the constant and insert a
1891 negative in the 0th position.
1892 */
1893 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
1894 && TYPE(CHILD(n, 1)) == factor
1895 && TYPE(CHILD(CHILD(n, 1), 0)) == power
1896 && TYPE(CHILD(CHILD(CHILD(n, 1), 0), 0)) == atom
1897 && TYPE(CHILD(CHILD(CHILD(CHILD(n, 1), 0), 0), 0)) == NUMBER) {
1898 node *constant = CHILD(CHILD(CHILD(n, 1), 0), 0);
1899 if (childtype == TILDE) {
1900 com_invert_constant(c, CHILD(constant, 0));
1901 return;
1902 }
1903 if (childtype == MINUS) {
1904 node *numnode = CHILD(constant, 0);
1905 char *s = malloc(strlen(STR(numnode)) + 2);
1906 if (s == NULL) {
1907 com_error(c, PyExc_MemoryError, "");
1908 com_addbyte(c, 255);
1909 return;
1910 }
1911 s[0] = '-';
1912 strcpy(s + 1, STR(numnode));
1913 free(STR(numnode));
1914 STR(numnode) = s;
1915 }
1916 com_atom(c, constant);
1917 }
1918 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001919 com_factor(c, CHILD(n, 1));
1920 com_addbyte(c, UNARY_POSITIVE);
1921 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001922 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001923 com_factor(c, CHILD(n, 1));
1924 com_addbyte(c, UNARY_NEGATIVE);
1925 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001926 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001927 com_factor(c, CHILD(n, 1));
1928 com_addbyte(c, UNARY_INVERT);
1929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001930 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001931 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 }
1933}
1934
1935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001936com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001937{
1938 int i;
1939 int op;
1940 REQ(n, term);
1941 com_factor(c, CHILD(n, 0));
1942 for (i = 2; i < NCH(n); i += 2) {
1943 com_factor(c, CHILD(n, i));
1944 switch (TYPE(CHILD(n, i-1))) {
1945 case STAR:
1946 op = BINARY_MULTIPLY;
1947 break;
1948 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00001949 if (c->c_flags & CO_FUTURE_DIVISION)
1950 op = BINARY_TRUE_DIVIDE;
1951 else
1952 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 break;
1954 case PERCENT:
1955 op = BINARY_MODULO;
1956 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00001957 case DOUBLESLASH:
1958 op = BINARY_FLOOR_DIVIDE;
1959 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001960 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001961 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00001962 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 op = 255;
1964 }
1965 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001966 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001967 }
1968}
1969
1970static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001971com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001972{
1973 int i;
1974 int op;
1975 REQ(n, arith_expr);
1976 com_term(c, CHILD(n, 0));
1977 for (i = 2; i < NCH(n); i += 2) {
1978 com_term(c, CHILD(n, i));
1979 switch (TYPE(CHILD(n, i-1))) {
1980 case PLUS:
1981 op = BINARY_ADD;
1982 break;
1983 case MINUS:
1984 op = BINARY_SUBTRACT;
1985 break;
1986 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001988 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001989 op = 255;
1990 }
1991 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001993 }
1994}
1995
1996static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001998{
1999 int i;
2000 int op;
2001 REQ(n, shift_expr);
2002 com_arith_expr(c, CHILD(n, 0));
2003 for (i = 2; i < NCH(n); i += 2) {
2004 com_arith_expr(c, CHILD(n, i));
2005 switch (TYPE(CHILD(n, i-1))) {
2006 case LEFTSHIFT:
2007 op = BINARY_LSHIFT;
2008 break;
2009 case RIGHTSHIFT:
2010 op = BINARY_RSHIFT;
2011 break;
2012 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002014 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015 op = 255;
2016 }
2017 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002018 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002019 }
2020}
2021
2022static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024{
2025 int i;
2026 int op;
2027 REQ(n, and_expr);
2028 com_shift_expr(c, CHILD(n, 0));
2029 for (i = 2; i < NCH(n); i += 2) {
2030 com_shift_expr(c, CHILD(n, i));
2031 if (TYPE(CHILD(n, i-1)) == AMPER) {
2032 op = BINARY_AND;
2033 }
2034 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002036 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002037 op = 255;
2038 }
2039 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002040 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002041 }
2042}
2043
2044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002046{
2047 int i;
2048 int op;
2049 REQ(n, xor_expr);
2050 com_and_expr(c, CHILD(n, 0));
2051 for (i = 2; i < NCH(n); i += 2) {
2052 com_and_expr(c, CHILD(n, i));
2053 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2054 op = BINARY_XOR;
2055 }
2056 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002058 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002059 op = 255;
2060 }
2061 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002062 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002063 }
2064}
2065
2066static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002067com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068{
2069 int i;
2070 int op;
2071 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002072 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002074 com_xor_expr(c, CHILD(n, i));
2075 if (TYPE(CHILD(n, i-1)) == VBAR) {
2076 op = BINARY_OR;
2077 }
2078 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002080 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 op = 255;
2082 }
2083 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 }
2086}
2087
2088static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090{
2091 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002092 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2094 if (NCH(n) == 1) {
2095 n = CHILD(n, 0);
2096 switch (TYPE(n)) {
2097 case LESS: return LT;
2098 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002099 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002101 case LESSEQUAL: return LE;
2102 case GREATEREQUAL: return GE;
2103 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2105 if (strcmp(STR(n), "is") == 0) return IS;
2106 }
2107 }
2108 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2111 return NOT_IN;
2112 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2113 return IS_NOT;
2114 }
2115 }
2116 return BAD;
2117}
2118
2119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002120com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121{
2122 int i;
2123 enum cmp_op op;
2124 int anchor;
2125 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2126 com_expr(c, CHILD(n, 0));
2127 if (NCH(n) == 1)
2128 return;
2129
2130 /****************************************************************
2131 The following code is generated for all but the last
2132 comparison in a chain:
2133
2134 label: on stack: opcode: jump to:
2135
2136 a <code to load b>
2137 a, b DUP_TOP
2138 a, b, b ROT_THREE
2139 b, a, b COMPARE_OP
2140 b, 0-or-1 JUMP_IF_FALSE L1
2141 b, 1 POP_TOP
2142 b
2143
2144 We are now ready to repeat this sequence for the next
2145 comparison in the chain.
2146
2147 For the last we generate:
2148
2149 b <code to load c>
2150 b, c COMPARE_OP
2151 0-or-1
2152
2153 If there were any jumps to L1 (i.e., there was more than one
2154 comparison), we generate:
2155
2156 0-or-1 JUMP_FORWARD L2
2157 L1: b, 0 ROT_TWO
2158 0, b POP_TOP
2159 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 ****************************************************************/
2162
2163 anchor = 0;
2164
2165 for (i = 2; i < NCH(n); i += 2) {
2166 com_expr(c, CHILD(n, i));
2167 if (i+2 < NCH(n)) {
2168 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002169 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 com_addbyte(c, ROT_THREE);
2171 }
2172 op = cmp_type(CHILD(n, i-1));
2173 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002174 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002175 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002178 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 if (i+2 < NCH(n)) {
2180 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2181 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 }
2184 }
2185
2186 if (anchor) {
2187 int anchor2 = 0;
2188 com_addfwref(c, JUMP_FORWARD, &anchor2);
2189 com_backpatch(c, anchor);
2190 com_addbyte(c, ROT_TWO);
2191 com_addbyte(c, POP_TOP);
2192 com_backpatch(c, anchor2);
2193 }
2194}
2195
2196static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002197com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198{
2199 REQ(n, not_test); /* 'not' not_test | comparison */
2200 if (NCH(n) == 1) {
2201 com_comparison(c, CHILD(n, 0));
2202 }
2203 else {
2204 com_not_test(c, CHILD(n, 1));
2205 com_addbyte(c, UNARY_NOT);
2206 }
2207}
2208
2209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211{
2212 int i;
2213 int anchor;
2214 REQ(n, and_test); /* not_test ('and' not_test)* */
2215 anchor = 0;
2216 i = 0;
2217 for (;;) {
2218 com_not_test(c, CHILD(n, i));
2219 if ((i += 2) >= NCH(n))
2220 break;
2221 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2222 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 }
2225 if (anchor)
2226 com_backpatch(c, anchor);
2227}
2228
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002229static int
2230com_make_closure(struct compiling *c, PyCodeObject *co)
2231{
2232 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2233 if (free == 0)
2234 return 0;
2235 for (i = 0; i < free; ++i) {
2236 /* Bypass com_addop_varname because it will generate
2237 LOAD_DEREF but LOAD_CLOSURE is needed.
2238 */
2239 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2240 int arg, reftype;
2241
2242 /* Special case: If a class contains a method with a
2243 free variable that has the same name as a method,
2244 the name will be considered free *and* local in the
2245 class. It should be handled by the closure, as
2246 well as by the normal name loookup logic.
2247 */
2248 reftype = get_ref_type(c, PyString_AS_STRING(name));
2249 if (reftype == CELL)
2250 arg = com_lookup_arg(c->c_cellvars, name);
2251 else /* (reftype == FREE) */
2252 arg = com_lookup_arg(c->c_freevars, name);
2253 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002254 fprintf(stderr, "lookup %s in %s %d %d\n"
2255 "freevars of %s: %s\n",
2256 PyObject_REPR(name),
2257 c->c_name,
2258 reftype, arg,
2259 PyString_AS_STRING(co->co_name),
2260 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002261 Py_FatalError("com_make_closure()");
2262 }
2263 com_addoparg(c, LOAD_CLOSURE, arg);
2264
2265 }
2266 com_push(c, free);
2267 return 1;
2268}
2269
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002270static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002271com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002274 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002275 PyObject *co;
2276 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002277 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002278 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2279 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002280 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002281 if (co == NULL) {
2282 c->c_errors++;
2283 return;
2284 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002285 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002286 i = com_addconst(c, co);
2287 closure = com_make_closure(c, (PyCodeObject *)co);
2288 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002289 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002290 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002291 if (closure)
2292 com_addoparg(c, MAKE_CLOSURE, ndefs);
2293 else
2294 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002297 else {
2298 int anchor = 0;
2299 int i = 0;
2300 for (;;) {
2301 com_and_test(c, CHILD(n, i));
2302 if ((i += 2) >= NCH(n))
2303 break;
2304 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2305 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002306 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002307 }
2308 if (anchor)
2309 com_backpatch(c, anchor);
2310 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002311}
2312
2313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002314com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315{
2316 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002317 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318 com_node(c, CHILD(n, 0));
2319 }
2320 else {
2321 int i;
2322 int len;
2323 len = (NCH(n) + 1) / 2;
2324 for (i = 0; i < NCH(n); i += 2)
2325 com_node(c, CHILD(n, i));
2326 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 }
2329}
2330
2331
2332/* Begin of assignment compilation */
2333
Thomas Wouters434d0822000-08-24 20:11:32 +00002334
2335static void
2336com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2337{
2338 com_addbyte(c, DUP_TOP);
2339 com_push(c, 1);
2340 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002341 com_node(c, augn);
2342 com_addbyte(c, opcode);
2343 com_pop(c, 1);
2344 com_addbyte(c, ROT_TWO);
2345 com_addopname(c, STORE_ATTR, n);
2346 com_pop(c, 2);
2347}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348
2349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351{
2352 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354}
2355
2356static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002357com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359 REQ(n, trailer);
2360 switch (TYPE(CHILD(n, 0))) {
2361 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 com_error(c, PyExc_SyntaxError,
2363 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 break;
2365 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002366 if (assigning > OP_APPLY)
2367 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2368 else
2369 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002371 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002372 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 break;
2374 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 }
2377}
2378
2379static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002380com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381{
2382 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002383 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 if (assigning) {
2386 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002387 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002388 com_push(c, i-1);
2389 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002391 com_assign(c, CHILD(n, i), assigning, NULL);
2392}
2393
2394static void
2395com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2396{
2397 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002398 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 com_push(c, 1);
2400 com_node(c, augn);
2401 com_addbyte(c, opcode);
2402 com_pop(c, 1);
2403 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404}
2405
2406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002407com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408{
2409 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002410 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 if (assigning)
2412 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413}
2414
2415static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002416com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417{
2418 /* Loop to avoid trivial recursion */
2419 for (;;) {
2420 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 case exprlist:
2423 case testlist:
2424 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002425 if (assigning > OP_APPLY) {
2426 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002427 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 return;
2429 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002430 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 return;
2432 }
2433 n = CHILD(n, 0);
2434 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002435
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002436 case test:
2437 case and_test:
2438 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002441 case xor_expr:
2442 case and_expr:
2443 case shift_expr:
2444 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002445 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002446 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002448 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002449 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 return;
2451 }
2452 n = CHILD(n, 0);
2453 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002454
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002455 case power: /* atom trailer* ('**' power)*
2456 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002457 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002458 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002459 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460 return;
2461 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002462 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 int i;
2464 com_node(c, CHILD(n, 0));
2465 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002466 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002467 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002468 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002469 return;
2470 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471 com_apply_trailer(c, CHILD(n, i));
2472 } /* NB i is still alive */
2473 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002474 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 return;
2476 }
2477 n = CHILD(n, 0);
2478 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002479
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002480 case atom:
2481 switch (TYPE(CHILD(n, 0))) {
2482 case LPAR:
2483 n = CHILD(n, 1);
2484 if (TYPE(n) == RPAR) {
2485 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002486 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002487 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 return;
2489 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002490 if (assigning > OP_APPLY) {
2491 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002492 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002493 return;
2494 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002495 break;
2496 case LSQB:
2497 n = CHILD(n, 1);
2498 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002499 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002500 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 return;
2502 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002503 if (assigning > OP_APPLY) {
2504 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002505 "augmented assign to list not possible");
2506 return;
2507 }
2508 if (NCH(n) > 1
2509 && TYPE(CHILD(n, 1)) == list_for) {
2510 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002511 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002512 return;
2513 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002514 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002515 return;
2516 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002517 if (assigning > OP_APPLY)
2518 com_augassign_name(c, CHILD(n, 0),
2519 assigning, augn);
2520 else
2521 com_assign_name(c, CHILD(n, 0),
2522 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523 return;
2524 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002525 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002526 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 return;
2528 }
2529 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002530
2531 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002532 com_error(c, PyExc_SyntaxError,
2533 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002534 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002535
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002537 com_error(c, PyExc_SystemError,
2538 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002540
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002541 }
2542 }
2543}
Guido van Rossum7c531111997-03-11 18:42:21 +00002544
Thomas Wouters434d0822000-08-24 20:11:32 +00002545static void
2546com_augassign(struct compiling *c, node *n)
2547{
2548 int opcode;
2549
2550 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2551 case '+': opcode = INPLACE_ADD; break;
2552 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002553 case '/':
2554 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2555 opcode = INPLACE_FLOOR_DIVIDE;
2556 else if (c->c_flags & CO_FUTURE_DIVISION)
2557 opcode = INPLACE_TRUE_DIVIDE;
2558 else
2559 opcode = INPLACE_DIVIDE;
2560 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002561 case '%': opcode = INPLACE_MODULO; break;
2562 case '<': opcode = INPLACE_LSHIFT; break;
2563 case '>': opcode = INPLACE_RSHIFT; break;
2564 case '&': opcode = INPLACE_AND; break;
2565 case '^': opcode = INPLACE_XOR; break;
2566 case '|': opcode = INPLACE_OR; break;
2567 case '*':
2568 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2569 opcode = INPLACE_POWER;
2570 else
2571 opcode = INPLACE_MULTIPLY;
2572 break;
2573 default:
2574 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2575 return;
2576 }
2577 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2578}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579
2580static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002581com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582{
Thomas Wouters434d0822000-08-24 20:11:32 +00002583 REQ(n, expr_stmt);
2584 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002585 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002586 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002588 if (NCH(n) == 1) {
2589 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002590 if (c->c_interactive)
2591 com_addbyte(c, PRINT_EXPR);
2592 else
2593 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002594 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002596 else if (TYPE(CHILD(n,1)) == augassign)
2597 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 else {
2599 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002600 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002601 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002602 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002603 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002604 com_push(c, 1);
2605 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002606 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 }
2608 }
2609}
2610
2611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002612com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002613{
2614 int a = 0, b = 0;
2615 int i;
2616 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2617 /* Generate code like for
2618
2619 if __debug__:
2620 if not <test>:
2621 raise AssertionError [, <message>]
2622
2623 where <message> is the second test, if present.
2624 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002625
Guido van Rossum228d7f31997-04-02 05:24:36 +00002626 if (Py_OptimizeFlag)
2627 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002628 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002629 com_push(c, 1);
2630 com_addfwref(c, JUMP_IF_FALSE, &a);
2631 com_addbyte(c, POP_TOP);
2632 com_pop(c, 1);
2633 com_node(c, CHILD(n, 1));
2634 com_addfwref(c, JUMP_IF_TRUE, &b);
2635 com_addbyte(c, POP_TOP);
2636 com_pop(c, 1);
2637 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002638 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002639 com_push(c, 1);
2640 i = NCH(n)/2; /* Either 2 or 4 */
2641 if (i > 1)
2642 com_node(c, CHILD(n, 3));
2643 com_addoparg(c, RAISE_VARARGS, i);
2644 com_pop(c, i);
2645 /* The interpreter does not fall through */
2646 /* All jumps converge here */
2647 com_backpatch(c, a);
2648 com_backpatch(c, b);
2649 com_addbyte(c, POP_TOP);
2650}
2651
2652static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002653com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002655 int i = 1;
2656 node* stream = NULL;
2657
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002658 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002659
2660 /* are we using the extended print form? */
2661 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2662 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002663 com_node(c, stream);
2664 /* stack: [...] => [... stream] */
2665 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002666 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2667 i = 4;
2668 else
2669 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002671 for (; i < NCH(n); i += 2) {
2672 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002673 com_addbyte(c, DUP_TOP);
2674 /* stack: [stream] => [stream stream] */
2675 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002676 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002677 /* stack: [stream stream] => [stream stream obj] */
2678 com_addbyte(c, ROT_TWO);
2679 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002680 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002681 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002682 com_pop(c, 2);
2683 }
2684 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002685 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002686 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002687 com_addbyte(c, PRINT_ITEM);
2688 com_pop(c, 1);
2689 }
2690 }
2691 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002692 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002693 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002694 /* must pop the extra stream object off the stack */
2695 com_addbyte(c, POP_TOP);
2696 /* stack: [... stream] => [...] */
2697 com_pop(c, 1);
2698 }
2699 }
2700 else {
2701 if (stream != NULL) {
2702 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002703 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002704 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002705 com_pop(c, 1);
2706 }
2707 else
2708 com_addbyte(c, PRINT_NEWLINE);
2709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710}
2711
2712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002713com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002715 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002716 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002717 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002718 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002719 if (c->c_flags & CO_GENERATOR) {
2720 if (NCH(n) > 1) {
2721 com_error(c, PyExc_SyntaxError,
2722 "'return' with argument inside generator");
2723 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002724 }
2725 if (NCH(n) < 2) {
2726 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002727 com_push(c, 1);
2728 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002729 else
2730 com_node(c, CHILD(n, 1));
2731 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002732 com_pop(c, 1);
2733}
2734
2735static void
2736com_yield_stmt(struct compiling *c, node *n)
2737{
Tim Peters95c80f82001-06-23 02:07:08 +00002738 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002739 REQ(n, yield_stmt); /* 'yield' testlist */
2740 if (!c->c_infunction) {
2741 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2742 }
Tim Peters95c80f82001-06-23 02:07:08 +00002743
2744 for (i = 0; i < c->c_nblocks; ++i) {
2745 if (c->c_block[i] == SETUP_FINALLY) {
2746 com_error(c, PyExc_SyntaxError,
2747 "'yield' not allowed in a 'try' block "
2748 "with a 'finally' clause");
2749 return;
2750 }
2751 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002752 com_node(c, CHILD(n, 1));
2753 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002754 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755}
2756
2757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002758com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002759{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002761 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2762 if (NCH(n) > 1) {
2763 com_node(c, CHILD(n, 1));
2764 if (NCH(n) > 3) {
2765 com_node(c, CHILD(n, 3));
2766 if (NCH(n) > 5)
2767 com_node(c, CHILD(n, 5));
2768 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002769 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 i = NCH(n)/2;
2771 com_addoparg(c, RAISE_VARARGS, i);
2772 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773}
2774
2775static void
Thomas Wouters52152252000-08-17 22:55:00 +00002776com_from_import(struct compiling *c, node *n)
2777{
2778 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2779 com_push(c, 1);
2780 if (NCH(n) > 1) {
2781 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2782 com_error(c, PyExc_SyntaxError, "invalid syntax");
2783 return;
2784 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002785 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002786 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002787 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002788 com_pop(c, 1);
2789}
2790
2791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002792com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793{
2794 int i;
2795 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002796 /* 'import' dotted_name (',' dotted_name)* |
2797 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002799 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002800 /* 'from' dotted_name 'import' ... */
2801 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002802
2803 if (TYPE(CHILD(n, 3)) == STAR) {
2804 tup = Py_BuildValue("(s)", "*");
2805 } else {
2806 tup = PyTuple_New((NCH(n) - 2)/2);
2807 for (i = 3; i < NCH(n); i += 2) {
2808 PyTuple_SET_ITEM(tup, (i-3)/2,
2809 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002810 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002811 }
2812 }
2813 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002814 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002815 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002816 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002817 if (TYPE(CHILD(n, 3)) == STAR)
2818 com_addbyte(c, IMPORT_STAR);
2819 else {
2820 for (i = 3; i < NCH(n); i += 2)
2821 com_from_import(c, CHILD(n, i));
2822 com_addbyte(c, POP_TOP);
2823 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 }
2826 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002827 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002829 node *subn = CHILD(n, i);
2830 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002831 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002832 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002833 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002834 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002835 int j;
2836 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002837 com_error(c, PyExc_SyntaxError,
2838 "invalid syntax");
2839 return;
2840 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002841 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2842 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002843 CHILD(CHILD(subn, 0),
2844 j));
2845 com_addop_varname(c, VAR_STORE,
2846 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002847 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002848 com_addop_varname(c, VAR_STORE,
2849 STR(CHILD(CHILD(subn, 0),
2850 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 }
2853 }
2854}
2855
2856static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002857com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002858{
2859 REQ(n, exec_stmt);
2860 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2861 com_node(c, CHILD(n, 1));
2862 if (NCH(n) >= 4)
2863 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002864 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002866 com_push(c, 1);
2867 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002868 if (NCH(n) >= 6)
2869 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002871 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 com_push(c, 1);
2873 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002876}
2877
Guido van Rossum7c531111997-03-11 18:42:21 +00002878static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002879is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002880{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002881 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002882 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002883 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002884
2885 /* Label to avoid tail recursion */
2886 next:
2887 switch (TYPE(n)) {
2888
2889 case suite:
2890 if (NCH(n) == 1) {
2891 n = CHILD(n, 0);
2892 goto next;
2893 }
2894 /* Fall through */
2895 case file_input:
2896 for (i = 0; i < NCH(n); i++) {
2897 node *ch = CHILD(n, i);
2898 if (TYPE(ch) == stmt) {
2899 n = ch;
2900 goto next;
2901 }
2902 }
2903 break;
2904
2905 case stmt:
2906 case simple_stmt:
2907 case small_stmt:
2908 n = CHILD(n, 0);
2909 goto next;
2910
2911 case expr_stmt:
2912 case testlist:
2913 case test:
2914 case and_test:
2915 case not_test:
2916 case comparison:
2917 case expr:
2918 case xor_expr:
2919 case and_expr:
2920 case shift_expr:
2921 case arith_expr:
2922 case term:
2923 case factor:
2924 case power:
2925 case atom:
2926 if (NCH(n) == 1) {
2927 n = CHILD(n, 0);
2928 goto next;
2929 }
2930 break;
2931
2932 case NAME:
2933 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2934 return 1;
2935 break;
2936
2937 case NUMBER:
2938 v = parsenumber(c, STR(n));
2939 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002940 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002941 break;
2942 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002943 i = PyObject_IsTrue(v);
2944 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002945 return i == 0;
2946
2947 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002948 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002949 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002951 break;
2952 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002953 i = PyObject_IsTrue(v);
2954 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002955 return i == 0;
2956
2957 }
2958 return 0;
2959}
2960
Tim Peters08a898f2001-06-28 01:52:22 +00002961
2962/* Look under n for a return stmt with an expression.
2963 * This hack is used to find illegal returns under "if 0:" blocks in
2964 * functions already known to be generators (as determined by the symtable
2965 * pass).
2966 * Return the offending return node if found, else NULL.
2967 */
2968static node *
2969look_for_offending_return(node *n)
2970{
2971 int i;
2972
2973 for (i = 0; i < NCH(n); ++i) {
2974 node *kid = CHILD(n, i);
2975
2976 switch (TYPE(kid)) {
2977 case classdef:
2978 case funcdef:
2979 case lambdef:
2980 /* Stuff in nested functions & classes doesn't
2981 affect the code block we started in. */
2982 return NULL;
2983
2984 case return_stmt:
2985 if (NCH(kid) > 1)
2986 return kid;
2987 break;
2988
2989 default: {
2990 node *bad = look_for_offending_return(kid);
2991 if (bad != NULL)
2992 return bad;
2993 }
2994 }
2995 }
2996
2997 return NULL;
2998}
2999
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003000static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003001com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002{
3003 int i;
3004 int anchor = 0;
3005 REQ(n, if_stmt);
3006 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3007 for (i = 0; i+3 < NCH(n); i+=4) {
3008 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003009 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003010 if (is_constant_false(c, ch)) {
3011 /* We're going to skip this block. However, if this
3012 is a generator, we have to check the dead code
3013 anyway to make sure there aren't any return stmts
3014 with expressions, in the same scope. */
3015 if (c->c_flags & CO_GENERATOR) {
3016 node *p = look_for_offending_return(n);
3017 if (p != NULL) {
3018 int savelineno = c->c_lineno;
3019 c->c_lineno = p->n_lineno;
3020 com_error(c, PyExc_SyntaxError,
3021 "'return' with argument "
3022 "inside generator");
3023 c->c_lineno = savelineno;
3024 }
3025 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003026 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003027 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003028 if (i > 0)
3029 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003030 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 com_addfwref(c, JUMP_IF_FALSE, &a);
3032 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003033 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 com_node(c, CHILD(n, i+3));
3035 com_addfwref(c, JUMP_FORWARD, &anchor);
3036 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003037 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 com_addbyte(c, POP_TOP);
3039 }
3040 if (i+2 < NCH(n))
3041 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003042 if (anchor)
3043 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044}
3045
3046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003047com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048{
3049 int break_anchor = 0;
3050 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003051 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3053 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003054 block_push(c, SETUP_LOOP);
3055 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003056 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057 com_node(c, CHILD(n, 1));
3058 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3059 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003060 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003061 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003063 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003064 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3065 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003067 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068 com_addbyte(c, POP_TOP);
3069 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003070 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 if (NCH(n) > 4)
3072 com_node(c, CHILD(n, 6));
3073 com_backpatch(c, break_anchor);
3074}
3075
3076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003077com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079 int break_anchor = 0;
3080 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003081 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 REQ(n, for_stmt);
3083 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3084 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003085 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003087 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003088 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003089 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003090 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003092 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003093 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003095 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003096 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3097 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003099 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003101 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 if (NCH(n) > 8)
3103 com_node(c, CHILD(n, 8));
3104 com_backpatch(c, break_anchor);
3105}
3106
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003107/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003108
3109 SETUP_FINALLY L
3110 <code for S>
3111 POP_BLOCK
3112 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003113 L: <code for Sf>
3114 END_FINALLY
3115
3116 The special instructions use the block stack. Each block
3117 stack entry contains the instruction that created it (here
3118 SETUP_FINALLY), the level of the value stack at the time the
3119 block stack entry was created, and a label (here L).
3120
3121 SETUP_FINALLY:
3122 Pushes the current value stack level and the label
3123 onto the block stack.
3124 POP_BLOCK:
3125 Pops en entry from the block stack, and pops the value
3126 stack until its level is the same as indicated on the
3127 block stack. (The label is ignored.)
3128 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003129 Pops a variable number of entries from the *value* stack
3130 and re-raises the exception they specify. The number of
3131 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003132
3133 The block stack is unwound when an exception is raised:
3134 when a SETUP_FINALLY entry is found, the exception is pushed
3135 onto the value stack (and the exception condition is cleared),
3136 and the interpreter jumps to the label gotten from the block
3137 stack.
3138
3139 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003140 (The contents of the value stack is shown in [], with the top
3141 at the right; 'tb' is trace-back info, 'val' the exception's
3142 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003143
3144 Value stack Label Instruction Argument
3145 [] SETUP_EXCEPT L1
3146 [] <code for S>
3147 [] POP_BLOCK
3148 [] JUMP_FORWARD L0
3149
Guido van Rossum3f5da241990-12-20 15:06:42 +00003150 [tb, val, exc] L1: DUP )
3151 [tb, val, exc, exc] <evaluate E1> )
3152 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3153 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3154 [tb, val, exc, 1] POP )
3155 [tb, val, exc] POP
3156 [tb, val] <assign to V1> (or POP if no V1)
3157 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003158 [] <code for S1>
3159 JUMP_FORWARD L0
3160
Guido van Rossum3f5da241990-12-20 15:06:42 +00003161 [tb, val, exc, 0] L2: POP
3162 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003163 .............................etc.......................
3164
Guido van Rossum3f5da241990-12-20 15:06:42 +00003165 [tb, val, exc, 0] Ln+1: POP
3166 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003167
3168 [] L0: <next statement>
3169
3170 Of course, parts are not generated if Vi or Ei is not present.
3171*/
3172
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003174com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003175{
3176 int except_anchor = 0;
3177 int end_anchor = 0;
3178 int else_anchor = 0;
3179 int i;
3180 node *ch;
3181
3182 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3183 block_push(c, SETUP_EXCEPT);
3184 com_node(c, CHILD(n, 2));
3185 com_addbyte(c, POP_BLOCK);
3186 block_pop(c, SETUP_EXCEPT);
3187 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3188 com_backpatch(c, except_anchor);
3189 for (i = 3;
3190 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3191 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003192 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003193 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003194 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003195 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003196 break;
3197 }
3198 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003200 com_addoparg(c, SET_LINENO, ch->n_lineno);
3201 if (NCH(ch) > 1) {
3202 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003203 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003204 com_node(c, CHILD(ch, 1));
3205 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3208 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003210 }
3211 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003213 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003214 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003217 com_pop(c, 1);
3218 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003219 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003220 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003221 com_node(c, CHILD(n, i+2));
3222 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3223 if (except_anchor) {
3224 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003225 /* We come in with [tb, val, exc, 0] on the
3226 stack; one pop and it's the same as
3227 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003228 com_addbyte(c, POP_TOP);
3229 }
3230 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003231 /* We actually come in here with [tb, val, exc] but the
3232 END_FINALLY will zap those and jump around.
3233 The c_stacklevel does not reflect them so we need not pop
3234 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003235 com_addbyte(c, END_FINALLY);
3236 com_backpatch(c, else_anchor);
3237 if (i < NCH(n))
3238 com_node(c, CHILD(n, i+2));
3239 com_backpatch(c, end_anchor);
3240}
3241
3242static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003243com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244{
3245 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003247
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003248 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3249 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 com_addbyte(c, POP_BLOCK);
3252 block_pop(c, SETUP_FINALLY);
3253 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003254 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003255 /* While the generated code pushes only one item,
3256 the try-finally handling can enter here with
3257 up to three items. OK, here are the details:
3258 3 for an exception, 2 for RETURN, 1 for BREAK. */
3259 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003260 com_backpatch(c, finally_anchor);
3261 ch = CHILD(n, NCH(n)-1);
3262 com_addoparg(c, SET_LINENO, ch->n_lineno);
3263 com_node(c, ch);
3264 com_addbyte(c, END_FINALLY);
3265 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003267}
3268
3269static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003270com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003271{
3272 REQ(n, try_stmt);
3273 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3274 | 'try' ':' suite 'finally' ':' suite */
3275 if (TYPE(CHILD(n, 3)) != except_clause)
3276 com_try_finally(c, n);
3277 else
3278 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279}
3280
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003282get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003283{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003284 int i;
3285
Guido van Rossum8b993a91997-01-17 21:04:03 +00003286 /* Label to avoid tail recursion */
3287 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003288 switch (TYPE(n)) {
3289
3290 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 if (NCH(n) == 1) {
3292 n = CHILD(n, 0);
3293 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003294 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003296 case file_input:
3297 for (i = 0; i < NCH(n); i++) {
3298 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003299 if (TYPE(ch) == stmt) {
3300 n = ch;
3301 goto next;
3302 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003303 }
3304 break;
3305
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003306 case stmt:
3307 case simple_stmt:
3308 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 n = CHILD(n, 0);
3310 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003311
3312 case expr_stmt:
3313 case testlist:
3314 case test:
3315 case and_test:
3316 case not_test:
3317 case comparison:
3318 case expr:
3319 case xor_expr:
3320 case and_expr:
3321 case shift_expr:
3322 case arith_expr:
3323 case term:
3324 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003325 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 if (NCH(n) == 1) {
3327 n = CHILD(n, 0);
3328 goto next;
3329 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003330 break;
3331
3332 case atom:
3333 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003335 break;
3336
3337 }
3338 return NULL;
3339}
3340
Guido van Rossum79f25d91997-04-29 20:08:16 +00003341static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003342get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343{
Guido van Rossum541563e1999-01-28 15:08:09 +00003344 /* Don't generate doc-strings if run with -OO */
3345 if (Py_OptimizeFlag > 1)
3346 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 n = get_rawdocstring(n);
3348 if (n == NULL)
3349 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003350 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351}
3352
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003354com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355{
3356 REQ(n, suite);
3357 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3358 if (NCH(n) == 1) {
3359 com_node(c, CHILD(n, 0));
3360 }
3361 else {
3362 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003363 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 node *ch = CHILD(n, i);
3365 if (TYPE(ch) == stmt)
3366 com_node(c, ch);
3367 }
3368 }
3369}
3370
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003371/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003373com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003374{
3375 int i = c->c_nblocks;
3376 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3377 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3378 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003379 else if (i <= 0) {
3380 /* at the outer level */
3381 com_error(c, PyExc_SyntaxError,
3382 "'continue' not properly in loop");
3383 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003384 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003385 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003386 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003387 if (c->c_block[j] == SETUP_LOOP)
3388 break;
3389 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003390 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003391 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003392 for (; i > j; --i) {
3393 if (c->c_block[i] == SETUP_EXCEPT ||
3394 c->c_block[i] == SETUP_FINALLY) {
3395 com_addoparg(c, CONTINUE_LOOP,
3396 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003397 return;
3398 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003399 if (c->c_block[i] == END_FINALLY) {
3400 com_error(c, PyExc_SyntaxError,
3401 "'continue' not supported inside 'finally' clause");
3402 return;
3403 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003404 }
3405 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003406 com_error(c, PyExc_SyntaxError,
3407 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003408 }
3409 /* XXX Could allow it inside a 'finally' clause
3410 XXX if we could pop the exception still on the stack */
3411}
3412
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003413static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003414com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003415{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003416 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003417 if (TYPE(n) == lambdef) {
3418 /* lambdef: 'lambda' [varargslist] ':' test */
3419 n = CHILD(n, 1);
3420 }
3421 else {
3422 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3423 n = CHILD(n, 2);
3424 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3425 n = CHILD(n, 1);
3426 }
3427 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003428 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003429 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003430 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003431 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3432 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003433 nargs = 0;
3434 ndefs = 0;
3435 for (i = 0; i < nch; i++) {
3436 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003437 if (TYPE(CHILD(n, i)) == STAR ||
3438 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003439 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003440 nargs++;
3441 i++;
3442 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003443 t = RPAR; /* Anything except EQUAL or COMMA */
3444 else
3445 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003446 if (t == EQUAL) {
3447 i++;
3448 ndefs++;
3449 com_node(c, CHILD(n, i));
3450 i++;
3451 if (i >= nch)
3452 break;
3453 t = TYPE(CHILD(n, i));
3454 }
3455 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003456 /* Treat "(a=1, b)" as an error */
3457 if (ndefs)
3458 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003459 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003460 }
3461 if (t != COMMA)
3462 break;
3463 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003464 return ndefs;
3465}
3466
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003468com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003470 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003471 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003473 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003474 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3475 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003476 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003477 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003478 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 c->c_errors++;
3480 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003481 int closure = com_make_closure(c, (PyCodeObject *)co);
3482 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003484 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003485 if (closure)
3486 com_addoparg(c, MAKE_CLOSURE, ndefs);
3487 else
3488 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003489 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003490 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003491 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003492 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 }
3494}
3495
3496static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003497com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003498{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003499 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003500 REQ(n, testlist);
3501 /* testlist: test (',' test)* [','] */
3502 for (i = 0; i < NCH(n); i += 2)
3503 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003504 i = (NCH(n)+1) / 2;
3505 com_addoparg(c, BUILD_TUPLE, i);
3506 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003507}
3508
3509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003510com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003511{
Guido van Rossum25831651993-05-19 14:50:45 +00003512 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003513 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003514 char *name;
3515
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003517 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003518 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003519 c->c_errors++;
3520 return;
3521 }
3522 /* Push the class name on the stack */
3523 i = com_addconst(c, v);
3524 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003525 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003526 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003527 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003529 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003530 com_push(c, 1);
3531 }
Guido van Rossum25831651993-05-19 14:50:45 +00003532 else
3533 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003534 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003535 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003536 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003537 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003538 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003539 c->c_errors++;
3540 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003541 int closure = com_make_closure(c, (PyCodeObject *)co);
3542 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003543 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003544 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003545 if (closure)
3546 com_addoparg(c, MAKE_CLOSURE, 0);
3547 else
3548 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003549 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003550 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003551 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003552 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003553 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003554 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003555}
3556
3557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003558com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003560 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003561 if (c->c_errors)
3562 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563 switch (TYPE(n)) {
3564
3565 /* Definition nodes */
3566
3567 case funcdef:
3568 com_funcdef(c, n);
3569 break;
3570 case classdef:
3571 com_classdef(c, n);
3572 break;
3573
3574 /* Trivial parse tree nodes */
3575
3576 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003577 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003579 n = CHILD(n, 0);
3580 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003581
3582 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003583 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3584 com_addoparg(c, SET_LINENO, n->n_lineno);
3585 {
3586 int i;
3587 for (i = 0; i < NCH(n)-1; i += 2)
3588 com_node(c, CHILD(n, i));
3589 }
3590 break;
3591
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003592 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003593 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003594 n = CHILD(n, 0);
3595 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596
3597 /* Statement nodes */
3598
3599 case expr_stmt:
3600 com_expr_stmt(c, n);
3601 break;
3602 case print_stmt:
3603 com_print_stmt(c, n);
3604 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003605 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003606 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 break;
3608 case pass_stmt:
3609 break;
3610 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003611 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003612 com_error(c, PyExc_SyntaxError,
3613 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003614 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615 com_addbyte(c, BREAK_LOOP);
3616 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003617 case continue_stmt:
3618 com_continue_stmt(c, n);
3619 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620 case return_stmt:
3621 com_return_stmt(c, n);
3622 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003623 case yield_stmt:
3624 com_yield_stmt(c, n);
3625 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 case raise_stmt:
3627 com_raise_stmt(c, n);
3628 break;
3629 case import_stmt:
3630 com_import_stmt(c, n);
3631 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003632 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003633 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003634 case exec_stmt:
3635 com_exec_stmt(c, n);
3636 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003637 case assert_stmt:
3638 com_assert_stmt(c, n);
3639 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640 case if_stmt:
3641 com_if_stmt(c, n);
3642 break;
3643 case while_stmt:
3644 com_while_stmt(c, n);
3645 break;
3646 case for_stmt:
3647 com_for_stmt(c, n);
3648 break;
3649 case try_stmt:
3650 com_try_stmt(c, n);
3651 break;
3652 case suite:
3653 com_suite(c, n);
3654 break;
3655
3656 /* Expression nodes */
3657
3658 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003659 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003660 break;
3661 case test:
3662 com_test(c, n);
3663 break;
3664 case and_test:
3665 com_and_test(c, n);
3666 break;
3667 case not_test:
3668 com_not_test(c, n);
3669 break;
3670 case comparison:
3671 com_comparison(c, n);
3672 break;
3673 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003674 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 break;
3676 case expr:
3677 com_expr(c, n);
3678 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003679 case xor_expr:
3680 com_xor_expr(c, n);
3681 break;
3682 case and_expr:
3683 com_and_expr(c, n);
3684 break;
3685 case shift_expr:
3686 com_shift_expr(c, n);
3687 break;
3688 case arith_expr:
3689 com_arith_expr(c, n);
3690 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 case term:
3692 com_term(c, n);
3693 break;
3694 case factor:
3695 com_factor(c, n);
3696 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003697 case power:
3698 com_power(c, n);
3699 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700 case atom:
3701 com_atom(c, n);
3702 break;
3703
3704 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003705 com_error(c, PyExc_SystemError,
3706 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003707 }
3708}
3709
Tim Petersdbd9ba62000-07-09 03:09:57 +00003710static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711
3712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003713com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714{
3715 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3716 if (TYPE(CHILD(n, 0)) == LPAR)
3717 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003718 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003719 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003720 com_pop(c, 1);
3721 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722}
3723
3724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003725com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003727 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 if (NCH(n) == 1) {
3729 com_fpdef(c, CHILD(n, 0));
3730 }
3731 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003733 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003734 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003735 for (i = 0; i < NCH(n); i += 2)
3736 com_fpdef(c, CHILD(n, i));
3737 }
3738}
3739
3740static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003741com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003742{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003743 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003744 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003745 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003746 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003747 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003748 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003749 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003750 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003751 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003752 node *ch = CHILD(n, i);
3753 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003754 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003755 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003756 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3757 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003758 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003759 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003760 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003761 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003762 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003763 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003764 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003765 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003766 ch = CHILD(n, i);
3767 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003768 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003769 else
3770 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003771 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003772 if (complex) {
3773 /* Generate code for complex arguments only after
3774 having counted the simple arguments */
3775 int ilocal = 0;
3776 for (i = 0; i < nch; i++) {
3777 node *ch = CHILD(n, i);
3778 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003779 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003780 break;
3781 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3782 fp = CHILD(ch, 0);
3783 if (TYPE(fp) != NAME) {
3784 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003785 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003786 com_fpdef(c, ch);
3787 }
3788 ilocal++;
3789 if (++i >= nch)
3790 break;
3791 ch = CHILD(n, i);
3792 if (TYPE(ch) == EQUAL)
3793 i += 2;
3794 else
3795 REQ(ch, COMMA);
3796 }
3797 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003798}
3799
3800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003801com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802{
3803 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003804 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003806 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003807 if (doc != NULL) {
3808 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003810 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003811 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003812 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003814 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003815 for (i = 0; i < NCH(n); i++) {
3816 node *ch = CHILD(n, i);
3817 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3818 com_node(c, ch);
3819 }
3820}
3821
3822/* Top-level compile-node interface */
3823
3824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003825compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003826{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003827 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003828 node *ch;
3829 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003830 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003831 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003832 if (doc != NULL) {
3833 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003834 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003835 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003836 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003838 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3839 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003840 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003841 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003842 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003844 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003845 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3846 com_push(c, 1);
3847 com_addbyte(c, RETURN_VALUE);
3848 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849}
3850
3851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003852compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003853{
Guido van Rossum590baa41993-11-30 13:40:46 +00003854 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003855 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003856 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003857
3858 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003859 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003860 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003861 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003862 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003863 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003864 else
3865 ch = CHILD(n, 2);
3866 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003867 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003869}
3870
3871static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003872compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003873{
3874 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003875 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003876 REQ(n, classdef);
3877 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3878 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003879 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003880 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003881 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003882 if (doc != NULL) {
3883 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003884 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003885 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003886 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003887 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003888 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003889 }
3890 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003891 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003892 com_node(c, ch);
3893 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003894 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003895 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003896 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003897}
3898
3899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003900compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003902 com_addoparg(c, SET_LINENO, n->n_lineno);
3903
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 switch (TYPE(n)) {
3905
Guido van Rossum4c417781991-01-21 16:09:22 +00003906 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003908 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003909 n = CHILD(n, 0);
3910 if (TYPE(n) != NEWLINE)
3911 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003912 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003913 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003914 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003916 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003917 break;
3918
Guido van Rossum4c417781991-01-21 16:09:22 +00003919 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003920 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003921 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003922 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003923 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003924 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003925 break;
3926
Guido van Rossum590baa41993-11-30 13:40:46 +00003927 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003928 com_node(c, CHILD(n, 0));
3929 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003930 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003931 break;
3932
Guido van Rossum590baa41993-11-30 13:40:46 +00003933 case lambdef: /* anonymous function definition */
3934 compile_lambdef(c, n);
3935 break;
3936
Guido van Rossum4c417781991-01-21 16:09:22 +00003937 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003938 compile_funcdef(c, n);
3939 break;
3940
Guido van Rossum4c417781991-01-21 16:09:22 +00003941 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003942 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003943 break;
3944
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003947 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948 }
3949}
3950
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003951static PyObject *
3952dict_keys_inorder(PyObject *dict, int offset)
3953{
3954 PyObject *tuple, *k, *v;
3955 int i, pos = 0, size = PyDict_Size(dict);
3956
3957 tuple = PyTuple_New(size);
3958 if (tuple == NULL)
3959 return NULL;
3960 while (PyDict_Next(dict, &pos, &k, &v)) {
3961 i = PyInt_AS_LONG(v);
3962 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003963 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003964 PyTuple_SET_ITEM(tuple, i - offset, k);
3965 }
3966 return tuple;
3967}
3968
Guido van Rossum79f25d91997-04-29 20:08:16 +00003969PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003970PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003971{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003972 return PyNode_CompileFlags(n, filename, NULL);
3973}
3974
3975PyCodeObject *
3976PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3977{
3978 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003979}
3980
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003981struct symtable *
3982PyNode_CompileSymtable(node *n, char *filename)
3983{
3984 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003985 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003986
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003987 ff = PyNode_Future(n, filename);
3988 if (ff == NULL)
3989 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003990 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003991 if (st == NULL)
3992 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003993 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003994 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003995 if (st->st_errors > 0)
3996 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003997 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003998 if (st->st_errors > 0)
3999 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004000
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004001 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004002 fail:
4003 PyMem_Free((void *)ff);
4004 st->st_future = NULL;
4005 PySymtable_Free(st);
4006 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004007}
4008
Guido van Rossum79f25d91997-04-29 20:08:16 +00004009static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004010icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004011{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004012 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004013}
4014
Guido van Rossum79f25d91997-04-29 20:08:16 +00004015static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004016jcompile(node *n, char *filename, struct compiling *base,
4017 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004018{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004019 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004020 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004021 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004022 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004023 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004024 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004025 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004026 /* c_symtable still points to parent's symbols */
4027 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004028 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 sc.c_nested = 1;
Guido van Rossum4668b002001-08-08 05:00:18 +00004030 sc.c_flags |= base->c_flags & (CO_GENERATOR_ALLOWED |
4031 CO_FUTURE_DIVISION);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004032 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004033 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004034 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004035 if (sc.c_future == NULL) {
4036 com_free(&sc);
4037 return NULL;
4038 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004039 if (flags) {
4040 int merged = sc.c_future->ff_features |
4041 flags->cf_flags;
4042 sc.c_future->ff_features = merged;
4043 flags->cf_flags = merged;
4044 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004045 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004046 com_free(&sc);
4047 return NULL;
4048 }
4049 }
4050 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004051 if (symtable_load_symbols(&sc) < 0) {
4052 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004053 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004054 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004055 compile_node(&sc, n);
4056 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004057 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004058 PyObject *consts, *names, *varnames, *filename, *name,
4059 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004060 consts = PyList_AsTuple(sc.c_consts);
4061 names = PyList_AsTuple(sc.c_names);
4062 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004063 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4064 freevars = dict_keys_inorder(sc.c_freevars,
4065 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004066 filename = PyString_InternFromString(sc.c_filename);
4067 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068 if (!PyErr_Occurred())
4069 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004070 sc.c_nlocals,
4071 sc.c_maxstacklevel,
4072 sc.c_flags,
4073 sc.c_code,
4074 consts,
4075 names,
4076 varnames,
4077 freevars,
4078 cellvars,
4079 filename,
4080 name,
4081 sc.c_firstlineno,
4082 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004083 Py_XDECREF(consts);
4084 Py_XDECREF(names);
4085 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004086 Py_XDECREF(freevars);
4087 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004088 Py_XDECREF(filename);
4089 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004090 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004091 else if (!PyErr_Occurred()) {
4092 /* This could happen if someone called PyErr_Clear() after an
4093 error was reported above. That's not supposed to happen,
4094 but I just plugged one case and I'm not sure there can't be
4095 others. In that case, raise SystemError so that at least
4096 it gets reported instead dumping core. */
4097 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4098 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004099 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004100 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004101 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004102 sc.c_symtable = NULL;
4103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105 return co;
4106}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004107
4108int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004109PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004110{
4111 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004112 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004113 int line = co->co_firstlineno;
4114 int addr = 0;
4115 while (--size >= 0) {
4116 addr += *p++;
4117 if (addr > addrq)
4118 break;
4119 line += *p++;
4120 }
4121 return line;
4122}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004123
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004124/* The test for LOCAL must come before the test for FREE in order to
4125 handle classes where name is both local and free. The local var is
4126 a method and the free var is a free var referenced within a method.
4127*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004128
4129static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004131{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004132 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004133 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004134
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004135 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4136 return CELL;
4137 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4138 return LOCAL;
4139 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4140 return FREE;
4141 v = PyDict_GetItemString(c->c_globals, name);
4142 if (v) {
4143 if (v == Py_None)
4144 return GLOBAL_EXPLICIT;
4145 else {
4146 return GLOBAL_IMPLICIT;
4147 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004148 }
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004149 sprintf(buf,
4150 "unknown scope for %.100s in %.100s(%s) "
4151 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4152 name, c->c_name,
4153 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4154 c->c_filename,
4155 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4156 PyObject_REPR(c->c_locals),
4157 PyObject_REPR(c->c_globals)
4158 );
4159
4160 Py_FatalError(buf);
4161 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004162}
4163
Guido van Rossum207fda62001-03-02 03:30:41 +00004164/* Helper functions to issue warnings */
4165
4166static int
4167issue_warning(char *msg, char *filename, int lineno)
4168{
4169 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4170 lineno, NULL, NULL) < 0) {
4171 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4172 PyErr_SetString(PyExc_SyntaxError, msg);
4173 PyErr_SyntaxLocation(filename, lineno);
4174 }
4175 return -1;
4176 }
4177 return 0;
4178}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004179
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004180static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004181symtable_warn(struct symtable *st, char *msg)
4182{
Guido van Rossum207fda62001-03-02 03:30:41 +00004183 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004184 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004185 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004186 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004187 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004188}
4189
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004190/* Helper function for setting lineno and filename */
4191
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004192static int
4193symtable_build(struct compiling *c, node *n)
4194{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004195 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004196 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004197 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004198 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004199 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4200 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004201 return -1;
4202 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004203 if (c->c_symtable->st_errors > 0)
4204 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004205 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004206 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004207 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004208 return 0;
4209}
4210
4211static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004212symtable_init_compiling_symbols(struct compiling *c)
4213{
4214 PyObject *varnames;
4215
4216 varnames = c->c_symtable->st_cur->ste_varnames;
4217 if (varnames == NULL) {
4218 varnames = PyList_New(0);
4219 if (varnames == NULL)
4220 return -1;
4221 c->c_symtable->st_cur->ste_varnames = varnames;
4222 Py_INCREF(varnames);
4223 } else
4224 Py_INCREF(varnames);
4225 c->c_varnames = varnames;
4226
4227 c->c_globals = PyDict_New();
4228 if (c->c_globals == NULL)
4229 return -1;
4230 c->c_freevars = PyDict_New();
4231 if (c->c_freevars == NULL)
4232 return -1;
4233 c->c_cellvars = PyDict_New();
4234 if (c->c_cellvars == NULL)
4235 return -1;
4236 return 0;
4237}
4238
4239struct symbol_info {
4240 int si_nlocals;
4241 int si_ncells;
4242 int si_nfrees;
4243 int si_nimplicit;
4244};
4245
4246static void
4247symtable_init_info(struct symbol_info *si)
4248{
4249 si->si_nlocals = 0;
4250 si->si_ncells = 0;
4251 si->si_nfrees = 0;
4252 si->si_nimplicit = 0;
4253}
4254
4255static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004256symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004257 struct symbol_info *si)
4258{
4259 PyObject *dict, *v;
4260
4261 /* Seperate logic for DEF_FREE. If it occurs in a function,
4262 it indicates a local that we must allocate storage for (a
4263 cell var). If it occurs in a class, then the class has a
4264 method and a free variable with the same name.
4265 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004266 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004267 /* If it isn't declared locally, it can't be a cell. */
4268 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4269 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004270 v = PyInt_FromLong(si->si_ncells++);
4271 dict = c->c_cellvars;
4272 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004273 /* If it is free anyway, then there is no need to do
4274 anything here.
4275 */
4276 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004277 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004278 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004279 v = PyInt_FromLong(si->si_nfrees++);
4280 dict = c->c_freevars;
4281 }
4282 if (v == NULL)
4283 return -1;
4284 if (PyDict_SetItem(dict, name, v) < 0) {
4285 Py_DECREF(v);
4286 return -1;
4287 }
4288 Py_DECREF(v);
4289 return 0;
4290}
4291
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004292/* If a variable is a cell and an argument, make sure that appears in
4293 co_cellvars before any variable to its right in varnames.
4294*/
4295
4296
4297static int
4298symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4299 PyObject *varnames, int flags)
4300{
4301 PyObject *v, *w, *d, *list = NULL;
4302 int i, pos;
4303
4304 if (flags & CO_VARARGS)
4305 argcount++;
4306 if (flags & CO_VARKEYWORDS)
4307 argcount++;
4308 for (i = argcount; --i >= 0; ) {
4309 v = PyList_GET_ITEM(varnames, i);
4310 if (PyDict_GetItem(*cellvars, v)) {
4311 if (list == NULL) {
4312 list = PyList_New(1);
4313 if (list == NULL)
4314 return -1;
4315 PyList_SET_ITEM(list, 0, v);
4316 Py_INCREF(v);
4317 } else
4318 PyList_Insert(list, 0, v);
4319 }
4320 }
4321 if (list == NULL || PyList_GET_SIZE(list) == 0)
4322 return 0;
4323 /* There are cellvars that are also arguments. Create a dict
4324 to replace cellvars and put the args at the front.
4325 */
4326 d = PyDict_New();
4327 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4328 v = PyInt_FromLong(i);
4329 if (v == NULL)
4330 goto fail;
4331 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4332 goto fail;
4333 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4334 goto fail;
4335 }
4336 pos = 0;
4337 i = PyList_GET_SIZE(list);
4338 Py_DECREF(list);
4339 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4340 w = PyInt_FromLong(i++); /* don't care about the old key */
4341 if (PyDict_SetItem(d, v, w) < 0) {
4342 Py_DECREF(w);
4343 goto fail;
4344 }
4345 Py_DECREF(w);
4346 }
4347 Py_DECREF(*cellvars);
4348 *cellvars = d;
4349 return 1;
4350 fail:
4351 Py_DECREF(d);
4352 return -1;
4353}
4354
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004355static int
4356symtable_freevar_offsets(PyObject *freevars, int offset)
4357{
4358 PyObject *name, *v;
4359 int pos;
4360
4361 /* The cell vars are the first elements of the closure,
4362 followed by the free vars. Update the offsets in
4363 c_freevars to account for number of cellvars. */
4364 pos = 0;
4365 while (PyDict_Next(freevars, &pos, &name, &v)) {
4366 int i = PyInt_AS_LONG(v) + offset;
4367 PyObject *o = PyInt_FromLong(i);
4368 if (o == NULL)
4369 return -1;
4370 if (PyDict_SetItem(freevars, name, o) < 0) {
4371 Py_DECREF(o);
4372 return -1;
4373 }
4374 Py_DECREF(o);
4375 }
4376 return 0;
4377}
4378
4379static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004380symtable_check_unoptimized(struct compiling *c,
4381 PySymtableEntryObject *ste,
4382 struct symbol_info *si)
4383{
4384 char buf[300];
4385
4386 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4387 || (ste->ste_nested && si->si_nimplicit)))
4388 return 0;
4389
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004390#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4391
4392#define ILLEGAL_IS "is a nested function"
4393
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004394#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004395"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004396
4397#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004398"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004399
4400#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4401"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004402"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004403
4404 /* XXX perhaps the linenos for these opt-breaking statements
4405 should be stored so the exception can point to them. */
4406
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004407 if (ste->ste_child_free) {
4408 if (ste->ste_optimized == OPT_IMPORT_STAR)
4409 sprintf(buf, ILLEGAL_IMPORT_STAR,
4410 PyString_AS_STRING(ste->ste_name),
4411 ILLEGAL_CONTAINS);
4412 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4413 sprintf(buf, ILLEGAL_BARE_EXEC,
4414 PyString_AS_STRING(ste->ste_name),
4415 ILLEGAL_CONTAINS);
4416 else {
4417 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4418 PyString_AS_STRING(ste->ste_name),
4419 ILLEGAL_CONTAINS);
4420 }
4421 } else {
4422 if (ste->ste_optimized == OPT_IMPORT_STAR)
4423 sprintf(buf, ILLEGAL_IMPORT_STAR,
4424 PyString_AS_STRING(ste->ste_name),
4425 ILLEGAL_IS);
4426 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4427 sprintf(buf, ILLEGAL_BARE_EXEC,
4428 PyString_AS_STRING(ste->ste_name),
4429 ILLEGAL_IS);
4430 else {
4431 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4432 PyString_AS_STRING(ste->ste_name),
4433 ILLEGAL_IS);
4434 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004435 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004436
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004437 PyErr_SetString(PyExc_SyntaxError, buf);
4438 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4439 ste->ste_opt_lineno);
4440 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004441}
4442
4443static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004444symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4445 struct symbol_info *si)
4446{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004447 if (c->c_future)
4448 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004449 if (ste->ste_generator)
4450 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004451 if (ste->ste_type != TYPE_MODULE)
4452 c->c_flags |= CO_NEWLOCALS;
4453 if (ste->ste_type == TYPE_FUNCTION) {
4454 c->c_nlocals = si->si_nlocals;
4455 if (ste->ste_optimized == 0)
4456 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004457 else if (ste->ste_optimized != OPT_EXEC)
4458 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004459 }
4460 return 0;
4461}
4462
4463static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464symtable_load_symbols(struct compiling *c)
4465{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004466 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004467 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004468 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004469 PyObject *name, *varnames, *v;
4470 int i, flags, pos;
4471 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004472
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004473 if (implicit == NULL) {
4474 implicit = PyInt_FromLong(1);
4475 if (implicit == NULL)
4476 return -1;
4477 }
4478 v = NULL;
4479
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004480 if (symtable_init_compiling_symbols(c) < 0)
4481 goto fail;
4482 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004483 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004484 si.si_nlocals = PyList_GET_SIZE(varnames);
4485 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004486
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004487 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004488 v = PyInt_FromLong(i);
4489 if (PyDict_SetItem(c->c_locals,
4490 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491 goto fail;
4492 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004493 }
4494
4495 /* XXX The cases below define the rules for whether a name is
4496 local or global. The logic could probably be clearer. */
4497 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004498 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4499 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004501 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004502 /* undo the original DEF_FREE */
4503 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004504
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004505 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004506 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004507 2. Free variables in methods that are also class
4508 variables or declared global.
4509 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004510 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004511 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004512
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004513 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004514 c->c_argcount--;
4515 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004516 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004517 c->c_argcount--;
4518 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004519 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004520 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004521 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004522 if (flags & DEF_PARAM) {
4523 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004524 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004525 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004526 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004527 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4531 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4535 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004536 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004537 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538 if (v == NULL)
4539 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 goto fail;
4542 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004543 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004546 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004547 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004548 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549 if (v == NULL)
4550 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004551 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 goto fail;
4553 Py_DECREF(v);
4554 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004555 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004556 if (PyDict_SetItem(c->c_globals, name,
4557 implicit) < 0)
4558 goto fail;
4559 if (st->st_nscopes != 1) {
4560 v = PyInt_FromLong(flags);
4561 if (PyDict_SetItem(st->st_global,
4562 name, v))
4563 goto fail;
4564 Py_DECREF(v);
4565 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567 }
4568 }
4569
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004570 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4571
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004572 if (si.si_ncells > 1) { /* one cell is always in order */
4573 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4574 c->c_varnames, c->c_flags) < 0)
4575 return -1;
4576 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004577 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4578 return -1;
4579 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004580 fail:
4581 /* is this always the right thing to do? */
4582 Py_XDECREF(v);
4583 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004584}
4585
4586static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004587symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004588{
4589 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004590
4591 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4592 if (st == NULL)
4593 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004595
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004596 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004597 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004598 goto fail;
4599 if ((st->st_symbols = PyDict_New()) == NULL)
4600 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004602 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 st->st_errors = 0;
4604 st->st_tmpname = 0;
4605 st->st_private = NULL;
4606 return st;
4607 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004608 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004609 return NULL;
4610}
4611
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004612void
4613PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614{
4615 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004616 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004617 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004618 PyMem_Free((void *)st);
4619}
4620
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004621/* When the compiler exits a scope, it must should update the scope's
4622 free variable information with the list of free variables in its
4623 children.
4624
4625 Variables that are free in children and defined in the current
4626 scope are cellvars.
4627
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004628 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 false), free variables in children that are not defined here are
4630 implicit globals.
4631
4632*/
4633
4634static int
4635symtable_update_free_vars(struct symtable *st)
4636{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004637 int i, j, def;
4638 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004639 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004640
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004641 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004642 def = DEF_FREE_CLASS;
4643 else
4644 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004645 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004646 int pos = 0;
4647
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004648 if (list)
4649 PyList_SetSlice(list, 0,
4650 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004651 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004652 PyList_GET_ITEM(ste->ste_children, i);
4653 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004654 int flags = PyInt_AS_LONG(o);
4655 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004657 if (list == NULL) {
4658 list = PyList_New(0);
4659 if (list == NULL)
4660 return -1;
4661 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004662 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004663 if (PyList_Append(list, name) < 0) {
4664 Py_DECREF(list);
4665 return -1;
4666 }
4667 }
4668 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004669 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004670 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004671 v = PyDict_GetItem(ste->ste_symbols, name);
4672 /* If a name N is declared global in scope A and
4673 referenced in scope B contained (perhaps
4674 indirectly) in A and there are no scopes
4675 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004676 is global in B. Unless A is a class scope,
4677 because class scopes are not considered for
4678 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004679 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004680 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004681 int flags = PyInt_AS_LONG(v);
4682 if (flags & DEF_GLOBAL) {
4683 symtable_undo_free(st, child->ste_id,
4684 name);
4685 continue;
4686 }
4687 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 if (ste->ste_nested) {
4689 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004690 name, def) < 0) {
4691 Py_DECREF(list);
4692 return -1;
4693 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004695 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004696 name) < 0) {
4697 Py_DECREF(list);
4698 return -1;
4699 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004700 }
4701 }
4702 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004703
4704 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004705 return 0;
4706}
4707
4708/* If the current scope is a non-nested class or if name is not
4709 defined in the current, non-nested scope, then it is an implicit
4710 global in all nested scopes.
4711*/
4712
4713static int
4714symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4715{
4716 PyObject *o;
4717 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004718 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004719
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004720 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004721 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004722 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004723 if (o == NULL)
4724 return symtable_undo_free(st, child, name);
4725 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004726
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004727 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 return symtable_undo_free(st, child, name);
4729 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004730 return symtable_add_def_o(st, ste->ste_symbols,
4731 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004732}
4733
4734static int
4735symtable_undo_free(struct symtable *st, PyObject *id,
4736 PyObject *name)
4737{
4738 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004739 PyObject *info;
4740 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4743 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004745
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004746 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 if (info == NULL)
4748 return 0;
4749 v = PyInt_AS_LONG(info);
4750 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004751 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004752 DEF_FREE_GLOBAL) < 0)
4753 return -1;
4754 } else
4755 /* If the name is defined here or declared global,
4756 then the recursion stops. */
4757 return 0;
4758
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004759 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4760 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004761 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004762 PyList_GET_ITEM(ste->ste_children, i);
4763 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 if (x < 0)
4765 return x;
4766 }
4767 return 0;
4768}
4769
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004770/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4771 This reference is released when the scope is exited, via the DECREF
4772 in symtable_exit_scope().
4773*/
4774
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004775static int
4776symtable_exit_scope(struct symtable *st)
4777{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 int end;
4779
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004780 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004783 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004784 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4785 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 if (PySequence_DelItem(st->st_stack, end) < 0)
4787 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004791static void
4792symtable_enter_scope(struct symtable *st, char *name, int type,
4793 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004794{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796
4797 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 prev = st->st_cur;
4799 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4800 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004801 st->st_errors++;
4802 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004803 }
4804 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004805 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004806 PySymtableEntry_New(st, name, type, lineno);
4807 if (strcmp(name, TOP) == 0)
4808 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004809 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004810 if (PyList_Append(prev->ste_children,
4811 (PyObject *)st->st_cur) < 0)
4812 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004813 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004814}
4815
4816static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004817symtable_lookup(struct symtable *st, char *name)
4818{
4819 char buffer[MANGLE_LEN];
4820 PyObject *v;
4821 int flags;
4822
4823 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4824 name = buffer;
4825 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4826 if (v == NULL) {
4827 if (PyErr_Occurred())
4828 return -1;
4829 else
4830 return 0;
4831 }
4832
4833 flags = PyInt_AS_LONG(v);
4834 return flags;
4835}
4836
4837static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004840 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004841 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004842 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004843
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004844 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845 name = buffer;
4846 if ((s = PyString_InternFromString(name)) == NULL)
4847 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004848 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4849 Py_DECREF(s);
4850 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851}
4852
4853/* Must only be called with mangled names */
4854
4855static int
4856symtable_add_def_o(struct symtable *st, PyObject *dict,
4857 PyObject *name, int flag)
4858{
4859 PyObject *o;
4860 int val;
4861
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004864 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004865 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004866 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004867 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004868 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 return -1;
4870 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004871 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004873 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004874 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876 Py_DECREF(o);
4877 return -1;
4878 }
4879 Py_DECREF(o);
4880
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004881 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004883 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 } else if (flag & DEF_GLOBAL) {
4885 /* XXX need to update DEF_GLOBAL for other flags too;
4886 perhaps only DEF_FREE_GLOBAL */
4887 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004888 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004890 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004891 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004894 Py_DECREF(o);
4895 return -1;
4896 }
4897 Py_DECREF(o);
4898 }
4899 return 0;
4900}
4901
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903
Tim Peters08a898f2001-06-28 01:52:22 +00004904/* Look for a yield stmt under n. Return 1 if found, else 0.
4905 This hack is used to look inside "if 0:" blocks (which are normally
4906 ignored) in case those are the only places a yield occurs (so that this
4907 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004908static int
4909look_for_yield(node *n)
4910{
4911 int i;
4912
4913 for (i = 0; i < NCH(n); ++i) {
4914 node *kid = CHILD(n, i);
4915
4916 switch (TYPE(kid)) {
4917
4918 case classdef:
4919 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004920 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004921 /* Stuff in nested functions and classes can't make
4922 the parent a generator. */
4923 return 0;
4924
4925 case yield_stmt:
4926 return 1;
4927
4928 default:
4929 if (look_for_yield(kid))
4930 return 1;
4931 }
4932 }
4933 return 0;
4934}
4935
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936static void
4937symtable_node(struct symtable *st, node *n)
4938{
4939 int i, start = 0;
4940
4941 loop:
4942 switch (TYPE(n)) {
4943 case funcdef: {
4944 char *func_name = STR(CHILD(n, 1));
4945 symtable_add_def(st, func_name, DEF_LOCAL);
4946 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004947 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 symtable_funcdef(st, n);
4949 symtable_exit_scope(st);
4950 break;
4951 }
4952 case lambdef:
4953 if (NCH(n) == 4)
4954 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004955 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956 symtable_funcdef(st, n);
4957 symtable_exit_scope(st);
4958 break;
4959 case classdef: {
4960 char *tmp, *class_name = STR(CHILD(n, 1));
4961 symtable_add_def(st, class_name, DEF_LOCAL);
4962 if (TYPE(CHILD(n, 2)) == LPAR) {
4963 node *bases = CHILD(n, 3);
4964 int i;
4965 for (i = 0; i < NCH(bases); i += 2) {
4966 symtable_node(st, CHILD(bases, i));
4967 }
4968 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004969 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970 tmp = st->st_private;
4971 st->st_private = class_name;
4972 symtable_node(st, CHILD(n, NCH(n) - 1));
4973 st->st_private = tmp;
4974 symtable_exit_scope(st);
4975 break;
4976 }
4977 case if_stmt:
4978 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00004979 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
4980 if (st->st_cur->ste_generator == 0)
4981 st->st_cur->ste_generator =
4982 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004984 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985 symtable_node(st, CHILD(n, i + 1));
4986 symtable_node(st, CHILD(n, i + 3));
4987 }
4988 if (i + 2 < NCH(n))
4989 symtable_node(st, CHILD(n, i + 2));
4990 break;
4991 case global_stmt:
4992 symtable_global(st, n);
4993 break;
4994 case import_stmt:
4995 symtable_import(st, n);
4996 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00004997 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004998 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004999 symtable_node(st, CHILD(n, 1));
5000 if (NCH(n) > 2)
5001 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005002 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005003 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005004 st->st_cur->ste_opt_lineno = n->n_lineno;
5005 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006 if (NCH(n) > 4)
5007 symtable_node(st, CHILD(n, 5));
5008 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005009
5010 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005011 case assert_stmt:
5012 if (Py_OptimizeFlag)
5013 return;
5014 if (NCH(n) == 2) {
5015 n = CHILD(n, 1);
5016 goto loop;
5017 } else {
5018 symtable_node(st, CHILD(n, 1));
5019 n = CHILD(n, 3);
5020 goto loop;
5021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005022 case except_clause:
5023 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005024 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 if (NCH(n) > 1) {
5026 n = CHILD(n, 1);
5027 goto loop;
5028 }
5029 break;
5030 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005031 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005032 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005033 case yield_stmt:
5034 st->st_cur->ste_generator = 1;
5035 n = CHILD(n, 1);
5036 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037 case expr_stmt:
5038 if (NCH(n) == 1)
5039 n = CHILD(n, 0);
5040 else {
5041 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005042 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005043 symtable_node(st, CHILD(n, 2));
5044 break;
5045 } else {
5046 int i;
5047 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005048 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005049 n = CHILD(n, NCH(n) - 1);
5050 }
5051 }
5052 goto loop;
5053 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054 case argument:
5055 if (NCH(n) == 3) {
5056 n = CHILD(n, 2);
5057 goto loop;
5058 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005059 case listmaker:
5060 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005061 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005063 symtable_node(st, CHILD(n, 0));
5064 st->st_tmpname--;
5065 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005066 }
5067 case atom:
5068 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5069 symtable_add_use(st, STR(CHILD(n, 0)));
5070 break;
5071 }
5072 case for_stmt:
5073 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005074 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 start = 3;
5076 }
5077 default:
5078 if (NCH(n) == 1) {
5079 n = CHILD(n, 0);
5080 goto loop;
5081 }
5082 for (i = start; i < NCH(n); ++i)
5083 if (TYPE(CHILD(n, i)) >= single_input)
5084 symtable_node(st, CHILD(n, i));
5085 }
5086}
5087
5088static void
5089symtable_funcdef(struct symtable *st, node *n)
5090{
5091 node *body;
5092
5093 if (TYPE(n) == lambdef) {
5094 if (NCH(n) == 4)
5095 symtable_params(st, CHILD(n, 1));
5096 } else
5097 symtable_params(st, CHILD(n, 2));
5098 body = CHILD(n, NCH(n) - 1);
5099 symtable_node(st, body);
5100}
5101
5102/* The next two functions parse the argument tuple.
5103 symtable_default_arg() checks for names in the default arguments,
5104 which are references in the defining scope. symtable_params()
5105 parses the parameter names, which are defined in the function's
5106 body.
5107
5108 varargslist:
5109 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5110 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5111*/
5112
5113static void
5114symtable_default_args(struct symtable *st, node *n)
5115{
5116 node *c;
5117 int i;
5118
5119 if (TYPE(n) == parameters) {
5120 n = CHILD(n, 1);
5121 if (TYPE(n) == RPAR)
5122 return;
5123 }
5124 REQ(n, varargslist);
5125 for (i = 0; i < NCH(n); i += 2) {
5126 c = CHILD(n, i);
5127 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5128 break;
5129 }
5130 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5131 symtable_node(st, CHILD(n, i));
5132 }
5133}
5134
5135static void
5136symtable_params(struct symtable *st, node *n)
5137{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005138 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005139 node *c = NULL;
5140
5141 if (TYPE(n) == parameters) {
5142 n = CHILD(n, 1);
5143 if (TYPE(n) == RPAR)
5144 return;
5145 }
5146 REQ(n, varargslist);
5147 for (i = 0; i < NCH(n); i += 2) {
5148 c = CHILD(n, i);
5149 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5150 ext = 1;
5151 break;
5152 }
5153 if (TYPE(c) == test) {
5154 continue;
5155 }
5156 if (TYPE(CHILD(c, 0)) == NAME)
5157 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5158 else {
5159 char nbuf[10];
5160 sprintf(nbuf, ".%d", i);
5161 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005162 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005163 }
5164 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 if (ext) {
5166 c = CHILD(n, i);
5167 if (TYPE(c) == STAR) {
5168 i++;
5169 symtable_add_def(st, STR(CHILD(n, i)),
5170 DEF_PARAM | DEF_STAR);
5171 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005172 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005173 c = NULL;
5174 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005175 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005177 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005178 i++;
5179 symtable_add_def(st, STR(CHILD(n, i)),
5180 DEF_PARAM | DEF_DOUBLESTAR);
5181 }
5182 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005183 if (complex >= 0) {
5184 int j;
5185 for (j = 0; j <= complex; j++) {
5186 c = CHILD(n, j);
5187 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005188 c = CHILD(n, ++j);
5189 else if (TYPE(c) == EQUAL)
5190 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005191 if (TYPE(CHILD(c, 0)) == LPAR)
5192 symtable_params_fplist(st, CHILD(c, 1));
5193 }
5194 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195}
5196
5197static void
5198symtable_params_fplist(struct symtable *st, node *n)
5199{
5200 int i;
5201 node *c;
5202
5203 REQ(n, fplist);
5204 for (i = 0; i < NCH(n); i += 2) {
5205 c = CHILD(n, i);
5206 REQ(c, fpdef);
5207 if (NCH(c) == 1)
5208 symtable_add_def(st, STR(CHILD(c, 0)),
5209 DEF_PARAM | DEF_INTUPLE);
5210 else
5211 symtable_params_fplist(st, CHILD(c, 1));
5212 }
5213
5214}
5215
5216static void
5217symtable_global(struct symtable *st, node *n)
5218{
5219 int i;
5220
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005221 /* XXX It might be helpful to warn about module-level global
5222 statements, but it's hard to tell the difference between
5223 module-level and a string passed to exec.
5224 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005225
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005226 for (i = 1; i < NCH(n); i += 2) {
5227 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005228 int flags;
5229
5230 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005231 if (flags < 0)
5232 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005233 if (flags && flags != DEF_GLOBAL) {
5234 char buf[500];
5235 if (flags & DEF_PARAM) {
5236 PyErr_Format(PyExc_SyntaxError,
5237 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005238 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005239 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005240 st->st_cur->ste_lineno);
5241 st->st_errors++;
5242 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005243 }
5244 else {
5245 if (flags & DEF_LOCAL)
5246 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5247 name);
5248 else
5249 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005250 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005251 }
5252 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005253 symtable_add_def(st, name, DEF_GLOBAL);
5254 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255}
5256
5257static void
5258symtable_list_comprehension(struct symtable *st, node *n)
5259{
5260 char tmpname[12];
5261
Jeremy Hylton23b42272001-03-19 20:38:06 +00005262 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005264 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005265 symtable_node(st, CHILD(n, 3));
5266 if (NCH(n) == 5)
5267 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268}
5269
5270static void
5271symtable_import(struct symtable *st, node *n)
5272{
5273 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005274 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275 | 'from' dotted_name 'import'
5276 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005277 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005280 node *dotname = CHILD(n, 1);
5281 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5282 /* check for bogus imports */
5283 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5284 PyErr_SetString(PyExc_SyntaxError,
5285 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005286 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005287 n->n_lineno);
5288 st->st_errors++;
5289 return;
5290 }
5291 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005293 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005294 if (symtable_warn(st,
5295 "import * only allowed at module level") < 0)
5296 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005297 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005298 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005299 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 } else {
5301 for (i = 3; i < NCH(n); i += 2) {
5302 node *c = CHILD(n, i);
5303 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005304 symtable_assign(st, CHILD(c, 2),
5305 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005307 symtable_assign(st, CHILD(c, 0),
5308 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 }
5310 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005311 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005313 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 }
5315 }
5316}
5317
5318static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005319symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005320{
5321 node *tmp;
5322 int i;
5323
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005324 loop:
5325 switch (TYPE(n)) {
5326 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005327 /* invalid assignment, e.g. lambda x:x=2. The next
5328 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005329 return;
5330 case power:
5331 if (NCH(n) > 2) {
5332 for (i = 2; i < NCH(n); ++i)
5333 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5334 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005335 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336 if (NCH(n) > 1) {
5337 symtable_node(st, CHILD(n, 0));
5338 symtable_node(st, CHILD(n, 1));
5339 } else {
5340 n = CHILD(n, 0);
5341 goto loop;
5342 }
5343 return;
5344 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005345 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5346 /* XXX This is an error, but the next pass
5347 will catch it. */
5348 return;
5349 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005350 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005351 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005352 }
5353 return;
5354 case exprlist:
5355 case testlist:
5356 if (NCH(n) == 1) {
5357 n = CHILD(n, 0);
5358 goto loop;
5359 }
5360 else {
5361 int i;
5362 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005363 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005364 return;
5365 }
5366 goto loop;
5367 case atom:
5368 tmp = CHILD(n, 0);
5369 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5370 n = CHILD(n, 1);
5371 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005372 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005373 if (strcmp(STR(tmp), "__debug__") == 0)
5374 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005375 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005376 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005377 return;
5378 case dotted_as_name:
5379 if (NCH(n) == 3)
5380 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005381 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005382 else
5383 symtable_add_def(st,
5384 STR(CHILD(CHILD(n,
5385 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005386 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005387 return;
5388 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005389 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005390 return;
5391 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005392 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393 return;
5394 default:
5395 if (NCH(n) == 0)
5396 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005397 if (NCH(n) == 1) {
5398 n = CHILD(n, 0);
5399 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005401 /* Should only occur for errors like x + 1 = 1,
5402 which will be caught in the next pass. */
5403 for (i = 0; i < NCH(n); ++i)
5404 if (TYPE(CHILD(n, i)) >= single_input)
5405 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 }
5407}