blob: c6c33942d201f2197c3e93542da8160a51d21257 [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') {
1087 if (errno != 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 com_error(co, PyExc_OverflowError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001089 "integer literal too large");
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 return NULL;
1091 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001094 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
1096 if (imflag) {
1097 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001098 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001099 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001100 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001103 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001104#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001105 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
1107 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001111}
1112
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001114parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001115{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001117 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 char *buf;
1119 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001120 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001122 int first = *s;
1123 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001124 int rawmode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001125#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001126 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001127#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001128 if (isalpha(quote) || quote == '_') {
1129 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001130#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001131 quote = *++s;
1132 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001133#else
1134 com_error(com, PyExc_SyntaxError,
1135 "Unicode literals not supported in this Python");
1136 return NULL;
1137#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001138 }
1139 if (quote == 'r' || quote == 'R') {
1140 quote = *++s;
1141 rawmode = 1;
1142 }
1143 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001144 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 return NULL;
1147 }
1148 s++;
1149 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001150 if (len > INT_MAX) {
1151 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1152 return NULL;
1153 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001154 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 return NULL;
1157 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001158 if (len >= 4 && s[0] == quote && s[1] == quote) {
1159 s += 2;
1160 len -= 2;
1161 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001163 return NULL;
1164 }
1165 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001166#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001167 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001168 if (rawmode)
1169 return PyUnicode_DecodeRawUnicodeEscape(
1170 s, len, NULL);
1171 else
1172 return PyUnicode_DecodeUnicodeEscape(
1173 s, len, NULL);
1174 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001175#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001176 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 return PyString_FromStringAndSize(s, len);
1178 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001179 if (v == NULL)
1180 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001182 end = s + len;
1183 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001184 if (*s != '\\') {
1185 *p++ = *s++;
1186 continue;
1187 }
1188 s++;
1189 switch (*s++) {
1190 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001191 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 case '\\': *p++ = '\\'; break;
1193 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001194 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 case 'b': *p++ = '\b'; break;
1196 case 'f': *p++ = '\014'; break; /* FF */
1197 case 't': *p++ = '\t'; break;
1198 case 'n': *p++ = '\n'; break;
1199 case 'r': *p++ = '\r'; break;
1200 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1202 case '0': case '1': case '2': case '3':
1203 case '4': case '5': case '6': case '7':
1204 c = s[-1] - '0';
1205 if ('0' <= *s && *s <= '7') {
1206 c = (c<<3) + *s++ - '0';
1207 if ('0' <= *s && *s <= '7')
1208 c = (c<<3) + *s++ - '0';
1209 }
1210 *p++ = c;
1211 break;
1212 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001213 if (isxdigit(Py_CHARMASK(s[0]))
1214 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001215 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001216 c = Py_CHARMASK(*s);
1217 s++;
1218 if (isdigit(c))
1219 x = c - '0';
1220 else if (islower(c))
1221 x = 10 + c - 'a';
1222 else
1223 x = 10 + c - 'A';
1224 x = x << 4;
1225 c = Py_CHARMASK(*s);
1226 s++;
1227 if (isdigit(c))
1228 x += c - '0';
1229 else if (islower(c))
1230 x += 10 + c - 'a';
1231 else
1232 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001233 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 break;
1235 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001236 PyErr_SetString(PyExc_ValueError,
1237 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001238 Py_DECREF(v);
1239 return NULL;
1240 default:
1241 *p++ = '\\';
1242 *p++ = s[-1];
1243 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244 }
1245 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 return v;
1248}
1249
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001251parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001252{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001254 int i;
1255 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001256 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001257 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001258 for (i = 1; i < NCH(n); i++) {
1259 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001260 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001261 if (s == NULL)
1262 goto onError;
1263 if (PyString_Check(v) && PyString_Check(s)) {
1264 PyString_ConcatAndDel(&v, s);
1265 if (v == NULL)
1266 goto onError;
1267 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001268#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001269 else {
1270 PyObject *temp;
1271 temp = PyUnicode_Concat(v, s);
1272 Py_DECREF(s);
1273 if (temp == NULL)
1274 goto onError;
1275 Py_DECREF(v);
1276 v = temp;
1277 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001278#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001279 }
1280 }
1281 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001282
1283 onError:
1284 Py_XDECREF(v);
1285 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001286}
1287
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001289com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001291 int anchor = 0;
1292 int save_begin = c->c_begin;
1293
1294 /* list_iter: for v in expr [list_iter] */
1295 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001296 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001297 c->c_begin = c->c_nexti;
1298 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001299 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001300 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001301 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001302 c->c_loops++;
1303 com_list_iter(c, n, e, t);
1304 c->c_loops--;
1305 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1306 c->c_begin = save_begin;
1307 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001308 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001309}
1310
1311static void
1312com_list_if(struct compiling *c, node *n, node *e, char *t)
1313{
1314 int anchor = 0;
1315 int a = 0;
1316 /* list_iter: 'if' test [list_iter] */
1317 com_addoparg(c, SET_LINENO, n->n_lineno);
1318 com_node(c, CHILD(n, 1));
1319 com_addfwref(c, JUMP_IF_FALSE, &a);
1320 com_addbyte(c, POP_TOP);
1321 com_pop(c, 1);
1322 com_list_iter(c, n, e, t);
1323 com_addfwref(c, JUMP_FORWARD, &anchor);
1324 com_backpatch(c, a);
1325 /* We jump here with an extra entry which we now pop */
1326 com_addbyte(c, POP_TOP);
1327 com_backpatch(c, anchor);
1328}
1329
1330static void
1331com_list_iter(struct compiling *c,
1332 node *p, /* parent of list_iter node */
1333 node *e, /* element expression node */
1334 char *t /* name of result list temp local */)
1335{
1336 /* list_iter is the last child in a listmaker, list_for, or list_if */
1337 node *n = CHILD(p, NCH(p)-1);
1338 if (TYPE(n) == list_iter) {
1339 n = CHILD(n, 0);
1340 switch (TYPE(n)) {
1341 case list_for:
1342 com_list_for(c, n, e, t);
1343 break;
1344 case list_if:
1345 com_list_if(c, n, e, t);
1346 break;
1347 default:
1348 com_error(c, PyExc_SystemError,
1349 "invalid list_iter node type");
1350 }
1351 }
1352 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001353 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 com_push(c, 1);
1355 com_node(c, e);
1356 com_addoparg(c, CALL_FUNCTION, 1);
1357 com_addbyte(c, POP_TOP);
1358 com_pop(c, 2);
1359 }
1360}
1361
1362static void
1363com_list_comprehension(struct compiling *c, node *n)
1364{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001365 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001366 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001367 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001368 com_addoparg(c, BUILD_LIST, 0);
1369 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1370 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001371 com_addop_name(c, LOAD_ATTR, "append");
1372 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001373 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001374 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001375 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001376 --c->c_tmpname;
1377}
1378
1379static void
1380com_listmaker(struct compiling *c, node *n)
1381{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001382 /* listmaker: test ( list_for | (',' test)* [','] ) */
1383 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001384 com_list_comprehension(c, n);
1385 else {
1386 int len = 0;
1387 int i;
1388 for (i = 0; i < NCH(n); i += 2, len++)
1389 com_node(c, CHILD(n, i));
1390 com_addoparg(c, BUILD_LIST, len);
1391 com_pop(c, len-1);
1392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001393}
1394
1395static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001396com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001397{
1398 int i;
1399 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1400 for (i = 0; i+2 < NCH(n); i += 4) {
1401 /* We must arrange things just right for STORE_SUBSCR.
1402 It wants the stack to look like (value) (dict) (key) */
1403 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001404 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001405 com_node(c, CHILD(n, i+2)); /* value */
1406 com_addbyte(c, ROT_TWO);
1407 com_node(c, CHILD(n, i)); /* key */
1408 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001409 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001410 }
1411}
1412
1413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415{
1416 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418 int i;
1419 REQ(n, atom);
1420 ch = CHILD(n, 0);
1421 switch (TYPE(ch)) {
1422 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001423 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001425 com_push(c, 1);
1426 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 else
1428 com_node(c, CHILD(n, 1));
1429 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001430 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001431 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001433 com_push(c, 1);
1434 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001436 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001438 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001440 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001441 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001442 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 break;
1444 case BACKQUOTE:
1445 com_node(c, CHILD(n, 1));
1446 com_addbyte(c, UNARY_CONVERT);
1447 break;
1448 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001449 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 i = 255;
1451 }
1452 else {
1453 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 }
1456 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001457 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458 break;
1459 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001460 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001461 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 c->c_errors++;
1463 i = 255;
1464 }
1465 else {
1466 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 }
1469 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001470 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 break;
1472 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001473 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001474 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 break;
1476 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 com_error(c, PyExc_SystemError,
1478 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479 }
1480}
1481
1482static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001483com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484{
1485 if (NCH(n) == 1) {
1486 com_addbyte(c, op);
1487 }
1488 else if (NCH(n) == 2) {
1489 if (TYPE(CHILD(n, 0)) != COLON) {
1490 com_node(c, CHILD(n, 0));
1491 com_addbyte(c, op+1);
1492 }
1493 else {
1494 com_node(c, CHILD(n, 1));
1495 com_addbyte(c, op+2);
1496 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001497 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001498 }
1499 else {
1500 com_node(c, CHILD(n, 0));
1501 com_node(c, CHILD(n, 2));
1502 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001503 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001504 }
1505}
1506
Guido van Rossum635abd21997-01-06 22:56:52 +00001507static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001508com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1509{
1510 if (NCH(n) == 1) {
1511 com_addbyte(c, DUP_TOP);
1512 com_push(c, 1);
1513 com_addbyte(c, SLICE);
1514 com_node(c, augn);
1515 com_addbyte(c, opcode);
1516 com_pop(c, 1);
1517 com_addbyte(c, ROT_TWO);
1518 com_addbyte(c, STORE_SLICE);
1519 com_pop(c, 2);
1520 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1521 com_node(c, CHILD(n, 0));
1522 com_addoparg(c, DUP_TOPX, 2);
1523 com_push(c, 2);
1524 com_addbyte(c, SLICE+1);
1525 com_pop(c, 1);
1526 com_node(c, augn);
1527 com_addbyte(c, opcode);
1528 com_pop(c, 1);
1529 com_addbyte(c, ROT_THREE);
1530 com_addbyte(c, STORE_SLICE+1);
1531 com_pop(c, 3);
1532 } else if (NCH(n) == 2) {
1533 com_node(c, CHILD(n, 1));
1534 com_addoparg(c, DUP_TOPX, 2);
1535 com_push(c, 2);
1536 com_addbyte(c, SLICE+2);
1537 com_pop(c, 1);
1538 com_node(c, augn);
1539 com_addbyte(c, opcode);
1540 com_pop(c, 1);
1541 com_addbyte(c, ROT_THREE);
1542 com_addbyte(c, STORE_SLICE+2);
1543 com_pop(c, 3);
1544 } else {
1545 com_node(c, CHILD(n, 0));
1546 com_node(c, CHILD(n, 2));
1547 com_addoparg(c, DUP_TOPX, 3);
1548 com_push(c, 3);
1549 com_addbyte(c, SLICE+3);
1550 com_pop(c, 2);
1551 com_node(c, augn);
1552 com_addbyte(c, opcode);
1553 com_pop(c, 1);
1554 com_addbyte(c, ROT_FOUR);
1555 com_addbyte(c, STORE_SLICE+3);
1556 com_pop(c, 4);
1557 }
1558}
1559
1560static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001561com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001562{
1563 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001564 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001565 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001566 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001568 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001569 }
1570 else {
1571 com_node(c, CHILD(n, 0));
1572 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001573 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001574 }
1575 m = n;
1576 do {
1577 m = CHILD(m, 0);
1578 } while (NCH(m) == 1);
1579 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001580 /* f(lambda x: x[0] = 3) ends up getting parsed with
1581 * LHS test = lambda x: x[0], and RHS test = 3.
1582 * SF bug 132313 points out that complaining about a keyword
1583 * then is very confusing.
1584 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001586 TYPE(m) == lambdef ?
1587 "lambda cannot contain assignment" :
1588 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001589 }
1590 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001592 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001594 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001595 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001596 else if (*pkeywords == NULL) {
1597 c->c_errors++;
1598 Py_DECREF(v);
1599 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 if (PyDict_GetItem(*pkeywords, v) != NULL)
1601 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001602 "duplicate keyword argument");
1603 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001605 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001607 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609 }
1610 }
1611 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001612}
1613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001615com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616{
1617 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001618 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619 }
1620 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001622 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001623 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001624 int star_flag = 0;
1625 int starstar_flag = 0;
1626 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001627 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001628 na = 0;
1629 nk = 0;
1630 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001631 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001632 if (TYPE(ch) == STAR ||
1633 TYPE(ch) == DOUBLESTAR)
1634 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001635 if (ch->n_lineno != lineno) {
1636 lineno = ch->n_lineno;
1637 com_addoparg(c, SET_LINENO, lineno);
1638 }
1639 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001640 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001641 na++;
1642 else
1643 nk++;
1644 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001646 while (i < NCH(n)) {
1647 node *tok = CHILD(n, i);
1648 node *ch = CHILD(n, i+1);
1649 i += 3;
1650 switch (TYPE(tok)) {
1651 case STAR: star_flag = 1; break;
1652 case DOUBLESTAR: starstar_flag = 1; break;
1653 }
1654 com_node(c, ch);
1655 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001656 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 com_error(c, PyExc_SyntaxError,
1658 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001659 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001660 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001661 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001662 star_flag + (starstar_flag << 1);
1663 else
1664 opcode = CALL_FUNCTION;
1665 com_addoparg(c, opcode, na | (nk << 8));
1666 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001667 }
1668}
1669
1670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001671com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001672{
1673 com_addopname(c, LOAD_ATTR, n);
1674}
1675
1676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001677com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001678{
1679 int i=0;
1680 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001681 node *ch;
1682
1683 /* first argument */
1684 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001686 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001687 i++;
1688 }
1689 else {
1690 com_node(c, CHILD(n,i));
1691 i++;
1692 REQ(CHILD(n,i),COLON);
1693 i++;
1694 }
1695 /* second argument */
1696 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1697 com_node(c, CHILD(n,i));
1698 i++;
1699 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001700 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001702 com_push(c, 1);
1703 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001704 /* remaining arguments */
1705 for (; i < NCH(n); i++) {
1706 ns++;
1707 ch=CHILD(n,i);
1708 REQ(ch, sliceop);
1709 if (NCH(ch) == 1) {
1710 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001711 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001712 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001713 }
1714 else
1715 com_node(c, CHILD(ch,1));
1716 }
1717 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001719}
1720
1721static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001722com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001723{
1724 node *ch;
1725 REQ(n, subscript);
1726 ch = CHILD(n,0);
1727 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001728 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001729 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001730 com_push(c, 1);
1731 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001732 else {
1733 /* check for slice */
1734 if ((TYPE(ch) == COLON || NCH(n) > 1))
1735 com_sliceobj(c, n);
1736 else {
1737 REQ(ch, test);
1738 com_node(c, ch);
1739 }
1740 }
1741}
1742
1743static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001744com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001745{
1746 int i, op;
1747 REQ(n, subscriptlist);
1748 /* Check to make backward compatible slice behavior for '[i:j]' */
1749 if (NCH(n) == 1) {
1750 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001751 /* 'Basic' slice, should have exactly one colon. */
1752 if ((TYPE(CHILD(sub, 0)) == COLON
1753 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1754 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1755 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001756 switch (assigning) {
1757 case OP_DELETE:
1758 op = DELETE_SLICE;
1759 break;
1760 case OP_ASSIGN:
1761 op = STORE_SLICE;
1762 break;
1763 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001764 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001765 break;
1766 default:
1767 com_augassign_slice(c, sub, assigning, augn);
1768 return;
1769 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001770 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001771 if (op == STORE_SLICE)
1772 com_pop(c, 2);
1773 else if (op == DELETE_SLICE)
1774 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001775 return;
1776 }
1777 }
1778 /* Else normal subscriptlist. Compile each subscript. */
1779 for (i = 0; i < NCH(n); i += 2)
1780 com_subscript(c, CHILD(n, i));
1781 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001782 if (NCH(n) > 1) {
1783 i = (NCH(n)+1) / 2;
1784 com_addoparg(c, BUILD_TUPLE, i);
1785 com_pop(c, i-1);
1786 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001787 switch (assigning) {
1788 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 op = DELETE_SUBSCR;
1790 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001791 break;
1792 default:
1793 case OP_ASSIGN:
1794 op = STORE_SUBSCR;
1795 i = 3;
1796 break;
1797 case OP_APPLY:
1798 op = BINARY_SUBSCR;
1799 i = 1;
1800 break;
1801 }
1802 if (assigning > OP_APPLY) {
1803 com_addoparg(c, DUP_TOPX, 2);
1804 com_push(c, 2);
1805 com_addbyte(c, BINARY_SUBSCR);
1806 com_pop(c, 1);
1807 com_node(c, augn);
1808 com_addbyte(c, assigning);
1809 com_pop(c, 1);
1810 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001811 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001812 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001813 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001814}
1815
1816static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001817com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001818{
1819 REQ(n, trailer);
1820 switch (TYPE(CHILD(n, 0))) {
1821 case LPAR:
1822 com_call_function(c, CHILD(n, 1));
1823 break;
1824 case DOT:
1825 com_select_member(c, CHILD(n, 1));
1826 break;
1827 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001828 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001829 break;
1830 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001832 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 }
1834}
1835
1836static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001837com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001838{
1839 int i;
1840 REQ(n, power);
1841 com_atom(c, CHILD(n, 0));
1842 for (i = 1; i < NCH(n); i++) {
1843 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1844 com_factor(c, CHILD(n, i+1));
1845 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001846 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001847 break;
1848 }
1849 else
1850 com_apply_trailer(c, CHILD(n, i));
1851 }
1852}
1853
1854static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001855com_invert_constant(struct compiling *c, node *n)
1856{
1857 /* Compute the inverse of int and longs and use them directly,
1858 but be prepared to generate code for all other
1859 possibilities (invalid numbers, floats, complex).
1860 */
1861 PyObject *num, *inv = NULL;
1862 int i;
1863
1864 REQ(n, NUMBER);
1865 num = parsenumber(c, STR(n));
1866 if (num == NULL)
1867 i = 255;
1868 else {
1869 inv = PyNumber_Invert(num);
1870 if (inv == NULL) {
1871 PyErr_Clear();
1872 i = com_addconst(c, num);
1873 } else {
1874 i = com_addconst(c, inv);
1875 Py_DECREF(inv);
1876 }
1877 Py_DECREF(num);
1878 }
1879 com_addoparg(c, LOAD_CONST, i);
1880 com_push(c, 1);
1881 if (num != NULL && inv == NULL)
1882 com_addbyte(c, UNARY_INVERT);
1883}
1884
1885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001886com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001887{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001888 int childtype = TYPE(CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001890 /* If the unary +, -, or ~ operator is applied to a constant,
1891 don't generate a UNARY_xxx opcode. Just store the
1892 approriate value as a constant. If the value is negative,
1893 extend the string containing the constant and insert a
1894 negative in the 0th position.
1895 */
1896 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
1897 && TYPE(CHILD(n, 1)) == factor
1898 && TYPE(CHILD(CHILD(n, 1), 0)) == power
1899 && TYPE(CHILD(CHILD(CHILD(n, 1), 0), 0)) == atom
1900 && TYPE(CHILD(CHILD(CHILD(CHILD(n, 1), 0), 0), 0)) == NUMBER) {
1901 node *constant = CHILD(CHILD(CHILD(n, 1), 0), 0);
1902 if (childtype == TILDE) {
1903 com_invert_constant(c, CHILD(constant, 0));
1904 return;
1905 }
1906 if (childtype == MINUS) {
1907 node *numnode = CHILD(constant, 0);
1908 char *s = malloc(strlen(STR(numnode)) + 2);
1909 if (s == NULL) {
1910 com_error(c, PyExc_MemoryError, "");
1911 com_addbyte(c, 255);
1912 return;
1913 }
1914 s[0] = '-';
1915 strcpy(s + 1, STR(numnode));
1916 free(STR(numnode));
1917 STR(numnode) = s;
1918 }
1919 com_atom(c, constant);
1920 }
1921 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 com_factor(c, CHILD(n, 1));
1923 com_addbyte(c, UNARY_POSITIVE);
1924 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001925 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001926 com_factor(c, CHILD(n, 1));
1927 com_addbyte(c, UNARY_NEGATIVE);
1928 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001929 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001930 com_factor(c, CHILD(n, 1));
1931 com_addbyte(c, UNARY_INVERT);
1932 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001934 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935 }
1936}
1937
1938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001939com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001940{
1941 int i;
1942 int op;
1943 REQ(n, term);
1944 com_factor(c, CHILD(n, 0));
1945 for (i = 2; i < NCH(n); i += 2) {
1946 com_factor(c, CHILD(n, i));
1947 switch (TYPE(CHILD(n, i-1))) {
1948 case STAR:
1949 op = BINARY_MULTIPLY;
1950 break;
1951 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00001952 if (c->c_flags & CO_FUTURE_DIVISION)
1953 op = BINARY_TRUE_DIVIDE;
1954 else
1955 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001956 break;
1957 case PERCENT:
1958 op = BINARY_MODULO;
1959 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00001960 case DOUBLESLASH:
1961 op = BINARY_FLOOR_DIVIDE;
1962 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001963 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00001965 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001966 op = 255;
1967 }
1968 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001969 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001970 }
1971}
1972
1973static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001974com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00001975{
1976 int i;
1977 int op;
1978 REQ(n, arith_expr);
1979 com_term(c, CHILD(n, 0));
1980 for (i = 2; i < NCH(n); i += 2) {
1981 com_term(c, CHILD(n, i));
1982 switch (TYPE(CHILD(n, i-1))) {
1983 case PLUS:
1984 op = BINARY_ADD;
1985 break;
1986 case MINUS:
1987 op = BINARY_SUBTRACT;
1988 break;
1989 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001991 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00001992 op = 255;
1993 }
1994 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001995 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00001996 }
1997}
1998
1999static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002000com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002001{
2002 int i;
2003 int op;
2004 REQ(n, shift_expr);
2005 com_arith_expr(c, CHILD(n, 0));
2006 for (i = 2; i < NCH(n); i += 2) {
2007 com_arith_expr(c, CHILD(n, i));
2008 switch (TYPE(CHILD(n, i-1))) {
2009 case LEFTSHIFT:
2010 op = BINARY_LSHIFT;
2011 break;
2012 case RIGHTSHIFT:
2013 op = BINARY_RSHIFT;
2014 break;
2015 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002017 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002018 op = 255;
2019 }
2020 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002022 }
2023}
2024
2025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002026com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002027{
2028 int i;
2029 int op;
2030 REQ(n, and_expr);
2031 com_shift_expr(c, CHILD(n, 0));
2032 for (i = 2; i < NCH(n); i += 2) {
2033 com_shift_expr(c, CHILD(n, i));
2034 if (TYPE(CHILD(n, i-1)) == AMPER) {
2035 op = BINARY_AND;
2036 }
2037 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002039 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002040 op = 255;
2041 }
2042 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002043 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002044 }
2045}
2046
2047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002049{
2050 int i;
2051 int op;
2052 REQ(n, xor_expr);
2053 com_and_expr(c, CHILD(n, 0));
2054 for (i = 2; i < NCH(n); i += 2) {
2055 com_and_expr(c, CHILD(n, i));
2056 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2057 op = BINARY_XOR;
2058 }
2059 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002061 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 op = 255;
2063 }
2064 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002065 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 }
2067}
2068
2069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002070com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071{
2072 int i;
2073 int op;
2074 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002075 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002077 com_xor_expr(c, CHILD(n, i));
2078 if (TYPE(CHILD(n, i-1)) == VBAR) {
2079 op = BINARY_OR;
2080 }
2081 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002082 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002083 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 op = 255;
2085 }
2086 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002087 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002088 }
2089}
2090
2091static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002092cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093{
2094 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002095 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002096 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2097 if (NCH(n) == 1) {
2098 n = CHILD(n, 0);
2099 switch (TYPE(n)) {
2100 case LESS: return LT;
2101 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002102 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002104 case LESSEQUAL: return LE;
2105 case GREATEREQUAL: return GE;
2106 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002107 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2108 if (strcmp(STR(n), "is") == 0) return IS;
2109 }
2110 }
2111 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002112 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2114 return NOT_IN;
2115 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2116 return IS_NOT;
2117 }
2118 }
2119 return BAD;
2120}
2121
2122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002123com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124{
2125 int i;
2126 enum cmp_op op;
2127 int anchor;
2128 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2129 com_expr(c, CHILD(n, 0));
2130 if (NCH(n) == 1)
2131 return;
2132
2133 /****************************************************************
2134 The following code is generated for all but the last
2135 comparison in a chain:
2136
2137 label: on stack: opcode: jump to:
2138
2139 a <code to load b>
2140 a, b DUP_TOP
2141 a, b, b ROT_THREE
2142 b, a, b COMPARE_OP
2143 b, 0-or-1 JUMP_IF_FALSE L1
2144 b, 1 POP_TOP
2145 b
2146
2147 We are now ready to repeat this sequence for the next
2148 comparison in the chain.
2149
2150 For the last we generate:
2151
2152 b <code to load c>
2153 b, c COMPARE_OP
2154 0-or-1
2155
2156 If there were any jumps to L1 (i.e., there was more than one
2157 comparison), we generate:
2158
2159 0-or-1 JUMP_FORWARD L2
2160 L1: b, 0 ROT_TWO
2161 0, b POP_TOP
2162 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 ****************************************************************/
2165
2166 anchor = 0;
2167
2168 for (i = 2; i < NCH(n); i += 2) {
2169 com_expr(c, CHILD(n, i));
2170 if (i+2 < NCH(n)) {
2171 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002172 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173 com_addbyte(c, ROT_THREE);
2174 }
2175 op = cmp_type(CHILD(n, i-1));
2176 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002177 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002178 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 }
2180 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002181 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 if (i+2 < NCH(n)) {
2183 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2184 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002185 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 }
2187 }
2188
2189 if (anchor) {
2190 int anchor2 = 0;
2191 com_addfwref(c, JUMP_FORWARD, &anchor2);
2192 com_backpatch(c, anchor);
2193 com_addbyte(c, ROT_TWO);
2194 com_addbyte(c, POP_TOP);
2195 com_backpatch(c, anchor2);
2196 }
2197}
2198
2199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002200com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201{
2202 REQ(n, not_test); /* 'not' not_test | comparison */
2203 if (NCH(n) == 1) {
2204 com_comparison(c, CHILD(n, 0));
2205 }
2206 else {
2207 com_not_test(c, CHILD(n, 1));
2208 com_addbyte(c, UNARY_NOT);
2209 }
2210}
2211
2212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002213com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214{
2215 int i;
2216 int anchor;
2217 REQ(n, and_test); /* not_test ('and' not_test)* */
2218 anchor = 0;
2219 i = 0;
2220 for (;;) {
2221 com_not_test(c, CHILD(n, i));
2222 if ((i += 2) >= NCH(n))
2223 break;
2224 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2225 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002226 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 }
2228 if (anchor)
2229 com_backpatch(c, anchor);
2230}
2231
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002232static int
2233com_make_closure(struct compiling *c, PyCodeObject *co)
2234{
2235 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2236 if (free == 0)
2237 return 0;
2238 for (i = 0; i < free; ++i) {
2239 /* Bypass com_addop_varname because it will generate
2240 LOAD_DEREF but LOAD_CLOSURE is needed.
2241 */
2242 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2243 int arg, reftype;
2244
2245 /* Special case: If a class contains a method with a
2246 free variable that has the same name as a method,
2247 the name will be considered free *and* local in the
2248 class. It should be handled by the closure, as
2249 well as by the normal name loookup logic.
2250 */
2251 reftype = get_ref_type(c, PyString_AS_STRING(name));
2252 if (reftype == CELL)
2253 arg = com_lookup_arg(c->c_cellvars, name);
2254 else /* (reftype == FREE) */
2255 arg = com_lookup_arg(c->c_freevars, name);
2256 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002257 fprintf(stderr, "lookup %s in %s %d %d\n"
2258 "freevars of %s: %s\n",
2259 PyObject_REPR(name),
2260 c->c_name,
2261 reftype, arg,
2262 PyString_AS_STRING(co->co_name),
2263 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002264 Py_FatalError("com_make_closure()");
2265 }
2266 com_addoparg(c, LOAD_CLOSURE, arg);
2267
2268 }
2269 com_push(c, free);
2270 return 1;
2271}
2272
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002273static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002274com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002276 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002277 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002278 PyObject *co;
2279 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002280 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002281 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2282 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002283 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002284 if (co == NULL) {
2285 c->c_errors++;
2286 return;
2287 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002288 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002289 i = com_addconst(c, co);
2290 closure = com_make_closure(c, (PyCodeObject *)co);
2291 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002292 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002293 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002294 if (closure)
2295 com_addoparg(c, MAKE_CLOSURE, ndefs);
2296 else
2297 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002298 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002300 else {
2301 int anchor = 0;
2302 int i = 0;
2303 for (;;) {
2304 com_and_test(c, CHILD(n, i));
2305 if ((i += 2) >= NCH(n))
2306 break;
2307 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2308 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002309 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002310 }
2311 if (anchor)
2312 com_backpatch(c, anchor);
2313 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314}
2315
2316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002317com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002318{
2319 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002320 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 com_node(c, CHILD(n, 0));
2322 }
2323 else {
2324 int i;
2325 int len;
2326 len = (NCH(n) + 1) / 2;
2327 for (i = 0; i < NCH(n); i += 2)
2328 com_node(c, CHILD(n, i));
2329 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002330 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002331 }
2332}
2333
2334
2335/* Begin of assignment compilation */
2336
Thomas Wouters434d0822000-08-24 20:11:32 +00002337
2338static void
2339com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2340{
2341 com_addbyte(c, DUP_TOP);
2342 com_push(c, 1);
2343 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002344 com_node(c, augn);
2345 com_addbyte(c, opcode);
2346 com_pop(c, 1);
2347 com_addbyte(c, ROT_TWO);
2348 com_addopname(c, STORE_ATTR, n);
2349 com_pop(c, 2);
2350}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351
2352static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002353com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354{
2355 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357}
2358
2359static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002360com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 REQ(n, trailer);
2363 switch (TYPE(CHILD(n, 0))) {
2364 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 com_error(c, PyExc_SyntaxError,
2366 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 break;
2368 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002369 if (assigning > OP_APPLY)
2370 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2371 else
2372 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002374 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002375 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 break;
2377 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 }
2380}
2381
2382static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002383com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002384{
2385 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002386 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002388 if (assigning) {
2389 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002390 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 com_push(c, i-1);
2392 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002394 com_assign(c, CHILD(n, i), assigning, NULL);
2395}
2396
2397static void
2398com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2399{
2400 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002401 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002402 com_push(c, 1);
2403 com_node(c, augn);
2404 com_addbyte(c, opcode);
2405 com_pop(c, 1);
2406 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407}
2408
2409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002410com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411{
2412 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002413 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 if (assigning)
2415 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416}
2417
2418static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002419com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002420{
2421 /* Loop to avoid trivial recursion */
2422 for (;;) {
2423 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002424
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002425 case exprlist:
2426 case testlist:
2427 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY) {
2429 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002430 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002431 return;
2432 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002433 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434 return;
2435 }
2436 n = CHILD(n, 0);
2437 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002438
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002439 case test:
2440 case and_test:
2441 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002444 case xor_expr:
2445 case and_expr:
2446 case shift_expr:
2447 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002449 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002450 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002451 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002452 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002453 return;
2454 }
2455 n = CHILD(n, 0);
2456 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002457
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002458 case power: /* atom trailer* ('**' power)*
2459 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002460 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002461 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002462 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002463 return;
2464 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002465 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466 int i;
2467 com_node(c, CHILD(n, 0));
2468 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002469 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002470 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002471 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002472 return;
2473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 com_apply_trailer(c, CHILD(n, i));
2475 } /* NB i is still alive */
2476 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002477 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 return;
2479 }
2480 n = CHILD(n, 0);
2481 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002482
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 case atom:
2484 switch (TYPE(CHILD(n, 0))) {
2485 case LPAR:
2486 n = CHILD(n, 1);
2487 if (TYPE(n) == RPAR) {
2488 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002489 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002490 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491 return;
2492 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002493 if (assigning > OP_APPLY) {
2494 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002495 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002496 return;
2497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002498 break;
2499 case LSQB:
2500 n = CHILD(n, 1);
2501 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002502 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002503 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 return;
2505 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 if (assigning > OP_APPLY) {
2507 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002508 "augmented assign to list not possible");
2509 return;
2510 }
2511 if (NCH(n) > 1
2512 && TYPE(CHILD(n, 1)) == list_for) {
2513 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002514 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002515 return;
2516 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002517 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 return;
2519 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002520 if (assigning > OP_APPLY)
2521 com_augassign_name(c, CHILD(n, 0),
2522 assigning, augn);
2523 else
2524 com_assign_name(c, CHILD(n, 0),
2525 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 return;
2527 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002528 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002529 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 return;
2531 }
2532 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002533
2534 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002535 com_error(c, PyExc_SyntaxError,
2536 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002537 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002538
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002540 com_error(c, PyExc_SystemError,
2541 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002543
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
2545 }
2546}
Guido van Rossum7c531111997-03-11 18:42:21 +00002547
Thomas Wouters434d0822000-08-24 20:11:32 +00002548static void
2549com_augassign(struct compiling *c, node *n)
2550{
2551 int opcode;
2552
2553 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2554 case '+': opcode = INPLACE_ADD; break;
2555 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002556 case '/':
2557 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2558 opcode = INPLACE_FLOOR_DIVIDE;
2559 else if (c->c_flags & CO_FUTURE_DIVISION)
2560 opcode = INPLACE_TRUE_DIVIDE;
2561 else
2562 opcode = INPLACE_DIVIDE;
2563 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002564 case '%': opcode = INPLACE_MODULO; break;
2565 case '<': opcode = INPLACE_LSHIFT; break;
2566 case '>': opcode = INPLACE_RSHIFT; break;
2567 case '&': opcode = INPLACE_AND; break;
2568 case '^': opcode = INPLACE_XOR; break;
2569 case '|': opcode = INPLACE_OR; break;
2570 case '*':
2571 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2572 opcode = INPLACE_POWER;
2573 else
2574 opcode = INPLACE_MULTIPLY;
2575 break;
2576 default:
2577 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2578 return;
2579 }
2580 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2581}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582
2583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002584com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002585{
Thomas Wouters434d0822000-08-24 20:11:32 +00002586 REQ(n, expr_stmt);
2587 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002589 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002591 if (NCH(n) == 1) {
2592 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002593 if (c->c_interactive)
2594 com_addbyte(c, PRINT_EXPR);
2595 else
2596 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002597 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002599 else if (TYPE(CHILD(n,1)) == augassign)
2600 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601 else {
2602 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002603 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002604 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_push(c, 1);
2608 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002609 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002610 }
2611 }
2612}
2613
2614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002615com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002616{
2617 int a = 0, b = 0;
2618 int i;
2619 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2620 /* Generate code like for
2621
2622 if __debug__:
2623 if not <test>:
2624 raise AssertionError [, <message>]
2625
2626 where <message> is the second test, if present.
2627 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002628
Guido van Rossum228d7f31997-04-02 05:24:36 +00002629 if (Py_OptimizeFlag)
2630 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002631 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002632 com_push(c, 1);
2633 com_addfwref(c, JUMP_IF_FALSE, &a);
2634 com_addbyte(c, POP_TOP);
2635 com_pop(c, 1);
2636 com_node(c, CHILD(n, 1));
2637 com_addfwref(c, JUMP_IF_TRUE, &b);
2638 com_addbyte(c, POP_TOP);
2639 com_pop(c, 1);
2640 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002641 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002642 com_push(c, 1);
2643 i = NCH(n)/2; /* Either 2 or 4 */
2644 if (i > 1)
2645 com_node(c, CHILD(n, 3));
2646 com_addoparg(c, RAISE_VARARGS, i);
2647 com_pop(c, i);
2648 /* The interpreter does not fall through */
2649 /* All jumps converge here */
2650 com_backpatch(c, a);
2651 com_backpatch(c, b);
2652 com_addbyte(c, POP_TOP);
2653}
2654
2655static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002656com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002658 int i = 1;
2659 node* stream = NULL;
2660
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002661 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002662
2663 /* are we using the extended print form? */
2664 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2665 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002666 com_node(c, stream);
2667 /* stack: [...] => [... stream] */
2668 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002669 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2670 i = 4;
2671 else
2672 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002673 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002674 for (; i < NCH(n); i += 2) {
2675 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002676 com_addbyte(c, DUP_TOP);
2677 /* stack: [stream] => [stream stream] */
2678 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002679 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002680 /* stack: [stream stream] => [stream stream obj] */
2681 com_addbyte(c, ROT_TWO);
2682 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002683 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002684 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002685 com_pop(c, 2);
2686 }
2687 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002688 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002689 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002690 com_addbyte(c, PRINT_ITEM);
2691 com_pop(c, 1);
2692 }
2693 }
2694 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002695 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002696 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002697 /* must pop the extra stream object off the stack */
2698 com_addbyte(c, POP_TOP);
2699 /* stack: [... stream] => [...] */
2700 com_pop(c, 1);
2701 }
2702 }
2703 else {
2704 if (stream != NULL) {
2705 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002706 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002707 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002708 com_pop(c, 1);
2709 }
2710 else
2711 com_addbyte(c, PRINT_NEWLINE);
2712 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002718 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002719 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002720 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002721 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002722 if (c->c_flags & CO_GENERATOR) {
2723 if (NCH(n) > 1) {
2724 com_error(c, PyExc_SyntaxError,
2725 "'return' with argument inside generator");
2726 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002727 }
2728 if (NCH(n) < 2) {
2729 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 com_push(c, 1);
2731 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002732 else
2733 com_node(c, CHILD(n, 1));
2734 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002735 com_pop(c, 1);
2736}
2737
2738static void
2739com_yield_stmt(struct compiling *c, node *n)
2740{
Tim Peters95c80f82001-06-23 02:07:08 +00002741 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002742 REQ(n, yield_stmt); /* 'yield' testlist */
2743 if (!c->c_infunction) {
2744 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2745 }
Tim Peters95c80f82001-06-23 02:07:08 +00002746
2747 for (i = 0; i < c->c_nblocks; ++i) {
2748 if (c->c_block[i] == SETUP_FINALLY) {
2749 com_error(c, PyExc_SyntaxError,
2750 "'yield' not allowed in a 'try' block "
2751 "with a 'finally' clause");
2752 return;
2753 }
2754 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002755 com_node(c, CHILD(n, 1));
2756 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758}
2759
2760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002761com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002764 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2765 if (NCH(n) > 1) {
2766 com_node(c, CHILD(n, 1));
2767 if (NCH(n) > 3) {
2768 com_node(c, CHILD(n, 3));
2769 if (NCH(n) > 5)
2770 com_node(c, CHILD(n, 5));
2771 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002772 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 i = NCH(n)/2;
2774 com_addoparg(c, RAISE_VARARGS, i);
2775 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776}
2777
2778static void
Thomas Wouters52152252000-08-17 22:55:00 +00002779com_from_import(struct compiling *c, node *n)
2780{
2781 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2782 com_push(c, 1);
2783 if (NCH(n) > 1) {
2784 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2785 com_error(c, PyExc_SyntaxError, "invalid syntax");
2786 return;
2787 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002788 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002789 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002790 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002791 com_pop(c, 1);
2792}
2793
2794static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002795com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796{
2797 int i;
2798 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002799 /* 'import' dotted_name (',' dotted_name)* |
2800 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002802 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002803 /* 'from' dotted_name 'import' ... */
2804 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002805
2806 if (TYPE(CHILD(n, 3)) == STAR) {
2807 tup = Py_BuildValue("(s)", "*");
2808 } else {
2809 tup = PyTuple_New((NCH(n) - 2)/2);
2810 for (i = 3; i < NCH(n); i += 2) {
2811 PyTuple_SET_ITEM(tup, (i-3)/2,
2812 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002813 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002814 }
2815 }
2816 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002817 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002818 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002819 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002820 if (TYPE(CHILD(n, 3)) == STAR)
2821 com_addbyte(c, IMPORT_STAR);
2822 else {
2823 for (i = 3; i < NCH(n); i += 2)
2824 com_from_import(c, CHILD(n, i));
2825 com_addbyte(c, POP_TOP);
2826 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828 }
2829 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002830 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002831 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002832 node *subn = CHILD(n, i);
2833 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002834 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002835 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002836 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002837 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002838 int j;
2839 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002840 com_error(c, PyExc_SyntaxError,
2841 "invalid syntax");
2842 return;
2843 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002844 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2845 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002846 CHILD(CHILD(subn, 0),
2847 j));
2848 com_addop_varname(c, VAR_STORE,
2849 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002850 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002851 com_addop_varname(c, VAR_STORE,
2852 STR(CHILD(CHILD(subn, 0),
2853 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002854 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 }
2856 }
2857}
2858
2859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002860com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002861{
2862 REQ(n, exec_stmt);
2863 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2864 com_node(c, CHILD(n, 1));
2865 if (NCH(n) >= 4)
2866 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002867 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_push(c, 1);
2870 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002871 if (NCH(n) >= 6)
2872 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002873 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002874 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 com_push(c, 1);
2876 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002877 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002879}
2880
Guido van Rossum7c531111997-03-11 18:42:21 +00002881static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002882is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002883{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002884 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002885 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002886 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002887
2888 /* Label to avoid tail recursion */
2889 next:
2890 switch (TYPE(n)) {
2891
2892 case suite:
2893 if (NCH(n) == 1) {
2894 n = CHILD(n, 0);
2895 goto next;
2896 }
2897 /* Fall through */
2898 case file_input:
2899 for (i = 0; i < NCH(n); i++) {
2900 node *ch = CHILD(n, i);
2901 if (TYPE(ch) == stmt) {
2902 n = ch;
2903 goto next;
2904 }
2905 }
2906 break;
2907
2908 case stmt:
2909 case simple_stmt:
2910 case small_stmt:
2911 n = CHILD(n, 0);
2912 goto next;
2913
2914 case expr_stmt:
2915 case testlist:
2916 case test:
2917 case and_test:
2918 case not_test:
2919 case comparison:
2920 case expr:
2921 case xor_expr:
2922 case and_expr:
2923 case shift_expr:
2924 case arith_expr:
2925 case term:
2926 case factor:
2927 case power:
2928 case atom:
2929 if (NCH(n) == 1) {
2930 n = CHILD(n, 0);
2931 goto next;
2932 }
2933 break;
2934
2935 case NAME:
2936 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2937 return 1;
2938 break;
2939
2940 case NUMBER:
2941 v = parsenumber(c, STR(n));
2942 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002943 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002944 break;
2945 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 i = PyObject_IsTrue(v);
2947 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002948 return i == 0;
2949
2950 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002951 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002952 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002953 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002954 break;
2955 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002956 i = PyObject_IsTrue(v);
2957 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002958 return i == 0;
2959
2960 }
2961 return 0;
2962}
2963
Tim Peters08a898f2001-06-28 01:52:22 +00002964
2965/* Look under n for a return stmt with an expression.
2966 * This hack is used to find illegal returns under "if 0:" blocks in
2967 * functions already known to be generators (as determined by the symtable
2968 * pass).
2969 * Return the offending return node if found, else NULL.
2970 */
2971static node *
2972look_for_offending_return(node *n)
2973{
2974 int i;
2975
2976 for (i = 0; i < NCH(n); ++i) {
2977 node *kid = CHILD(n, i);
2978
2979 switch (TYPE(kid)) {
2980 case classdef:
2981 case funcdef:
2982 case lambdef:
2983 /* Stuff in nested functions & classes doesn't
2984 affect the code block we started in. */
2985 return NULL;
2986
2987 case return_stmt:
2988 if (NCH(kid) > 1)
2989 return kid;
2990 break;
2991
2992 default: {
2993 node *bad = look_for_offending_return(kid);
2994 if (bad != NULL)
2995 return bad;
2996 }
2997 }
2998 }
2999
3000 return NULL;
3001}
3002
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003003static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003004com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005{
3006 int i;
3007 int anchor = 0;
3008 REQ(n, if_stmt);
3009 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3010 for (i = 0; i+3 < NCH(n); i+=4) {
3011 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003012 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003013 if (is_constant_false(c, ch)) {
3014 /* We're going to skip this block. However, if this
3015 is a generator, we have to check the dead code
3016 anyway to make sure there aren't any return stmts
3017 with expressions, in the same scope. */
3018 if (c->c_flags & CO_GENERATOR) {
3019 node *p = look_for_offending_return(n);
3020 if (p != NULL) {
3021 int savelineno = c->c_lineno;
3022 c->c_lineno = p->n_lineno;
3023 com_error(c, PyExc_SyntaxError,
3024 "'return' with argument "
3025 "inside generator");
3026 c->c_lineno = savelineno;
3027 }
3028 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003029 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003030 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003031 if (i > 0)
3032 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003033 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003034 com_addfwref(c, JUMP_IF_FALSE, &a);
3035 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003036 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037 com_node(c, CHILD(n, i+3));
3038 com_addfwref(c, JUMP_FORWARD, &anchor);
3039 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003040 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 com_addbyte(c, POP_TOP);
3042 }
3043 if (i+2 < NCH(n))
3044 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003045 if (anchor)
3046 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047}
3048
3049static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003050com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051{
3052 int break_anchor = 0;
3053 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003054 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3056 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003057 block_push(c, SETUP_LOOP);
3058 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003059 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060 com_node(c, CHILD(n, 1));
3061 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3062 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003064 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003066 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003067 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3068 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003070 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 com_addbyte(c, POP_TOP);
3072 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003073 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 if (NCH(n) > 4)
3075 com_node(c, CHILD(n, 6));
3076 com_backpatch(c, break_anchor);
3077}
3078
3079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003080com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 int break_anchor = 0;
3083 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003084 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 REQ(n, for_stmt);
3086 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3087 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003088 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003090 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003091 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 Rossum59d1d2b2001-04-20 19:13:02 +00003093 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003095 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003096 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003098 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003099 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3100 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003102 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003104 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 if (NCH(n) > 8)
3106 com_node(c, CHILD(n, 8));
3107 com_backpatch(c, break_anchor);
3108}
3109
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003110/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003111
3112 SETUP_FINALLY L
3113 <code for S>
3114 POP_BLOCK
3115 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003116 L: <code for Sf>
3117 END_FINALLY
3118
3119 The special instructions use the block stack. Each block
3120 stack entry contains the instruction that created it (here
3121 SETUP_FINALLY), the level of the value stack at the time the
3122 block stack entry was created, and a label (here L).
3123
3124 SETUP_FINALLY:
3125 Pushes the current value stack level and the label
3126 onto the block stack.
3127 POP_BLOCK:
3128 Pops en entry from the block stack, and pops the value
3129 stack until its level is the same as indicated on the
3130 block stack. (The label is ignored.)
3131 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003132 Pops a variable number of entries from the *value* stack
3133 and re-raises the exception they specify. The number of
3134 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003135
3136 The block stack is unwound when an exception is raised:
3137 when a SETUP_FINALLY entry is found, the exception is pushed
3138 onto the value stack (and the exception condition is cleared),
3139 and the interpreter jumps to the label gotten from the block
3140 stack.
3141
3142 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003143 (The contents of the value stack is shown in [], with the top
3144 at the right; 'tb' is trace-back info, 'val' the exception's
3145 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003146
3147 Value stack Label Instruction Argument
3148 [] SETUP_EXCEPT L1
3149 [] <code for S>
3150 [] POP_BLOCK
3151 [] JUMP_FORWARD L0
3152
Guido van Rossum3f5da241990-12-20 15:06:42 +00003153 [tb, val, exc] L1: DUP )
3154 [tb, val, exc, exc] <evaluate E1> )
3155 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3156 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3157 [tb, val, exc, 1] POP )
3158 [tb, val, exc] POP
3159 [tb, val] <assign to V1> (or POP if no V1)
3160 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003161 [] <code for S1>
3162 JUMP_FORWARD L0
3163
Guido van Rossum3f5da241990-12-20 15:06:42 +00003164 [tb, val, exc, 0] L2: POP
3165 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003166 .............................etc.......................
3167
Guido van Rossum3f5da241990-12-20 15:06:42 +00003168 [tb, val, exc, 0] Ln+1: POP
3169 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003170
3171 [] L0: <next statement>
3172
3173 Of course, parts are not generated if Vi or Ei is not present.
3174*/
3175
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003177com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003178{
3179 int except_anchor = 0;
3180 int end_anchor = 0;
3181 int else_anchor = 0;
3182 int i;
3183 node *ch;
3184
3185 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3186 block_push(c, SETUP_EXCEPT);
3187 com_node(c, CHILD(n, 2));
3188 com_addbyte(c, POP_BLOCK);
3189 block_pop(c, SETUP_EXCEPT);
3190 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3191 com_backpatch(c, except_anchor);
3192 for (i = 3;
3193 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3194 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003196 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003197 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003198 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003199 break;
3200 }
3201 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003202 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003203 com_addoparg(c, SET_LINENO, ch->n_lineno);
3204 if (NCH(ch) > 1) {
3205 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003207 com_node(c, CHILD(ch, 1));
3208 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003210 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3211 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003213 }
3214 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003216 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003217 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003218 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003219 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003220 com_pop(c, 1);
3221 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224 com_node(c, CHILD(n, i+2));
3225 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3226 if (except_anchor) {
3227 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003228 /* We come in with [tb, val, exc, 0] on the
3229 stack; one pop and it's the same as
3230 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231 com_addbyte(c, POP_TOP);
3232 }
3233 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003234 /* We actually come in here with [tb, val, exc] but the
3235 END_FINALLY will zap those and jump around.
3236 The c_stacklevel does not reflect them so we need not pop
3237 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003238 com_addbyte(c, END_FINALLY);
3239 com_backpatch(c, else_anchor);
3240 if (i < NCH(n))
3241 com_node(c, CHILD(n, i+2));
3242 com_backpatch(c, end_anchor);
3243}
3244
3245static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003246com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247{
3248 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003250
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3252 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003254 com_addbyte(c, POP_BLOCK);
3255 block_pop(c, SETUP_FINALLY);
3256 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003257 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 /* While the generated code pushes only one item,
3259 the try-finally handling can enter here with
3260 up to three items. OK, here are the details:
3261 3 for an exception, 2 for RETURN, 1 for BREAK. */
3262 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 com_backpatch(c, finally_anchor);
3264 ch = CHILD(n, NCH(n)-1);
3265 com_addoparg(c, SET_LINENO, ch->n_lineno);
3266 com_node(c, ch);
3267 com_addbyte(c, END_FINALLY);
3268 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003270}
3271
3272static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003273com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003274{
3275 REQ(n, try_stmt);
3276 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3277 | 'try' ':' suite 'finally' ':' suite */
3278 if (TYPE(CHILD(n, 3)) != except_clause)
3279 com_try_finally(c, n);
3280 else
3281 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282}
3283
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003285get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003286{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003287 int i;
3288
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 /* Label to avoid tail recursion */
3290 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003291 switch (TYPE(n)) {
3292
3293 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 if (NCH(n) == 1) {
3295 n = CHILD(n, 0);
3296 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003297 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003299 case file_input:
3300 for (i = 0; i < NCH(n); i++) {
3301 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 if (TYPE(ch) == stmt) {
3303 n = ch;
3304 goto next;
3305 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003306 }
3307 break;
3308
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003309 case stmt:
3310 case simple_stmt:
3311 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 n = CHILD(n, 0);
3313 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003314
3315 case expr_stmt:
3316 case testlist:
3317 case test:
3318 case and_test:
3319 case not_test:
3320 case comparison:
3321 case expr:
3322 case xor_expr:
3323 case and_expr:
3324 case shift_expr:
3325 case arith_expr:
3326 case term:
3327 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003328 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 if (NCH(n) == 1) {
3330 n = CHILD(n, 0);
3331 goto next;
3332 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003333 break;
3334
3335 case atom:
3336 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003338 break;
3339
3340 }
3341 return NULL;
3342}
3343
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003345get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346{
Guido van Rossum541563e1999-01-28 15:08:09 +00003347 /* Don't generate doc-strings if run with -OO */
3348 if (Py_OptimizeFlag > 1)
3349 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003350 n = get_rawdocstring(n);
3351 if (n == NULL)
3352 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003353 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003354}
3355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003357com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358{
3359 REQ(n, suite);
3360 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3361 if (NCH(n) == 1) {
3362 com_node(c, CHILD(n, 0));
3363 }
3364 else {
3365 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003366 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 node *ch = CHILD(n, i);
3368 if (TYPE(ch) == stmt)
3369 com_node(c, ch);
3370 }
3371 }
3372}
3373
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003374/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003377{
3378 int i = c->c_nblocks;
3379 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3380 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3381 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003382 else if (i <= 0) {
3383 /* at the outer level */
3384 com_error(c, PyExc_SyntaxError,
3385 "'continue' not properly in loop");
3386 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003387 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003388 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003389 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003390 if (c->c_block[j] == SETUP_LOOP)
3391 break;
3392 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003393 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003394 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003395 for (; i > j; --i) {
3396 if (c->c_block[i] == SETUP_EXCEPT ||
3397 c->c_block[i] == SETUP_FINALLY) {
3398 com_addoparg(c, CONTINUE_LOOP,
3399 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003400 return;
3401 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003402 if (c->c_block[i] == END_FINALLY) {
3403 com_error(c, PyExc_SyntaxError,
3404 "'continue' not supported inside 'finally' clause");
3405 return;
3406 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003407 }
3408 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003409 com_error(c, PyExc_SyntaxError,
3410 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003411 }
3412 /* XXX Could allow it inside a 'finally' clause
3413 XXX if we could pop the exception still on the stack */
3414}
3415
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003416static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003417com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003418{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003419 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003420 if (TYPE(n) == lambdef) {
3421 /* lambdef: 'lambda' [varargslist] ':' test */
3422 n = CHILD(n, 1);
3423 }
3424 else {
3425 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3426 n = CHILD(n, 2);
3427 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3428 n = CHILD(n, 1);
3429 }
3430 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003431 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003432 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003433 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003434 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3435 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003436 nargs = 0;
3437 ndefs = 0;
3438 for (i = 0; i < nch; i++) {
3439 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003440 if (TYPE(CHILD(n, i)) == STAR ||
3441 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003442 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003443 nargs++;
3444 i++;
3445 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003446 t = RPAR; /* Anything except EQUAL or COMMA */
3447 else
3448 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003449 if (t == EQUAL) {
3450 i++;
3451 ndefs++;
3452 com_node(c, CHILD(n, i));
3453 i++;
3454 if (i >= nch)
3455 break;
3456 t = TYPE(CHILD(n, i));
3457 }
3458 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003459 /* Treat "(a=1, b)" as an error */
3460 if (ndefs)
3461 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003462 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003463 }
3464 if (t != COMMA)
3465 break;
3466 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003467 return ndefs;
3468}
3469
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003471com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003473 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003474 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003476 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003477 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3478 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003479 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003480 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003481 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 c->c_errors++;
3483 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003484 int closure = com_make_closure(c, (PyCodeObject *)co);
3485 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003487 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003488 if (closure)
3489 com_addoparg(c, MAKE_CLOSURE, ndefs);
3490 else
3491 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003492 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003493 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003494 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003495 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
3497}
3498
3499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003500com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003501{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003502 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003503 REQ(n, testlist);
3504 /* testlist: test (',' test)* [','] */
3505 for (i = 0; i < NCH(n); i += 2)
3506 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003507 i = (NCH(n)+1) / 2;
3508 com_addoparg(c, BUILD_TUPLE, i);
3509 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003510}
3511
3512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003513com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003514{
Guido van Rossum25831651993-05-19 14:50:45 +00003515 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003516 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003517 char *name;
3518
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003520 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003521 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003522 c->c_errors++;
3523 return;
3524 }
3525 /* Push the class name on the stack */
3526 i = com_addconst(c, v);
3527 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003529 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003530 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003532 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 com_push(c, 1);
3534 }
Guido van Rossum25831651993-05-19 14:50:45 +00003535 else
3536 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003537 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003538 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003540 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003541 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003542 c->c_errors++;
3543 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003544 int closure = com_make_closure(c, (PyCodeObject *)co);
3545 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003546 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003548 if (closure)
3549 com_addoparg(c, MAKE_CLOSURE, 0);
3550 else
3551 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003552 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003553 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003554 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003555 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003556 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003557 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003558}
3559
3560static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003561com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003563 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003564 if (c->c_errors)
3565 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 switch (TYPE(n)) {
3567
3568 /* Definition nodes */
3569
3570 case funcdef:
3571 com_funcdef(c, n);
3572 break;
3573 case classdef:
3574 com_classdef(c, n);
3575 break;
3576
3577 /* Trivial parse tree nodes */
3578
3579 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003580 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003582 n = CHILD(n, 0);
3583 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003584
3585 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003586 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3587 com_addoparg(c, SET_LINENO, n->n_lineno);
3588 {
3589 int i;
3590 for (i = 0; i < NCH(n)-1; i += 2)
3591 com_node(c, CHILD(n, i));
3592 }
3593 break;
3594
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003595 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003596 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003597 n = CHILD(n, 0);
3598 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599
3600 /* Statement nodes */
3601
3602 case expr_stmt:
3603 com_expr_stmt(c, n);
3604 break;
3605 case print_stmt:
3606 com_print_stmt(c, n);
3607 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003608 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003609 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610 break;
3611 case pass_stmt:
3612 break;
3613 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003614 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003615 com_error(c, PyExc_SyntaxError,
3616 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003617 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003618 com_addbyte(c, BREAK_LOOP);
3619 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003620 case continue_stmt:
3621 com_continue_stmt(c, n);
3622 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623 case return_stmt:
3624 com_return_stmt(c, n);
3625 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003626 case yield_stmt:
3627 com_yield_stmt(c, n);
3628 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 case raise_stmt:
3630 com_raise_stmt(c, n);
3631 break;
3632 case import_stmt:
3633 com_import_stmt(c, n);
3634 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003635 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003636 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003637 case exec_stmt:
3638 com_exec_stmt(c, n);
3639 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003640 case assert_stmt:
3641 com_assert_stmt(c, n);
3642 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643 case if_stmt:
3644 com_if_stmt(c, n);
3645 break;
3646 case while_stmt:
3647 com_while_stmt(c, n);
3648 break;
3649 case for_stmt:
3650 com_for_stmt(c, n);
3651 break;
3652 case try_stmt:
3653 com_try_stmt(c, n);
3654 break;
3655 case suite:
3656 com_suite(c, n);
3657 break;
3658
3659 /* Expression nodes */
3660
3661 case testlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003662 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003663 break;
3664 case test:
3665 com_test(c, n);
3666 break;
3667 case and_test:
3668 com_and_test(c, n);
3669 break;
3670 case not_test:
3671 com_not_test(c, n);
3672 break;
3673 case comparison:
3674 com_comparison(c, n);
3675 break;
3676 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003677 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003678 break;
3679 case expr:
3680 com_expr(c, n);
3681 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003682 case xor_expr:
3683 com_xor_expr(c, n);
3684 break;
3685 case and_expr:
3686 com_and_expr(c, n);
3687 break;
3688 case shift_expr:
3689 com_shift_expr(c, n);
3690 break;
3691 case arith_expr:
3692 com_arith_expr(c, n);
3693 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003694 case term:
3695 com_term(c, n);
3696 break;
3697 case factor:
3698 com_factor(c, n);
3699 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003700 case power:
3701 com_power(c, n);
3702 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703 case atom:
3704 com_atom(c, n);
3705 break;
3706
3707 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003708 com_error(c, PyExc_SystemError,
3709 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 }
3711}
3712
Tim Petersdbd9ba62000-07-09 03:09:57 +00003713static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003714
3715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003716com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003717{
3718 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3719 if (TYPE(CHILD(n, 0)) == LPAR)
3720 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003721 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003722 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_pop(c, 1);
3724 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003725}
3726
3727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003728com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003729{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003730 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003731 if (NCH(n) == 1) {
3732 com_fpdef(c, CHILD(n, 0));
3733 }
3734 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003736 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 for (i = 0; i < NCH(n); i += 2)
3739 com_fpdef(c, CHILD(n, i));
3740 }
3741}
3742
3743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003744com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003745{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003746 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003747 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003748 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003749 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003750 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003751 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003752 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003753 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003754 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003755 node *ch = CHILD(n, i);
3756 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003757 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003758 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003759 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3760 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003761 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003762 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003763 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003764 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003765 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003767 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003768 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003769 ch = CHILD(n, i);
3770 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003771 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003772 else
3773 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003774 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003775 if (complex) {
3776 /* Generate code for complex arguments only after
3777 having counted the simple arguments */
3778 int ilocal = 0;
3779 for (i = 0; i < nch; i++) {
3780 node *ch = CHILD(n, i);
3781 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003782 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003783 break;
3784 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3785 fp = CHILD(ch, 0);
3786 if (TYPE(fp) != NAME) {
3787 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003788 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003789 com_fpdef(c, ch);
3790 }
3791 ilocal++;
3792 if (++i >= nch)
3793 break;
3794 ch = CHILD(n, i);
3795 if (TYPE(ch) == EQUAL)
3796 i += 2;
3797 else
3798 REQ(ch, COMMA);
3799 }
3800 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003801}
3802
3803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003804com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805{
3806 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003807 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003808 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003809 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003810 if (doc != NULL) {
3811 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003812 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003813 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003815 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003817 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003818 for (i = 0; i < NCH(n); i++) {
3819 node *ch = CHILD(n, i);
3820 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3821 com_node(c, ch);
3822 }
3823}
3824
3825/* Top-level compile-node interface */
3826
3827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003828compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003830 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003831 node *ch;
3832 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003833 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003834 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003835 if (doc != NULL) {
3836 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003837 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003838 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003839 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003840 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003841 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3842 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003843 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003844 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003845 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003847 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003848 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3849 com_push(c, 1);
3850 com_addbyte(c, RETURN_VALUE);
3851 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852}
3853
3854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003855compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003856{
Guido van Rossum590baa41993-11-30 13:40:46 +00003857 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003858 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003859 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003860
3861 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003862 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003863 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003864 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003865 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003866 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003867 else
3868 ch = CHILD(n, 2);
3869 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003870 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003872}
3873
3874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003875compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003876{
3877 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003879 REQ(n, classdef);
3880 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3881 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003882 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003883 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003884 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003885 if (doc != NULL) {
3886 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003888 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003889 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003890 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003892 }
3893 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003894 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003895 com_node(c, ch);
3896 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003897 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003898 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003900}
3901
3902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003903compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003905 com_addoparg(c, SET_LINENO, n->n_lineno);
3906
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 switch (TYPE(n)) {
3908
Guido van Rossum4c417781991-01-21 16:09:22 +00003909 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003911 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 n = CHILD(n, 0);
3913 if (TYPE(n) != NEWLINE)
3914 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003915 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003916 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003917 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003918 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003919 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003920 break;
3921
Guido van Rossum4c417781991-01-21 16:09:22 +00003922 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003923 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003924 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003925 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003926 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003927 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003928 break;
3929
Guido van Rossum590baa41993-11-30 13:40:46 +00003930 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003931 com_node(c, CHILD(n, 0));
3932 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003933 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003934 break;
3935
Guido van Rossum590baa41993-11-30 13:40:46 +00003936 case lambdef: /* anonymous function definition */
3937 compile_lambdef(c, n);
3938 break;
3939
Guido van Rossum4c417781991-01-21 16:09:22 +00003940 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003941 compile_funcdef(c, n);
3942 break;
3943
Guido van Rossum4c417781991-01-21 16:09:22 +00003944 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003945 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003946 break;
3947
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003949 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003950 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 }
3952}
3953
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003954static PyObject *
3955dict_keys_inorder(PyObject *dict, int offset)
3956{
3957 PyObject *tuple, *k, *v;
3958 int i, pos = 0, size = PyDict_Size(dict);
3959
3960 tuple = PyTuple_New(size);
3961 if (tuple == NULL)
3962 return NULL;
3963 while (PyDict_Next(dict, &pos, &k, &v)) {
3964 i = PyInt_AS_LONG(v);
3965 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00003966 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003967 PyTuple_SET_ITEM(tuple, i - offset, k);
3968 }
3969 return tuple;
3970}
3971
Guido van Rossum79f25d91997-04-29 20:08:16 +00003972PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003973PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00003975 return PyNode_CompileFlags(n, filename, NULL);
3976}
3977
3978PyCodeObject *
3979PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
3980{
3981 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003982}
3983
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003984struct symtable *
3985PyNode_CompileSymtable(node *n, char *filename)
3986{
3987 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003988 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003989
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003990 ff = PyNode_Future(n, filename);
3991 if (ff == NULL)
3992 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003993 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003994 if (st == NULL)
3995 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003996 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003997 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00003998 if (st->st_errors > 0)
3999 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004000 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004001 if (st->st_errors > 0)
4002 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004003
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004004 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004005 fail:
4006 PyMem_Free((void *)ff);
4007 st->st_future = NULL;
4008 PySymtable_Free(st);
4009 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004010}
4011
Guido van Rossum79f25d91997-04-29 20:08:16 +00004012static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004013icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004014{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004015 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004016}
4017
Guido van Rossum79f25d91997-04-29 20:08:16 +00004018static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004019jcompile(node *n, char *filename, struct compiling *base,
4020 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004021{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004022 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004023 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004024 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004026 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004027 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004028 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 /* c_symtable still points to parent's symbols */
4030 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004031 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004032 sc.c_nested = 1;
Guido van Rossum4668b002001-08-08 05:00:18 +00004033 sc.c_flags |= base->c_flags & (CO_GENERATOR_ALLOWED |
4034 CO_FUTURE_DIVISION);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004035 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004036 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004037 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004038 if (sc.c_future == NULL) {
4039 com_free(&sc);
4040 return NULL;
4041 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004042 if (flags) {
4043 int merged = sc.c_future->ff_features |
4044 flags->cf_flags;
4045 sc.c_future->ff_features = merged;
4046 flags->cf_flags = merged;
4047 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004048 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004049 com_free(&sc);
4050 return NULL;
4051 }
4052 }
4053 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004054 if (symtable_load_symbols(&sc) < 0) {
4055 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004056 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004057 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058 compile_node(&sc, n);
4059 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004060 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004061 PyObject *consts, *names, *varnames, *filename, *name,
4062 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004063 consts = PyList_AsTuple(sc.c_consts);
4064 names = PyList_AsTuple(sc.c_names);
4065 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004066 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4067 freevars = dict_keys_inorder(sc.c_freevars,
4068 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004069 filename = PyString_InternFromString(sc.c_filename);
4070 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004071 if (!PyErr_Occurred())
4072 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004073 sc.c_nlocals,
4074 sc.c_maxstacklevel,
4075 sc.c_flags,
4076 sc.c_code,
4077 consts,
4078 names,
4079 varnames,
4080 freevars,
4081 cellvars,
4082 filename,
4083 name,
4084 sc.c_firstlineno,
4085 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004086 Py_XDECREF(consts);
4087 Py_XDECREF(names);
4088 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004089 Py_XDECREF(freevars);
4090 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004091 Py_XDECREF(filename);
4092 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004093 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004094 else if (!PyErr_Occurred()) {
4095 /* This could happen if someone called PyErr_Clear() after an
4096 error was reported above. That's not supposed to happen,
4097 but I just plugged one case and I'm not sure there can't be
4098 others. In that case, raise SystemError so that at least
4099 it gets reported instead dumping core. */
4100 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4101 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004102 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004103 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004104 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004105 sc.c_symtable = NULL;
4106 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004107 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004108 return co;
4109}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004110
4111int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004112PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004113{
4114 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004115 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004116 int line = co->co_firstlineno;
4117 int addr = 0;
4118 while (--size >= 0) {
4119 addr += *p++;
4120 if (addr > addrq)
4121 break;
4122 line += *p++;
4123 }
4124 return line;
4125}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004126
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004127/* The test for LOCAL must come before the test for FREE in order to
4128 handle classes where name is both local and free. The local var is
4129 a method and the free var is a free var referenced within a method.
4130*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004131
4132static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004133get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004134{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004135 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004136 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004137
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004138 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4139 return CELL;
4140 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4141 return LOCAL;
4142 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4143 return FREE;
4144 v = PyDict_GetItemString(c->c_globals, name);
4145 if (v) {
4146 if (v == Py_None)
4147 return GLOBAL_EXPLICIT;
4148 else {
4149 return GLOBAL_IMPLICIT;
4150 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004151 }
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004152 sprintf(buf,
4153 "unknown scope for %.100s in %.100s(%s) "
4154 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4155 name, c->c_name,
4156 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4157 c->c_filename,
4158 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4159 PyObject_REPR(c->c_locals),
4160 PyObject_REPR(c->c_globals)
4161 );
4162
4163 Py_FatalError(buf);
4164 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165}
4166
Guido van Rossum207fda62001-03-02 03:30:41 +00004167/* Helper functions to issue warnings */
4168
4169static int
4170issue_warning(char *msg, char *filename, int lineno)
4171{
4172 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4173 lineno, NULL, NULL) < 0) {
4174 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4175 PyErr_SetString(PyExc_SyntaxError, msg);
4176 PyErr_SyntaxLocation(filename, lineno);
4177 }
4178 return -1;
4179 }
4180 return 0;
4181}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004182
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004183static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004184symtable_warn(struct symtable *st, char *msg)
4185{
Guido van Rossum207fda62001-03-02 03:30:41 +00004186 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004187 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004188 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004189 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004190 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004191}
4192
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004193/* Helper function for setting lineno and filename */
4194
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004195static int
4196symtable_build(struct compiling *c, node *n)
4197{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004198 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004199 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004200 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004201 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004202 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4203 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004204 return -1;
4205 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004206 if (c->c_symtable->st_errors > 0)
4207 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004208 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004209 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004210 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004211 return 0;
4212}
4213
4214static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004215symtable_init_compiling_symbols(struct compiling *c)
4216{
4217 PyObject *varnames;
4218
4219 varnames = c->c_symtable->st_cur->ste_varnames;
4220 if (varnames == NULL) {
4221 varnames = PyList_New(0);
4222 if (varnames == NULL)
4223 return -1;
4224 c->c_symtable->st_cur->ste_varnames = varnames;
4225 Py_INCREF(varnames);
4226 } else
4227 Py_INCREF(varnames);
4228 c->c_varnames = varnames;
4229
4230 c->c_globals = PyDict_New();
4231 if (c->c_globals == NULL)
4232 return -1;
4233 c->c_freevars = PyDict_New();
4234 if (c->c_freevars == NULL)
4235 return -1;
4236 c->c_cellvars = PyDict_New();
4237 if (c->c_cellvars == NULL)
4238 return -1;
4239 return 0;
4240}
4241
4242struct symbol_info {
4243 int si_nlocals;
4244 int si_ncells;
4245 int si_nfrees;
4246 int si_nimplicit;
4247};
4248
4249static void
4250symtable_init_info(struct symbol_info *si)
4251{
4252 si->si_nlocals = 0;
4253 si->si_ncells = 0;
4254 si->si_nfrees = 0;
4255 si->si_nimplicit = 0;
4256}
4257
4258static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004259symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004260 struct symbol_info *si)
4261{
4262 PyObject *dict, *v;
4263
4264 /* Seperate logic for DEF_FREE. If it occurs in a function,
4265 it indicates a local that we must allocate storage for (a
4266 cell var). If it occurs in a class, then the class has a
4267 method and a free variable with the same name.
4268 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004269 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004270 /* If it isn't declared locally, it can't be a cell. */
4271 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4272 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004273 v = PyInt_FromLong(si->si_ncells++);
4274 dict = c->c_cellvars;
4275 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004276 /* If it is free anyway, then there is no need to do
4277 anything here.
4278 */
4279 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004280 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004281 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004282 v = PyInt_FromLong(si->si_nfrees++);
4283 dict = c->c_freevars;
4284 }
4285 if (v == NULL)
4286 return -1;
4287 if (PyDict_SetItem(dict, name, v) < 0) {
4288 Py_DECREF(v);
4289 return -1;
4290 }
4291 Py_DECREF(v);
4292 return 0;
4293}
4294
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004295/* If a variable is a cell and an argument, make sure that appears in
4296 co_cellvars before any variable to its right in varnames.
4297*/
4298
4299
4300static int
4301symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4302 PyObject *varnames, int flags)
4303{
4304 PyObject *v, *w, *d, *list = NULL;
4305 int i, pos;
4306
4307 if (flags & CO_VARARGS)
4308 argcount++;
4309 if (flags & CO_VARKEYWORDS)
4310 argcount++;
4311 for (i = argcount; --i >= 0; ) {
4312 v = PyList_GET_ITEM(varnames, i);
4313 if (PyDict_GetItem(*cellvars, v)) {
4314 if (list == NULL) {
4315 list = PyList_New(1);
4316 if (list == NULL)
4317 return -1;
4318 PyList_SET_ITEM(list, 0, v);
4319 Py_INCREF(v);
4320 } else
4321 PyList_Insert(list, 0, v);
4322 }
4323 }
4324 if (list == NULL || PyList_GET_SIZE(list) == 0)
4325 return 0;
4326 /* There are cellvars that are also arguments. Create a dict
4327 to replace cellvars and put the args at the front.
4328 */
4329 d = PyDict_New();
4330 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4331 v = PyInt_FromLong(i);
4332 if (v == NULL)
4333 goto fail;
4334 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4335 goto fail;
4336 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4337 goto fail;
4338 }
4339 pos = 0;
4340 i = PyList_GET_SIZE(list);
4341 Py_DECREF(list);
4342 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4343 w = PyInt_FromLong(i++); /* don't care about the old key */
4344 if (PyDict_SetItem(d, v, w) < 0) {
4345 Py_DECREF(w);
4346 goto fail;
4347 }
4348 Py_DECREF(w);
4349 }
4350 Py_DECREF(*cellvars);
4351 *cellvars = d;
4352 return 1;
4353 fail:
4354 Py_DECREF(d);
4355 return -1;
4356}
4357
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004358static int
4359symtable_freevar_offsets(PyObject *freevars, int offset)
4360{
4361 PyObject *name, *v;
4362 int pos;
4363
4364 /* The cell vars are the first elements of the closure,
4365 followed by the free vars. Update the offsets in
4366 c_freevars to account for number of cellvars. */
4367 pos = 0;
4368 while (PyDict_Next(freevars, &pos, &name, &v)) {
4369 int i = PyInt_AS_LONG(v) + offset;
4370 PyObject *o = PyInt_FromLong(i);
4371 if (o == NULL)
4372 return -1;
4373 if (PyDict_SetItem(freevars, name, o) < 0) {
4374 Py_DECREF(o);
4375 return -1;
4376 }
4377 Py_DECREF(o);
4378 }
4379 return 0;
4380}
4381
4382static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004383symtable_check_unoptimized(struct compiling *c,
4384 PySymtableEntryObject *ste,
4385 struct symbol_info *si)
4386{
4387 char buf[300];
4388
4389 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4390 || (ste->ste_nested && si->si_nimplicit)))
4391 return 0;
4392
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004393#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4394
4395#define ILLEGAL_IS "is a nested function"
4396
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004397#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004398"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004399
4400#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004401"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004402
4403#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4404"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004405"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004406
4407 /* XXX perhaps the linenos for these opt-breaking statements
4408 should be stored so the exception can point to them. */
4409
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004410 if (ste->ste_child_free) {
4411 if (ste->ste_optimized == OPT_IMPORT_STAR)
4412 sprintf(buf, ILLEGAL_IMPORT_STAR,
4413 PyString_AS_STRING(ste->ste_name),
4414 ILLEGAL_CONTAINS);
4415 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4416 sprintf(buf, ILLEGAL_BARE_EXEC,
4417 PyString_AS_STRING(ste->ste_name),
4418 ILLEGAL_CONTAINS);
4419 else {
4420 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4421 PyString_AS_STRING(ste->ste_name),
4422 ILLEGAL_CONTAINS);
4423 }
4424 } else {
4425 if (ste->ste_optimized == OPT_IMPORT_STAR)
4426 sprintf(buf, ILLEGAL_IMPORT_STAR,
4427 PyString_AS_STRING(ste->ste_name),
4428 ILLEGAL_IS);
4429 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4430 sprintf(buf, ILLEGAL_BARE_EXEC,
4431 PyString_AS_STRING(ste->ste_name),
4432 ILLEGAL_IS);
4433 else {
4434 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4435 PyString_AS_STRING(ste->ste_name),
4436 ILLEGAL_IS);
4437 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004438 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004439
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004440 PyErr_SetString(PyExc_SyntaxError, buf);
4441 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4442 ste->ste_opt_lineno);
4443 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004444}
4445
4446static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004447symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4448 struct symbol_info *si)
4449{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004450 if (c->c_future)
4451 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004452 if (ste->ste_generator)
4453 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004454 if (ste->ste_type != TYPE_MODULE)
4455 c->c_flags |= CO_NEWLOCALS;
4456 if (ste->ste_type == TYPE_FUNCTION) {
4457 c->c_nlocals = si->si_nlocals;
4458 if (ste->ste_optimized == 0)
4459 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004460 else if (ste->ste_optimized != OPT_EXEC)
4461 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004462 }
4463 return 0;
4464}
4465
4466static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004467symtable_load_symbols(struct compiling *c)
4468{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004469 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004470 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004471 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004472 PyObject *name, *varnames, *v;
4473 int i, flags, pos;
4474 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004475
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004476 if (implicit == NULL) {
4477 implicit = PyInt_FromLong(1);
4478 if (implicit == NULL)
4479 return -1;
4480 }
4481 v = NULL;
4482
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004483 if (symtable_init_compiling_symbols(c) < 0)
4484 goto fail;
4485 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004486 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004487 si.si_nlocals = PyList_GET_SIZE(varnames);
4488 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004489
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004490 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004491 v = PyInt_FromLong(i);
4492 if (PyDict_SetItem(c->c_locals,
4493 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004494 goto fail;
4495 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004496 }
4497
4498 /* XXX The cases below define the rules for whether a name is
4499 local or global. The logic could probably be clearer. */
4500 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004501 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4502 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004504 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004505 /* undo the original DEF_FREE */
4506 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004508 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004509 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004510 2. Free variables in methods that are also class
4511 variables or declared global.
4512 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004513 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004514 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004516 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004517 c->c_argcount--;
4518 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004519 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004520 c->c_argcount--;
4521 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004522 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004523 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004524 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004525 if (flags & DEF_PARAM) {
4526 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004527 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004528 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004529 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004530 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004531 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004532 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004533 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4534 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004535 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004536 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4538 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004539 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004540 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541 if (v == NULL)
4542 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004543 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004544 goto fail;
4545 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004546 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004547 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004548 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004549 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004550 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004551 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004552 if (v == NULL)
4553 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004554 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555 goto fail;
4556 Py_DECREF(v);
4557 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004558 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004559 if (PyDict_SetItem(c->c_globals, name,
4560 implicit) < 0)
4561 goto fail;
4562 if (st->st_nscopes != 1) {
4563 v = PyInt_FromLong(flags);
4564 if (PyDict_SetItem(st->st_global,
4565 name, v))
4566 goto fail;
4567 Py_DECREF(v);
4568 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004569 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004570 }
4571 }
4572
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004573 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4574
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004575 if (si.si_ncells > 1) { /* one cell is always in order */
4576 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4577 c->c_varnames, c->c_flags) < 0)
4578 return -1;
4579 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004580 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4581 return -1;
4582 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 fail:
4584 /* is this always the right thing to do? */
4585 Py_XDECREF(v);
4586 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587}
4588
4589static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004591{
4592 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593
4594 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4595 if (st == NULL)
4596 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004597 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004598
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004599 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 goto fail;
4602 if ((st->st_symbols = PyDict_New()) == NULL)
4603 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004605 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004606 st->st_errors = 0;
4607 st->st_tmpname = 0;
4608 st->st_private = NULL;
4609 return st;
4610 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004611 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004612 return NULL;
4613}
4614
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004615void
4616PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617{
4618 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004619 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004620 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004621 PyMem_Free((void *)st);
4622}
4623
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004624/* When the compiler exits a scope, it must should update the scope's
4625 free variable information with the list of free variables in its
4626 children.
4627
4628 Variables that are free in children and defined in the current
4629 scope are cellvars.
4630
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004631 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004632 false), free variables in children that are not defined here are
4633 implicit globals.
4634
4635*/
4636
4637static int
4638symtable_update_free_vars(struct symtable *st)
4639{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004640 int i, j, def;
4641 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004642 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004644 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 def = DEF_FREE_CLASS;
4646 else
4647 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004648 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 int pos = 0;
4650
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004651 if (list)
4652 PyList_SetSlice(list, 0,
4653 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004654 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004655 PyList_GET_ITEM(ste->ste_children, i);
4656 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004657 int flags = PyInt_AS_LONG(o);
4658 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004660 if (list == NULL) {
4661 list = PyList_New(0);
4662 if (list == NULL)
4663 return -1;
4664 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004665 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004666 if (PyList_Append(list, name) < 0) {
4667 Py_DECREF(list);
4668 return -1;
4669 }
4670 }
4671 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004672 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004673 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004674 v = PyDict_GetItem(ste->ste_symbols, name);
4675 /* If a name N is declared global in scope A and
4676 referenced in scope B contained (perhaps
4677 indirectly) in A and there are no scopes
4678 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004679 is global in B. Unless A is a class scope,
4680 because class scopes are not considered for
4681 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004682 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004683 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004684 int flags = PyInt_AS_LONG(v);
4685 if (flags & DEF_GLOBAL) {
4686 symtable_undo_free(st, child->ste_id,
4687 name);
4688 continue;
4689 }
4690 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004691 if (ste->ste_nested) {
4692 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004693 name, def) < 0) {
4694 Py_DECREF(list);
4695 return -1;
4696 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004698 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004699 name) < 0) {
4700 Py_DECREF(list);
4701 return -1;
4702 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004703 }
4704 }
4705 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004706
4707 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004708 return 0;
4709}
4710
4711/* If the current scope is a non-nested class or if name is not
4712 defined in the current, non-nested scope, then it is an implicit
4713 global in all nested scopes.
4714*/
4715
4716static int
4717symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4718{
4719 PyObject *o;
4720 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004722
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004723 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004724 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004725 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004726 if (o == NULL)
4727 return symtable_undo_free(st, child, name);
4728 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004729
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004730 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 return symtable_undo_free(st, child, name);
4732 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004733 return symtable_add_def_o(st, ste->ste_symbols,
4734 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004735}
4736
4737static int
4738symtable_undo_free(struct symtable *st, PyObject *id,
4739 PyObject *name)
4740{
4741 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004742 PyObject *info;
4743 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004744
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004745 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4746 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004747 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004748
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004749 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 if (info == NULL)
4751 return 0;
4752 v = PyInt_AS_LONG(info);
4753 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004754 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755 DEF_FREE_GLOBAL) < 0)
4756 return -1;
4757 } else
4758 /* If the name is defined here or declared global,
4759 then the recursion stops. */
4760 return 0;
4761
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004762 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4763 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004764 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004765 PyList_GET_ITEM(ste->ste_children, i);
4766 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004767 if (x < 0)
4768 return x;
4769 }
4770 return 0;
4771}
4772
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004773/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4774 This reference is released when the scope is exited, via the DECREF
4775 in symtable_exit_scope().
4776*/
4777
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778static int
4779symtable_exit_scope(struct symtable *st)
4780{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781 int end;
4782
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004783 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004784 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004785 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004787 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4788 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789 if (PySequence_DelItem(st->st_stack, end) < 0)
4790 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004794static void
4795symtable_enter_scope(struct symtable *st, char *name, int type,
4796 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004797{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004798 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799
4800 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 prev = st->st_cur;
4802 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4803 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004804 st->st_errors++;
4805 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004806 }
4807 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004808 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004809 PySymtableEntry_New(st, name, type, lineno);
4810 if (strcmp(name, TOP) == 0)
4811 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004812 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004813 if (PyList_Append(prev->ste_children,
4814 (PyObject *)st->st_cur) < 0)
4815 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004816 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004817}
4818
4819static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004820symtable_lookup(struct symtable *st, char *name)
4821{
4822 char buffer[MANGLE_LEN];
4823 PyObject *v;
4824 int flags;
4825
4826 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4827 name = buffer;
4828 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4829 if (v == NULL) {
4830 if (PyErr_Occurred())
4831 return -1;
4832 else
4833 return 0;
4834 }
4835
4836 flags = PyInt_AS_LONG(v);
4837 return flags;
4838}
4839
4840static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004843 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004844 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004845 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004847 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004848 name = buffer;
4849 if ((s = PyString_InternFromString(name)) == NULL)
4850 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004851 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4852 Py_DECREF(s);
4853 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854}
4855
4856/* Must only be called with mangled names */
4857
4858static int
4859symtable_add_def_o(struct symtable *st, PyObject *dict,
4860 PyObject *name, int flag)
4861{
4862 PyObject *o;
4863 int val;
4864
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004865 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004868 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004869 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004870 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004871 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004872 return -1;
4873 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004877 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879 Py_DECREF(o);
4880 return -1;
4881 }
4882 Py_DECREF(o);
4883
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887 } else if (flag & DEF_GLOBAL) {
4888 /* XXX need to update DEF_GLOBAL for other flags too;
4889 perhaps only DEF_FREE_GLOBAL */
4890 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004891 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004896 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897 Py_DECREF(o);
4898 return -1;
4899 }
4900 Py_DECREF(o);
4901 }
4902 return 0;
4903}
4904
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004906
Tim Peters08a898f2001-06-28 01:52:22 +00004907/* Look for a yield stmt under n. Return 1 if found, else 0.
4908 This hack is used to look inside "if 0:" blocks (which are normally
4909 ignored) in case those are the only places a yield occurs (so that this
4910 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004911static int
4912look_for_yield(node *n)
4913{
4914 int i;
4915
4916 for (i = 0; i < NCH(n); ++i) {
4917 node *kid = CHILD(n, i);
4918
4919 switch (TYPE(kid)) {
4920
4921 case classdef:
4922 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004923 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004924 /* Stuff in nested functions and classes can't make
4925 the parent a generator. */
4926 return 0;
4927
4928 case yield_stmt:
4929 return 1;
4930
4931 default:
4932 if (look_for_yield(kid))
4933 return 1;
4934 }
4935 }
4936 return 0;
4937}
4938
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939static void
4940symtable_node(struct symtable *st, node *n)
4941{
4942 int i, start = 0;
4943
4944 loop:
4945 switch (TYPE(n)) {
4946 case funcdef: {
4947 char *func_name = STR(CHILD(n, 1));
4948 symtable_add_def(st, func_name, DEF_LOCAL);
4949 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004950 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951 symtable_funcdef(st, n);
4952 symtable_exit_scope(st);
4953 break;
4954 }
4955 case lambdef:
4956 if (NCH(n) == 4)
4957 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004958 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959 symtable_funcdef(st, n);
4960 symtable_exit_scope(st);
4961 break;
4962 case classdef: {
4963 char *tmp, *class_name = STR(CHILD(n, 1));
4964 symtable_add_def(st, class_name, DEF_LOCAL);
4965 if (TYPE(CHILD(n, 2)) == LPAR) {
4966 node *bases = CHILD(n, 3);
4967 int i;
4968 for (i = 0; i < NCH(bases); i += 2) {
4969 symtable_node(st, CHILD(bases, i));
4970 }
4971 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004972 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 tmp = st->st_private;
4974 st->st_private = class_name;
4975 symtable_node(st, CHILD(n, NCH(n) - 1));
4976 st->st_private = tmp;
4977 symtable_exit_scope(st);
4978 break;
4979 }
4980 case if_stmt:
4981 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00004982 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
4983 if (st->st_cur->ste_generator == 0)
4984 st->st_cur->ste_generator =
4985 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00004987 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 symtable_node(st, CHILD(n, i + 1));
4989 symtable_node(st, CHILD(n, i + 3));
4990 }
4991 if (i + 2 < NCH(n))
4992 symtable_node(st, CHILD(n, i + 2));
4993 break;
4994 case global_stmt:
4995 symtable_global(st, n);
4996 break;
4997 case import_stmt:
4998 symtable_import(st, n);
4999 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005000 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005001 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005002 symtable_node(st, CHILD(n, 1));
5003 if (NCH(n) > 2)
5004 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005005 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005006 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005007 st->st_cur->ste_opt_lineno = n->n_lineno;
5008 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009 if (NCH(n) > 4)
5010 symtable_node(st, CHILD(n, 5));
5011 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005012
5013 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005014 case assert_stmt:
5015 if (Py_OptimizeFlag)
5016 return;
5017 if (NCH(n) == 2) {
5018 n = CHILD(n, 1);
5019 goto loop;
5020 } else {
5021 symtable_node(st, CHILD(n, 1));
5022 n = CHILD(n, 3);
5023 goto loop;
5024 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 case except_clause:
5026 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005027 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 if (NCH(n) > 1) {
5029 n = CHILD(n, 1);
5030 goto loop;
5031 }
5032 break;
5033 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005034 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005035 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005036 case yield_stmt:
5037 st->st_cur->ste_generator = 1;
5038 n = CHILD(n, 1);
5039 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040 case expr_stmt:
5041 if (NCH(n) == 1)
5042 n = CHILD(n, 0);
5043 else {
5044 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005045 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 symtable_node(st, CHILD(n, 2));
5047 break;
5048 } else {
5049 int i;
5050 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005051 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052 n = CHILD(n, NCH(n) - 1);
5053 }
5054 }
5055 goto loop;
5056 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005057 case argument:
5058 if (NCH(n) == 3) {
5059 n = CHILD(n, 2);
5060 goto loop;
5061 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005062 case listmaker:
5063 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005064 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005066 symtable_node(st, CHILD(n, 0));
5067 st->st_tmpname--;
5068 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005069 }
5070 case atom:
5071 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5072 symtable_add_use(st, STR(CHILD(n, 0)));
5073 break;
5074 }
5075 case for_stmt:
5076 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005077 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 start = 3;
5079 }
5080 default:
5081 if (NCH(n) == 1) {
5082 n = CHILD(n, 0);
5083 goto loop;
5084 }
5085 for (i = start; i < NCH(n); ++i)
5086 if (TYPE(CHILD(n, i)) >= single_input)
5087 symtable_node(st, CHILD(n, i));
5088 }
5089}
5090
5091static void
5092symtable_funcdef(struct symtable *st, node *n)
5093{
5094 node *body;
5095
5096 if (TYPE(n) == lambdef) {
5097 if (NCH(n) == 4)
5098 symtable_params(st, CHILD(n, 1));
5099 } else
5100 symtable_params(st, CHILD(n, 2));
5101 body = CHILD(n, NCH(n) - 1);
5102 symtable_node(st, body);
5103}
5104
5105/* The next two functions parse the argument tuple.
5106 symtable_default_arg() checks for names in the default arguments,
5107 which are references in the defining scope. symtable_params()
5108 parses the parameter names, which are defined in the function's
5109 body.
5110
5111 varargslist:
5112 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5113 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5114*/
5115
5116static void
5117symtable_default_args(struct symtable *st, node *n)
5118{
5119 node *c;
5120 int i;
5121
5122 if (TYPE(n) == parameters) {
5123 n = CHILD(n, 1);
5124 if (TYPE(n) == RPAR)
5125 return;
5126 }
5127 REQ(n, varargslist);
5128 for (i = 0; i < NCH(n); i += 2) {
5129 c = CHILD(n, i);
5130 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5131 break;
5132 }
5133 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5134 symtable_node(st, CHILD(n, i));
5135 }
5136}
5137
5138static void
5139symtable_params(struct symtable *st, node *n)
5140{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005141 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005142 node *c = NULL;
5143
5144 if (TYPE(n) == parameters) {
5145 n = CHILD(n, 1);
5146 if (TYPE(n) == RPAR)
5147 return;
5148 }
5149 REQ(n, varargslist);
5150 for (i = 0; i < NCH(n); i += 2) {
5151 c = CHILD(n, i);
5152 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5153 ext = 1;
5154 break;
5155 }
5156 if (TYPE(c) == test) {
5157 continue;
5158 }
5159 if (TYPE(CHILD(c, 0)) == NAME)
5160 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5161 else {
5162 char nbuf[10];
5163 sprintf(nbuf, ".%d", i);
5164 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005165 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 }
5167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 if (ext) {
5169 c = CHILD(n, i);
5170 if (TYPE(c) == STAR) {
5171 i++;
5172 symtable_add_def(st, STR(CHILD(n, i)),
5173 DEF_PARAM | DEF_STAR);
5174 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005175 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005176 c = NULL;
5177 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005178 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005180 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 i++;
5182 symtable_add_def(st, STR(CHILD(n, i)),
5183 DEF_PARAM | DEF_DOUBLESTAR);
5184 }
5185 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005186 if (complex >= 0) {
5187 int j;
5188 for (j = 0; j <= complex; j++) {
5189 c = CHILD(n, j);
5190 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005191 c = CHILD(n, ++j);
5192 else if (TYPE(c) == EQUAL)
5193 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005194 if (TYPE(CHILD(c, 0)) == LPAR)
5195 symtable_params_fplist(st, CHILD(c, 1));
5196 }
5197 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198}
5199
5200static void
5201symtable_params_fplist(struct symtable *st, node *n)
5202{
5203 int i;
5204 node *c;
5205
5206 REQ(n, fplist);
5207 for (i = 0; i < NCH(n); i += 2) {
5208 c = CHILD(n, i);
5209 REQ(c, fpdef);
5210 if (NCH(c) == 1)
5211 symtable_add_def(st, STR(CHILD(c, 0)),
5212 DEF_PARAM | DEF_INTUPLE);
5213 else
5214 symtable_params_fplist(st, CHILD(c, 1));
5215 }
5216
5217}
5218
5219static void
5220symtable_global(struct symtable *st, node *n)
5221{
5222 int i;
5223
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005224 /* XXX It might be helpful to warn about module-level global
5225 statements, but it's hard to tell the difference between
5226 module-level and a string passed to exec.
5227 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005228
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005229 for (i = 1; i < NCH(n); i += 2) {
5230 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005231 int flags;
5232
5233 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005234 if (flags < 0)
5235 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005236 if (flags && flags != DEF_GLOBAL) {
5237 char buf[500];
5238 if (flags & DEF_PARAM) {
5239 PyErr_Format(PyExc_SyntaxError,
5240 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005241 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005242 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005243 st->st_cur->ste_lineno);
5244 st->st_errors++;
5245 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005246 }
5247 else {
5248 if (flags & DEF_LOCAL)
5249 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5250 name);
5251 else
5252 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005253 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005254 }
5255 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005256 symtable_add_def(st, name, DEF_GLOBAL);
5257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258}
5259
5260static void
5261symtable_list_comprehension(struct symtable *st, node *n)
5262{
5263 char tmpname[12];
5264
Jeremy Hylton23b42272001-03-19 20:38:06 +00005265 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005266 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005267 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 symtable_node(st, CHILD(n, 3));
5269 if (NCH(n) == 5)
5270 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271}
5272
5273static void
5274symtable_import(struct symtable *st, node *n)
5275{
5276 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005277 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 | 'from' dotted_name 'import'
5279 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005280 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005282 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005283 node *dotname = CHILD(n, 1);
5284 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5285 /* check for bogus imports */
5286 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5287 PyErr_SetString(PyExc_SyntaxError,
5288 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005289 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005290 n->n_lineno);
5291 st->st_errors++;
5292 return;
5293 }
5294 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005295 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005296 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005297 if (symtable_warn(st,
5298 "import * only allowed at module level") < 0)
5299 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005300 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005301 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005302 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303 } else {
5304 for (i = 3; i < NCH(n); i += 2) {
5305 node *c = CHILD(n, i);
5306 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005307 symtable_assign(st, CHILD(c, 2),
5308 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005310 symtable_assign(st, CHILD(c, 0),
5311 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 }
5313 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005314 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005315 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005316 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005317 }
5318 }
5319}
5320
5321static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005322symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323{
5324 node *tmp;
5325 int i;
5326
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005327 loop:
5328 switch (TYPE(n)) {
5329 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005330 /* invalid assignment, e.g. lambda x:x=2. The next
5331 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005332 return;
5333 case power:
5334 if (NCH(n) > 2) {
5335 for (i = 2; i < NCH(n); ++i)
5336 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5337 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005338 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005339 if (NCH(n) > 1) {
5340 symtable_node(st, CHILD(n, 0));
5341 symtable_node(st, CHILD(n, 1));
5342 } else {
5343 n = CHILD(n, 0);
5344 goto loop;
5345 }
5346 return;
5347 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005348 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5349 /* XXX This is an error, but the next pass
5350 will catch it. */
5351 return;
5352 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005353 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005354 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005355 }
5356 return;
5357 case exprlist:
5358 case testlist:
5359 if (NCH(n) == 1) {
5360 n = CHILD(n, 0);
5361 goto loop;
5362 }
5363 else {
5364 int i;
5365 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005366 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005367 return;
5368 }
5369 goto loop;
5370 case atom:
5371 tmp = CHILD(n, 0);
5372 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5373 n = CHILD(n, 1);
5374 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005375 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005376 if (strcmp(STR(tmp), "__debug__") == 0)
5377 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005378 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005379 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380 return;
5381 case dotted_as_name:
5382 if (NCH(n) == 3)
5383 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005384 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005385 else
5386 symtable_add_def(st,
5387 STR(CHILD(CHILD(n,
5388 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005389 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005390 return;
5391 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005392 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393 return;
5394 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005395 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005396 return;
5397 default:
5398 if (NCH(n) == 0)
5399 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005400 if (NCH(n) == 1) {
5401 n = CHILD(n, 0);
5402 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005404 /* Should only occur for errors like x + 1 = 1,
5405 which will be caught in the next pass. */
5406 for (i = 0; i < NCH(n); ++i)
5407 if (TYPE(CHILD(n, i)) >= single_input)
5408 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 }
5410}