blob: ec7daafd44cf45b7dcea76196a2cdd97510dbf48 [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
Tim Peters51e26512001-09-07 08:45:55 +00001882static int
1883is_float_zero(const char *p)
1884{
1885 int found_radix_point = 0;
1886 int ch;
1887 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1888 switch (ch) {
1889 case '0':
1890 /* no reason to believe it's not 0 -- continue */
1891 break;
1892
1893 case 'e': case 'E': case 'j': case 'J':
1894 /* If this was a hex constant, we already would have
1895 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1896 must be an exponent marker, and we haven't yet
1897 seen a non-zero digit, and it doesn't matter what
1898 the exponent is then. For 'j' or 'J' similarly,
1899 except that this is an imaginary 0 then. */
1900 return 1;
1901
1902 case '.':
1903 found_radix_point = 1;
1904 break;
1905
1906 default:
1907 return 0;
1908 }
1909 }
1910 return found_radix_point;
1911}
1912
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001915{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001916 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001917 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001918 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001919 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001920 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001921 approriate value as a constant. If the value is negative,
1922 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001923 negative in the 0th position -- unless we're doing unary minus
1924 of a floating zero! In that case the sign is significant, but
1925 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001926 */
1927 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001928 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001929 && TYPE((pfactor = CHILD(n, 1))) == factor
1930 && NCH(pfactor) == 1
1931 && TYPE((ppower = CHILD(pfactor, 0))) == power
1932 && NCH(ppower) == 1
1933 && TYPE((patom = CHILD(ppower, 0))) == atom
1934 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1935 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001936 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001937 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001938 return;
1939 }
1940 if (childtype == MINUS) {
Tim Peters51e26512001-09-07 08:45:55 +00001941 char *s = malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001942 if (s == NULL) {
1943 com_error(c, PyExc_MemoryError, "");
1944 com_addbyte(c, 255);
1945 return;
1946 }
1947 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001948 strcpy(s + 1, STR(pnum));
1949 free(STR(pnum));
1950 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001951 }
Tim Peters51e26512001-09-07 08:45:55 +00001952 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001953 }
1954 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001955 com_factor(c, CHILD(n, 1));
1956 com_addbyte(c, UNARY_POSITIVE);
1957 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001958 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001959 com_factor(c, CHILD(n, 1));
1960 com_addbyte(c, UNARY_NEGATIVE);
1961 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001962 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001963 com_factor(c, CHILD(n, 1));
1964 com_addbyte(c, UNARY_INVERT);
1965 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001967 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001968 }
1969}
1970
1971static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001972com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973{
1974 int i;
1975 int op;
1976 REQ(n, term);
1977 com_factor(c, CHILD(n, 0));
1978 for (i = 2; i < NCH(n); i += 2) {
1979 com_factor(c, CHILD(n, i));
1980 switch (TYPE(CHILD(n, i-1))) {
1981 case STAR:
1982 op = BINARY_MULTIPLY;
1983 break;
1984 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00001985 if (c->c_flags & CO_FUTURE_DIVISION)
1986 op = BINARY_TRUE_DIVIDE;
1987 else
1988 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 break;
1990 case PERCENT:
1991 op = BINARY_MODULO;
1992 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00001993 case DOUBLESLASH:
1994 op = BINARY_FLOOR_DIVIDE;
1995 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001996 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00001998 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001999 op = 255;
2000 }
2001 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002002 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002003 }
2004}
2005
2006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002007com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002008{
2009 int i;
2010 int op;
2011 REQ(n, arith_expr);
2012 com_term(c, CHILD(n, 0));
2013 for (i = 2; i < NCH(n); i += 2) {
2014 com_term(c, CHILD(n, i));
2015 switch (TYPE(CHILD(n, i-1))) {
2016 case PLUS:
2017 op = BINARY_ADD;
2018 break;
2019 case MINUS:
2020 op = BINARY_SUBTRACT;
2021 break;
2022 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002024 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002025 op = 255;
2026 }
2027 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002028 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002029 }
2030}
2031
2032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002033com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002034{
2035 int i;
2036 int op;
2037 REQ(n, shift_expr);
2038 com_arith_expr(c, CHILD(n, 0));
2039 for (i = 2; i < NCH(n); i += 2) {
2040 com_arith_expr(c, CHILD(n, i));
2041 switch (TYPE(CHILD(n, i-1))) {
2042 case LEFTSHIFT:
2043 op = BINARY_LSHIFT;
2044 break;
2045 case RIGHTSHIFT:
2046 op = BINARY_RSHIFT;
2047 break;
2048 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002050 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002051 op = 255;
2052 }
2053 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002054 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002055 }
2056}
2057
2058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002059com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002060{
2061 int i;
2062 int op;
2063 REQ(n, and_expr);
2064 com_shift_expr(c, CHILD(n, 0));
2065 for (i = 2; i < NCH(n); i += 2) {
2066 com_shift_expr(c, CHILD(n, i));
2067 if (TYPE(CHILD(n, i-1)) == AMPER) {
2068 op = BINARY_AND;
2069 }
2070 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002071 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002072 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002073 op = 255;
2074 }
2075 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002077 }
2078}
2079
2080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002081com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002082{
2083 int i;
2084 int op;
2085 REQ(n, xor_expr);
2086 com_and_expr(c, CHILD(n, 0));
2087 for (i = 2; i < NCH(n); i += 2) {
2088 com_and_expr(c, CHILD(n, i));
2089 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2090 op = BINARY_XOR;
2091 }
2092 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002094 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095 op = 255;
2096 }
2097 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002098 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002099 }
2100}
2101
2102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002103com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104{
2105 int i;
2106 int op;
2107 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002108 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002110 com_xor_expr(c, CHILD(n, i));
2111 if (TYPE(CHILD(n, i-1)) == VBAR) {
2112 op = BINARY_OR;
2113 }
2114 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002115 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002116 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 op = 255;
2118 }
2119 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002120 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 }
2122}
2123
2124static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002125cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126{
2127 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002128 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2130 if (NCH(n) == 1) {
2131 n = CHILD(n, 0);
2132 switch (TYPE(n)) {
2133 case LESS: return LT;
2134 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002135 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002136 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002137 case LESSEQUAL: return LE;
2138 case GREATEREQUAL: return GE;
2139 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2141 if (strcmp(STR(n), "is") == 0) return IS;
2142 }
2143 }
2144 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2147 return NOT_IN;
2148 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2149 return IS_NOT;
2150 }
2151 }
2152 return BAD;
2153}
2154
2155static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002156com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157{
2158 int i;
2159 enum cmp_op op;
2160 int anchor;
2161 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2162 com_expr(c, CHILD(n, 0));
2163 if (NCH(n) == 1)
2164 return;
2165
2166 /****************************************************************
2167 The following code is generated for all but the last
2168 comparison in a chain:
2169
2170 label: on stack: opcode: jump to:
2171
2172 a <code to load b>
2173 a, b DUP_TOP
2174 a, b, b ROT_THREE
2175 b, a, b COMPARE_OP
2176 b, 0-or-1 JUMP_IF_FALSE L1
2177 b, 1 POP_TOP
2178 b
2179
2180 We are now ready to repeat this sequence for the next
2181 comparison in the chain.
2182
2183 For the last we generate:
2184
2185 b <code to load c>
2186 b, c COMPARE_OP
2187 0-or-1
2188
2189 If there were any jumps to L1 (i.e., there was more than one
2190 comparison), we generate:
2191
2192 0-or-1 JUMP_FORWARD L2
2193 L1: b, 0 ROT_TWO
2194 0, b POP_TOP
2195 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002196 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 ****************************************************************/
2198
2199 anchor = 0;
2200
2201 for (i = 2; i < NCH(n); i += 2) {
2202 com_expr(c, CHILD(n, i));
2203 if (i+2 < NCH(n)) {
2204 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 com_addbyte(c, ROT_THREE);
2207 }
2208 op = cmp_type(CHILD(n, i-1));
2209 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002211 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 }
2213 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 if (i+2 < NCH(n)) {
2216 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2217 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002218 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 }
2220 }
2221
2222 if (anchor) {
2223 int anchor2 = 0;
2224 com_addfwref(c, JUMP_FORWARD, &anchor2);
2225 com_backpatch(c, anchor);
2226 com_addbyte(c, ROT_TWO);
2227 com_addbyte(c, POP_TOP);
2228 com_backpatch(c, anchor2);
2229 }
2230}
2231
2232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002233com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002234{
2235 REQ(n, not_test); /* 'not' not_test | comparison */
2236 if (NCH(n) == 1) {
2237 com_comparison(c, CHILD(n, 0));
2238 }
2239 else {
2240 com_not_test(c, CHILD(n, 1));
2241 com_addbyte(c, UNARY_NOT);
2242 }
2243}
2244
2245static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002246com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247{
2248 int i;
2249 int anchor;
2250 REQ(n, and_test); /* not_test ('and' not_test)* */
2251 anchor = 0;
2252 i = 0;
2253 for (;;) {
2254 com_not_test(c, CHILD(n, i));
2255 if ((i += 2) >= NCH(n))
2256 break;
2257 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2258 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002260 }
2261 if (anchor)
2262 com_backpatch(c, anchor);
2263}
2264
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002265static int
2266com_make_closure(struct compiling *c, PyCodeObject *co)
2267{
2268 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2269 if (free == 0)
2270 return 0;
2271 for (i = 0; i < free; ++i) {
2272 /* Bypass com_addop_varname because it will generate
2273 LOAD_DEREF but LOAD_CLOSURE is needed.
2274 */
2275 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2276 int arg, reftype;
2277
2278 /* Special case: If a class contains a method with a
2279 free variable that has the same name as a method,
2280 the name will be considered free *and* local in the
2281 class. It should be handled by the closure, as
2282 well as by the normal name loookup logic.
2283 */
2284 reftype = get_ref_type(c, PyString_AS_STRING(name));
2285 if (reftype == CELL)
2286 arg = com_lookup_arg(c->c_cellvars, name);
2287 else /* (reftype == FREE) */
2288 arg = com_lookup_arg(c->c_freevars, name);
2289 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002290 fprintf(stderr, "lookup %s in %s %d %d\n"
2291 "freevars of %s: %s\n",
2292 PyObject_REPR(name),
2293 c->c_name,
2294 reftype, arg,
2295 PyString_AS_STRING(co->co_name),
2296 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002297 Py_FatalError("com_make_closure()");
2298 }
2299 com_addoparg(c, LOAD_CLOSURE, arg);
2300
2301 }
2302 com_push(c, free);
2303 return 1;
2304}
2305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002307com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002309 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002310 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002311 PyObject *co;
2312 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002313 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002314 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2315 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002316 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002317 if (co == NULL) {
2318 c->c_errors++;
2319 return;
2320 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002321 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002322 i = com_addconst(c, co);
2323 closure = com_make_closure(c, (PyCodeObject *)co);
2324 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002325 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002326 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002327 if (closure)
2328 com_addoparg(c, MAKE_CLOSURE, ndefs);
2329 else
2330 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002333 else {
2334 int anchor = 0;
2335 int i = 0;
2336 for (;;) {
2337 com_and_test(c, CHILD(n, i));
2338 if ((i += 2) >= NCH(n))
2339 break;
2340 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2341 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002343 }
2344 if (anchor)
2345 com_backpatch(c, anchor);
2346 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347}
2348
2349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351{
2352 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002353 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 com_node(c, CHILD(n, 0));
2355 }
2356 else {
2357 int i;
2358 int len;
2359 len = (NCH(n) + 1) / 2;
2360 for (i = 0; i < NCH(n); i += 2)
2361 com_node(c, CHILD(n, i));
2362 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364 }
2365}
2366
2367
2368/* Begin of assignment compilation */
2369
Thomas Wouters434d0822000-08-24 20:11:32 +00002370
2371static void
2372com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2373{
2374 com_addbyte(c, DUP_TOP);
2375 com_push(c, 1);
2376 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002377 com_node(c, augn);
2378 com_addbyte(c, opcode);
2379 com_pop(c, 1);
2380 com_addbyte(c, ROT_TWO);
2381 com_addopname(c, STORE_ATTR, n);
2382 com_pop(c, 2);
2383}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384
2385static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002386com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387{
2388 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002389 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390}
2391
2392static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002393com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 REQ(n, trailer);
2396 switch (TYPE(CHILD(n, 0))) {
2397 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 com_error(c, PyExc_SyntaxError,
2399 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 break;
2401 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002402 if (assigning > OP_APPLY)
2403 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2404 else
2405 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002407 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002408 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 break;
2410 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 }
2413}
2414
2415static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002416com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417{
2418 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002419 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002421 if (assigning) {
2422 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002423 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002424 com_push(c, i-1);
2425 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002427 com_assign(c, CHILD(n, i), assigning, NULL);
2428}
2429
2430static void
2431com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2432{
2433 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002434 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002435 com_push(c, 1);
2436 com_node(c, augn);
2437 com_addbyte(c, opcode);
2438 com_pop(c, 1);
2439 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002440}
2441
2442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002443com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444{
2445 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002446 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 if (assigning)
2448 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002449}
2450
2451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002452com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453{
2454 /* Loop to avoid trivial recursion */
2455 for (;;) {
2456 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002457
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 case exprlist:
2459 case testlist:
2460 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002461 if (assigning > OP_APPLY) {
2462 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002463 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002464 return;
2465 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002466 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467 return;
2468 }
2469 n = CHILD(n, 0);
2470 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002471
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002472 case test:
2473 case and_test:
2474 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002477 case xor_expr:
2478 case and_expr:
2479 case shift_expr:
2480 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002482 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002485 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 return;
2487 }
2488 n = CHILD(n, 0);
2489 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002490
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002491 case power: /* atom trailer* ('**' power)*
2492 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002493 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002494 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002495 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 return;
2497 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002498 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 int i;
2500 com_node(c, CHILD(n, 0));
2501 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002502 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002503 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002504 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002505 return;
2506 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 com_apply_trailer(c, CHILD(n, i));
2508 } /* NB i is still alive */
2509 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002510 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002511 return;
2512 }
2513 n = CHILD(n, 0);
2514 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002515
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 case atom:
2517 switch (TYPE(CHILD(n, 0))) {
2518 case LPAR:
2519 n = CHILD(n, 1);
2520 if (TYPE(n) == RPAR) {
2521 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002522 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002523 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002524 return;
2525 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002526 if (assigning > OP_APPLY) {
2527 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002528 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002529 return;
2530 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531 break;
2532 case LSQB:
2533 n = CHILD(n, 1);
2534 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002535 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002536 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 return;
2538 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002539 if (assigning > OP_APPLY) {
2540 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002541 "augmented assign to list not possible");
2542 return;
2543 }
2544 if (NCH(n) > 1
2545 && TYPE(CHILD(n, 1)) == list_for) {
2546 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002547 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002548 return;
2549 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002550 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 return;
2552 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002553 if (assigning > OP_APPLY)
2554 com_augassign_name(c, CHILD(n, 0),
2555 assigning, augn);
2556 else
2557 com_assign_name(c, CHILD(n, 0),
2558 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559 return;
2560 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002561 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002562 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 return;
2564 }
2565 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002566
2567 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002568 com_error(c, PyExc_SyntaxError,
2569 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002570 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002571
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002573 com_error(c, PyExc_SystemError,
2574 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002576
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 }
2578 }
2579}
Guido van Rossum7c531111997-03-11 18:42:21 +00002580
Thomas Wouters434d0822000-08-24 20:11:32 +00002581static void
2582com_augassign(struct compiling *c, node *n)
2583{
2584 int opcode;
2585
2586 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2587 case '+': opcode = INPLACE_ADD; break;
2588 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002589 case '/':
2590 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2591 opcode = INPLACE_FLOOR_DIVIDE;
2592 else if (c->c_flags & CO_FUTURE_DIVISION)
2593 opcode = INPLACE_TRUE_DIVIDE;
2594 else
2595 opcode = INPLACE_DIVIDE;
2596 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002597 case '%': opcode = INPLACE_MODULO; break;
2598 case '<': opcode = INPLACE_LSHIFT; break;
2599 case '>': opcode = INPLACE_RSHIFT; break;
2600 case '&': opcode = INPLACE_AND; break;
2601 case '^': opcode = INPLACE_XOR; break;
2602 case '|': opcode = INPLACE_OR; break;
2603 case '*':
2604 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2605 opcode = INPLACE_POWER;
2606 else
2607 opcode = INPLACE_MULTIPLY;
2608 break;
2609 default:
2610 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2611 return;
2612 }
2613 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2614}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002615
2616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002617com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618{
Thomas Wouters434d0822000-08-24 20:11:32 +00002619 REQ(n, expr_stmt);
2620 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002621 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002622 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002623 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002624 if (NCH(n) == 1) {
2625 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002626 if (c->c_interactive)
2627 com_addbyte(c, PRINT_EXPR);
2628 else
2629 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002631 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002632 else if (TYPE(CHILD(n,1)) == augassign)
2633 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002634 else {
2635 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002636 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002637 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002638 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002640 com_push(c, 1);
2641 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002643 }
2644 }
2645}
2646
2647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002649{
2650 int a = 0, b = 0;
2651 int i;
2652 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2653 /* Generate code like for
2654
2655 if __debug__:
2656 if not <test>:
2657 raise AssertionError [, <message>]
2658
2659 where <message> is the second test, if present.
2660 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002661
Guido van Rossum228d7f31997-04-02 05:24:36 +00002662 if (Py_OptimizeFlag)
2663 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002664 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002665 com_push(c, 1);
2666 com_addfwref(c, JUMP_IF_FALSE, &a);
2667 com_addbyte(c, POP_TOP);
2668 com_pop(c, 1);
2669 com_node(c, CHILD(n, 1));
2670 com_addfwref(c, JUMP_IF_TRUE, &b);
2671 com_addbyte(c, POP_TOP);
2672 com_pop(c, 1);
2673 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002674 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002675 com_push(c, 1);
2676 i = NCH(n)/2; /* Either 2 or 4 */
2677 if (i > 1)
2678 com_node(c, CHILD(n, 3));
2679 com_addoparg(c, RAISE_VARARGS, i);
2680 com_pop(c, i);
2681 /* The interpreter does not fall through */
2682 /* All jumps converge here */
2683 com_backpatch(c, a);
2684 com_backpatch(c, b);
2685 com_addbyte(c, POP_TOP);
2686}
2687
2688static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002689com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002691 int i = 1;
2692 node* stream = NULL;
2693
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002694 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002695
2696 /* are we using the extended print form? */
2697 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2698 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002699 com_node(c, stream);
2700 /* stack: [...] => [... stream] */
2701 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002702 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2703 i = 4;
2704 else
2705 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002707 for (; i < NCH(n); i += 2) {
2708 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002709 com_addbyte(c, DUP_TOP);
2710 /* stack: [stream] => [stream stream] */
2711 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002712 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002713 /* stack: [stream stream] => [stream stream obj] */
2714 com_addbyte(c, ROT_TWO);
2715 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002716 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002717 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002718 com_pop(c, 2);
2719 }
2720 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002721 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002722 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002723 com_addbyte(c, PRINT_ITEM);
2724 com_pop(c, 1);
2725 }
2726 }
2727 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002728 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002729 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002730 /* must pop the extra stream object off the stack */
2731 com_addbyte(c, POP_TOP);
2732 /* stack: [... stream] => [...] */
2733 com_pop(c, 1);
2734 }
2735 }
2736 else {
2737 if (stream != NULL) {
2738 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002739 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002740 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002741 com_pop(c, 1);
2742 }
2743 else
2744 com_addbyte(c, PRINT_NEWLINE);
2745 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746}
2747
2748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002749com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002751 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002752 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002753 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002754 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002755 if (c->c_flags & CO_GENERATOR) {
2756 if (NCH(n) > 1) {
2757 com_error(c, PyExc_SyntaxError,
2758 "'return' with argument inside generator");
2759 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002760 }
2761 if (NCH(n) < 2) {
2762 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_push(c, 1);
2764 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002765 else
2766 com_node(c, CHILD(n, 1));
2767 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002768 com_pop(c, 1);
2769}
2770
2771static void
2772com_yield_stmt(struct compiling *c, node *n)
2773{
Tim Peters95c80f82001-06-23 02:07:08 +00002774 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002775 REQ(n, yield_stmt); /* 'yield' testlist */
2776 if (!c->c_infunction) {
2777 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2778 }
Tim Peters95c80f82001-06-23 02:07:08 +00002779
2780 for (i = 0; i < c->c_nblocks; ++i) {
2781 if (c->c_block[i] == SETUP_FINALLY) {
2782 com_error(c, PyExc_SyntaxError,
2783 "'yield' not allowed in a 'try' block "
2784 "with a 'finally' clause");
2785 return;
2786 }
2787 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002788 com_node(c, CHILD(n, 1));
2789 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002790 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791}
2792
2793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002797 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2798 if (NCH(n) > 1) {
2799 com_node(c, CHILD(n, 1));
2800 if (NCH(n) > 3) {
2801 com_node(c, CHILD(n, 3));
2802 if (NCH(n) > 5)
2803 com_node(c, CHILD(n, 5));
2804 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002805 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002806 i = NCH(n)/2;
2807 com_addoparg(c, RAISE_VARARGS, i);
2808 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
2810
2811static void
Thomas Wouters52152252000-08-17 22:55:00 +00002812com_from_import(struct compiling *c, node *n)
2813{
2814 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2815 com_push(c, 1);
2816 if (NCH(n) > 1) {
2817 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2818 com_error(c, PyExc_SyntaxError, "invalid syntax");
2819 return;
2820 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002821 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002822 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002823 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002824 com_pop(c, 1);
2825}
2826
2827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002828com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829{
2830 int i;
2831 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002832 /* 'import' dotted_name (',' dotted_name)* |
2833 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002835 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002836 /* 'from' dotted_name 'import' ... */
2837 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002838
2839 if (TYPE(CHILD(n, 3)) == STAR) {
2840 tup = Py_BuildValue("(s)", "*");
2841 } else {
2842 tup = PyTuple_New((NCH(n) - 2)/2);
2843 for (i = 3; i < NCH(n); i += 2) {
2844 PyTuple_SET_ITEM(tup, (i-3)/2,
2845 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002846 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002847 }
2848 }
2849 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002850 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002852 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002853 if (TYPE(CHILD(n, 3)) == STAR)
2854 com_addbyte(c, IMPORT_STAR);
2855 else {
2856 for (i = 3; i < NCH(n); i += 2)
2857 com_from_import(c, CHILD(n, i));
2858 com_addbyte(c, POP_TOP);
2859 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002860 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861 }
2862 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002863 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002865 node *subn = CHILD(n, i);
2866 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002867 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002868 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002869 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002870 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002871 int j;
2872 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002873 com_error(c, PyExc_SyntaxError,
2874 "invalid syntax");
2875 return;
2876 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002877 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2878 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002879 CHILD(CHILD(subn, 0),
2880 j));
2881 com_addop_varname(c, VAR_STORE,
2882 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002883 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002884 com_addop_varname(c, VAR_STORE,
2885 STR(CHILD(CHILD(subn, 0),
2886 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 }
2889 }
2890}
2891
2892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002893com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002894{
2895 REQ(n, exec_stmt);
2896 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2897 com_node(c, CHILD(n, 1));
2898 if (NCH(n) >= 4)
2899 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002900 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002901 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002902 com_push(c, 1);
2903 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002904 if (NCH(n) >= 6)
2905 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002906 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002907 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002908 com_push(c, 1);
2909 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002910 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002911 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002912}
2913
Guido van Rossum7c531111997-03-11 18:42:21 +00002914static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002915is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002916{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002917 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002918 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002919 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002920
2921 /* Label to avoid tail recursion */
2922 next:
2923 switch (TYPE(n)) {
2924
2925 case suite:
2926 if (NCH(n) == 1) {
2927 n = CHILD(n, 0);
2928 goto next;
2929 }
2930 /* Fall through */
2931 case file_input:
2932 for (i = 0; i < NCH(n); i++) {
2933 node *ch = CHILD(n, i);
2934 if (TYPE(ch) == stmt) {
2935 n = ch;
2936 goto next;
2937 }
2938 }
2939 break;
2940
2941 case stmt:
2942 case simple_stmt:
2943 case small_stmt:
2944 n = CHILD(n, 0);
2945 goto next;
2946
2947 case expr_stmt:
2948 case testlist:
2949 case test:
2950 case and_test:
2951 case not_test:
2952 case comparison:
2953 case expr:
2954 case xor_expr:
2955 case and_expr:
2956 case shift_expr:
2957 case arith_expr:
2958 case term:
2959 case factor:
2960 case power:
2961 case atom:
2962 if (NCH(n) == 1) {
2963 n = CHILD(n, 0);
2964 goto next;
2965 }
2966 break;
2967
2968 case NAME:
2969 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2970 return 1;
2971 break;
2972
2973 case NUMBER:
2974 v = parsenumber(c, STR(n));
2975 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002976 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002977 break;
2978 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 i = PyObject_IsTrue(v);
2980 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002981 return i == 0;
2982
2983 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002984 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002985 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002987 break;
2988 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 i = PyObject_IsTrue(v);
2990 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002991 return i == 0;
2992
2993 }
2994 return 0;
2995}
2996
Tim Peters08a898f2001-06-28 01:52:22 +00002997
2998/* Look under n for a return stmt with an expression.
2999 * This hack is used to find illegal returns under "if 0:" blocks in
3000 * functions already known to be generators (as determined by the symtable
3001 * pass).
3002 * Return the offending return node if found, else NULL.
3003 */
3004static node *
3005look_for_offending_return(node *n)
3006{
3007 int i;
3008
3009 for (i = 0; i < NCH(n); ++i) {
3010 node *kid = CHILD(n, i);
3011
3012 switch (TYPE(kid)) {
3013 case classdef:
3014 case funcdef:
3015 case lambdef:
3016 /* Stuff in nested functions & classes doesn't
3017 affect the code block we started in. */
3018 return NULL;
3019
3020 case return_stmt:
3021 if (NCH(kid) > 1)
3022 return kid;
3023 break;
3024
3025 default: {
3026 node *bad = look_for_offending_return(kid);
3027 if (bad != NULL)
3028 return bad;
3029 }
3030 }
3031 }
3032
3033 return NULL;
3034}
3035
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003037com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038{
3039 int i;
3040 int anchor = 0;
3041 REQ(n, if_stmt);
3042 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3043 for (i = 0; i+3 < NCH(n); i+=4) {
3044 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003045 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003046 if (is_constant_false(c, ch)) {
3047 /* We're going to skip this block. However, if this
3048 is a generator, we have to check the dead code
3049 anyway to make sure there aren't any return stmts
3050 with expressions, in the same scope. */
3051 if (c->c_flags & CO_GENERATOR) {
3052 node *p = look_for_offending_return(n);
3053 if (p != NULL) {
3054 int savelineno = c->c_lineno;
3055 c->c_lineno = p->n_lineno;
3056 com_error(c, PyExc_SyntaxError,
3057 "'return' with argument "
3058 "inside generator");
3059 c->c_lineno = savelineno;
3060 }
3061 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003062 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003063 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003064 if (i > 0)
3065 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003066 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 com_addfwref(c, JUMP_IF_FALSE, &a);
3068 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 com_node(c, CHILD(n, i+3));
3071 com_addfwref(c, JUMP_FORWARD, &anchor);
3072 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 com_addbyte(c, POP_TOP);
3075 }
3076 if (i+2 < NCH(n))
3077 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003078 if (anchor)
3079 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080}
3081
3082static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003083com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084{
3085 int break_anchor = 0;
3086 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003087 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3089 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003090 block_push(c, SETUP_LOOP);
3091 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003092 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003093 com_node(c, CHILD(n, 1));
3094 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3095 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003096 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003097 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003099 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003100 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3101 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 com_addbyte(c, POP_TOP);
3105 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003106 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 if (NCH(n) > 4)
3108 com_node(c, CHILD(n, 6));
3109 com_backpatch(c, break_anchor);
3110}
3111
3112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003113com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115 int break_anchor = 0;
3116 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003117 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 REQ(n, for_stmt);
3119 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3120 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003121 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003123 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003124 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003125 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003126 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003127 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003128 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003129 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003130 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003131 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003132 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3133 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003135 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003136 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003137 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 if (NCH(n) > 8)
3139 com_node(c, CHILD(n, 8));
3140 com_backpatch(c, break_anchor);
3141}
3142
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003143/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003144
3145 SETUP_FINALLY L
3146 <code for S>
3147 POP_BLOCK
3148 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003149 L: <code for Sf>
3150 END_FINALLY
3151
3152 The special instructions use the block stack. Each block
3153 stack entry contains the instruction that created it (here
3154 SETUP_FINALLY), the level of the value stack at the time the
3155 block stack entry was created, and a label (here L).
3156
3157 SETUP_FINALLY:
3158 Pushes the current value stack level and the label
3159 onto the block stack.
3160 POP_BLOCK:
3161 Pops en entry from the block stack, and pops the value
3162 stack until its level is the same as indicated on the
3163 block stack. (The label is ignored.)
3164 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003165 Pops a variable number of entries from the *value* stack
3166 and re-raises the exception they specify. The number of
3167 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003168
3169 The block stack is unwound when an exception is raised:
3170 when a SETUP_FINALLY entry is found, the exception is pushed
3171 onto the value stack (and the exception condition is cleared),
3172 and the interpreter jumps to the label gotten from the block
3173 stack.
3174
3175 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003176 (The contents of the value stack is shown in [], with the top
3177 at the right; 'tb' is trace-back info, 'val' the exception's
3178 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003179
3180 Value stack Label Instruction Argument
3181 [] SETUP_EXCEPT L1
3182 [] <code for S>
3183 [] POP_BLOCK
3184 [] JUMP_FORWARD L0
3185
Guido van Rossum3f5da241990-12-20 15:06:42 +00003186 [tb, val, exc] L1: DUP )
3187 [tb, val, exc, exc] <evaluate E1> )
3188 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3189 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3190 [tb, val, exc, 1] POP )
3191 [tb, val, exc] POP
3192 [tb, val] <assign to V1> (or POP if no V1)
3193 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003194 [] <code for S1>
3195 JUMP_FORWARD L0
3196
Guido van Rossum3f5da241990-12-20 15:06:42 +00003197 [tb, val, exc, 0] L2: POP
3198 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003199 .............................etc.......................
3200
Guido van Rossum3f5da241990-12-20 15:06:42 +00003201 [tb, val, exc, 0] Ln+1: POP
3202 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003203
3204 [] L0: <next statement>
3205
3206 Of course, parts are not generated if Vi or Ei is not present.
3207*/
3208
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003210com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003211{
3212 int except_anchor = 0;
3213 int end_anchor = 0;
3214 int else_anchor = 0;
3215 int i;
3216 node *ch;
3217
3218 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3219 block_push(c, SETUP_EXCEPT);
3220 com_node(c, CHILD(n, 2));
3221 com_addbyte(c, POP_BLOCK);
3222 block_pop(c, SETUP_EXCEPT);
3223 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3224 com_backpatch(c, except_anchor);
3225 for (i = 3;
3226 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3227 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003230 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003231 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232 break;
3233 }
3234 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003236 com_addoparg(c, SET_LINENO, ch->n_lineno);
3237 if (NCH(ch) > 1) {
3238 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 com_node(c, CHILD(ch, 1));
3241 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3244 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003246 }
3247 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003250 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003253 com_pop(c, 1);
3254 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003255 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257 com_node(c, CHILD(n, i+2));
3258 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3259 if (except_anchor) {
3260 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003261 /* We come in with [tb, val, exc, 0] on the
3262 stack; one pop and it's the same as
3263 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 com_addbyte(c, POP_TOP);
3265 }
3266 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 /* We actually come in here with [tb, val, exc] but the
3268 END_FINALLY will zap those and jump around.
3269 The c_stacklevel does not reflect them so we need not pop
3270 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003271 com_addbyte(c, END_FINALLY);
3272 com_backpatch(c, else_anchor);
3273 if (i < NCH(n))
3274 com_node(c, CHILD(n, i+2));
3275 com_backpatch(c, end_anchor);
3276}
3277
3278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003279com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280{
3281 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003283
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003284 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3285 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003287 com_addbyte(c, POP_BLOCK);
3288 block_pop(c, SETUP_FINALLY);
3289 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003290 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003291 /* While the generated code pushes only one item,
3292 the try-finally handling can enter here with
3293 up to three items. OK, here are the details:
3294 3 for an exception, 2 for RETURN, 1 for BREAK. */
3295 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003296 com_backpatch(c, finally_anchor);
3297 ch = CHILD(n, NCH(n)-1);
3298 com_addoparg(c, SET_LINENO, ch->n_lineno);
3299 com_node(c, ch);
3300 com_addbyte(c, END_FINALLY);
3301 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303}
3304
3305static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003306com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003307{
3308 REQ(n, try_stmt);
3309 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3310 | 'try' ':' suite 'finally' ':' suite */
3311 if (TYPE(CHILD(n, 3)) != except_clause)
3312 com_try_finally(c, n);
3313 else
3314 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315}
3316
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003318get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003319{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003320 int i;
3321
Guido van Rossum8b993a91997-01-17 21:04:03 +00003322 /* Label to avoid tail recursion */
3323 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003324 switch (TYPE(n)) {
3325
3326 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003327 if (NCH(n) == 1) {
3328 n = CHILD(n, 0);
3329 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003330 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003331 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003332 case file_input:
3333 for (i = 0; i < NCH(n); i++) {
3334 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 if (TYPE(ch) == stmt) {
3336 n = ch;
3337 goto next;
3338 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003339 }
3340 break;
3341
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003342 case stmt:
3343 case simple_stmt:
3344 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 n = CHILD(n, 0);
3346 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003347
3348 case expr_stmt:
3349 case testlist:
3350 case test:
3351 case and_test:
3352 case not_test:
3353 case comparison:
3354 case expr:
3355 case xor_expr:
3356 case and_expr:
3357 case shift_expr:
3358 case arith_expr:
3359 case term:
3360 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003361 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003362 if (NCH(n) == 1) {
3363 n = CHILD(n, 0);
3364 goto next;
3365 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003366 break;
3367
3368 case atom:
3369 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003371 break;
3372
3373 }
3374 return NULL;
3375}
3376
Guido van Rossum79f25d91997-04-29 20:08:16 +00003377static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003378get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003379{
Guido van Rossum541563e1999-01-28 15:08:09 +00003380 /* Don't generate doc-strings if run with -OO */
3381 if (Py_OptimizeFlag > 1)
3382 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 n = get_rawdocstring(n);
3384 if (n == NULL)
3385 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003386 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387}
3388
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003390com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391{
3392 REQ(n, suite);
3393 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3394 if (NCH(n) == 1) {
3395 com_node(c, CHILD(n, 0));
3396 }
3397 else {
3398 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003399 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400 node *ch = CHILD(n, i);
3401 if (TYPE(ch) == stmt)
3402 com_node(c, ch);
3403 }
3404 }
3405}
3406
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003407/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003409com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003410{
3411 int i = c->c_nblocks;
3412 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3413 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3414 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003415 else if (i <= 0) {
3416 /* at the outer level */
3417 com_error(c, PyExc_SyntaxError,
3418 "'continue' not properly in loop");
3419 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003420 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003421 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003422 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003423 if (c->c_block[j] == SETUP_LOOP)
3424 break;
3425 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003426 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003427 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003428 for (; i > j; --i) {
3429 if (c->c_block[i] == SETUP_EXCEPT ||
3430 c->c_block[i] == SETUP_FINALLY) {
3431 com_addoparg(c, CONTINUE_LOOP,
3432 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003433 return;
3434 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003435 if (c->c_block[i] == END_FINALLY) {
3436 com_error(c, PyExc_SyntaxError,
3437 "'continue' not supported inside 'finally' clause");
3438 return;
3439 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003440 }
3441 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003442 com_error(c, PyExc_SyntaxError,
3443 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003444 }
3445 /* XXX Could allow it inside a 'finally' clause
3446 XXX if we could pop the exception still on the stack */
3447}
3448
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003449static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003450com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003451{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003452 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003453 if (TYPE(n) == lambdef) {
3454 /* lambdef: 'lambda' [varargslist] ':' test */
3455 n = CHILD(n, 1);
3456 }
3457 else {
3458 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3459 n = CHILD(n, 2);
3460 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3461 n = CHILD(n, 1);
3462 }
3463 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003464 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003465 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003466 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003467 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3468 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003469 nargs = 0;
3470 ndefs = 0;
3471 for (i = 0; i < nch; i++) {
3472 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003473 if (TYPE(CHILD(n, i)) == STAR ||
3474 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003475 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003476 nargs++;
3477 i++;
3478 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003479 t = RPAR; /* Anything except EQUAL or COMMA */
3480 else
3481 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003482 if (t == EQUAL) {
3483 i++;
3484 ndefs++;
3485 com_node(c, CHILD(n, i));
3486 i++;
3487 if (i >= nch)
3488 break;
3489 t = TYPE(CHILD(n, i));
3490 }
3491 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003492 /* Treat "(a=1, b)" as an error */
3493 if (ndefs)
3494 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003495 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003496 }
3497 if (t != COMMA)
3498 break;
3499 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 return ndefs;
3501}
3502
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003504com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003506 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003507 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003509 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003510 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3511 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003512 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003513 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003514 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 c->c_errors++;
3516 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003517 int closure = com_make_closure(c, (PyCodeObject *)co);
3518 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003520 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003521 if (closure)
3522 com_addoparg(c, MAKE_CLOSURE, ndefs);
3523 else
3524 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003525 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003526 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003528 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 }
3530}
3531
3532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003533com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003534{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003535 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003536 REQ(n, testlist);
3537 /* testlist: test (',' test)* [','] */
3538 for (i = 0; i < NCH(n); i += 2)
3539 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003540 i = (NCH(n)+1) / 2;
3541 com_addoparg(c, BUILD_TUPLE, i);
3542 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003543}
3544
3545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003546com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547{
Guido van Rossum25831651993-05-19 14:50:45 +00003548 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003549 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003550 char *name;
3551
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003552 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003553 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003554 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003555 c->c_errors++;
3556 return;
3557 }
3558 /* Push the class name on the stack */
3559 i = com_addconst(c, v);
3560 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003562 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003563 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003565 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 com_push(c, 1);
3567 }
Guido van Rossum25831651993-05-19 14:50:45 +00003568 else
3569 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003570 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003571 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003572 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003573 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003574 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003575 c->c_errors++;
3576 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003577 int closure = com_make_closure(c, (PyCodeObject *)co);
3578 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003579 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003580 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003581 if (closure)
3582 com_addoparg(c, MAKE_CLOSURE, 0);
3583 else
3584 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003585 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003586 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003588 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003589 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003590 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591}
3592
3593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003594com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003596 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003597 if (c->c_errors)
3598 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 switch (TYPE(n)) {
3600
3601 /* Definition nodes */
3602
3603 case funcdef:
3604 com_funcdef(c, n);
3605 break;
3606 case classdef:
3607 com_classdef(c, n);
3608 break;
3609
3610 /* Trivial parse tree nodes */
3611
3612 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003613 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003615 n = CHILD(n, 0);
3616 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003617
3618 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003619 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3620 com_addoparg(c, SET_LINENO, n->n_lineno);
3621 {
3622 int i;
3623 for (i = 0; i < NCH(n)-1; i += 2)
3624 com_node(c, CHILD(n, i));
3625 }
3626 break;
3627
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003628 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003629 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003630 n = CHILD(n, 0);
3631 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632
3633 /* Statement nodes */
3634
3635 case expr_stmt:
3636 com_expr_stmt(c, n);
3637 break;
3638 case print_stmt:
3639 com_print_stmt(c, n);
3640 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003641 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003642 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643 break;
3644 case pass_stmt:
3645 break;
3646 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003647 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003648 com_error(c, PyExc_SyntaxError,
3649 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003650 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003651 com_addbyte(c, BREAK_LOOP);
3652 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003653 case continue_stmt:
3654 com_continue_stmt(c, n);
3655 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 case return_stmt:
3657 com_return_stmt(c, n);
3658 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003659 case yield_stmt:
3660 com_yield_stmt(c, n);
3661 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003662 case raise_stmt:
3663 com_raise_stmt(c, n);
3664 break;
3665 case import_stmt:
3666 com_import_stmt(c, n);
3667 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003668 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003669 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003670 case exec_stmt:
3671 com_exec_stmt(c, n);
3672 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003673 case assert_stmt:
3674 com_assert_stmt(c, n);
3675 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676 case if_stmt:
3677 com_if_stmt(c, n);
3678 break;
3679 case while_stmt:
3680 com_while_stmt(c, n);
3681 break;
3682 case for_stmt:
3683 com_for_stmt(c, n);
3684 break;
3685 case try_stmt:
3686 com_try_stmt(c, n);
3687 break;
3688 case suite:
3689 com_suite(c, n);
3690 break;
3691
3692 /* Expression nodes */
3693
3694 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003695 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696 break;
3697 case test:
3698 com_test(c, n);
3699 break;
3700 case and_test:
3701 com_and_test(c, n);
3702 break;
3703 case not_test:
3704 com_not_test(c, n);
3705 break;
3706 case comparison:
3707 com_comparison(c, n);
3708 break;
3709 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003710 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711 break;
3712 case expr:
3713 com_expr(c, n);
3714 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003715 case xor_expr:
3716 com_xor_expr(c, n);
3717 break;
3718 case and_expr:
3719 com_and_expr(c, n);
3720 break;
3721 case shift_expr:
3722 com_shift_expr(c, n);
3723 break;
3724 case arith_expr:
3725 com_arith_expr(c, n);
3726 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727 case term:
3728 com_term(c, n);
3729 break;
3730 case factor:
3731 com_factor(c, n);
3732 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003733 case power:
3734 com_power(c, n);
3735 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 case atom:
3737 com_atom(c, n);
3738 break;
3739
3740 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003741 com_error(c, PyExc_SystemError,
3742 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003743 }
3744}
3745
Tim Petersdbd9ba62000-07-09 03:09:57 +00003746static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747
3748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750{
3751 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3752 if (TYPE(CHILD(n, 0)) == LPAR)
3753 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003754 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003755 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
3757 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758}
3759
3760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003761com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003763 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 if (NCH(n) == 1) {
3765 com_fpdef(c, CHILD(n, 0));
3766 }
3767 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003768 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003769 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003770 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003771 for (i = 0; i < NCH(n); i += 2)
3772 com_fpdef(c, CHILD(n, i));
3773 }
3774}
3775
3776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003777com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003778{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003779 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003780 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003781 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003782 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003783 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003784 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003785 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003786 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003787 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003788 node *ch = CHILD(n, i);
3789 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003790 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003791 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003792 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3793 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003794 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003795 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003796 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003797 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003799 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003800 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003801 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003802 ch = CHILD(n, i);
3803 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003804 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003805 else
3806 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003807 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003808 if (complex) {
3809 /* Generate code for complex arguments only after
3810 having counted the simple arguments */
3811 int ilocal = 0;
3812 for (i = 0; i < nch; i++) {
3813 node *ch = CHILD(n, i);
3814 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003815 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003816 break;
3817 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3818 fp = CHILD(ch, 0);
3819 if (TYPE(fp) != NAME) {
3820 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003821 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003822 com_fpdef(c, ch);
3823 }
3824 ilocal++;
3825 if (++i >= nch)
3826 break;
3827 ch = CHILD(n, i);
3828 if (TYPE(ch) == EQUAL)
3829 i += 2;
3830 else
3831 REQ(ch, COMMA);
3832 }
3833 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003834}
3835
3836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003837com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838{
3839 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003840 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003842 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003843 if (doc != NULL) {
3844 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003845 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003846 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003847 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003848 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003850 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 for (i = 0; i < NCH(n); i++) {
3852 node *ch = CHILD(n, i);
3853 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3854 com_node(c, ch);
3855 }
3856}
3857
3858/* Top-level compile-node interface */
3859
3860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003861compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003863 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 node *ch;
3865 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003866 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003867 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003868 if (doc != NULL) {
3869 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003870 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003871 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003872 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003873 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003874 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3875 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003876 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003877 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003878 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003880 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003881 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3882 com_push(c, 1);
3883 com_addbyte(c, RETURN_VALUE);
3884 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885}
3886
3887static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003888compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003889{
Guido van Rossum590baa41993-11-30 13:40:46 +00003890 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003891 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003892 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003893
3894 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003895 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003896 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003897 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003898 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003899 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003900 else
3901 ch = CHILD(n, 2);
3902 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003903 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003904 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003905}
3906
3907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003908compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003909{
3910 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003911 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003912 REQ(n, classdef);
3913 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3914 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003915 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003916 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003917 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003918 if (doc != NULL) {
3919 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003920 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003921 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003922 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003923 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003924 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003925 }
3926 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003927 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003928 com_node(c, ch);
3929 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003930 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003931 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003932 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003933}
3934
3935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003936compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003937{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003938 com_addoparg(c, SET_LINENO, n->n_lineno);
3939
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003940 switch (TYPE(n)) {
3941
Guido van Rossum4c417781991-01-21 16:09:22 +00003942 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003943 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003944 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 n = CHILD(n, 0);
3946 if (TYPE(n) != NEWLINE)
3947 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003948 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003949 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003950 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003951 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003952 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003953 break;
3954
Guido van Rossum4c417781991-01-21 16:09:22 +00003955 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003958 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003959 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003960 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 break;
3962
Guido van Rossum590baa41993-11-30 13:40:46 +00003963 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003964 com_node(c, CHILD(n, 0));
3965 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003966 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003967 break;
3968
Guido van Rossum590baa41993-11-30 13:40:46 +00003969 case lambdef: /* anonymous function definition */
3970 compile_lambdef(c, n);
3971 break;
3972
Guido van Rossum4c417781991-01-21 16:09:22 +00003973 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974 compile_funcdef(c, n);
3975 break;
3976
Guido van Rossum4c417781991-01-21 16:09:22 +00003977 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003978 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003979 break;
3980
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003981 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003982 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003983 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003984 }
3985}
3986
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003987static PyObject *
3988dict_keys_inorder(PyObject *dict, int offset)
3989{
3990 PyObject *tuple, *k, *v;
3991 int i, pos = 0, size = PyDict_Size(dict);
3992
3993 tuple = PyTuple_New(size);
3994 if (tuple == NULL)
3995 return NULL;
3996 while (PyDict_Next(dict, &pos, &k, &v)) {
3997 i = PyInt_AS_LONG(v);
3998 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003999 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004000 PyTuple_SET_ITEM(tuple, i - offset, k);
4001 }
4002 return tuple;
4003}
4004
Guido van Rossum79f25d91997-04-29 20:08:16 +00004005PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004006PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004008 return PyNode_CompileFlags(n, filename, NULL);
4009}
4010
4011PyCodeObject *
4012PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4013{
4014 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004015}
4016
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004017struct symtable *
4018PyNode_CompileSymtable(node *n, char *filename)
4019{
4020 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004021 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004022
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004023 ff = PyNode_Future(n, filename);
4024 if (ff == NULL)
4025 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004026 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004027 if (st == NULL)
4028 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004029 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004030 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004031 if (st->st_errors > 0)
4032 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004033 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004034 if (st->st_errors > 0)
4035 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004036
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004037 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004038 fail:
4039 PyMem_Free((void *)ff);
4040 st->st_future = NULL;
4041 PySymtable_Free(st);
4042 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004043}
4044
Guido van Rossum79f25d91997-04-29 20:08:16 +00004045static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004046icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004047{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004048 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004049}
4050
Guido van Rossum79f25d91997-04-29 20:08:16 +00004051static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004052jcompile(node *n, char *filename, struct compiling *base,
4053 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004054{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004055 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004056 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004057 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004059 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004060 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004061 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004062 /* c_symtable still points to parent's symbols */
4063 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004064 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004065 sc.c_nested = 1;
Guido van Rossum4668b002001-08-08 05:00:18 +00004066 sc.c_flags |= base->c_flags & (CO_GENERATOR_ALLOWED |
4067 CO_FUTURE_DIVISION);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004068 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004069 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004070 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004071 if (sc.c_future == NULL) {
4072 com_free(&sc);
4073 return NULL;
4074 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004075 if (flags) {
4076 int merged = sc.c_future->ff_features |
4077 flags->cf_flags;
4078 sc.c_future->ff_features = merged;
4079 flags->cf_flags = merged;
4080 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004081 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082 com_free(&sc);
4083 return NULL;
4084 }
4085 }
4086 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004087 if (symtable_load_symbols(&sc) < 0) {
4088 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004089 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004090 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 compile_node(&sc, n);
4092 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004093 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004094 PyObject *consts, *names, *varnames, *filename, *name,
4095 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004096 consts = PyList_AsTuple(sc.c_consts);
4097 names = PyList_AsTuple(sc.c_names);
4098 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004099 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4100 freevars = dict_keys_inorder(sc.c_freevars,
4101 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004102 filename = PyString_InternFromString(sc.c_filename);
4103 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004104 if (!PyErr_Occurred())
4105 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004106 sc.c_nlocals,
4107 sc.c_maxstacklevel,
4108 sc.c_flags,
4109 sc.c_code,
4110 consts,
4111 names,
4112 varnames,
4113 freevars,
4114 cellvars,
4115 filename,
4116 name,
4117 sc.c_firstlineno,
4118 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004119 Py_XDECREF(consts);
4120 Py_XDECREF(names);
4121 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004122 Py_XDECREF(freevars);
4123 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004124 Py_XDECREF(filename);
4125 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004126 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004127 else if (!PyErr_Occurred()) {
4128 /* This could happen if someone called PyErr_Clear() after an
4129 error was reported above. That's not supposed to happen,
4130 but I just plugged one case and I'm not sure there can't be
4131 others. In that case, raise SystemError so that at least
4132 it gets reported instead dumping core. */
4133 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4134 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004135 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004136 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004137 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004138 sc.c_symtable = NULL;
4139 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004140 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004141 return co;
4142}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004143
4144int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004145PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004146{
4147 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004148 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004149 int line = co->co_firstlineno;
4150 int addr = 0;
4151 while (--size >= 0) {
4152 addr += *p++;
4153 if (addr > addrq)
4154 break;
4155 line += *p++;
4156 }
4157 return line;
4158}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004159
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004160/* The test for LOCAL must come before the test for FREE in order to
4161 handle classes where name is both local and free. The local var is
4162 a method and the free var is a free var referenced within a method.
4163*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004164
4165static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004166get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004167{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004168 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004169 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004170
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004171 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4172 return CELL;
4173 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4174 return LOCAL;
4175 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4176 return FREE;
4177 v = PyDict_GetItemString(c->c_globals, name);
4178 if (v) {
4179 if (v == Py_None)
4180 return GLOBAL_EXPLICIT;
4181 else {
4182 return GLOBAL_IMPLICIT;
4183 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004184 }
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004185 sprintf(buf,
4186 "unknown scope for %.100s in %.100s(%s) "
4187 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4188 name, c->c_name,
4189 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4190 c->c_filename,
4191 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4192 PyObject_REPR(c->c_locals),
4193 PyObject_REPR(c->c_globals)
4194 );
4195
4196 Py_FatalError(buf);
4197 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004198}
4199
Guido van Rossum207fda62001-03-02 03:30:41 +00004200/* Helper functions to issue warnings */
4201
4202static int
4203issue_warning(char *msg, char *filename, int lineno)
4204{
4205 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4206 lineno, NULL, NULL) < 0) {
4207 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4208 PyErr_SetString(PyExc_SyntaxError, msg);
4209 PyErr_SyntaxLocation(filename, lineno);
4210 }
4211 return -1;
4212 }
4213 return 0;
4214}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004215
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004216static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004217symtable_warn(struct symtable *st, char *msg)
4218{
Guido van Rossum207fda62001-03-02 03:30:41 +00004219 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004220 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004221 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004222 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004223 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004224}
4225
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004226/* Helper function for setting lineno and filename */
4227
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004228static int
4229symtable_build(struct compiling *c, node *n)
4230{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004231 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004232 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004233 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004234 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004235 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4236 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004237 return -1;
4238 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004239 if (c->c_symtable->st_errors > 0)
4240 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004241 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004242 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004244 return 0;
4245}
4246
4247static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004248symtable_init_compiling_symbols(struct compiling *c)
4249{
4250 PyObject *varnames;
4251
4252 varnames = c->c_symtable->st_cur->ste_varnames;
4253 if (varnames == NULL) {
4254 varnames = PyList_New(0);
4255 if (varnames == NULL)
4256 return -1;
4257 c->c_symtable->st_cur->ste_varnames = varnames;
4258 Py_INCREF(varnames);
4259 } else
4260 Py_INCREF(varnames);
4261 c->c_varnames = varnames;
4262
4263 c->c_globals = PyDict_New();
4264 if (c->c_globals == NULL)
4265 return -1;
4266 c->c_freevars = PyDict_New();
4267 if (c->c_freevars == NULL)
4268 return -1;
4269 c->c_cellvars = PyDict_New();
4270 if (c->c_cellvars == NULL)
4271 return -1;
4272 return 0;
4273}
4274
4275struct symbol_info {
4276 int si_nlocals;
4277 int si_ncells;
4278 int si_nfrees;
4279 int si_nimplicit;
4280};
4281
4282static void
4283symtable_init_info(struct symbol_info *si)
4284{
4285 si->si_nlocals = 0;
4286 si->si_ncells = 0;
4287 si->si_nfrees = 0;
4288 si->si_nimplicit = 0;
4289}
4290
4291static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004292symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004293 struct symbol_info *si)
4294{
4295 PyObject *dict, *v;
4296
4297 /* Seperate logic for DEF_FREE. If it occurs in a function,
4298 it indicates a local that we must allocate storage for (a
4299 cell var). If it occurs in a class, then the class has a
4300 method and a free variable with the same name.
4301 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004302 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004303 /* If it isn't declared locally, it can't be a cell. */
4304 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4305 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004306 v = PyInt_FromLong(si->si_ncells++);
4307 dict = c->c_cellvars;
4308 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004309 /* If it is free anyway, then there is no need to do
4310 anything here.
4311 */
4312 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004313 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004314 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004315 v = PyInt_FromLong(si->si_nfrees++);
4316 dict = c->c_freevars;
4317 }
4318 if (v == NULL)
4319 return -1;
4320 if (PyDict_SetItem(dict, name, v) < 0) {
4321 Py_DECREF(v);
4322 return -1;
4323 }
4324 Py_DECREF(v);
4325 return 0;
4326}
4327
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004328/* If a variable is a cell and an argument, make sure that appears in
4329 co_cellvars before any variable to its right in varnames.
4330*/
4331
4332
4333static int
4334symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4335 PyObject *varnames, int flags)
4336{
4337 PyObject *v, *w, *d, *list = NULL;
4338 int i, pos;
4339
4340 if (flags & CO_VARARGS)
4341 argcount++;
4342 if (flags & CO_VARKEYWORDS)
4343 argcount++;
4344 for (i = argcount; --i >= 0; ) {
4345 v = PyList_GET_ITEM(varnames, i);
4346 if (PyDict_GetItem(*cellvars, v)) {
4347 if (list == NULL) {
4348 list = PyList_New(1);
4349 if (list == NULL)
4350 return -1;
4351 PyList_SET_ITEM(list, 0, v);
4352 Py_INCREF(v);
4353 } else
4354 PyList_Insert(list, 0, v);
4355 }
4356 }
4357 if (list == NULL || PyList_GET_SIZE(list) == 0)
4358 return 0;
4359 /* There are cellvars that are also arguments. Create a dict
4360 to replace cellvars and put the args at the front.
4361 */
4362 d = PyDict_New();
4363 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4364 v = PyInt_FromLong(i);
4365 if (v == NULL)
4366 goto fail;
4367 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4368 goto fail;
4369 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4370 goto fail;
4371 }
4372 pos = 0;
4373 i = PyList_GET_SIZE(list);
4374 Py_DECREF(list);
4375 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4376 w = PyInt_FromLong(i++); /* don't care about the old key */
4377 if (PyDict_SetItem(d, v, w) < 0) {
4378 Py_DECREF(w);
4379 goto fail;
4380 }
4381 Py_DECREF(w);
4382 }
4383 Py_DECREF(*cellvars);
4384 *cellvars = d;
4385 return 1;
4386 fail:
4387 Py_DECREF(d);
4388 return -1;
4389}
4390
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004391static int
4392symtable_freevar_offsets(PyObject *freevars, int offset)
4393{
4394 PyObject *name, *v;
4395 int pos;
4396
4397 /* The cell vars are the first elements of the closure,
4398 followed by the free vars. Update the offsets in
4399 c_freevars to account for number of cellvars. */
4400 pos = 0;
4401 while (PyDict_Next(freevars, &pos, &name, &v)) {
4402 int i = PyInt_AS_LONG(v) + offset;
4403 PyObject *o = PyInt_FromLong(i);
4404 if (o == NULL)
4405 return -1;
4406 if (PyDict_SetItem(freevars, name, o) < 0) {
4407 Py_DECREF(o);
4408 return -1;
4409 }
4410 Py_DECREF(o);
4411 }
4412 return 0;
4413}
4414
4415static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004416symtable_check_unoptimized(struct compiling *c,
4417 PySymtableEntryObject *ste,
4418 struct symbol_info *si)
4419{
4420 char buf[300];
4421
4422 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4423 || (ste->ste_nested && si->si_nimplicit)))
4424 return 0;
4425
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004426#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4427
4428#define ILLEGAL_IS "is a nested function"
4429
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004430#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004431"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004432
4433#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004434"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004435
4436#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4437"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004438"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004439
4440 /* XXX perhaps the linenos for these opt-breaking statements
4441 should be stored so the exception can point to them. */
4442
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004443 if (ste->ste_child_free) {
4444 if (ste->ste_optimized == OPT_IMPORT_STAR)
4445 sprintf(buf, ILLEGAL_IMPORT_STAR,
4446 PyString_AS_STRING(ste->ste_name),
4447 ILLEGAL_CONTAINS);
4448 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4449 sprintf(buf, ILLEGAL_BARE_EXEC,
4450 PyString_AS_STRING(ste->ste_name),
4451 ILLEGAL_CONTAINS);
4452 else {
4453 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4454 PyString_AS_STRING(ste->ste_name),
4455 ILLEGAL_CONTAINS);
4456 }
4457 } else {
4458 if (ste->ste_optimized == OPT_IMPORT_STAR)
4459 sprintf(buf, ILLEGAL_IMPORT_STAR,
4460 PyString_AS_STRING(ste->ste_name),
4461 ILLEGAL_IS);
4462 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4463 sprintf(buf, ILLEGAL_BARE_EXEC,
4464 PyString_AS_STRING(ste->ste_name),
4465 ILLEGAL_IS);
4466 else {
4467 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4468 PyString_AS_STRING(ste->ste_name),
4469 ILLEGAL_IS);
4470 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004471 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004472
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004473 PyErr_SetString(PyExc_SyntaxError, buf);
4474 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4475 ste->ste_opt_lineno);
4476 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004477}
4478
4479static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004480symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4481 struct symbol_info *si)
4482{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004483 if (c->c_future)
4484 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004485 if (ste->ste_generator)
4486 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004487 if (ste->ste_type != TYPE_MODULE)
4488 c->c_flags |= CO_NEWLOCALS;
4489 if (ste->ste_type == TYPE_FUNCTION) {
4490 c->c_nlocals = si->si_nlocals;
4491 if (ste->ste_optimized == 0)
4492 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004493 else if (ste->ste_optimized != OPT_EXEC)
4494 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004495 }
4496 return 0;
4497}
4498
4499static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004500symtable_load_symbols(struct compiling *c)
4501{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004502 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004503 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004504 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004505 PyObject *name, *varnames, *v;
4506 int i, flags, pos;
4507 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004508
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004509 if (implicit == NULL) {
4510 implicit = PyInt_FromLong(1);
4511 if (implicit == NULL)
4512 return -1;
4513 }
4514 v = NULL;
4515
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004516 if (symtable_init_compiling_symbols(c) < 0)
4517 goto fail;
4518 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004519 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004520 si.si_nlocals = PyList_GET_SIZE(varnames);
4521 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004523 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004524 v = PyInt_FromLong(i);
4525 if (PyDict_SetItem(c->c_locals,
4526 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004527 goto fail;
4528 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004529 }
4530
4531 /* XXX The cases below define the rules for whether a name is
4532 local or global. The logic could probably be clearer. */
4533 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004534 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4535 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004536
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004537 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004538 /* undo the original DEF_FREE */
4539 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004540
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004541 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004542 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004543 2. Free variables in methods that are also class
4544 variables or declared global.
4545 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004546 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004547 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004549 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004550 c->c_argcount--;
4551 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004552 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004553 c->c_argcount--;
4554 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004555 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004556 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004557 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004558 if (flags & DEF_PARAM) {
4559 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004560 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004561 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004562 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004563 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004564 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004565 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4567 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004568 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004569 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004570 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4571 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004572 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004573 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004574 if (v == NULL)
4575 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004576 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004577 goto fail;
4578 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004579 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004580 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004581 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004582 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004583 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004584 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 if (v == NULL)
4586 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004587 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004588 goto fail;
4589 Py_DECREF(v);
4590 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004591 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004592 if (PyDict_SetItem(c->c_globals, name,
4593 implicit) < 0)
4594 goto fail;
4595 if (st->st_nscopes != 1) {
4596 v = PyInt_FromLong(flags);
4597 if (PyDict_SetItem(st->st_global,
4598 name, v))
4599 goto fail;
4600 Py_DECREF(v);
4601 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004602 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 }
4604 }
4605
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004606 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4607
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004608 if (si.si_ncells > 1) { /* one cell is always in order */
4609 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4610 c->c_varnames, c->c_flags) < 0)
4611 return -1;
4612 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004613 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4614 return -1;
4615 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004616 fail:
4617 /* is this always the right thing to do? */
4618 Py_XDECREF(v);
4619 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004620}
4621
4622static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004623symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624{
4625 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626
4627 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4628 if (st == NULL)
4629 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004630 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004631
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004632 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004633 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004634 goto fail;
4635 if ((st->st_symbols = PyDict_New()) == NULL)
4636 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004638 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 st->st_errors = 0;
4640 st->st_tmpname = 0;
4641 st->st_private = NULL;
4642 return st;
4643 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004644 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645 return NULL;
4646}
4647
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004648void
4649PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004650{
4651 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004653 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004654 PyMem_Free((void *)st);
4655}
4656
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657/* When the compiler exits a scope, it must should update the scope's
4658 free variable information with the list of free variables in its
4659 children.
4660
4661 Variables that are free in children and defined in the current
4662 scope are cellvars.
4663
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004664 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665 false), free variables in children that are not defined here are
4666 implicit globals.
4667
4668*/
4669
4670static int
4671symtable_update_free_vars(struct symtable *st)
4672{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004673 int i, j, def;
4674 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004675 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004676
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004677 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004678 def = DEF_FREE_CLASS;
4679 else
4680 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004681 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004682 int pos = 0;
4683
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004684 if (list)
4685 PyList_SetSlice(list, 0,
4686 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004687 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 PyList_GET_ITEM(ste->ste_children, i);
4689 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004690 int flags = PyInt_AS_LONG(o);
4691 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004692 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004693 if (list == NULL) {
4694 list = PyList_New(0);
4695 if (list == NULL)
4696 return -1;
4697 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004698 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004699 if (PyList_Append(list, name) < 0) {
4700 Py_DECREF(list);
4701 return -1;
4702 }
4703 }
4704 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004705 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004706 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004707 v = PyDict_GetItem(ste->ste_symbols, name);
4708 /* If a name N is declared global in scope A and
4709 referenced in scope B contained (perhaps
4710 indirectly) in A and there are no scopes
4711 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004712 is global in B. Unless A is a class scope,
4713 because class scopes are not considered for
4714 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004715 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004716 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004717 int flags = PyInt_AS_LONG(v);
4718 if (flags & DEF_GLOBAL) {
4719 symtable_undo_free(st, child->ste_id,
4720 name);
4721 continue;
4722 }
4723 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004724 if (ste->ste_nested) {
4725 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004726 name, def) < 0) {
4727 Py_DECREF(list);
4728 return -1;
4729 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004730 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004731 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004732 name) < 0) {
4733 Py_DECREF(list);
4734 return -1;
4735 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004736 }
4737 }
4738 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004739
4740 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004741 return 0;
4742}
4743
4744/* If the current scope is a non-nested class or if name is not
4745 defined in the current, non-nested scope, then it is an implicit
4746 global in all nested scopes.
4747*/
4748
4749static int
4750symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4751{
4752 PyObject *o;
4753 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004754 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004755
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004756 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004757 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004758 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004759 if (o == NULL)
4760 return symtable_undo_free(st, child, name);
4761 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004762
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004763 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 return symtable_undo_free(st, child, name);
4765 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004766 return symtable_add_def_o(st, ste->ste_symbols,
4767 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004768}
4769
4770static int
4771symtable_undo_free(struct symtable *st, PyObject *id,
4772 PyObject *name)
4773{
4774 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004775 PyObject *info;
4776 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004778 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4779 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004780 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004781
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004783 if (info == NULL)
4784 return 0;
4785 v = PyInt_AS_LONG(info);
4786 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004787 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004788 DEF_FREE_GLOBAL) < 0)
4789 return -1;
4790 } else
4791 /* If the name is defined here or declared global,
4792 then the recursion stops. */
4793 return 0;
4794
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4796 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004797 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 PyList_GET_ITEM(ste->ste_children, i);
4799 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 if (x < 0)
4801 return x;
4802 }
4803 return 0;
4804}
4805
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004806/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4807 This reference is released when the scope is exited, via the DECREF
4808 in symtable_exit_scope().
4809*/
4810
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811static int
4812symtable_exit_scope(struct symtable *st)
4813{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814 int end;
4815
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004816 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004818 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004820 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4821 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004822 if (PySequence_DelItem(st->st_stack, end) < 0)
4823 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004826
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004827static void
4828symtable_enter_scope(struct symtable *st, char *name, int type,
4829 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004830{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832
4833 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004834 prev = st->st_cur;
4835 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4836 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004837 st->st_errors++;
4838 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 }
4840 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004841 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004842 PySymtableEntry_New(st, name, type, lineno);
4843 if (strcmp(name, TOP) == 0)
4844 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004845 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004846 if (PyList_Append(prev->ste_children,
4847 (PyObject *)st->st_cur) < 0)
4848 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004849 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004850}
4851
4852static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004853symtable_lookup(struct symtable *st, char *name)
4854{
4855 char buffer[MANGLE_LEN];
4856 PyObject *v;
4857 int flags;
4858
4859 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4860 name = buffer;
4861 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4862 if (v == NULL) {
4863 if (PyErr_Occurred())
4864 return -1;
4865 else
4866 return 0;
4867 }
4868
4869 flags = PyInt_AS_LONG(v);
4870 return flags;
4871}
4872
4873static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004877 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004878 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004880 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004881 name = buffer;
4882 if ((s = PyString_InternFromString(name)) == NULL)
4883 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004884 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4885 Py_DECREF(s);
4886 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887}
4888
4889/* Must only be called with mangled names */
4890
4891static int
4892symtable_add_def_o(struct symtable *st, PyObject *dict,
4893 PyObject *name, int flag)
4894{
4895 PyObject *o;
4896 int val;
4897
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004901 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004902 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004903 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004904 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 return -1;
4906 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004907 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004908 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004909 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004910 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912 Py_DECREF(o);
4913 return -1;
4914 }
4915 Py_DECREF(o);
4916
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004918 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004919 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 } else if (flag & DEF_GLOBAL) {
4921 /* XXX need to update DEF_GLOBAL for other flags too;
4922 perhaps only DEF_FREE_GLOBAL */
4923 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004925 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004926 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004927 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004929 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004930 Py_DECREF(o);
4931 return -1;
4932 }
4933 Py_DECREF(o);
4934 }
4935 return 0;
4936}
4937
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939
Tim Peters08a898f2001-06-28 01:52:22 +00004940/* Look for a yield stmt under n. Return 1 if found, else 0.
4941 This hack is used to look inside "if 0:" blocks (which are normally
4942 ignored) in case those are the only places a yield occurs (so that this
4943 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004944static int
4945look_for_yield(node *n)
4946{
4947 int i;
4948
4949 for (i = 0; i < NCH(n); ++i) {
4950 node *kid = CHILD(n, i);
4951
4952 switch (TYPE(kid)) {
4953
4954 case classdef:
4955 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004956 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004957 /* Stuff in nested functions and classes can't make
4958 the parent a generator. */
4959 return 0;
4960
4961 case yield_stmt:
4962 return 1;
4963
4964 default:
4965 if (look_for_yield(kid))
4966 return 1;
4967 }
4968 }
4969 return 0;
4970}
4971
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004972static void
4973symtable_node(struct symtable *st, node *n)
4974{
4975 int i, start = 0;
4976
4977 loop:
4978 switch (TYPE(n)) {
4979 case funcdef: {
4980 char *func_name = STR(CHILD(n, 1));
4981 symtable_add_def(st, func_name, DEF_LOCAL);
4982 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004983 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 symtable_funcdef(st, n);
4985 symtable_exit_scope(st);
4986 break;
4987 }
4988 case lambdef:
4989 if (NCH(n) == 4)
4990 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004991 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004992 symtable_funcdef(st, n);
4993 symtable_exit_scope(st);
4994 break;
4995 case classdef: {
4996 char *tmp, *class_name = STR(CHILD(n, 1));
4997 symtable_add_def(st, class_name, DEF_LOCAL);
4998 if (TYPE(CHILD(n, 2)) == LPAR) {
4999 node *bases = CHILD(n, 3);
5000 int i;
5001 for (i = 0; i < NCH(bases); i += 2) {
5002 symtable_node(st, CHILD(bases, i));
5003 }
5004 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005005 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006 tmp = st->st_private;
5007 st->st_private = class_name;
5008 symtable_node(st, CHILD(n, NCH(n) - 1));
5009 st->st_private = tmp;
5010 symtable_exit_scope(st);
5011 break;
5012 }
5013 case if_stmt:
5014 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005015 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5016 if (st->st_cur->ste_generator == 0)
5017 st->st_cur->ste_generator =
5018 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005019 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005020 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005021 symtable_node(st, CHILD(n, i + 1));
5022 symtable_node(st, CHILD(n, i + 3));
5023 }
5024 if (i + 2 < NCH(n))
5025 symtable_node(st, CHILD(n, i + 2));
5026 break;
5027 case global_stmt:
5028 symtable_global(st, n);
5029 break;
5030 case import_stmt:
5031 symtable_import(st, n);
5032 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005033 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005034 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005035 symtable_node(st, CHILD(n, 1));
5036 if (NCH(n) > 2)
5037 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005038 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005039 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005040 st->st_cur->ste_opt_lineno = n->n_lineno;
5041 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005042 if (NCH(n) > 4)
5043 symtable_node(st, CHILD(n, 5));
5044 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005045
5046 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005047 case assert_stmt:
5048 if (Py_OptimizeFlag)
5049 return;
5050 if (NCH(n) == 2) {
5051 n = CHILD(n, 1);
5052 goto loop;
5053 } else {
5054 symtable_node(st, CHILD(n, 1));
5055 n = CHILD(n, 3);
5056 goto loop;
5057 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005058 case except_clause:
5059 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005060 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061 if (NCH(n) > 1) {
5062 n = CHILD(n, 1);
5063 goto loop;
5064 }
5065 break;
5066 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005067 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005069 case yield_stmt:
5070 st->st_cur->ste_generator = 1;
5071 n = CHILD(n, 1);
5072 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005073 case expr_stmt:
5074 if (NCH(n) == 1)
5075 n = CHILD(n, 0);
5076 else {
5077 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005078 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005079 symtable_node(st, CHILD(n, 2));
5080 break;
5081 } else {
5082 int i;
5083 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005084 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085 n = CHILD(n, NCH(n) - 1);
5086 }
5087 }
5088 goto loop;
5089 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005090 case argument:
5091 if (NCH(n) == 3) {
5092 n = CHILD(n, 2);
5093 goto loop;
5094 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 case listmaker:
5096 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005097 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005099 symtable_node(st, CHILD(n, 0));
5100 st->st_tmpname--;
5101 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102 }
5103 case atom:
5104 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5105 symtable_add_use(st, STR(CHILD(n, 0)));
5106 break;
5107 }
5108 case for_stmt:
5109 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005110 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005111 start = 3;
5112 }
5113 default:
5114 if (NCH(n) == 1) {
5115 n = CHILD(n, 0);
5116 goto loop;
5117 }
5118 for (i = start; i < NCH(n); ++i)
5119 if (TYPE(CHILD(n, i)) >= single_input)
5120 symtable_node(st, CHILD(n, i));
5121 }
5122}
5123
5124static void
5125symtable_funcdef(struct symtable *st, node *n)
5126{
5127 node *body;
5128
5129 if (TYPE(n) == lambdef) {
5130 if (NCH(n) == 4)
5131 symtable_params(st, CHILD(n, 1));
5132 } else
5133 symtable_params(st, CHILD(n, 2));
5134 body = CHILD(n, NCH(n) - 1);
5135 symtable_node(st, body);
5136}
5137
5138/* The next two functions parse the argument tuple.
5139 symtable_default_arg() checks for names in the default arguments,
5140 which are references in the defining scope. symtable_params()
5141 parses the parameter names, which are defined in the function's
5142 body.
5143
5144 varargslist:
5145 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5146 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5147*/
5148
5149static void
5150symtable_default_args(struct symtable *st, node *n)
5151{
5152 node *c;
5153 int i;
5154
5155 if (TYPE(n) == parameters) {
5156 n = CHILD(n, 1);
5157 if (TYPE(n) == RPAR)
5158 return;
5159 }
5160 REQ(n, varargslist);
5161 for (i = 0; i < NCH(n); i += 2) {
5162 c = CHILD(n, i);
5163 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5164 break;
5165 }
5166 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5167 symtable_node(st, CHILD(n, i));
5168 }
5169}
5170
5171static void
5172symtable_params(struct symtable *st, node *n)
5173{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005174 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 node *c = NULL;
5176
5177 if (TYPE(n) == parameters) {
5178 n = CHILD(n, 1);
5179 if (TYPE(n) == RPAR)
5180 return;
5181 }
5182 REQ(n, varargslist);
5183 for (i = 0; i < NCH(n); i += 2) {
5184 c = CHILD(n, i);
5185 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5186 ext = 1;
5187 break;
5188 }
5189 if (TYPE(c) == test) {
5190 continue;
5191 }
5192 if (TYPE(CHILD(c, 0)) == NAME)
5193 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5194 else {
5195 char nbuf[10];
5196 sprintf(nbuf, ".%d", i);
5197 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005198 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199 }
5200 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201 if (ext) {
5202 c = CHILD(n, i);
5203 if (TYPE(c) == STAR) {
5204 i++;
5205 symtable_add_def(st, STR(CHILD(n, i)),
5206 DEF_PARAM | DEF_STAR);
5207 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005208 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005209 c = NULL;
5210 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005212 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005213 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 i++;
5215 symtable_add_def(st, STR(CHILD(n, i)),
5216 DEF_PARAM | DEF_DOUBLESTAR);
5217 }
5218 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005219 if (complex >= 0) {
5220 int j;
5221 for (j = 0; j <= complex; j++) {
5222 c = CHILD(n, j);
5223 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005224 c = CHILD(n, ++j);
5225 else if (TYPE(c) == EQUAL)
5226 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005227 if (TYPE(CHILD(c, 0)) == LPAR)
5228 symtable_params_fplist(st, CHILD(c, 1));
5229 }
5230 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231}
5232
5233static void
5234symtable_params_fplist(struct symtable *st, node *n)
5235{
5236 int i;
5237 node *c;
5238
5239 REQ(n, fplist);
5240 for (i = 0; i < NCH(n); i += 2) {
5241 c = CHILD(n, i);
5242 REQ(c, fpdef);
5243 if (NCH(c) == 1)
5244 symtable_add_def(st, STR(CHILD(c, 0)),
5245 DEF_PARAM | DEF_INTUPLE);
5246 else
5247 symtable_params_fplist(st, CHILD(c, 1));
5248 }
5249
5250}
5251
5252static void
5253symtable_global(struct symtable *st, node *n)
5254{
5255 int i;
5256
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005257 /* XXX It might be helpful to warn about module-level global
5258 statements, but it's hard to tell the difference between
5259 module-level and a string passed to exec.
5260 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005261
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005262 for (i = 1; i < NCH(n); i += 2) {
5263 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005264 int flags;
5265
5266 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005267 if (flags < 0)
5268 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005269 if (flags && flags != DEF_GLOBAL) {
5270 char buf[500];
5271 if (flags & DEF_PARAM) {
5272 PyErr_Format(PyExc_SyntaxError,
5273 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005274 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005275 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005276 st->st_cur->ste_lineno);
5277 st->st_errors++;
5278 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005279 }
5280 else {
5281 if (flags & DEF_LOCAL)
5282 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5283 name);
5284 else
5285 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005286 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005287 }
5288 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005289 symtable_add_def(st, name, DEF_GLOBAL);
5290 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005291}
5292
5293static void
5294symtable_list_comprehension(struct symtable *st, node *n)
5295{
5296 char tmpname[12];
5297
Jeremy Hylton23b42272001-03-19 20:38:06 +00005298 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005300 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005301 symtable_node(st, CHILD(n, 3));
5302 if (NCH(n) == 5)
5303 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005304}
5305
5306static void
5307symtable_import(struct symtable *st, node *n)
5308{
5309 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005310 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005311 | 'from' dotted_name 'import'
5312 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005313 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005315 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005316 node *dotname = CHILD(n, 1);
5317 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5318 /* check for bogus imports */
5319 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5320 PyErr_SetString(PyExc_SyntaxError,
5321 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005322 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005323 n->n_lineno);
5324 st->st_errors++;
5325 return;
5326 }
5327 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005329 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005330 if (symtable_warn(st,
5331 "import * only allowed at module level") < 0)
5332 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005333 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005334 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005335 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005336 } else {
5337 for (i = 3; i < NCH(n); i += 2) {
5338 node *c = CHILD(n, i);
5339 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005340 symtable_assign(st, CHILD(c, 2),
5341 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005342 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005343 symtable_assign(st, CHILD(c, 0),
5344 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345 }
5346 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005347 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005348 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005349 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 }
5351 }
5352}
5353
5354static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005355symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356{
5357 node *tmp;
5358 int i;
5359
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005360 loop:
5361 switch (TYPE(n)) {
5362 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005363 /* invalid assignment, e.g. lambda x:x=2. The next
5364 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365 return;
5366 case power:
5367 if (NCH(n) > 2) {
5368 for (i = 2; i < NCH(n); ++i)
5369 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5370 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005372 if (NCH(n) > 1) {
5373 symtable_node(st, CHILD(n, 0));
5374 symtable_node(st, CHILD(n, 1));
5375 } else {
5376 n = CHILD(n, 0);
5377 goto loop;
5378 }
5379 return;
5380 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005381 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5382 /* XXX This is an error, but the next pass
5383 will catch it. */
5384 return;
5385 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005386 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005387 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005388 }
5389 return;
5390 case exprlist:
5391 case testlist:
5392 if (NCH(n) == 1) {
5393 n = CHILD(n, 0);
5394 goto loop;
5395 }
5396 else {
5397 int i;
5398 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005399 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 return;
5401 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005402 case atom:
5403 tmp = CHILD(n, 0);
5404 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5405 n = CHILD(n, 1);
5406 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005407 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005408 if (strcmp(STR(tmp), "__debug__") == 0)
5409 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005410 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005411 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005412 return;
5413 case dotted_as_name:
5414 if (NCH(n) == 3)
5415 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005416 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 else
5418 symtable_add_def(st,
5419 STR(CHILD(CHILD(n,
5420 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005421 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005422 return;
5423 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005424 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005425 return;
5426 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005427 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005428 return;
5429 default:
5430 if (NCH(n) == 0)
5431 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005432 if (NCH(n) == 1) {
5433 n = CHILD(n, 0);
5434 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005435 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005436 /* Should only occur for errors like x + 1 = 1,
5437 which will be caught in the next pass. */
5438 for (i = 0; i < NCH(n); ++i)
5439 if (TYPE(CHILD(n, i)) >= single_input)
5440 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005441 }
5442}