blob: 51209166cdebb027032a43f0d37c27267668c440 [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
Guido van Rossum6f799372001-09-20 20:46:19 +000076static PyMemberDef 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 Rossum10dc2e81990-11-18 17:27:39 +000094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000095code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +000096{
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 Py_XDECREF(co->co_code);
98 Py_XDECREF(co->co_consts);
99 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000100 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000101 Py_XDECREF(co->co_freevars);
102 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103 Py_XDECREF(co->co_filename);
104 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000105 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000106 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000107}
108
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000111{
112 char buf[500];
113 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000114 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000115 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000116
Guido van Rossuma396a882000-04-07 01:21:36 +0000117 if (co->co_firstlineno != 0)
118 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000119 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000120 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000122 name = PyString_AS_STRING(co->co_name);
Fred Drake615ae552000-06-30 16:20:13 +0000123 sprintf(buf, "<code object %.100s at %p, file \"%.300s\", line %d>",
124 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000126}
127
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000128static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000129code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000130{
131 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000132 cmp = PyObject_Compare(co->co_name, cp->co_name);
133 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000134 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000135 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000136 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000137 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000138 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000139 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000140 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000141 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000143 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000144 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000145 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000147 if (cmp) return cmp;
148 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
149 if (cmp) return cmp;
150 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000151 return cmp;
152}
153
154static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000156{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000157 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000158 h0 = PyObject_Hash(co->co_name);
159 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000160 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000161 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000163 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000164 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000165 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000167 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000168 h5 = PyObject_Hash(co->co_freevars);
169 if (h5 == -1) return -1;
170 h6 = PyObject_Hash(co->co_cellvars);
171 if (h6 == -1) return -1;
172 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000173 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000174 if (h == -1) h = -2;
175 return h;
176}
177
Jeremy Hylton78891072001-03-01 06:09:34 +0000178/* XXX code objects need to participate in GC? */
179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180PyTypeObject PyCode_Type = {
181 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000182 0,
183 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000185 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000186 (destructor)code_dealloc, /* tp_dealloc */
187 0, /* tp_print */
188 0, /* tp_getattr */
189 0, /* tp_setattr */
190 (cmpfunc)code_compare, /* tp_compare */
191 (reprfunc)code_repr, /* tp_repr */
192 0, /* tp_as_number */
193 0, /* tp_as_sequence */
194 0, /* tp_as_mapping */
195 (hashfunc)code_hash, /* tp_hash */
196 0, /* tp_call */
197 0, /* tp_str */
198 PyObject_GenericGetAttr, /* tp_getattro */
199 0, /* tp_setattro */
200 0, /* tp_as_buffer */
201 Py_TPFLAGS_DEFAULT, /* tp_flags */
202 0, /* tp_doc */
203 0, /* tp_traverse */
204 0, /* tp_clear */
205 0, /* tp_richcompare */
206 0, /* tp_weaklistoffset */
207 0, /* tp_iter */
208 0, /* tp_iternext */
209 0, /* tp_methods */
210 code_memberlist, /* tp_members */
211 0, /* tp_getset */
212 0, /* tp_base */
213 0, /* tp_dict */
214 0, /* tp_descr_get */
215 0, /* tp_descr_set */
216 0, /* tp_dictoffset */
217 0, /* tp_init */
218 0, /* tp_alloc */
219 0, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000220};
221
Guido van Rossum644a12b1997-04-09 19:24:53 +0000222#define NAME_CHARS \
223 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
224
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000225/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
226
227static int
228all_name_chars(unsigned char *s)
229{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000230 static char ok_name_char[256];
231 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000232
Guido van Rossumcd90c202001-02-09 15:06:42 +0000233 if (ok_name_char[*name_chars] == 0) {
234 unsigned char *p;
235 for (p = name_chars; *p; p++)
236 ok_name_char[*p] = 1;
237 }
238 while (*s) {
239 if (ok_name_char[*s++] == 0)
240 return 0;
241 }
242 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000243}
244
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245static int
246intern_strings(PyObject *tuple)
247{
248 int i;
249
250 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
251 PyObject *v = PyTuple_GET_ITEM(tuple, i);
252 if (v == NULL || !PyString_Check(v)) {
253 Py_FatalError("non-string found in code slot");
254 PyErr_BadInternalCall();
255 return -1;
256 }
257 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
258 }
259 return 0;
260}
261
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000263PyCode_New(int argcount, int nlocals, int stacksize, int flags,
264 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000265 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
266 PyObject *filename, PyObject *name, int firstlineno,
267 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000268{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000270 int i;
Guido van Rossumd076c731998-10-07 19:42:25 +0000271 PyBufferProcs *pb;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000272 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000274 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 consts == NULL || !PyTuple_Check(consts) ||
276 names == NULL || !PyTuple_Check(names) ||
277 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000278 freevars == NULL || !PyTuple_Check(freevars) ||
279 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280 name == NULL || !PyString_Check(name) ||
281 filename == NULL || !PyString_Check(filename) ||
282 lnotab == NULL || !PyString_Check(lnotab)) {
283 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284 return NULL;
285 }
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 pb = code->ob_type->tp_as_buffer;
287 if (pb == NULL ||
288 pb->bf_getreadbuffer == NULL ||
289 pb->bf_getsegcount == NULL ||
290 (*pb->bf_getsegcount)(code, NULL) != 1)
291 {
292 PyErr_BadInternalCall();
293 return NULL;
294 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000295 intern_strings(names);
296 intern_strings(varnames);
297 if (freevars == NULL)
298 freevars = PyTuple_New(0);
299 intern_strings(freevars);
300 if (cellvars == NULL)
301 cellvars = PyTuple_New(0);
302 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000303 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 for (i = PyTuple_Size(consts); --i >= 0; ) {
305 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000307 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000308 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000309 continue;
310 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000314 co->co_argcount = argcount;
315 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000316 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000317 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000319 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000321 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000323 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000325 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000326 Py_INCREF(freevars);
327 co->co_freevars = freevars;
328 Py_INCREF(cellvars);
329 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000331 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000333 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000334 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000336 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000337 }
338 return co;
339}
340
341
342/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000343
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000344/* The compiler uses two passes to generate bytecodes. The first pass
345 builds the symbol table. The second pass generates the bytecode.
346
347 The first pass uses a single symtable struct. The second pass uses
348 a compiling struct for each code block. The compiling structs
349 share a reference to the symtable.
350
351 The two passes communicate via symtable_load_symbols() and via
352 is_local() and is_global(). The former initializes several slots
353 in the compiling struct: c_varnames, c_locals, c_nlocals,
354 c_argcount, c_globals, and c_flags.
355*/
356
Tim Peters2a7f3842001-06-09 09:26:21 +0000357/* All about c_lnotab.
358
359c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
360mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
361to source code line #s (when needed for tracebacks) via c_lnotab instead.
362The array is conceptually a list of
363 (bytecode offset increment, line number increment)
364pairs. The details are important and delicate, best illustrated by example:
365
366 byte code offset source code line number
367 0 1
368 6 2
369 50 7
370 350 307
371 361 308
372
373The first trick is that these numbers aren't stored, only the increments
374from one row to the next (this doesn't really work, but it's a start):
375
376 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
377
378The second trick is that an unsigned byte can't hold negative values, or
379values larger than 255, so (a) there's a deep assumption that byte code
380offsets and their corresponding line #s both increase monotonically, and (b)
381if at least one column jumps by more than 255 from one row to the next, more
382than one pair is written to the table. In case #b, there's no way to know
383from looking at the table later how many were written. That's the delicate
384part. A user of c_lnotab desiring to find the source line number
385corresponding to a bytecode address A should do something like this
386
387 lineno = addr = 0
388 for addr_incr, line_incr in c_lnotab:
389 addr += addr_incr
390 if addr > A:
391 return lineno
392 lineno += line_incr
393
394In order for this to work, when the addr field increments by more than 255,
395the line # increment in each pair generated must be 0 until the remaining addr
396increment is < 256. So, in the example above, com_set_lineno should not (as
397was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
398255, 0, 45, 255, 0, 45.
399*/
400
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000401struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000402 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000404 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000405 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000406 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 PyObject *c_globals; /* dictionary (value=None) */
408 PyObject *c_locals; /* dictionary (value=localID) */
409 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000410 PyObject *c_freevars; /* dictionary (value=None) */
411 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000412 int c_nlocals; /* index of next local */
413 int c_argcount; /* number of top-level arguments */
414 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000415 int c_nexti; /* index into c_code */
416 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000417 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000418 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000419 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000420 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000421 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000422 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000423 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000424 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000425 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000426 int c_stacklevel; /* Current stack level */
427 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000428 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000430 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000431 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000432 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000433 int c_nested; /* Is block nested funcdef or lamdef? */
434 int c_closure; /* Is nested w/freevars? */
435 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000436 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000437};
438
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000439static int
440is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000441{
442 if ((v & (USE | DEF_FREE))
443 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
444 return 1;
445 if (v & DEF_FREE_CLASS)
446 return 1;
447 return 0;
448}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000449
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000451com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000452{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000453 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
454
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000455 if (c == NULL) {
456 /* Error occurred via symtable call to
457 is_constant_false */
458 PyErr_SetString(exc, msg);
459 return;
460 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000461 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000462 if (c->c_lineno < 1 || c->c_interactive) {
463 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000465 return;
466 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000467 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000468 if (v == NULL)
469 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000470
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000471 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000472 if (line == NULL) {
473 Py_INCREF(Py_None);
474 line = Py_None;
475 }
476 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
477 Py_None, line);
478 if (t == NULL)
479 goto exit;
480 w = Py_BuildValue("(OO)", v, t);
481 if (w == NULL)
482 goto exit;
483 PyErr_SetObject(exc, w);
484 exit:
485 Py_XDECREF(t);
486 Py_XDECREF(v);
487 Py_XDECREF(w);
488 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000489}
490
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000491/* Interface to the block stack */
492
493static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000494block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000495{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000496 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 com_error(c, PyExc_SystemError,
498 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000499 }
500 else {
501 c->c_block[c->c_nblocks++] = type;
502 }
503}
504
505static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000506block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000507{
508 if (c->c_nblocks > 0)
509 c->c_nblocks--;
510 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000512 }
513}
514
Guido van Rossum681d79a1995-07-18 14:51:37 +0000515/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000516
Tim Petersdbd9ba62000-07-09 03:09:57 +0000517static int com_init(struct compiling *, char *);
518static void com_free(struct compiling *);
519static void com_push(struct compiling *, int);
520static void com_pop(struct compiling *, int);
521static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000522static void com_node(struct compiling *, node *);
523static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000524static void com_addbyte(struct compiling *, int);
525static void com_addint(struct compiling *, int);
526static void com_addoparg(struct compiling *, int, int);
527static void com_addfwref(struct compiling *, int, int *);
528static void com_backpatch(struct compiling *, int);
529static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
530static int com_addconst(struct compiling *, PyObject *);
531static int com_addname(struct compiling *, PyObject *);
532static void com_addopname(struct compiling *, int, node *);
533static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000534static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000535static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000536static void com_assign(struct compiling *, node *, int, node *);
537static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000538static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000539static PyCodeObject *jcompile(node *, char *, struct compiling *,
540 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000541static PyObject *parsestrplus(struct compiling*, node *);
542static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000543static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000544
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546
547/* symtable operations */
548static int symtable_build(struct compiling *, node *);
549static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000550static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000551static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000553static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000554static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000555
556static void symtable_node(struct symtable *, node *);
557static void symtable_funcdef(struct symtable *, node *);
558static void symtable_default_args(struct symtable *, node *);
559static void symtable_params(struct symtable *, node *);
560static void symtable_params_fplist(struct symtable *, node *n);
561static void symtable_global(struct symtable *, node *);
562static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000563static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000564static void symtable_list_comprehension(struct symtable *, node *);
565
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000566static int symtable_update_free_vars(struct symtable *);
567static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
568static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
569
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000570/* helper */
571static void
572do_pad(int pad)
573{
574 int i;
575 for (i = 0; i < pad; ++i)
576 fprintf(stderr, " ");
577}
578
579static void
580dump(node *n, int pad, int depth)
581{
582 int i;
583 if (depth == 0)
584 return;
585 do_pad(pad);
586 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
587 if (depth > 0)
588 depth--;
589 for (i = 0; i < NCH(n); ++i)
590 dump(CHILD(n, i), pad + 1, depth);
591}
592
593#define DUMP(N) dump(N, 0, -1)
594
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000595static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000596com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000597{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000598 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
600 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000601 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000603 goto fail;
604 if ((c->c_const_dict = PyDict_New()) == NULL)
605 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000607 goto fail;
608 if ((c->c_name_dict = PyDict_New()) == NULL)
609 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000611 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
613 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000614 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000615 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000616 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000617 c->c_freevars = NULL;
618 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000619 c->c_nlocals = 0;
620 c->c_argcount = 0;
621 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000622 c->c_nexti = 0;
623 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000624 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000625 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000626 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000627 c->c_begin = 0;
628 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000629 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000631 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000632 c->c_stacklevel = 0;
633 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000634 c->c_firstlineno = 0;
635 c->c_last_addr = 0;
636 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000637 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000638 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000639 c->c_nested = 0;
640 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000641 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642 return 1;
643
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000644 fail:
645 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646 return 0;
647}
648
649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000650com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000651{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 Py_XDECREF(c->c_code);
653 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000654 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000656 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 Py_XDECREF(c->c_globals);
658 Py_XDECREF(c->c_locals);
659 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000660 Py_XDECREF(c->c_freevars);
661 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000663 if (c->c_future)
664 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000665}
666
667static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000668com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000669{
670 c->c_stacklevel += n;
671 if (c->c_stacklevel > c->c_maxstacklevel)
672 c->c_maxstacklevel = c->c_stacklevel;
673}
674
675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000676com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000677{
678 if (c->c_stacklevel < n) {
Guido van Rossum90f827c1998-08-25 18:22:17 +0000679 /* fprintf(stderr,
Guido van Rossum8b993a91997-01-17 21:04:03 +0000680 "%s:%d: underflow! nexti=%d, level=%d, n=%d\n",
681 c->c_filename, c->c_lineno,
Guido van Rossum90f827c1998-08-25 18:22:17 +0000682 c->c_nexti, c->c_stacklevel, n); */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000683 c->c_stacklevel = 0;
684 }
685 else
686 c->c_stacklevel -= n;
687}
688
689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000691{
692 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000694 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696}
697
698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000699com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700{
701 int len;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000702 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000703 assert(byte >= 0 && byte <= 255);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704 if (byte < 0 || byte > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 com_error(c, PyExc_SystemError,
706 "com_addbyte: byte out of range");
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 }
708 if (c->c_code == NULL)
709 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 len = PyString_Size(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711 if (c->c_nexti >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (_PyString_Resize(&c->c_code, len+1000) != 0) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 c->c_errors++;
714 return;
715 }
716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 PyString_AsString(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718}
719
720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000721com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000723 com_addbyte(c, x & 0xff);
724 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725}
726
727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000728com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000729{
730 int size;
731 char *p;
732 if (c->c_lnotab == NULL)
733 return;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 size = PyString_Size(c->c_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000735 if (c->c_lnotab_next+2 > size) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736 if (_PyString_Resize(&c->c_lnotab, size + 1000) < 0) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000737 c->c_errors++;
738 return;
739 }
740 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 p = PyString_AsString(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 *p++ = addr;
743 *p++ = line;
744 c->c_lnotab_next += 2;
745}
746
747static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000748com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000749{
750 c->c_lineno = lineno;
751 if (c->c_firstlineno == 0) {
752 c->c_firstlineno = c->c_last_line = lineno;
753 }
754 else {
755 int incr_addr = c->c_nexti - c->c_last_addr;
756 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000757 while (incr_addr > 255) {
758 com_add_lnotab(c, 255, 0);
759 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000761 while (incr_line > 255) {
762 com_add_lnotab(c, incr_addr, 255);
763 incr_line -=255;
764 incr_addr = 0;
765 }
766 if (incr_addr > 0 || incr_line > 0)
767 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000768 c->c_last_addr = c->c_nexti;
769 c->c_last_line = lineno;
770 }
771}
772
773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775{
Fred Drakeef8ace32000-08-24 00:32:09 +0000776 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000777 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000778 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000779 if (Py_OptimizeFlag)
780 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000781 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000782 if (extended_arg){
783 com_addbyte(c, EXTENDED_ARG);
784 com_addint(c, extended_arg);
785 arg &= 0xffff;
786 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000787 com_addbyte(c, op);
788 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789}
790
791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000792com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000793{
794 /* Compile a forward reference for backpatching */
795 int here;
796 int anchor;
797 com_addbyte(c, op);
798 here = c->c_nexti;
799 anchor = *p_anchor;
800 *p_anchor = here;
801 com_addint(c, anchor == 0 ? 0 : here - anchor);
802}
803
804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000805com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 unsigned char *code = (unsigned char *) PyString_AsString(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809 int dist;
810 int prev;
811 for (;;) {
812 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000813 prev = code[anchor] + (code[anchor+1] << 8);
814 dist = target - (anchor+2);
815 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000816 dist >>= 8;
817 code[anchor+1] = dist;
818 dist >>= 8;
819 if (dist) {
820 com_error(c, PyExc_SystemError,
821 "com_backpatch: offset too large");
822 break;
823 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 if (!prev)
825 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000826 anchor -= prev;
827 }
828}
829
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000830/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000831
832static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000833com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000834{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000835 PyObject *w, *t, *np=NULL;
836 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000837
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000838 t = Py_BuildValue("(OO)", v, v->ob_type);
839 if (t == NULL)
840 goto fail;
841 w = PyDict_GetItem(dict, t);
842 if (w != NULL) {
843 n = PyInt_AsLong(w);
844 } else {
845 n = PyList_Size(list);
846 np = PyInt_FromLong(n);
847 if (np == NULL)
848 goto fail;
849 if (PyList_Append(list, v) != 0)
850 goto fail;
851 if (PyDict_SetItem(dict, t, np) != 0)
852 goto fail;
853 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000854 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000856 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000857 fail:
858 Py_XDECREF(np);
859 Py_XDECREF(t);
860 c->c_errors++;
861 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862}
863
864static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000865com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000867 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868}
869
870static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000871com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000872{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000873 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874}
875
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000876static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000877mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000878{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000879 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000881 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000882 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
883 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000884 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000885 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000886 return 0; /* Don't mangle __extremely_long_names */
887 if (name[nlen-1] == '_' && name[nlen-2] == '_')
888 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000889 /* Strip leading underscores from class name */
890 while (*p == '_')
891 p++;
892 if (*p == '\0')
893 return 0; /* Don't mangle if class is just underscores */
894 plen = strlen(p);
895 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000896 plen = maxlen-nlen-2; /* Truncate class name if too long */
897 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000898 buffer[0] = '_';
899 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000900 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000901 return 1;
902}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000903
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000909 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000910
911 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000912 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000913 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000914 c->c_errors++;
915 i = 255;
916 }
917 else {
918 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000921 com_addoparg(c, op, i);
922}
923
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000924#define NAME_LOCAL 0
925#define NAME_GLOBAL 1
926#define NAME_DEFAULT 2
927#define NAME_CLOSURE 3
928
929static int
930com_lookup_arg(PyObject *dict, PyObject *name)
931{
932 PyObject *v = PyDict_GetItem(dict, name);
933 if (v == NULL)
934 return -1;
935 else
936 return PyInt_AS_LONG(v);
937}
938
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000939static void
940com_addop_varname(struct compiling *c, int kind, char *name)
941{
942 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000943 int i, reftype;
944 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000945 int op = STOP_CODE;
946 char buffer[MANGLE_LEN];
947
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000948 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000949 name = buffer;
950 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
951 c->c_errors++;
952 i = 255;
953 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000954 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000955
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000956 reftype = get_ref_type(c, name);
957 switch (reftype) {
958 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000959 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000960 scope = NAME_LOCAL;
961 break;
962 case GLOBAL_EXPLICIT:
963 scope = NAME_GLOBAL;
964 break;
965 case GLOBAL_IMPLICIT:
966 if (c->c_flags & CO_OPTIMIZED)
967 scope = NAME_GLOBAL;
968 break;
969 case FREE:
970 case CELL:
971 scope = NAME_CLOSURE;
972 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000973 }
974
975 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976 if (scope == NAME_LOCAL)
977 i = com_lookup_arg(c->c_locals, v);
978 else if (reftype == FREE)
979 i = com_lookup_arg(c->c_freevars, v);
980 else if (reftype == CELL)
981 i = com_lookup_arg(c->c_cellvars, v);
982 if (i == -1) {
983 c->c_errors++; /* XXX no exception set */
984 i = 255;
985 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986 }
987 Py_DECREF(v);
988
989 switch (kind) {
990 case VAR_LOAD:
991 switch (scope) {
992 case NAME_LOCAL:
993 op = LOAD_FAST;
994 break;
995 case NAME_GLOBAL:
996 op = LOAD_GLOBAL;
997 break;
998 case NAME_DEFAULT:
999 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001000 break;
1001 case NAME_CLOSURE:
1002 op = LOAD_DEREF;
1003 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001004 }
1005 break;
1006 case VAR_STORE:
1007 switch (scope) {
1008 case NAME_LOCAL:
1009 op = STORE_FAST;
1010 break;
1011 case NAME_GLOBAL:
1012 op = STORE_GLOBAL;
1013 break;
1014 case NAME_DEFAULT:
1015 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 break;
1017 case NAME_CLOSURE:
1018 op = STORE_DEREF;
1019 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001020 }
1021 break;
1022 case VAR_DELETE:
1023 switch (scope) {
1024 case NAME_LOCAL:
1025 op = DELETE_FAST;
1026 break;
1027 case NAME_GLOBAL:
1028 op = DELETE_GLOBAL;
1029 break;
1030 case NAME_DEFAULT:
1031 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001032 break;
1033 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001034 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001035 sprintf(buf, DEL_CLOSURE_ERROR, name);
1036 com_error(c, PyExc_SyntaxError, buf);
1037 i = 255;
1038 break;
1039 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001040 }
1041 break;
1042 }
1043done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 com_addoparg(c, op, i);
1045}
1046
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001048com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001049{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001050 char *name;
1051 char buffer[1000];
1052 /* XXX it is possible to write this code without the 1000
1053 chars on the total length of dotted names, I just can't be
1054 bothered right now */
1055 if (TYPE(n) == STAR)
1056 name = "*";
1057 else if (TYPE(n) == dotted_name) {
1058 char *p = buffer;
1059 int i;
1060 name = buffer;
1061 for (i = 0; i < NCH(n); i += 2) {
1062 char *s = STR(CHILD(n, i));
1063 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001065 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001066 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001067 break;
1068 }
1069 if (p != buffer)
1070 *p++ = '.';
1071 strcpy(p, s);
1072 p = strchr(p, '\0');
1073 }
1074 }
1075 else {
1076 REQ(n, NAME);
1077 name = STR(n);
1078 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001079 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001080}
1081
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001083parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001084{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001085 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001087 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001088#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001089 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001090 int imflag;
1091#endif
1092
Guido van Rossum282914b1991-04-04 10:42:56 +00001093 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001094 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001095#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001096 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001097#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001098 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001100 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001102 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001104 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001105 if (errno != 0)
1106 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001108 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001109 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001110#ifndef WITHOUT_COMPLEX
1111 if (imflag) {
1112 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001113 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001114 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001115 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001117 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001118 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001119#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001120 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001121 PyFPE_START_PROTECT("atof", return 0)
1122 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001123 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001125 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126}
1127
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001129parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001132 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 char *buf;
1134 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001135 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001137 int first = *s;
1138 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001139 int rawmode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001140#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001141 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001142#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001143 if (isalpha(quote) || quote == '_') {
1144 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001145#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001146 quote = *++s;
1147 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001148#else
1149 com_error(com, PyExc_SyntaxError,
1150 "Unicode literals not supported in this Python");
1151 return NULL;
1152#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001153 }
1154 if (quote == 'r' || quote == 'R') {
1155 quote = *++s;
1156 rawmode = 1;
1157 }
1158 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001159 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161 return NULL;
1162 }
1163 s++;
1164 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001165 if (len > INT_MAX) {
1166 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1167 return NULL;
1168 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001169 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001171 return NULL;
1172 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001173 if (len >= 4 && s[0] == quote && s[1] == quote) {
1174 s += 2;
1175 len -= 2;
1176 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001178 return NULL;
1179 }
1180 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001181#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001182 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001183 if (rawmode)
1184 return PyUnicode_DecodeRawUnicodeEscape(
1185 s, len, NULL);
1186 else
1187 return PyUnicode_DecodeUnicodeEscape(
1188 s, len, NULL);
1189 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001190#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001191 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 return PyString_FromStringAndSize(s, len);
1193 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001194 if (v == NULL)
1195 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001197 end = s + len;
1198 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001199 if (*s != '\\') {
1200 *p++ = *s++;
1201 continue;
1202 }
1203 s++;
1204 switch (*s++) {
1205 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001206 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 case '\\': *p++ = '\\'; break;
1208 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001209 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 case 'b': *p++ = '\b'; break;
1211 case 'f': *p++ = '\014'; break; /* FF */
1212 case 't': *p++ = '\t'; break;
1213 case 'n': *p++ = '\n'; break;
1214 case 'r': *p++ = '\r'; break;
1215 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1217 case '0': case '1': case '2': case '3':
1218 case '4': case '5': case '6': case '7':
1219 c = s[-1] - '0';
1220 if ('0' <= *s && *s <= '7') {
1221 c = (c<<3) + *s++ - '0';
1222 if ('0' <= *s && *s <= '7')
1223 c = (c<<3) + *s++ - '0';
1224 }
1225 *p++ = c;
1226 break;
1227 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001228 if (isxdigit(Py_CHARMASK(s[0]))
1229 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001230 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001231 c = Py_CHARMASK(*s);
1232 s++;
1233 if (isdigit(c))
1234 x = c - '0';
1235 else if (islower(c))
1236 x = 10 + c - 'a';
1237 else
1238 x = 10 + c - 'A';
1239 x = x << 4;
1240 c = Py_CHARMASK(*s);
1241 s++;
1242 if (isdigit(c))
1243 x += c - '0';
1244 else if (islower(c))
1245 x += 10 + c - 'a';
1246 else
1247 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001248 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 break;
1250 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001251 PyErr_SetString(PyExc_ValueError,
1252 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001253 Py_DECREF(v);
1254 return NULL;
1255 default:
1256 *p++ = '\\';
1257 *p++ = s[-1];
1258 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001259 }
1260 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 return v;
1263}
1264
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001266parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001269 int i;
1270 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001271 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001272 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001273 for (i = 1; i < NCH(n); i++) {
1274 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001275 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001276 if (s == NULL)
1277 goto onError;
1278 if (PyString_Check(v) && PyString_Check(s)) {
1279 PyString_ConcatAndDel(&v, s);
1280 if (v == NULL)
1281 goto onError;
1282 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001283#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001284 else {
1285 PyObject *temp;
1286 temp = PyUnicode_Concat(v, s);
1287 Py_DECREF(s);
1288 if (temp == NULL)
1289 goto onError;
1290 Py_DECREF(v);
1291 v = temp;
1292 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001293#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001294 }
1295 }
1296 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001297
1298 onError:
1299 Py_XDECREF(v);
1300 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001301}
1302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001304com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001306 int anchor = 0;
1307 int save_begin = c->c_begin;
1308
1309 /* list_iter: for v in expr [list_iter] */
1310 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001311 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312 c->c_begin = c->c_nexti;
1313 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001314 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001315 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001316 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 c->c_loops++;
1318 com_list_iter(c, n, e, t);
1319 c->c_loops--;
1320 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1321 c->c_begin = save_begin;
1322 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001323 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001324}
1325
1326static void
1327com_list_if(struct compiling *c, node *n, node *e, char *t)
1328{
1329 int anchor = 0;
1330 int a = 0;
1331 /* list_iter: 'if' test [list_iter] */
1332 com_addoparg(c, SET_LINENO, n->n_lineno);
1333 com_node(c, CHILD(n, 1));
1334 com_addfwref(c, JUMP_IF_FALSE, &a);
1335 com_addbyte(c, POP_TOP);
1336 com_pop(c, 1);
1337 com_list_iter(c, n, e, t);
1338 com_addfwref(c, JUMP_FORWARD, &anchor);
1339 com_backpatch(c, a);
1340 /* We jump here with an extra entry which we now pop */
1341 com_addbyte(c, POP_TOP);
1342 com_backpatch(c, anchor);
1343}
1344
1345static void
1346com_list_iter(struct compiling *c,
1347 node *p, /* parent of list_iter node */
1348 node *e, /* element expression node */
1349 char *t /* name of result list temp local */)
1350{
1351 /* list_iter is the last child in a listmaker, list_for, or list_if */
1352 node *n = CHILD(p, NCH(p)-1);
1353 if (TYPE(n) == list_iter) {
1354 n = CHILD(n, 0);
1355 switch (TYPE(n)) {
1356 case list_for:
1357 com_list_for(c, n, e, t);
1358 break;
1359 case list_if:
1360 com_list_if(c, n, e, t);
1361 break;
1362 default:
1363 com_error(c, PyExc_SystemError,
1364 "invalid list_iter node type");
1365 }
1366 }
1367 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001368 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001369 com_push(c, 1);
1370 com_node(c, e);
1371 com_addoparg(c, CALL_FUNCTION, 1);
1372 com_addbyte(c, POP_TOP);
1373 com_pop(c, 2);
1374 }
1375}
1376
1377static void
1378com_list_comprehension(struct compiling *c, node *n)
1379{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001380 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001381 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001382 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001383 com_addoparg(c, BUILD_LIST, 0);
1384 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1385 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001386 com_addop_name(c, LOAD_ATTR, "append");
1387 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001388 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001389 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001390 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391 --c->c_tmpname;
1392}
1393
1394static void
1395com_listmaker(struct compiling *c, node *n)
1396{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001397 /* listmaker: test ( list_for | (',' test)* [','] ) */
1398 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001399 com_list_comprehension(c, n);
1400 else {
1401 int len = 0;
1402 int i;
1403 for (i = 0; i < NCH(n); i += 2, len++)
1404 com_node(c, CHILD(n, i));
1405 com_addoparg(c, BUILD_LIST, len);
1406 com_pop(c, len-1);
1407 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408}
1409
1410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001412{
1413 int i;
1414 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1415 for (i = 0; i+2 < NCH(n); i += 4) {
1416 /* We must arrange things just right for STORE_SUBSCR.
1417 It wants the stack to look like (value) (dict) (key) */
1418 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001419 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001420 com_node(c, CHILD(n, i+2)); /* value */
1421 com_addbyte(c, ROT_TWO);
1422 com_node(c, CHILD(n, i)); /* key */
1423 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001424 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001425 }
1426}
1427
1428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001429com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430{
1431 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 int i;
1434 REQ(n, atom);
1435 ch = CHILD(n, 0);
1436 switch (TYPE(ch)) {
1437 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001438 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001440 com_push(c, 1);
1441 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 else
1443 com_node(c, CHILD(n, 1));
1444 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001445 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001448 com_push(c, 1);
1449 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001451 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001453 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001455 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001456 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001457 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458 break;
1459 case BACKQUOTE:
1460 com_node(c, CHILD(n, 1));
1461 com_addbyte(c, UNARY_CONVERT);
1462 break;
1463 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001464 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 i = 255;
1466 }
1467 else {
1468 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 }
1471 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001472 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 break;
1474 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001475 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001476 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 c->c_errors++;
1478 i = 255;
1479 }
1480 else {
1481 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001483 }
1484 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001485 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 break;
1487 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001488 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001489 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001490 break;
1491 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 com_error(c, PyExc_SystemError,
1493 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494 }
1495}
1496
1497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001498com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499{
1500 if (NCH(n) == 1) {
1501 com_addbyte(c, op);
1502 }
1503 else if (NCH(n) == 2) {
1504 if (TYPE(CHILD(n, 0)) != COLON) {
1505 com_node(c, CHILD(n, 0));
1506 com_addbyte(c, op+1);
1507 }
1508 else {
1509 com_node(c, CHILD(n, 1));
1510 com_addbyte(c, op+2);
1511 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001512 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513 }
1514 else {
1515 com_node(c, CHILD(n, 0));
1516 com_node(c, CHILD(n, 2));
1517 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001518 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519 }
1520}
1521
Guido van Rossum635abd21997-01-06 22:56:52 +00001522static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001523com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1524{
1525 if (NCH(n) == 1) {
1526 com_addbyte(c, DUP_TOP);
1527 com_push(c, 1);
1528 com_addbyte(c, SLICE);
1529 com_node(c, augn);
1530 com_addbyte(c, opcode);
1531 com_pop(c, 1);
1532 com_addbyte(c, ROT_TWO);
1533 com_addbyte(c, STORE_SLICE);
1534 com_pop(c, 2);
1535 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1536 com_node(c, CHILD(n, 0));
1537 com_addoparg(c, DUP_TOPX, 2);
1538 com_push(c, 2);
1539 com_addbyte(c, SLICE+1);
1540 com_pop(c, 1);
1541 com_node(c, augn);
1542 com_addbyte(c, opcode);
1543 com_pop(c, 1);
1544 com_addbyte(c, ROT_THREE);
1545 com_addbyte(c, STORE_SLICE+1);
1546 com_pop(c, 3);
1547 } else if (NCH(n) == 2) {
1548 com_node(c, CHILD(n, 1));
1549 com_addoparg(c, DUP_TOPX, 2);
1550 com_push(c, 2);
1551 com_addbyte(c, SLICE+2);
1552 com_pop(c, 1);
1553 com_node(c, augn);
1554 com_addbyte(c, opcode);
1555 com_pop(c, 1);
1556 com_addbyte(c, ROT_THREE);
1557 com_addbyte(c, STORE_SLICE+2);
1558 com_pop(c, 3);
1559 } else {
1560 com_node(c, CHILD(n, 0));
1561 com_node(c, CHILD(n, 2));
1562 com_addoparg(c, DUP_TOPX, 3);
1563 com_push(c, 3);
1564 com_addbyte(c, SLICE+3);
1565 com_pop(c, 2);
1566 com_node(c, augn);
1567 com_addbyte(c, opcode);
1568 com_pop(c, 1);
1569 com_addbyte(c, ROT_FOUR);
1570 com_addbyte(c, STORE_SLICE+3);
1571 com_pop(c, 4);
1572 }
1573}
1574
1575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001576com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577{
1578 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001579 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001580 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001581 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001582 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001583 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001584 }
1585 else {
1586 com_node(c, CHILD(n, 0));
1587 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001588 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001589 }
1590 m = n;
1591 do {
1592 m = CHILD(m, 0);
1593 } while (NCH(m) == 1);
1594 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001595 /* f(lambda x: x[0] = 3) ends up getting parsed with
1596 * LHS test = lambda x: x[0], and RHS test = 3.
1597 * SF bug 132313 points out that complaining about a keyword
1598 * then is very confusing.
1599 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001601 TYPE(m) == lambdef ?
1602 "lambda cannot contain assignment" :
1603 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001604 }
1605 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001607 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001609 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001610 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001611 else if (*pkeywords == NULL) {
1612 c->c_errors++;
1613 Py_DECREF(v);
1614 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 if (PyDict_GetItem(*pkeywords, v) != NULL)
1616 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001617 "duplicate keyword argument");
1618 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001620 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001621 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001622 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001623 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001624 }
1625 }
1626 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001627}
1628
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001630com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631{
1632 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001633 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 }
1635 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001637 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001638 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001639 int star_flag = 0;
1640 int starstar_flag = 0;
1641 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001642 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001643 na = 0;
1644 nk = 0;
1645 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001646 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001647 if (TYPE(ch) == STAR ||
1648 TYPE(ch) == DOUBLESTAR)
1649 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001650 if (ch->n_lineno != lineno) {
1651 lineno = ch->n_lineno;
1652 com_addoparg(c, SET_LINENO, lineno);
1653 }
1654 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001655 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001656 na++;
1657 else
1658 nk++;
1659 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001661 while (i < NCH(n)) {
1662 node *tok = CHILD(n, i);
1663 node *ch = CHILD(n, i+1);
1664 i += 3;
1665 switch (TYPE(tok)) {
1666 case STAR: star_flag = 1; break;
1667 case DOUBLESTAR: starstar_flag = 1; break;
1668 }
1669 com_node(c, ch);
1670 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001671 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 com_error(c, PyExc_SyntaxError,
1673 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001674 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001675 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001676 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001677 star_flag + (starstar_flag << 1);
1678 else
1679 opcode = CALL_FUNCTION;
1680 com_addoparg(c, opcode, na | (nk << 8));
1681 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001682 }
1683}
1684
1685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001686com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001687{
1688 com_addopname(c, LOAD_ATTR, n);
1689}
1690
1691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001692com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001693{
1694 int i=0;
1695 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001696 node *ch;
1697
1698 /* first argument */
1699 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001701 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001702 i++;
1703 }
1704 else {
1705 com_node(c, CHILD(n,i));
1706 i++;
1707 REQ(CHILD(n,i),COLON);
1708 i++;
1709 }
1710 /* second argument */
1711 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1712 com_node(c, CHILD(n,i));
1713 i++;
1714 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 com_push(c, 1);
1718 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001719 /* remaining arguments */
1720 for (; i < NCH(n); i++) {
1721 ns++;
1722 ch=CHILD(n,i);
1723 REQ(ch, sliceop);
1724 if (NCH(ch) == 1) {
1725 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001727 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001728 }
1729 else
1730 com_node(c, CHILD(ch,1));
1731 }
1732 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001734}
1735
1736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001737com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001738{
1739 node *ch;
1740 REQ(n, subscript);
1741 ch = CHILD(n,0);
1742 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001743 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001744 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001745 com_push(c, 1);
1746 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001747 else {
1748 /* check for slice */
1749 if ((TYPE(ch) == COLON || NCH(n) > 1))
1750 com_sliceobj(c, n);
1751 else {
1752 REQ(ch, test);
1753 com_node(c, ch);
1754 }
1755 }
1756}
1757
1758static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001759com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001760{
1761 int i, op;
1762 REQ(n, subscriptlist);
1763 /* Check to make backward compatible slice behavior for '[i:j]' */
1764 if (NCH(n) == 1) {
1765 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001766 /* 'Basic' slice, should have exactly one colon. */
1767 if ((TYPE(CHILD(sub, 0)) == COLON
1768 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1769 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1770 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001771 switch (assigning) {
1772 case OP_DELETE:
1773 op = DELETE_SLICE;
1774 break;
1775 case OP_ASSIGN:
1776 op = STORE_SLICE;
1777 break;
1778 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001779 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001780 break;
1781 default:
1782 com_augassign_slice(c, sub, assigning, augn);
1783 return;
1784 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001785 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001786 if (op == STORE_SLICE)
1787 com_pop(c, 2);
1788 else if (op == DELETE_SLICE)
1789 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001790 return;
1791 }
1792 }
1793 /* Else normal subscriptlist. Compile each subscript. */
1794 for (i = 0; i < NCH(n); i += 2)
1795 com_subscript(c, CHILD(n, i));
1796 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001797 if (NCH(n) > 1) {
1798 i = (NCH(n)+1) / 2;
1799 com_addoparg(c, BUILD_TUPLE, i);
1800 com_pop(c, i-1);
1801 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001802 switch (assigning) {
1803 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001804 op = DELETE_SUBSCR;
1805 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001806 break;
1807 default:
1808 case OP_ASSIGN:
1809 op = STORE_SUBSCR;
1810 i = 3;
1811 break;
1812 case OP_APPLY:
1813 op = BINARY_SUBSCR;
1814 i = 1;
1815 break;
1816 }
1817 if (assigning > OP_APPLY) {
1818 com_addoparg(c, DUP_TOPX, 2);
1819 com_push(c, 2);
1820 com_addbyte(c, BINARY_SUBSCR);
1821 com_pop(c, 1);
1822 com_node(c, augn);
1823 com_addbyte(c, assigning);
1824 com_pop(c, 1);
1825 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001827 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001829}
1830
1831static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001832com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833{
1834 REQ(n, trailer);
1835 switch (TYPE(CHILD(n, 0))) {
1836 case LPAR:
1837 com_call_function(c, CHILD(n, 1));
1838 break;
1839 case DOT:
1840 com_select_member(c, CHILD(n, 1));
1841 break;
1842 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001843 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001844 break;
1845 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001847 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 }
1849}
1850
1851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001852com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001853{
1854 int i;
1855 REQ(n, power);
1856 com_atom(c, CHILD(n, 0));
1857 for (i = 1; i < NCH(n); i++) {
1858 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1859 com_factor(c, CHILD(n, i+1));
1860 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001862 break;
1863 }
1864 else
1865 com_apply_trailer(c, CHILD(n, i));
1866 }
1867}
1868
1869static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001870com_invert_constant(struct compiling *c, node *n)
1871{
1872 /* Compute the inverse of int and longs and use them directly,
1873 but be prepared to generate code for all other
1874 possibilities (invalid numbers, floats, complex).
1875 */
1876 PyObject *num, *inv = NULL;
1877 int i;
1878
1879 REQ(n, NUMBER);
1880 num = parsenumber(c, STR(n));
1881 if (num == NULL)
1882 i = 255;
1883 else {
1884 inv = PyNumber_Invert(num);
1885 if (inv == NULL) {
1886 PyErr_Clear();
1887 i = com_addconst(c, num);
1888 } else {
1889 i = com_addconst(c, inv);
1890 Py_DECREF(inv);
1891 }
1892 Py_DECREF(num);
1893 }
1894 com_addoparg(c, LOAD_CONST, i);
1895 com_push(c, 1);
1896 if (num != NULL && inv == NULL)
1897 com_addbyte(c, UNARY_INVERT);
1898}
1899
Tim Peters51e26512001-09-07 08:45:55 +00001900static int
1901is_float_zero(const char *p)
1902{
1903 int found_radix_point = 0;
1904 int ch;
1905 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1906 switch (ch) {
1907 case '0':
1908 /* no reason to believe it's not 0 -- continue */
1909 break;
1910
1911 case 'e': case 'E': case 'j': case 'J':
1912 /* If this was a hex constant, we already would have
1913 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1914 must be an exponent marker, and we haven't yet
1915 seen a non-zero digit, and it doesn't matter what
1916 the exponent is then. For 'j' or 'J' similarly,
1917 except that this is an imaginary 0 then. */
1918 return 1;
1919
1920 case '.':
1921 found_radix_point = 1;
1922 break;
1923
1924 default:
1925 return 0;
1926 }
1927 }
1928 return found_radix_point;
1929}
1930
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001931static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001932com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001934 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001935 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001937 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001938 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001939 approriate value as a constant. If the value is negative,
1940 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001941 negative in the 0th position -- unless we're doing unary minus
1942 of a floating zero! In that case the sign is significant, but
1943 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001944 */
1945 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001946 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001947 && TYPE((pfactor = CHILD(n, 1))) == factor
1948 && NCH(pfactor) == 1
1949 && TYPE((ppower = CHILD(pfactor, 0))) == power
1950 && NCH(ppower) == 1
1951 && TYPE((patom = CHILD(ppower, 0))) == atom
1952 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1953 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001954 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001955 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001956 return;
1957 }
1958 if (childtype == MINUS) {
Tim Peters51e26512001-09-07 08:45:55 +00001959 char *s = malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001960 if (s == NULL) {
1961 com_error(c, PyExc_MemoryError, "");
1962 com_addbyte(c, 255);
1963 return;
1964 }
1965 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001966 strcpy(s + 1, STR(pnum));
1967 free(STR(pnum));
1968 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001969 }
Tim Peters51e26512001-09-07 08:45:55 +00001970 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001971 }
1972 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001973 com_factor(c, CHILD(n, 1));
1974 com_addbyte(c, UNARY_POSITIVE);
1975 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001976 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001977 com_factor(c, CHILD(n, 1));
1978 com_addbyte(c, UNARY_NEGATIVE);
1979 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001980 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001981 com_factor(c, CHILD(n, 1));
1982 com_addbyte(c, UNARY_INVERT);
1983 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001985 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 }
1987}
1988
1989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001990com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991{
1992 int i;
1993 int op;
1994 REQ(n, term);
1995 com_factor(c, CHILD(n, 0));
1996 for (i = 2; i < NCH(n); i += 2) {
1997 com_factor(c, CHILD(n, i));
1998 switch (TYPE(CHILD(n, i-1))) {
1999 case STAR:
2000 op = BINARY_MULTIPLY;
2001 break;
2002 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002003 if (c->c_flags & CO_FUTURE_DIVISION)
2004 op = BINARY_TRUE_DIVIDE;
2005 else
2006 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 break;
2008 case PERCENT:
2009 op = BINARY_MODULO;
2010 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002011 case DOUBLESLASH:
2012 op = BINARY_FLOOR_DIVIDE;
2013 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002015 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002016 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002017 op = 255;
2018 }
2019 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002020 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002021 }
2022}
2023
2024static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002025com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002026{
2027 int i;
2028 int op;
2029 REQ(n, arith_expr);
2030 com_term(c, CHILD(n, 0));
2031 for (i = 2; i < NCH(n); i += 2) {
2032 com_term(c, CHILD(n, i));
2033 switch (TYPE(CHILD(n, i-1))) {
2034 case PLUS:
2035 op = BINARY_ADD;
2036 break;
2037 case MINUS:
2038 op = BINARY_SUBTRACT;
2039 break;
2040 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002042 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002043 op = 255;
2044 }
2045 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002047 }
2048}
2049
2050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002052{
2053 int i;
2054 int op;
2055 REQ(n, shift_expr);
2056 com_arith_expr(c, CHILD(n, 0));
2057 for (i = 2; i < NCH(n); i += 2) {
2058 com_arith_expr(c, CHILD(n, i));
2059 switch (TYPE(CHILD(n, i-1))) {
2060 case LEFTSHIFT:
2061 op = BINARY_LSHIFT;
2062 break;
2063 case RIGHTSHIFT:
2064 op = BINARY_RSHIFT;
2065 break;
2066 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002067 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002068 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002069 op = 255;
2070 }
2071 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002073 }
2074}
2075
2076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002077com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002078{
2079 int i;
2080 int op;
2081 REQ(n, and_expr);
2082 com_shift_expr(c, CHILD(n, 0));
2083 for (i = 2; i < NCH(n); i += 2) {
2084 com_shift_expr(c, CHILD(n, i));
2085 if (TYPE(CHILD(n, i-1)) == AMPER) {
2086 op = BINARY_AND;
2087 }
2088 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002089 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002090 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002091 op = 255;
2092 }
2093 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002094 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002095 }
2096}
2097
2098static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002099com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002100{
2101 int i;
2102 int op;
2103 REQ(n, xor_expr);
2104 com_and_expr(c, CHILD(n, 0));
2105 for (i = 2; i < NCH(n); i += 2) {
2106 com_and_expr(c, CHILD(n, i));
2107 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2108 op = BINARY_XOR;
2109 }
2110 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002111 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002112 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 op = 255;
2114 }
2115 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118}
2119
2120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002121com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122{
2123 int i;
2124 int op;
2125 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002126 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002128 com_xor_expr(c, CHILD(n, i));
2129 if (TYPE(CHILD(n, i-1)) == VBAR) {
2130 op = BINARY_OR;
2131 }
2132 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002133 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002134 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 op = 255;
2136 }
2137 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002139 }
2140}
2141
2142static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002143cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002144{
2145 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002146 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2148 if (NCH(n) == 1) {
2149 n = CHILD(n, 0);
2150 switch (TYPE(n)) {
2151 case LESS: return LT;
2152 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002153 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002155 case LESSEQUAL: return LE;
2156 case GREATEREQUAL: return GE;
2157 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2159 if (strcmp(STR(n), "is") == 0) return IS;
2160 }
2161 }
2162 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2165 return NOT_IN;
2166 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2167 return IS_NOT;
2168 }
2169 }
2170 return BAD;
2171}
2172
2173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002174com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175{
2176 int i;
2177 enum cmp_op op;
2178 int anchor;
2179 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2180 com_expr(c, CHILD(n, 0));
2181 if (NCH(n) == 1)
2182 return;
2183
2184 /****************************************************************
2185 The following code is generated for all but the last
2186 comparison in a chain:
2187
2188 label: on stack: opcode: jump to:
2189
2190 a <code to load b>
2191 a, b DUP_TOP
2192 a, b, b ROT_THREE
2193 b, a, b COMPARE_OP
2194 b, 0-or-1 JUMP_IF_FALSE L1
2195 b, 1 POP_TOP
2196 b
2197
2198 We are now ready to repeat this sequence for the next
2199 comparison in the chain.
2200
2201 For the last we generate:
2202
2203 b <code to load c>
2204 b, c COMPARE_OP
2205 0-or-1
2206
2207 If there were any jumps to L1 (i.e., there was more than one
2208 comparison), we generate:
2209
2210 0-or-1 JUMP_FORWARD L2
2211 L1: b, 0 ROT_TWO
2212 0, b POP_TOP
2213 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 ****************************************************************/
2216
2217 anchor = 0;
2218
2219 for (i = 2; i < NCH(n); i += 2) {
2220 com_expr(c, CHILD(n, i));
2221 if (i+2 < NCH(n)) {
2222 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002223 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 com_addbyte(c, ROT_THREE);
2225 }
2226 op = cmp_type(CHILD(n, i-1));
2227 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002228 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002229 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 }
2231 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 if (i+2 < NCH(n)) {
2234 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2235 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002236 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002237 }
2238 }
2239
2240 if (anchor) {
2241 int anchor2 = 0;
2242 com_addfwref(c, JUMP_FORWARD, &anchor2);
2243 com_backpatch(c, anchor);
2244 com_addbyte(c, ROT_TWO);
2245 com_addbyte(c, POP_TOP);
2246 com_backpatch(c, anchor2);
2247 }
2248}
2249
2250static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002251com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002252{
2253 REQ(n, not_test); /* 'not' not_test | comparison */
2254 if (NCH(n) == 1) {
2255 com_comparison(c, CHILD(n, 0));
2256 }
2257 else {
2258 com_not_test(c, CHILD(n, 1));
2259 com_addbyte(c, UNARY_NOT);
2260 }
2261}
2262
2263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
2266 int i;
2267 int anchor;
2268 REQ(n, and_test); /* not_test ('and' not_test)* */
2269 anchor = 0;
2270 i = 0;
2271 for (;;) {
2272 com_not_test(c, CHILD(n, i));
2273 if ((i += 2) >= NCH(n))
2274 break;
2275 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2276 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278 }
2279 if (anchor)
2280 com_backpatch(c, anchor);
2281}
2282
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002283static int
2284com_make_closure(struct compiling *c, PyCodeObject *co)
2285{
2286 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2287 if (free == 0)
2288 return 0;
2289 for (i = 0; i < free; ++i) {
2290 /* Bypass com_addop_varname because it will generate
2291 LOAD_DEREF but LOAD_CLOSURE is needed.
2292 */
2293 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2294 int arg, reftype;
2295
2296 /* Special case: If a class contains a method with a
2297 free variable that has the same name as a method,
2298 the name will be considered free *and* local in the
2299 class. It should be handled by the closure, as
2300 well as by the normal name loookup logic.
2301 */
2302 reftype = get_ref_type(c, PyString_AS_STRING(name));
2303 if (reftype == CELL)
2304 arg = com_lookup_arg(c->c_cellvars, name);
2305 else /* (reftype == FREE) */
2306 arg = com_lookup_arg(c->c_freevars, name);
2307 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002308 fprintf(stderr, "lookup %s in %s %d %d\n"
2309 "freevars of %s: %s\n",
2310 PyObject_REPR(name),
2311 c->c_name,
2312 reftype, arg,
2313 PyString_AS_STRING(co->co_name),
2314 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002315 Py_FatalError("com_make_closure()");
2316 }
2317 com_addoparg(c, LOAD_CLOSURE, arg);
2318
2319 }
2320 com_push(c, free);
2321 return 1;
2322}
2323
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002328 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002329 PyObject *co;
2330 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002331 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002332 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2333 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002334 co = (PyObject *) icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002335 if (co == NULL) {
2336 c->c_errors++;
2337 return;
2338 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002339 symtable_exit_scope(c->c_symtable);
Tim Peters1e542112001-02-23 22:23:53 +00002340 i = com_addconst(c, co);
2341 closure = com_make_closure(c, (PyCodeObject *)co);
2342 Py_DECREF(co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002343 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002344 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002345 if (closure)
2346 com_addoparg(c, MAKE_CLOSURE, ndefs);
2347 else
2348 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002351 else {
2352 int anchor = 0;
2353 int i = 0;
2354 for (;;) {
2355 com_and_test(c, CHILD(n, i));
2356 if ((i += 2) >= NCH(n))
2357 break;
2358 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2359 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002361 }
2362 if (anchor)
2363 com_backpatch(c, anchor);
2364 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365}
2366
2367static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002368com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369{
2370 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002371 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 com_node(c, CHILD(n, 0));
2373 }
2374 else {
2375 int i;
2376 int len;
2377 len = (NCH(n) + 1) / 2;
2378 for (i = 0; i < NCH(n); i += 2)
2379 com_node(c, CHILD(n, i));
2380 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 }
2383}
2384
2385
2386/* Begin of assignment compilation */
2387
Thomas Wouters434d0822000-08-24 20:11:32 +00002388
2389static void
2390com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2391{
2392 com_addbyte(c, DUP_TOP);
2393 com_push(c, 1);
2394 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002395 com_node(c, augn);
2396 com_addbyte(c, opcode);
2397 com_pop(c, 1);
2398 com_addbyte(c, ROT_TWO);
2399 com_addopname(c, STORE_ATTR, n);
2400 com_pop(c, 2);
2401}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402
2403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002404com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405{
2406 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408}
2409
2410static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002411com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 REQ(n, trailer);
2414 switch (TYPE(CHILD(n, 0))) {
2415 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 com_error(c, PyExc_SyntaxError,
2417 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 break;
2419 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002420 if (assigning > OP_APPLY)
2421 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2422 else
2423 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002425 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002426 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 break;
2428 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002429 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 }
2431}
2432
2433static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002434com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435{
2436 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002437 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002439 if (assigning) {
2440 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002441 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 com_push(c, i-1);
2443 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002444 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002445 com_assign(c, CHILD(n, i), assigning, NULL);
2446}
2447
2448static void
2449com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2450{
2451 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002452 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002453 com_push(c, 1);
2454 com_node(c, augn);
2455 com_addbyte(c, opcode);
2456 com_pop(c, 1);
2457 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458}
2459
2460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002461com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002462{
2463 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002464 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002465 if (assigning)
2466 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467}
2468
2469static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002470com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471{
2472 /* Loop to avoid trivial recursion */
2473 for (;;) {
2474 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002475
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476 case exprlist:
2477 case testlist:
2478 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002479 if (assigning > OP_APPLY) {
2480 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002481 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002482 return;
2483 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002484 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 return;
2486 }
2487 n = CHILD(n, 0);
2488 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002489
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 case test:
2491 case and_test:
2492 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002495 case xor_expr:
2496 case and_expr:
2497 case shift_expr:
2498 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002500 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 if (NCH(n) > 1) {
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 operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 return;
2505 }
2506 n = CHILD(n, 0);
2507 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002508
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002509 case power: /* atom trailer* ('**' power)*
2510 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002511 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002512 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002513 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 return;
2515 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002516 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 int i;
2518 com_node(c, CHILD(n, 0));
2519 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002520 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002521 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002522 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002523 return;
2524 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 com_apply_trailer(c, CHILD(n, i));
2526 } /* NB i is still alive */
2527 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002528 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 return;
2530 }
2531 n = CHILD(n, 0);
2532 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002533
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 case atom:
2535 switch (TYPE(CHILD(n, 0))) {
2536 case LPAR:
2537 n = CHILD(n, 1);
2538 if (TYPE(n) == RPAR) {
2539 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002540 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002541 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 return;
2543 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002544 if (assigning > OP_APPLY) {
2545 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002547 return;
2548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 break;
2550 case LSQB:
2551 n = CHILD(n, 1);
2552 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002553 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002554 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 return;
2556 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002557 if (assigning > OP_APPLY) {
2558 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002559 "augmented assign to list not possible");
2560 return;
2561 }
2562 if (NCH(n) > 1
2563 && TYPE(CHILD(n, 1)) == list_for) {
2564 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002565 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002566 return;
2567 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002568 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 return;
2570 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002571 if (assigning > OP_APPLY)
2572 com_augassign_name(c, CHILD(n, 0),
2573 assigning, augn);
2574 else
2575 com_assign_name(c, CHILD(n, 0),
2576 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 return;
2578 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002579 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002580 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 return;
2582 }
2583 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002584
2585 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 com_error(c, PyExc_SyntaxError,
2587 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002588 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002589
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SystemError,
2592 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002594
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
2596 }
2597}
Guido van Rossum7c531111997-03-11 18:42:21 +00002598
Thomas Wouters434d0822000-08-24 20:11:32 +00002599static void
2600com_augassign(struct compiling *c, node *n)
2601{
2602 int opcode;
2603
2604 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2605 case '+': opcode = INPLACE_ADD; break;
2606 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002607 case '/':
2608 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2609 opcode = INPLACE_FLOOR_DIVIDE;
2610 else if (c->c_flags & CO_FUTURE_DIVISION)
2611 opcode = INPLACE_TRUE_DIVIDE;
2612 else
2613 opcode = INPLACE_DIVIDE;
2614 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002615 case '%': opcode = INPLACE_MODULO; break;
2616 case '<': opcode = INPLACE_LSHIFT; break;
2617 case '>': opcode = INPLACE_RSHIFT; break;
2618 case '&': opcode = INPLACE_AND; break;
2619 case '^': opcode = INPLACE_XOR; break;
2620 case '|': opcode = INPLACE_OR; break;
2621 case '*':
2622 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2623 opcode = INPLACE_POWER;
2624 else
2625 opcode = INPLACE_MULTIPLY;
2626 break;
2627 default:
2628 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2629 return;
2630 }
2631 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2632}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633
2634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636{
Thomas Wouters434d0822000-08-24 20:11:32 +00002637 REQ(n, expr_stmt);
2638 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002640 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 if (NCH(n) == 1) {
2643 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002644 if (c->c_interactive)
2645 com_addbyte(c, PRINT_EXPR);
2646 else
2647 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002650 else if (TYPE(CHILD(n,1)) == augassign)
2651 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 else {
2653 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002654 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002655 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 com_push(c, 1);
2659 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002660 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662 }
2663}
2664
2665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002666com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002667{
2668 int a = 0, b = 0;
2669 int i;
2670 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2671 /* Generate code like for
2672
2673 if __debug__:
2674 if not <test>:
2675 raise AssertionError [, <message>]
2676
2677 where <message> is the second test, if present.
2678 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002679
Guido van Rossum228d7f31997-04-02 05:24:36 +00002680 if (Py_OptimizeFlag)
2681 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002682 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002683 com_push(c, 1);
2684 com_addfwref(c, JUMP_IF_FALSE, &a);
2685 com_addbyte(c, POP_TOP);
2686 com_pop(c, 1);
2687 com_node(c, CHILD(n, 1));
2688 com_addfwref(c, JUMP_IF_TRUE, &b);
2689 com_addbyte(c, POP_TOP);
2690 com_pop(c, 1);
2691 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002692 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002693 com_push(c, 1);
2694 i = NCH(n)/2; /* Either 2 or 4 */
2695 if (i > 1)
2696 com_node(c, CHILD(n, 3));
2697 com_addoparg(c, RAISE_VARARGS, i);
2698 com_pop(c, i);
2699 /* The interpreter does not fall through */
2700 /* All jumps converge here */
2701 com_backpatch(c, a);
2702 com_backpatch(c, b);
2703 com_addbyte(c, POP_TOP);
2704}
2705
2706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002707com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002709 int i = 1;
2710 node* stream = NULL;
2711
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002712 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002713
2714 /* are we using the extended print form? */
2715 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2716 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002717 com_node(c, stream);
2718 /* stack: [...] => [... stream] */
2719 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002720 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2721 i = 4;
2722 else
2723 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002725 for (; i < NCH(n); i += 2) {
2726 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002727 com_addbyte(c, DUP_TOP);
2728 /* stack: [stream] => [stream stream] */
2729 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002730 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002731 /* stack: [stream stream] => [stream stream obj] */
2732 com_addbyte(c, ROT_TWO);
2733 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002734 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002735 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002736 com_pop(c, 2);
2737 }
2738 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002739 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002740 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002741 com_addbyte(c, PRINT_ITEM);
2742 com_pop(c, 1);
2743 }
2744 }
2745 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002746 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002747 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002748 /* must pop the extra stream object off the stack */
2749 com_addbyte(c, POP_TOP);
2750 /* stack: [... stream] => [...] */
2751 com_pop(c, 1);
2752 }
2753 }
2754 else {
2755 if (stream != NULL) {
2756 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002757 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002758 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002759 com_pop(c, 1);
2760 }
2761 else
2762 com_addbyte(c, PRINT_NEWLINE);
2763 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002764}
2765
2766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002767com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002769 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002770 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002772 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002773 if (c->c_flags & CO_GENERATOR) {
2774 if (NCH(n) > 1) {
2775 com_error(c, PyExc_SyntaxError,
2776 "'return' with argument inside generator");
2777 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002778 }
2779 if (NCH(n) < 2) {
2780 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002781 com_push(c, 1);
2782 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002783 else
2784 com_node(c, CHILD(n, 1));
2785 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002786 com_pop(c, 1);
2787}
2788
2789static void
2790com_yield_stmt(struct compiling *c, node *n)
2791{
Tim Peters95c80f82001-06-23 02:07:08 +00002792 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002793 REQ(n, yield_stmt); /* 'yield' testlist */
2794 if (!c->c_infunction) {
2795 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2796 }
Tim Peters95c80f82001-06-23 02:07:08 +00002797
2798 for (i = 0; i < c->c_nblocks; ++i) {
2799 if (c->c_block[i] == SETUP_FINALLY) {
2800 com_error(c, PyExc_SyntaxError,
2801 "'yield' not allowed in a 'try' block "
2802 "with a 'finally' clause");
2803 return;
2804 }
2805 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002806 com_node(c, CHILD(n, 1));
2807 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002808 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
2810
2811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002814 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002815 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2816 if (NCH(n) > 1) {
2817 com_node(c, CHILD(n, 1));
2818 if (NCH(n) > 3) {
2819 com_node(c, CHILD(n, 3));
2820 if (NCH(n) > 5)
2821 com_node(c, CHILD(n, 5));
2822 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002823 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 i = NCH(n)/2;
2825 com_addoparg(c, RAISE_VARARGS, i);
2826 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002827}
2828
2829static void
Thomas Wouters52152252000-08-17 22:55:00 +00002830com_from_import(struct compiling *c, node *n)
2831{
2832 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2833 com_push(c, 1);
2834 if (NCH(n) > 1) {
2835 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2836 com_error(c, PyExc_SyntaxError, "invalid syntax");
2837 return;
2838 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002839 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002840 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002841 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002842 com_pop(c, 1);
2843}
2844
2845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847{
2848 int i;
2849 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002850 /* 'import' dotted_name (',' dotted_name)* |
2851 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002853 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002854 /* 'from' dotted_name 'import' ... */
2855 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002856
2857 if (TYPE(CHILD(n, 3)) == STAR) {
2858 tup = Py_BuildValue("(s)", "*");
2859 } else {
2860 tup = PyTuple_New((NCH(n) - 2)/2);
2861 for (i = 3; i < NCH(n); i += 2) {
2862 PyTuple_SET_ITEM(tup, (i-3)/2,
2863 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002864 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002865 }
2866 }
2867 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002868 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002870 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002871 if (TYPE(CHILD(n, 3)) == STAR)
2872 com_addbyte(c, IMPORT_STAR);
2873 else {
2874 for (i = 3; i < NCH(n); i += 2)
2875 com_from_import(c, CHILD(n, i));
2876 com_addbyte(c, POP_TOP);
2877 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 }
2880 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002881 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002883 node *subn = CHILD(n, i);
2884 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002885 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002887 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002888 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002889 int j;
2890 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002891 com_error(c, PyExc_SyntaxError,
2892 "invalid syntax");
2893 return;
2894 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002895 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2896 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002897 CHILD(CHILD(subn, 0),
2898 j));
2899 com_addop_varname(c, VAR_STORE,
2900 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002901 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002902 com_addop_varname(c, VAR_STORE,
2903 STR(CHILD(CHILD(subn, 0),
2904 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002905 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906 }
2907 }
2908}
2909
2910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002912{
2913 REQ(n, exec_stmt);
2914 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2915 com_node(c, CHILD(n, 1));
2916 if (NCH(n) >= 4)
2917 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002919 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002920 com_push(c, 1);
2921 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002922 if (NCH(n) >= 6)
2923 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002925 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002926 com_push(c, 1);
2927 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002928 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002929 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002930}
2931
Guido van Rossum7c531111997-03-11 18:42:21 +00002932static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002934{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002935 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002936 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002937 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002938
2939 /* Label to avoid tail recursion */
2940 next:
2941 switch (TYPE(n)) {
2942
2943 case suite:
2944 if (NCH(n) == 1) {
2945 n = CHILD(n, 0);
2946 goto next;
2947 }
2948 /* Fall through */
2949 case file_input:
2950 for (i = 0; i < NCH(n); i++) {
2951 node *ch = CHILD(n, i);
2952 if (TYPE(ch) == stmt) {
2953 n = ch;
2954 goto next;
2955 }
2956 }
2957 break;
2958
2959 case stmt:
2960 case simple_stmt:
2961 case small_stmt:
2962 n = CHILD(n, 0);
2963 goto next;
2964
2965 case expr_stmt:
2966 case testlist:
2967 case test:
2968 case and_test:
2969 case not_test:
2970 case comparison:
2971 case expr:
2972 case xor_expr:
2973 case and_expr:
2974 case shift_expr:
2975 case arith_expr:
2976 case term:
2977 case factor:
2978 case power:
2979 case atom:
2980 if (NCH(n) == 1) {
2981 n = CHILD(n, 0);
2982 goto next;
2983 }
2984 break;
2985
2986 case NAME:
2987 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2988 return 1;
2989 break;
2990
2991 case NUMBER:
2992 v = parsenumber(c, STR(n));
2993 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002994 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002995 break;
2996 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 i = PyObject_IsTrue(v);
2998 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002999 return i == 0;
3000
3001 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003002 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003003 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003004 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003005 break;
3006 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003007 i = PyObject_IsTrue(v);
3008 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003009 return i == 0;
3010
3011 }
3012 return 0;
3013}
3014
Tim Peters08a898f2001-06-28 01:52:22 +00003015
3016/* Look under n for a return stmt with an expression.
3017 * This hack is used to find illegal returns under "if 0:" blocks in
3018 * functions already known to be generators (as determined by the symtable
3019 * pass).
3020 * Return the offending return node if found, else NULL.
3021 */
3022static node *
3023look_for_offending_return(node *n)
3024{
3025 int i;
3026
3027 for (i = 0; i < NCH(n); ++i) {
3028 node *kid = CHILD(n, i);
3029
3030 switch (TYPE(kid)) {
3031 case classdef:
3032 case funcdef:
3033 case lambdef:
3034 /* Stuff in nested functions & classes doesn't
3035 affect the code block we started in. */
3036 return NULL;
3037
3038 case return_stmt:
3039 if (NCH(kid) > 1)
3040 return kid;
3041 break;
3042
3043 default: {
3044 node *bad = look_for_offending_return(kid);
3045 if (bad != NULL)
3046 return bad;
3047 }
3048 }
3049 }
3050
3051 return NULL;
3052}
3053
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003054static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003055com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056{
3057 int i;
3058 int anchor = 0;
3059 REQ(n, if_stmt);
3060 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3061 for (i = 0; i+3 < NCH(n); i+=4) {
3062 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003063 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003064 if (is_constant_false(c, ch)) {
3065 /* We're going to skip this block. However, if this
3066 is a generator, we have to check the dead code
3067 anyway to make sure there aren't any return stmts
3068 with expressions, in the same scope. */
3069 if (c->c_flags & CO_GENERATOR) {
3070 node *p = look_for_offending_return(n);
3071 if (p != NULL) {
3072 int savelineno = c->c_lineno;
3073 c->c_lineno = p->n_lineno;
3074 com_error(c, PyExc_SyntaxError,
3075 "'return' with argument "
3076 "inside generator");
3077 c->c_lineno = savelineno;
3078 }
3079 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003080 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003081 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003082 if (i > 0)
3083 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003084 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 com_addfwref(c, JUMP_IF_FALSE, &a);
3086 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 com_node(c, CHILD(n, i+3));
3089 com_addfwref(c, JUMP_FORWARD, &anchor);
3090 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 com_addbyte(c, POP_TOP);
3093 }
3094 if (i+2 < NCH(n))
3095 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003096 if (anchor)
3097 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098}
3099
3100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003101com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102{
3103 int break_anchor = 0;
3104 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003105 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3107 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003108 block_push(c, SETUP_LOOP);
3109 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 com_node(c, CHILD(n, 1));
3112 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3113 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003114 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003115 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003116 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003117 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003118 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3119 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003121 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 com_addbyte(c, POP_TOP);
3123 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003124 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 if (NCH(n) > 4)
3126 com_node(c, CHILD(n, 6));
3127 com_backpatch(c, break_anchor);
3128}
3129
3130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003131com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 int break_anchor = 0;
3134 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003135 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003136 REQ(n, for_stmt);
3137 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3138 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003139 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003141 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003142 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003143 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003144 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003145 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003146 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003147 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003149 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003150 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3151 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003153 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003155 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156 if (NCH(n) > 8)
3157 com_node(c, CHILD(n, 8));
3158 com_backpatch(c, break_anchor);
3159}
3160
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003161/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003162
3163 SETUP_FINALLY L
3164 <code for S>
3165 POP_BLOCK
3166 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003167 L: <code for Sf>
3168 END_FINALLY
3169
3170 The special instructions use the block stack. Each block
3171 stack entry contains the instruction that created it (here
3172 SETUP_FINALLY), the level of the value stack at the time the
3173 block stack entry was created, and a label (here L).
3174
3175 SETUP_FINALLY:
3176 Pushes the current value stack level and the label
3177 onto the block stack.
3178 POP_BLOCK:
3179 Pops en entry from the block stack, and pops the value
3180 stack until its level is the same as indicated on the
3181 block stack. (The label is ignored.)
3182 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003183 Pops a variable number of entries from the *value* stack
3184 and re-raises the exception they specify. The number of
3185 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003186
3187 The block stack is unwound when an exception is raised:
3188 when a SETUP_FINALLY entry is found, the exception is pushed
3189 onto the value stack (and the exception condition is cleared),
3190 and the interpreter jumps to the label gotten from the block
3191 stack.
3192
3193 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003194 (The contents of the value stack is shown in [], with the top
3195 at the right; 'tb' is trace-back info, 'val' the exception's
3196 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003197
3198 Value stack Label Instruction Argument
3199 [] SETUP_EXCEPT L1
3200 [] <code for S>
3201 [] POP_BLOCK
3202 [] JUMP_FORWARD L0
3203
Guido van Rossum3f5da241990-12-20 15:06:42 +00003204 [tb, val, exc] L1: DUP )
3205 [tb, val, exc, exc] <evaluate E1> )
3206 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3207 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3208 [tb, val, exc, 1] POP )
3209 [tb, val, exc] POP
3210 [tb, val] <assign to V1> (or POP if no V1)
3211 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003212 [] <code for S1>
3213 JUMP_FORWARD L0
3214
Guido van Rossum3f5da241990-12-20 15:06:42 +00003215 [tb, val, exc, 0] L2: POP
3216 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003217 .............................etc.......................
3218
Guido van Rossum3f5da241990-12-20 15:06:42 +00003219 [tb, val, exc, 0] Ln+1: POP
3220 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003221
3222 [] L0: <next statement>
3223
3224 Of course, parts are not generated if Vi or Ei is not present.
3225*/
3226
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003228com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003229{
3230 int except_anchor = 0;
3231 int end_anchor = 0;
3232 int else_anchor = 0;
3233 int i;
3234 node *ch;
3235
3236 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3237 block_push(c, SETUP_EXCEPT);
3238 com_node(c, CHILD(n, 2));
3239 com_addbyte(c, POP_BLOCK);
3240 block_pop(c, SETUP_EXCEPT);
3241 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3242 com_backpatch(c, except_anchor);
3243 for (i = 3;
3244 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3245 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003248 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003249 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250 break;
3251 }
3252 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003253 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003254 com_addoparg(c, SET_LINENO, ch->n_lineno);
3255 if (NCH(ch) > 1) {
3256 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003257 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003258 com_node(c, CHILD(ch, 1));
3259 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003261 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3262 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 }
3265 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003267 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003268 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003270 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 com_pop(c, 1);
3272 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003273 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003274 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275 com_node(c, CHILD(n, i+2));
3276 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3277 if (except_anchor) {
3278 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003279 /* We come in with [tb, val, exc, 0] on the
3280 stack; one pop and it's the same as
3281 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 com_addbyte(c, POP_TOP);
3283 }
3284 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003285 /* We actually come in here with [tb, val, exc] but the
3286 END_FINALLY will zap those and jump around.
3287 The c_stacklevel does not reflect them so we need not pop
3288 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003289 com_addbyte(c, END_FINALLY);
3290 com_backpatch(c, else_anchor);
3291 if (i < NCH(n))
3292 com_node(c, CHILD(n, i+2));
3293 com_backpatch(c, end_anchor);
3294}
3295
3296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003297com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298{
3299 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003300 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003301
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003302 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3303 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 com_addbyte(c, POP_BLOCK);
3306 block_pop(c, SETUP_FINALLY);
3307 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003308 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 /* While the generated code pushes only one item,
3310 the try-finally handling can enter here with
3311 up to three items. OK, here are the details:
3312 3 for an exception, 2 for RETURN, 1 for BREAK. */
3313 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003314 com_backpatch(c, finally_anchor);
3315 ch = CHILD(n, NCH(n)-1);
3316 com_addoparg(c, SET_LINENO, ch->n_lineno);
3317 com_node(c, ch);
3318 com_addbyte(c, END_FINALLY);
3319 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003321}
3322
3323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003324com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003325{
3326 REQ(n, try_stmt);
3327 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3328 | 'try' ':' suite 'finally' ':' suite */
3329 if (TYPE(CHILD(n, 3)) != except_clause)
3330 com_try_finally(c, n);
3331 else
3332 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333}
3334
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003336get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003337{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003338 int i;
3339
Guido van Rossum8b993a91997-01-17 21:04:03 +00003340 /* Label to avoid tail recursion */
3341 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003342 switch (TYPE(n)) {
3343
3344 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 if (NCH(n) == 1) {
3346 n = CHILD(n, 0);
3347 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003348 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003349 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003350 case file_input:
3351 for (i = 0; i < NCH(n); i++) {
3352 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003353 if (TYPE(ch) == stmt) {
3354 n = ch;
3355 goto next;
3356 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003357 }
3358 break;
3359
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003360 case stmt:
3361 case simple_stmt:
3362 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 n = CHILD(n, 0);
3364 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003365
3366 case expr_stmt:
3367 case testlist:
3368 case test:
3369 case and_test:
3370 case not_test:
3371 case comparison:
3372 case expr:
3373 case xor_expr:
3374 case and_expr:
3375 case shift_expr:
3376 case arith_expr:
3377 case term:
3378 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003379 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 if (NCH(n) == 1) {
3381 n = CHILD(n, 0);
3382 goto next;
3383 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003384 break;
3385
3386 case atom:
3387 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003389 break;
3390
3391 }
3392 return NULL;
3393}
3394
Guido van Rossum79f25d91997-04-29 20:08:16 +00003395static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003396get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397{
Guido van Rossum541563e1999-01-28 15:08:09 +00003398 /* Don't generate doc-strings if run with -OO */
3399 if (Py_OptimizeFlag > 1)
3400 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003401 n = get_rawdocstring(n);
3402 if (n == NULL)
3403 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003404 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003405}
3406
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409{
3410 REQ(n, suite);
3411 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3412 if (NCH(n) == 1) {
3413 com_node(c, CHILD(n, 0));
3414 }
3415 else {
3416 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003417 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 node *ch = CHILD(n, i);
3419 if (TYPE(ch) == stmt)
3420 com_node(c, ch);
3421 }
3422 }
3423}
3424
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003425/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003427com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003428{
3429 int i = c->c_nblocks;
3430 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3431 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3432 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003433 else if (i <= 0) {
3434 /* at the outer level */
3435 com_error(c, PyExc_SyntaxError,
3436 "'continue' not properly in loop");
3437 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003438 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003439 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003440 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003441 if (c->c_block[j] == SETUP_LOOP)
3442 break;
3443 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003444 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003445 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003446 for (; i > j; --i) {
3447 if (c->c_block[i] == SETUP_EXCEPT ||
3448 c->c_block[i] == SETUP_FINALLY) {
3449 com_addoparg(c, CONTINUE_LOOP,
3450 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003451 return;
3452 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003453 if (c->c_block[i] == END_FINALLY) {
3454 com_error(c, PyExc_SyntaxError,
3455 "'continue' not supported inside 'finally' clause");
3456 return;
3457 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003458 }
3459 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003460 com_error(c, PyExc_SyntaxError,
3461 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003462 }
3463 /* XXX Could allow it inside a 'finally' clause
3464 XXX if we could pop the exception still on the stack */
3465}
3466
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003467static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003468com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003469{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003470 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003471 if (TYPE(n) == lambdef) {
3472 /* lambdef: 'lambda' [varargslist] ':' test */
3473 n = CHILD(n, 1);
3474 }
3475 else {
3476 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3477 n = CHILD(n, 2);
3478 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3479 n = CHILD(n, 1);
3480 }
3481 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003482 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003484 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003485 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3486 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003487 nargs = 0;
3488 ndefs = 0;
3489 for (i = 0; i < nch; i++) {
3490 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003491 if (TYPE(CHILD(n, i)) == STAR ||
3492 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003493 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003494 nargs++;
3495 i++;
3496 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003497 t = RPAR; /* Anything except EQUAL or COMMA */
3498 else
3499 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003500 if (t == EQUAL) {
3501 i++;
3502 ndefs++;
3503 com_node(c, CHILD(n, i));
3504 i++;
3505 if (i >= nch)
3506 break;
3507 t = TYPE(CHILD(n, i));
3508 }
3509 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003510 /* Treat "(a=1, b)" as an error */
3511 if (ndefs)
3512 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003513 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003514 }
3515 if (t != COMMA)
3516 break;
3517 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003518 return ndefs;
3519}
3520
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003522com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003524 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003525 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003527 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003528 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3529 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003530 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003531 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003532 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 c->c_errors++;
3534 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003535 int closure = com_make_closure(c, (PyCodeObject *)co);
3536 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003537 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003538 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003539 if (closure)
3540 com_addoparg(c, MAKE_CLOSURE, ndefs);
3541 else
3542 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003543 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003544 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003546 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547 }
3548}
3549
3550static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003551com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003552{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003553 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003554 REQ(n, testlist);
3555 /* testlist: test (',' test)* [','] */
3556 for (i = 0; i < NCH(n); i += 2)
3557 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 i = (NCH(n)+1) / 2;
3559 com_addoparg(c, BUILD_TUPLE, i);
3560 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003561}
3562
3563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003564com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565{
Guido van Rossum25831651993-05-19 14:50:45 +00003566 int i;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003567 PyObject *co, *v;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003568 char *name;
3569
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003571 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003572 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003573 c->c_errors++;
3574 return;
3575 }
3576 /* Push the class name on the stack */
3577 i = com_addconst(c, v);
3578 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003580 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003581 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003582 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003583 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003584 com_push(c, 1);
3585 }
Guido van Rossum25831651993-05-19 14:50:45 +00003586 else
3587 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003588 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003589 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003590 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003591 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003592 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003593 c->c_errors++;
3594 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003595 int closure = com_make_closure(c, (PyCodeObject *)co);
3596 i = com_addconst(c, co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003597 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003598 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003599 if (closure)
3600 com_addoparg(c, MAKE_CLOSURE, 0);
3601 else
3602 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003603 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003604 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003605 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003606 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003607 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003608 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609}
3610
3611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003612com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003613{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003614 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003615 if (c->c_errors)
3616 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617 switch (TYPE(n)) {
3618
3619 /* Definition nodes */
3620
3621 case funcdef:
3622 com_funcdef(c, n);
3623 break;
3624 case classdef:
3625 com_classdef(c, n);
3626 break;
3627
3628 /* Trivial parse tree nodes */
3629
3630 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003631 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003632 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003633 n = CHILD(n, 0);
3634 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003635
3636 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003637 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3638 com_addoparg(c, SET_LINENO, n->n_lineno);
3639 {
3640 int i;
3641 for (i = 0; i < NCH(n)-1; i += 2)
3642 com_node(c, CHILD(n, i));
3643 }
3644 break;
3645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003646 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003647 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003648 n = CHILD(n, 0);
3649 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650
3651 /* Statement nodes */
3652
3653 case expr_stmt:
3654 com_expr_stmt(c, n);
3655 break;
3656 case print_stmt:
3657 com_print_stmt(c, n);
3658 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003659 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003660 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661 break;
3662 case pass_stmt:
3663 break;
3664 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003665 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003666 com_error(c, PyExc_SyntaxError,
3667 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003668 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003669 com_addbyte(c, BREAK_LOOP);
3670 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003671 case continue_stmt:
3672 com_continue_stmt(c, n);
3673 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674 case return_stmt:
3675 com_return_stmt(c, n);
3676 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003677 case yield_stmt:
3678 com_yield_stmt(c, n);
3679 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680 case raise_stmt:
3681 com_raise_stmt(c, n);
3682 break;
3683 case import_stmt:
3684 com_import_stmt(c, n);
3685 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003686 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003687 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003688 case exec_stmt:
3689 com_exec_stmt(c, n);
3690 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003691 case assert_stmt:
3692 com_assert_stmt(c, n);
3693 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003694 case if_stmt:
3695 com_if_stmt(c, n);
3696 break;
3697 case while_stmt:
3698 com_while_stmt(c, n);
3699 break;
3700 case for_stmt:
3701 com_for_stmt(c, n);
3702 break;
3703 case try_stmt:
3704 com_try_stmt(c, n);
3705 break;
3706 case suite:
3707 com_suite(c, n);
3708 break;
3709
3710 /* Expression nodes */
3711
3712 case testlist:
Guido van Rossum1c917072001-10-15 15:44:05 +00003713 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003714 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003715 break;
3716 case test:
3717 com_test(c, n);
3718 break;
3719 case and_test:
3720 com_and_test(c, n);
3721 break;
3722 case not_test:
3723 com_not_test(c, n);
3724 break;
3725 case comparison:
3726 com_comparison(c, n);
3727 break;
3728 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003729 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730 break;
3731 case expr:
3732 com_expr(c, n);
3733 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003734 case xor_expr:
3735 com_xor_expr(c, n);
3736 break;
3737 case and_expr:
3738 com_and_expr(c, n);
3739 break;
3740 case shift_expr:
3741 com_shift_expr(c, n);
3742 break;
3743 case arith_expr:
3744 com_arith_expr(c, n);
3745 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003746 case term:
3747 com_term(c, n);
3748 break;
3749 case factor:
3750 com_factor(c, n);
3751 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003752 case power:
3753 com_power(c, n);
3754 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755 case atom:
3756 com_atom(c, n);
3757 break;
3758
3759 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003760 com_error(c, PyExc_SystemError,
3761 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 }
3763}
3764
Tim Petersdbd9ba62000-07-09 03:09:57 +00003765static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766
3767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003768com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769{
3770 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3771 if (TYPE(CHILD(n, 0)) == LPAR)
3772 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003774 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003775 com_pop(c, 1);
3776 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777}
3778
3779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003780com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003782 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783 if (NCH(n) == 1) {
3784 com_fpdef(c, CHILD(n, 0));
3785 }
3786 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003788 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003789 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 for (i = 0; i < NCH(n); i += 2)
3791 com_fpdef(c, CHILD(n, i));
3792 }
3793}
3794
3795static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003796com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003797{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003799 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003800 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003801 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003802 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003803 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003804 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003805 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003806 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003807 node *ch = CHILD(n, i);
3808 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003809 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003810 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003811 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3812 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003813 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003814 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003815 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003816 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003817 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003818 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003819 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003820 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003821 ch = CHILD(n, i);
3822 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003823 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003824 else
3825 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003826 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003827 if (complex) {
3828 /* Generate code for complex arguments only after
3829 having counted the simple arguments */
3830 int ilocal = 0;
3831 for (i = 0; i < nch; i++) {
3832 node *ch = CHILD(n, i);
3833 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003834 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003835 break;
3836 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3837 fp = CHILD(ch, 0);
3838 if (TYPE(fp) != NAME) {
3839 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003840 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003841 com_fpdef(c, ch);
3842 }
3843 ilocal++;
3844 if (++i >= nch)
3845 break;
3846 ch = CHILD(n, i);
3847 if (TYPE(ch) == EQUAL)
3848 i += 2;
3849 else
3850 REQ(ch, COMMA);
3851 }
3852 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003853}
3854
3855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003856com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857{
3858 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003859 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003860 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003861 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003862 if (doc != NULL) {
3863 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003864 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003865 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003869 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 for (i = 0; i < NCH(n); i++) {
3871 node *ch = CHILD(n, i);
3872 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3873 com_node(c, ch);
3874 }
3875}
3876
3877/* Top-level compile-node interface */
3878
3879static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003880compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 node *ch;
3884 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003885 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003886 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003887 if (doc != NULL) {
3888 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003889 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003890 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003891 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003892 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003893 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3894 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003895 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003896 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003899 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003900 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3901 com_push(c, 1);
3902 com_addbyte(c, RETURN_VALUE);
3903 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904}
3905
3906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003907compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003908{
Guido van Rossum590baa41993-11-30 13:40:46 +00003909 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003910 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003911 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003912
3913 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003914 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003915 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003916 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003917 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003918 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003919 else
3920 ch = CHILD(n, 2);
3921 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003922 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003923 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003924}
3925
3926static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003927compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003928{
3929 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003930 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003931 REQ(n, classdef);
3932 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3933 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003934 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003935 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003936 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003937 if (doc != NULL) {
3938 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003939 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003940 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003941 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003942 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003943 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003944 }
3945 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003947 com_node(c, ch);
3948 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003949 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003950 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003951 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003952}
3953
3954static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003955compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003957 com_addoparg(c, SET_LINENO, n->n_lineno);
3958
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 switch (TYPE(n)) {
3960
Guido van Rossum4c417781991-01-21 16:09:22 +00003961 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964 n = CHILD(n, 0);
3965 if (TYPE(n) != NEWLINE)
3966 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003967 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003968 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003969 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003970 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003971 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972 break;
3973
Guido van Rossum4c417781991-01-21 16:09:22 +00003974 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003976 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003977 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003978 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003979 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980 break;
3981
Guido van Rossum590baa41993-11-30 13:40:46 +00003982 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003983 com_node(c, CHILD(n, 0));
3984 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003985 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003986 break;
3987
Guido van Rossum590baa41993-11-30 13:40:46 +00003988 case lambdef: /* anonymous function definition */
3989 compile_lambdef(c, n);
3990 break;
3991
Guido van Rossum4c417781991-01-21 16:09:22 +00003992 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993 compile_funcdef(c, n);
3994 break;
3995
Guido van Rossum4c417781991-01-21 16:09:22 +00003996 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003997 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003998 break;
3999
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004002 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003 }
4004}
4005
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004006static PyObject *
4007dict_keys_inorder(PyObject *dict, int offset)
4008{
4009 PyObject *tuple, *k, *v;
4010 int i, pos = 0, size = PyDict_Size(dict);
4011
4012 tuple = PyTuple_New(size);
4013 if (tuple == NULL)
4014 return NULL;
4015 while (PyDict_Next(dict, &pos, &k, &v)) {
4016 i = PyInt_AS_LONG(v);
4017 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004018 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004019 PyTuple_SET_ITEM(tuple, i - offset, k);
4020 }
4021 return tuple;
4022}
4023
Guido van Rossum79f25d91997-04-29 20:08:16 +00004024PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004025PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004027 return PyNode_CompileFlags(n, filename, NULL);
4028}
4029
4030PyCodeObject *
4031PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4032{
4033 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004034}
4035
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004036struct symtable *
4037PyNode_CompileSymtable(node *n, char *filename)
4038{
4039 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004040 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004041
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004042 ff = PyNode_Future(n, filename);
4043 if (ff == NULL)
4044 return NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004045 st = symtable_init();
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004046 if (st == NULL)
4047 return NULL;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004048 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004049 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004050 if (st->st_errors > 0)
4051 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004052 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004053 if (st->st_errors > 0)
4054 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004055
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004056 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004057 fail:
4058 PyMem_Free((void *)ff);
4059 st->st_future = NULL;
4060 PySymtable_Free(st);
4061 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004062}
4063
Guido van Rossum79f25d91997-04-29 20:08:16 +00004064static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004065icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004066{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004067 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004068}
4069
Guido van Rossum79f25d91997-04-29 20:08:16 +00004070static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004071jcompile(node *n, char *filename, struct compiling *base,
4072 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004073{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004074 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004075 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004076 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004077 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004078 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004079 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004080 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004081 /* c_symtable still points to parent's symbols */
4082 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004083 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004084 sc.c_nested = 1;
Guido van Rossum4668b002001-08-08 05:00:18 +00004085 sc.c_flags |= base->c_flags & (CO_GENERATOR_ALLOWED |
4086 CO_FUTURE_DIVISION);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004087 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004088 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004089 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004090 if (sc.c_future == NULL) {
4091 com_free(&sc);
4092 return NULL;
4093 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004094 if (flags) {
4095 int merged = sc.c_future->ff_features |
4096 flags->cf_flags;
4097 sc.c_future->ff_features = merged;
4098 flags->cf_flags = merged;
4099 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004100 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004101 com_free(&sc);
4102 return NULL;
4103 }
4104 }
4105 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004106 if (symtable_load_symbols(&sc) < 0) {
4107 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004108 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004109 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004110 compile_node(&sc, n);
4111 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004112 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004113 PyObject *consts, *names, *varnames, *filename, *name,
4114 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004115 consts = PyList_AsTuple(sc.c_consts);
4116 names = PyList_AsTuple(sc.c_names);
4117 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004118 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4119 freevars = dict_keys_inorder(sc.c_freevars,
4120 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004121 filename = PyString_InternFromString(sc.c_filename);
4122 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004123 if (!PyErr_Occurred())
4124 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004125 sc.c_nlocals,
4126 sc.c_maxstacklevel,
4127 sc.c_flags,
4128 sc.c_code,
4129 consts,
4130 names,
4131 varnames,
4132 freevars,
4133 cellvars,
4134 filename,
4135 name,
4136 sc.c_firstlineno,
4137 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004138 Py_XDECREF(consts);
4139 Py_XDECREF(names);
4140 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004141 Py_XDECREF(freevars);
4142 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004143 Py_XDECREF(filename);
4144 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004145 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004146 else if (!PyErr_Occurred()) {
4147 /* This could happen if someone called PyErr_Clear() after an
4148 error was reported above. That's not supposed to happen,
4149 but I just plugged one case and I'm not sure there can't be
4150 others. In that case, raise SystemError so that at least
4151 it gets reported instead dumping core. */
4152 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4153 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004154 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004155 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004156 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004157 sc.c_symtable = NULL;
4158 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004159 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004160 return co;
4161}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004162
4163int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004164PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004165{
4166 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004167 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004168 int line = co->co_firstlineno;
4169 int addr = 0;
4170 while (--size >= 0) {
4171 addr += *p++;
4172 if (addr > addrq)
4173 break;
4174 line += *p++;
4175 }
4176 return line;
4177}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004178
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004179/* The test for LOCAL must come before the test for FREE in order to
4180 handle classes where name is both local and free. The local var is
4181 a method and the free var is a free var referenced within a method.
4182*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004183
4184static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004185get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004186{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004187 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004188 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004189
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004190 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4191 return CELL;
4192 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4193 return LOCAL;
4194 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4195 return FREE;
4196 v = PyDict_GetItemString(c->c_globals, name);
4197 if (v) {
4198 if (v == Py_None)
4199 return GLOBAL_EXPLICIT;
4200 else {
4201 return GLOBAL_IMPLICIT;
4202 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004203 }
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004204 sprintf(buf,
4205 "unknown scope for %.100s in %.100s(%s) "
4206 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4207 name, c->c_name,
4208 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4209 c->c_filename,
4210 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4211 PyObject_REPR(c->c_locals),
4212 PyObject_REPR(c->c_globals)
4213 );
4214
4215 Py_FatalError(buf);
4216 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004217}
4218
Guido van Rossum207fda62001-03-02 03:30:41 +00004219/* Helper functions to issue warnings */
4220
4221static int
4222issue_warning(char *msg, char *filename, int lineno)
4223{
4224 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4225 lineno, NULL, NULL) < 0) {
4226 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4227 PyErr_SetString(PyExc_SyntaxError, msg);
4228 PyErr_SyntaxLocation(filename, lineno);
4229 }
4230 return -1;
4231 }
4232 return 0;
4233}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004234
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004235static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004236symtable_warn(struct symtable *st, char *msg)
4237{
Guido van Rossum207fda62001-03-02 03:30:41 +00004238 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004239 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004240 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004241 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004242 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004243}
4244
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004245/* Helper function for setting lineno and filename */
4246
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004247static int
4248symtable_build(struct compiling *c, node *n)
4249{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004250 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004252 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004253 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004254 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4255 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004256 return -1;
4257 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004258 if (c->c_symtable->st_errors > 0)
4259 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004260 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004261 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004262 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 return 0;
4264}
4265
4266static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004267symtable_init_compiling_symbols(struct compiling *c)
4268{
4269 PyObject *varnames;
4270
4271 varnames = c->c_symtable->st_cur->ste_varnames;
4272 if (varnames == NULL) {
4273 varnames = PyList_New(0);
4274 if (varnames == NULL)
4275 return -1;
4276 c->c_symtable->st_cur->ste_varnames = varnames;
4277 Py_INCREF(varnames);
4278 } else
4279 Py_INCREF(varnames);
4280 c->c_varnames = varnames;
4281
4282 c->c_globals = PyDict_New();
4283 if (c->c_globals == NULL)
4284 return -1;
4285 c->c_freevars = PyDict_New();
4286 if (c->c_freevars == NULL)
4287 return -1;
4288 c->c_cellvars = PyDict_New();
4289 if (c->c_cellvars == NULL)
4290 return -1;
4291 return 0;
4292}
4293
4294struct symbol_info {
4295 int si_nlocals;
4296 int si_ncells;
4297 int si_nfrees;
4298 int si_nimplicit;
4299};
4300
4301static void
4302symtable_init_info(struct symbol_info *si)
4303{
4304 si->si_nlocals = 0;
4305 si->si_ncells = 0;
4306 si->si_nfrees = 0;
4307 si->si_nimplicit = 0;
4308}
4309
4310static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004311symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004312 struct symbol_info *si)
4313{
4314 PyObject *dict, *v;
4315
4316 /* Seperate logic for DEF_FREE. If it occurs in a function,
4317 it indicates a local that we must allocate storage for (a
4318 cell var). If it occurs in a class, then the class has a
4319 method and a free variable with the same name.
4320 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004321 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004322 /* If it isn't declared locally, it can't be a cell. */
4323 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4324 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004325 v = PyInt_FromLong(si->si_ncells++);
4326 dict = c->c_cellvars;
4327 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004328 /* If it is free anyway, then there is no need to do
4329 anything here.
4330 */
4331 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004332 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004333 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004334 v = PyInt_FromLong(si->si_nfrees++);
4335 dict = c->c_freevars;
4336 }
4337 if (v == NULL)
4338 return -1;
4339 if (PyDict_SetItem(dict, name, v) < 0) {
4340 Py_DECREF(v);
4341 return -1;
4342 }
4343 Py_DECREF(v);
4344 return 0;
4345}
4346
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004347/* If a variable is a cell and an argument, make sure that appears in
4348 co_cellvars before any variable to its right in varnames.
4349*/
4350
4351
4352static int
4353symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4354 PyObject *varnames, int flags)
4355{
4356 PyObject *v, *w, *d, *list = NULL;
4357 int i, pos;
4358
4359 if (flags & CO_VARARGS)
4360 argcount++;
4361 if (flags & CO_VARKEYWORDS)
4362 argcount++;
4363 for (i = argcount; --i >= 0; ) {
4364 v = PyList_GET_ITEM(varnames, i);
4365 if (PyDict_GetItem(*cellvars, v)) {
4366 if (list == NULL) {
4367 list = PyList_New(1);
4368 if (list == NULL)
4369 return -1;
4370 PyList_SET_ITEM(list, 0, v);
4371 Py_INCREF(v);
4372 } else
4373 PyList_Insert(list, 0, v);
4374 }
4375 }
4376 if (list == NULL || PyList_GET_SIZE(list) == 0)
4377 return 0;
4378 /* There are cellvars that are also arguments. Create a dict
4379 to replace cellvars and put the args at the front.
4380 */
4381 d = PyDict_New();
4382 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4383 v = PyInt_FromLong(i);
4384 if (v == NULL)
4385 goto fail;
4386 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4387 goto fail;
4388 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4389 goto fail;
4390 }
4391 pos = 0;
4392 i = PyList_GET_SIZE(list);
4393 Py_DECREF(list);
4394 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4395 w = PyInt_FromLong(i++); /* don't care about the old key */
4396 if (PyDict_SetItem(d, v, w) < 0) {
4397 Py_DECREF(w);
4398 goto fail;
4399 }
4400 Py_DECREF(w);
4401 }
4402 Py_DECREF(*cellvars);
4403 *cellvars = d;
4404 return 1;
4405 fail:
4406 Py_DECREF(d);
4407 return -1;
4408}
4409
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004410static int
4411symtable_freevar_offsets(PyObject *freevars, int offset)
4412{
4413 PyObject *name, *v;
4414 int pos;
4415
4416 /* The cell vars are the first elements of the closure,
4417 followed by the free vars. Update the offsets in
4418 c_freevars to account for number of cellvars. */
4419 pos = 0;
4420 while (PyDict_Next(freevars, &pos, &name, &v)) {
4421 int i = PyInt_AS_LONG(v) + offset;
4422 PyObject *o = PyInt_FromLong(i);
4423 if (o == NULL)
4424 return -1;
4425 if (PyDict_SetItem(freevars, name, o) < 0) {
4426 Py_DECREF(o);
4427 return -1;
4428 }
4429 Py_DECREF(o);
4430 }
4431 return 0;
4432}
4433
4434static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004435symtable_check_unoptimized(struct compiling *c,
4436 PySymtableEntryObject *ste,
4437 struct symbol_info *si)
4438{
4439 char buf[300];
4440
4441 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4442 || (ste->ste_nested && si->si_nimplicit)))
4443 return 0;
4444
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004445#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4446
4447#define ILLEGAL_IS "is a nested function"
4448
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004449#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004450"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004451
4452#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004453"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004454
4455#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4456"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004457"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004458
4459 /* XXX perhaps the linenos for these opt-breaking statements
4460 should be stored so the exception can point to them. */
4461
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004462 if (ste->ste_child_free) {
4463 if (ste->ste_optimized == OPT_IMPORT_STAR)
4464 sprintf(buf, ILLEGAL_IMPORT_STAR,
4465 PyString_AS_STRING(ste->ste_name),
4466 ILLEGAL_CONTAINS);
4467 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4468 sprintf(buf, ILLEGAL_BARE_EXEC,
4469 PyString_AS_STRING(ste->ste_name),
4470 ILLEGAL_CONTAINS);
4471 else {
4472 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4473 PyString_AS_STRING(ste->ste_name),
4474 ILLEGAL_CONTAINS);
4475 }
4476 } else {
4477 if (ste->ste_optimized == OPT_IMPORT_STAR)
4478 sprintf(buf, ILLEGAL_IMPORT_STAR,
4479 PyString_AS_STRING(ste->ste_name),
4480 ILLEGAL_IS);
4481 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4482 sprintf(buf, ILLEGAL_BARE_EXEC,
4483 PyString_AS_STRING(ste->ste_name),
4484 ILLEGAL_IS);
4485 else {
4486 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4487 PyString_AS_STRING(ste->ste_name),
4488 ILLEGAL_IS);
4489 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004490 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004491
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004492 PyErr_SetString(PyExc_SyntaxError, buf);
4493 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4494 ste->ste_opt_lineno);
4495 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004496}
4497
4498static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004499symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4500 struct symbol_info *si)
4501{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004502 if (c->c_future)
4503 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004504 if (ste->ste_generator)
4505 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004506 if (ste->ste_type != TYPE_MODULE)
4507 c->c_flags |= CO_NEWLOCALS;
4508 if (ste->ste_type == TYPE_FUNCTION) {
4509 c->c_nlocals = si->si_nlocals;
4510 if (ste->ste_optimized == 0)
4511 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004512 else if (ste->ste_optimized != OPT_EXEC)
4513 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004514 }
4515 return 0;
4516}
4517
4518static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004519symtable_load_symbols(struct compiling *c)
4520{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004521 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004522 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004523 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004524 PyObject *name, *varnames, *v;
4525 int i, flags, pos;
4526 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004527
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 if (implicit == NULL) {
4529 implicit = PyInt_FromLong(1);
4530 if (implicit == NULL)
4531 return -1;
4532 }
4533 v = NULL;
4534
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004535 if (symtable_init_compiling_symbols(c) < 0)
4536 goto fail;
4537 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004538 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004539 si.si_nlocals = PyList_GET_SIZE(varnames);
4540 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004541
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004542 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004543 v = PyInt_FromLong(i);
4544 if (PyDict_SetItem(c->c_locals,
4545 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 goto fail;
4547 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004548 }
4549
4550 /* XXX The cases below define the rules for whether a name is
4551 local or global. The logic could probably be clearer. */
4552 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004553 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4554 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004556 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004557 /* undo the original DEF_FREE */
4558 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004560 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004561 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004562 2. Free variables in methods that are also class
4563 variables or declared global.
4564 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004565 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004566 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004567
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004568 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004569 c->c_argcount--;
4570 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004571 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004572 c->c_argcount--;
4573 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004574 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004575 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004576 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004577 if (flags & DEF_PARAM) {
4578 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004579 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004580 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004581 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004582 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004584 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4586 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004587 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004588 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004589 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4590 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004591 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004592 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004593 if (v == NULL)
4594 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004595 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004596 goto fail;
4597 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004598 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004599 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004601 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004602 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004603 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004604 if (v == NULL)
4605 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004606 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 goto fail;
4608 Py_DECREF(v);
4609 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004610 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004611 if (PyDict_SetItem(c->c_globals, name,
4612 implicit) < 0)
4613 goto fail;
4614 if (st->st_nscopes != 1) {
4615 v = PyInt_FromLong(flags);
4616 if (PyDict_SetItem(st->st_global,
4617 name, v))
4618 goto fail;
4619 Py_DECREF(v);
4620 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004621 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004622 }
4623 }
4624
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004625 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4626
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004627 if (si.si_ncells > 1) { /* one cell is always in order */
4628 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4629 c->c_varnames, c->c_flags) < 0)
4630 return -1;
4631 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004632 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4633 return -1;
4634 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004635 fail:
4636 /* is this always the right thing to do? */
4637 Py_XDECREF(v);
4638 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639}
4640
4641static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004642symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004643{
4644 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645
4646 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4647 if (st == NULL)
4648 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004650
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004651 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004653 goto fail;
4654 if ((st->st_symbols = PyDict_New()) == NULL)
4655 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004656 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004657 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004658 st->st_errors = 0;
4659 st->st_tmpname = 0;
4660 st->st_private = NULL;
4661 return st;
4662 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004663 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004664 return NULL;
4665}
4666
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004667void
4668PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004669{
4670 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004671 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004672 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 PyMem_Free((void *)st);
4674}
4675
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004676/* When the compiler exits a scope, it must should update the scope's
4677 free variable information with the list of free variables in its
4678 children.
4679
4680 Variables that are free in children and defined in the current
4681 scope are cellvars.
4682
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004683 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684 false), free variables in children that are not defined here are
4685 implicit globals.
4686
4687*/
4688
4689static int
4690symtable_update_free_vars(struct symtable *st)
4691{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004692 int i, j, def;
4693 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004694 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004696 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 def = DEF_FREE_CLASS;
4698 else
4699 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004700 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 int pos = 0;
4702
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004703 if (list)
4704 PyList_SetSlice(list, 0,
4705 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004706 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004707 PyList_GET_ITEM(ste->ste_children, i);
4708 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004709 int flags = PyInt_AS_LONG(o);
4710 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004711 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004712 if (list == NULL) {
4713 list = PyList_New(0);
4714 if (list == NULL)
4715 return -1;
4716 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004717 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004718 if (PyList_Append(list, name) < 0) {
4719 Py_DECREF(list);
4720 return -1;
4721 }
4722 }
4723 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004724 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004725 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004726 v = PyDict_GetItem(ste->ste_symbols, name);
4727 /* If a name N is declared global in scope A and
4728 referenced in scope B contained (perhaps
4729 indirectly) in A and there are no scopes
4730 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004731 is global in B. Unless A is a class scope,
4732 because class scopes are not considered for
4733 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004734 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004735 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004736 int flags = PyInt_AS_LONG(v);
4737 if (flags & DEF_GLOBAL) {
4738 symtable_undo_free(st, child->ste_id,
4739 name);
4740 continue;
4741 }
4742 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004743 if (ste->ste_nested) {
4744 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004745 name, def) < 0) {
4746 Py_DECREF(list);
4747 return -1;
4748 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004750 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004751 name) < 0) {
4752 Py_DECREF(list);
4753 return -1;
4754 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755 }
4756 }
4757 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004758
4759 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004760 return 0;
4761}
4762
4763/* If the current scope is a non-nested class or if name is not
4764 defined in the current, non-nested scope, then it is an implicit
4765 global in all nested scopes.
4766*/
4767
4768static int
4769symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4770{
4771 PyObject *o;
4772 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004773 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004774
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004775 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004776 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004777 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 if (o == NULL)
4779 return symtable_undo_free(st, child, name);
4780 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004781
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004782 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004783 return symtable_undo_free(st, child, name);
4784 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004785 return symtable_add_def_o(st, ste->ste_symbols,
4786 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787}
4788
4789static int
4790symtable_undo_free(struct symtable *st, PyObject *id,
4791 PyObject *name)
4792{
4793 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004794 PyObject *info;
4795 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004797 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4798 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004800
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004801 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 if (info == NULL)
4803 return 0;
4804 v = PyInt_AS_LONG(info);
4805 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004806 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807 DEF_FREE_GLOBAL) < 0)
4808 return -1;
4809 } else
4810 /* If the name is defined here or declared global,
4811 then the recursion stops. */
4812 return 0;
4813
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004814 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4815 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004816 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004817 PyList_GET_ITEM(ste->ste_children, i);
4818 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819 if (x < 0)
4820 return x;
4821 }
4822 return 0;
4823}
4824
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004825/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4826 This reference is released when the scope is exited, via the DECREF
4827 in symtable_exit_scope().
4828*/
4829
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830static int
4831symtable_exit_scope(struct symtable *st)
4832{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004833 int end;
4834
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004835 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004836 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004839 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4840 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004841 if (PySequence_DelItem(st->st_stack, end) < 0)
4842 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004843 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004844}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004846static void
4847symtable_enter_scope(struct symtable *st, char *name, int type,
4848 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004850 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851
4852 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004853 prev = st->st_cur;
4854 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4855 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004856 st->st_errors++;
4857 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858 }
4859 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004860 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004861 PySymtableEntry_New(st, name, type, lineno);
4862 if (strcmp(name, TOP) == 0)
4863 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004864 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004865 if (PyList_Append(prev->ste_children,
4866 (PyObject *)st->st_cur) < 0)
4867 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004868 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869}
4870
4871static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004872symtable_lookup(struct symtable *st, char *name)
4873{
4874 char buffer[MANGLE_LEN];
4875 PyObject *v;
4876 int flags;
4877
4878 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4879 name = buffer;
4880 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4881 if (v == NULL) {
4882 if (PyErr_Occurred())
4883 return -1;
4884 else
4885 return 0;
4886 }
4887
4888 flags = PyInt_AS_LONG(v);
4889 return flags;
4890}
4891
4892static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004893symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004894{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004895 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004897 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004898
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004899 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004900 name = buffer;
4901 if ((s = PyString_InternFromString(name)) == NULL)
4902 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004903 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4904 Py_DECREF(s);
4905 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004906}
4907
4908/* Must only be called with mangled names */
4909
4910static int
4911symtable_add_def_o(struct symtable *st, PyObject *dict,
4912 PyObject *name, int flag)
4913{
4914 PyObject *o;
4915 int val;
4916
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004919 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004920 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004921 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004922 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004923 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924 return -1;
4925 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004926 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004928 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004929 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004931 Py_DECREF(o);
4932 return -1;
4933 }
4934 Py_DECREF(o);
4935
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004937 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 } else if (flag & DEF_GLOBAL) {
4940 /* XXX need to update DEF_GLOBAL for other flags too;
4941 perhaps only DEF_FREE_GLOBAL */
4942 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004943 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004945 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004947 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004948 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004949 Py_DECREF(o);
4950 return -1;
4951 }
4952 Py_DECREF(o);
4953 }
4954 return 0;
4955}
4956
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004958
Tim Peters08a898f2001-06-28 01:52:22 +00004959/* Look for a yield stmt under n. Return 1 if found, else 0.
4960 This hack is used to look inside "if 0:" blocks (which are normally
4961 ignored) in case those are the only places a yield occurs (so that this
4962 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004963static int
4964look_for_yield(node *n)
4965{
4966 int i;
4967
4968 for (i = 0; i < NCH(n); ++i) {
4969 node *kid = CHILD(n, i);
4970
4971 switch (TYPE(kid)) {
4972
4973 case classdef:
4974 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004975 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004976 /* Stuff in nested functions and classes can't make
4977 the parent a generator. */
4978 return 0;
4979
4980 case yield_stmt:
4981 return 1;
4982
4983 default:
4984 if (look_for_yield(kid))
4985 return 1;
4986 }
4987 }
4988 return 0;
4989}
4990
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991static void
4992symtable_node(struct symtable *st, node *n)
4993{
4994 int i, start = 0;
4995
4996 loop:
4997 switch (TYPE(n)) {
4998 case funcdef: {
4999 char *func_name = STR(CHILD(n, 1));
5000 symtable_add_def(st, func_name, DEF_LOCAL);
5001 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005002 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005003 symtable_funcdef(st, n);
5004 symtable_exit_scope(st);
5005 break;
5006 }
5007 case lambdef:
5008 if (NCH(n) == 4)
5009 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005010 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005011 symtable_funcdef(st, n);
5012 symtable_exit_scope(st);
5013 break;
5014 case classdef: {
5015 char *tmp, *class_name = STR(CHILD(n, 1));
5016 symtable_add_def(st, class_name, DEF_LOCAL);
5017 if (TYPE(CHILD(n, 2)) == LPAR) {
5018 node *bases = CHILD(n, 3);
5019 int i;
5020 for (i = 0; i < NCH(bases); i += 2) {
5021 symtable_node(st, CHILD(bases, i));
5022 }
5023 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005024 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005025 tmp = st->st_private;
5026 st->st_private = class_name;
5027 symtable_node(st, CHILD(n, NCH(n) - 1));
5028 st->st_private = tmp;
5029 symtable_exit_scope(st);
5030 break;
5031 }
5032 case if_stmt:
5033 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005034 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5035 if (st->st_cur->ste_generator == 0)
5036 st->st_cur->ste_generator =
5037 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005038 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005039 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005040 symtable_node(st, CHILD(n, i + 1));
5041 symtable_node(st, CHILD(n, i + 3));
5042 }
5043 if (i + 2 < NCH(n))
5044 symtable_node(st, CHILD(n, i + 2));
5045 break;
5046 case global_stmt:
5047 symtable_global(st, n);
5048 break;
5049 case import_stmt:
5050 symtable_import(st, n);
5051 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005052 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005053 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005054 symtable_node(st, CHILD(n, 1));
5055 if (NCH(n) > 2)
5056 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005057 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005058 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005059 st->st_cur->ste_opt_lineno = n->n_lineno;
5060 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061 if (NCH(n) > 4)
5062 symtable_node(st, CHILD(n, 5));
5063 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005064
5065 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005066 case assert_stmt:
5067 if (Py_OptimizeFlag)
5068 return;
5069 if (NCH(n) == 2) {
5070 n = CHILD(n, 1);
5071 goto loop;
5072 } else {
5073 symtable_node(st, CHILD(n, 1));
5074 n = CHILD(n, 3);
5075 goto loop;
5076 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 case except_clause:
5078 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005079 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 if (NCH(n) > 1) {
5081 n = CHILD(n, 1);
5082 goto loop;
5083 }
5084 break;
5085 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005086 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005087 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005088 case yield_stmt:
5089 st->st_cur->ste_generator = 1;
5090 n = CHILD(n, 1);
5091 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 case expr_stmt:
5093 if (NCH(n) == 1)
5094 n = CHILD(n, 0);
5095 else {
5096 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005097 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 symtable_node(st, CHILD(n, 2));
5099 break;
5100 } else {
5101 int i;
5102 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005103 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 n = CHILD(n, NCH(n) - 1);
5105 }
5106 }
5107 goto loop;
5108 /* watchout for fall-through logic below */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 case argument:
5110 if (NCH(n) == 3) {
5111 n = CHILD(n, 2);
5112 goto loop;
5113 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005114 case listmaker:
5115 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005116 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005117 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005118 symtable_node(st, CHILD(n, 0));
5119 st->st_tmpname--;
5120 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 }
5122 case atom:
5123 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5124 symtable_add_use(st, STR(CHILD(n, 0)));
5125 break;
5126 }
5127 case for_stmt:
5128 if (TYPE(n) == for_stmt) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005129 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005130 start = 3;
5131 }
5132 default:
5133 if (NCH(n) == 1) {
5134 n = CHILD(n, 0);
5135 goto loop;
5136 }
5137 for (i = start; i < NCH(n); ++i)
5138 if (TYPE(CHILD(n, i)) >= single_input)
5139 symtable_node(st, CHILD(n, i));
5140 }
5141}
5142
5143static void
5144symtable_funcdef(struct symtable *st, node *n)
5145{
5146 node *body;
5147
5148 if (TYPE(n) == lambdef) {
5149 if (NCH(n) == 4)
5150 symtable_params(st, CHILD(n, 1));
5151 } else
5152 symtable_params(st, CHILD(n, 2));
5153 body = CHILD(n, NCH(n) - 1);
5154 symtable_node(st, body);
5155}
5156
5157/* The next two functions parse the argument tuple.
5158 symtable_default_arg() checks for names in the default arguments,
5159 which are references in the defining scope. symtable_params()
5160 parses the parameter names, which are defined in the function's
5161 body.
5162
5163 varargslist:
5164 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5165 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5166*/
5167
5168static void
5169symtable_default_args(struct symtable *st, node *n)
5170{
5171 node *c;
5172 int i;
5173
5174 if (TYPE(n) == parameters) {
5175 n = CHILD(n, 1);
5176 if (TYPE(n) == RPAR)
5177 return;
5178 }
5179 REQ(n, varargslist);
5180 for (i = 0; i < NCH(n); i += 2) {
5181 c = CHILD(n, i);
5182 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5183 break;
5184 }
5185 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5186 symtable_node(st, CHILD(n, i));
5187 }
5188}
5189
5190static void
5191symtable_params(struct symtable *st, node *n)
5192{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005193 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194 node *c = NULL;
5195
5196 if (TYPE(n) == parameters) {
5197 n = CHILD(n, 1);
5198 if (TYPE(n) == RPAR)
5199 return;
5200 }
5201 REQ(n, varargslist);
5202 for (i = 0; i < NCH(n); i += 2) {
5203 c = CHILD(n, i);
5204 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5205 ext = 1;
5206 break;
5207 }
5208 if (TYPE(c) == test) {
5209 continue;
5210 }
5211 if (TYPE(CHILD(c, 0)) == NAME)
5212 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5213 else {
5214 char nbuf[10];
5215 sprintf(nbuf, ".%d", i);
5216 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005217 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005218 }
5219 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005220 if (ext) {
5221 c = CHILD(n, i);
5222 if (TYPE(c) == STAR) {
5223 i++;
5224 symtable_add_def(st, STR(CHILD(n, i)),
5225 DEF_PARAM | DEF_STAR);
5226 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005227 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005228 c = NULL;
5229 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005230 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005231 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005232 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233 i++;
5234 symtable_add_def(st, STR(CHILD(n, i)),
5235 DEF_PARAM | DEF_DOUBLESTAR);
5236 }
5237 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005238 if (complex >= 0) {
5239 int j;
5240 for (j = 0; j <= complex; j++) {
5241 c = CHILD(n, j);
5242 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005243 c = CHILD(n, ++j);
5244 else if (TYPE(c) == EQUAL)
5245 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005246 if (TYPE(CHILD(c, 0)) == LPAR)
5247 symtable_params_fplist(st, CHILD(c, 1));
5248 }
5249 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250}
5251
5252static void
5253symtable_params_fplist(struct symtable *st, node *n)
5254{
5255 int i;
5256 node *c;
5257
5258 REQ(n, fplist);
5259 for (i = 0; i < NCH(n); i += 2) {
5260 c = CHILD(n, i);
5261 REQ(c, fpdef);
5262 if (NCH(c) == 1)
5263 symtable_add_def(st, STR(CHILD(c, 0)),
5264 DEF_PARAM | DEF_INTUPLE);
5265 else
5266 symtable_params_fplist(st, CHILD(c, 1));
5267 }
5268
5269}
5270
5271static void
5272symtable_global(struct symtable *st, node *n)
5273{
5274 int i;
5275
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005276 /* XXX It might be helpful to warn about module-level global
5277 statements, but it's hard to tell the difference between
5278 module-level and a string passed to exec.
5279 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005280
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005281 for (i = 1; i < NCH(n); i += 2) {
5282 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005283 int flags;
5284
5285 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005286 if (flags < 0)
5287 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005288 if (flags && flags != DEF_GLOBAL) {
5289 char buf[500];
5290 if (flags & DEF_PARAM) {
5291 PyErr_Format(PyExc_SyntaxError,
5292 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005293 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005294 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005295 st->st_cur->ste_lineno);
5296 st->st_errors++;
5297 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005298 }
5299 else {
5300 if (flags & DEF_LOCAL)
5301 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5302 name);
5303 else
5304 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005305 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005306 }
5307 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005308 symtable_add_def(st, name, DEF_GLOBAL);
5309 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310}
5311
5312static void
5313symtable_list_comprehension(struct symtable *st, node *n)
5314{
5315 char tmpname[12];
5316
Jeremy Hylton23b42272001-03-19 20:38:06 +00005317 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005318 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005319 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005320 symtable_node(st, CHILD(n, 3));
5321 if (NCH(n) == 5)
5322 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323}
5324
5325static void
5326symtable_import(struct symtable *st, node *n)
5327{
5328 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005329 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005330 | 'from' dotted_name 'import'
5331 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005332 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005334 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005335 node *dotname = CHILD(n, 1);
5336 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5337 /* check for bogus imports */
5338 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5339 PyErr_SetString(PyExc_SyntaxError,
5340 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005341 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005342 n->n_lineno);
5343 st->st_errors++;
5344 return;
5345 }
5346 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005348 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005349 if (symtable_warn(st,
5350 "import * only allowed at module level") < 0)
5351 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005352 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005353 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005354 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355 } else {
5356 for (i = 3; i < NCH(n); i += 2) {
5357 node *c = CHILD(n, i);
5358 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005359 symtable_assign(st, CHILD(c, 2),
5360 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005361 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005362 symtable_assign(st, CHILD(c, 0),
5363 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005364 }
5365 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005366 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005368 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369 }
5370 }
5371}
5372
5373static void
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005374symtable_assign(struct symtable *st, node *n, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005375{
5376 node *tmp;
5377 int i;
5378
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005379 loop:
5380 switch (TYPE(n)) {
5381 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005382 /* invalid assignment, e.g. lambda x:x=2. The next
5383 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005384 return;
5385 case power:
5386 if (NCH(n) > 2) {
5387 for (i = 2; i < NCH(n); ++i)
5388 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5389 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005391 if (NCH(n) > 1) {
5392 symtable_node(st, CHILD(n, 0));
5393 symtable_node(st, CHILD(n, 1));
5394 } else {
5395 n = CHILD(n, 0);
5396 goto loop;
5397 }
5398 return;
5399 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005400 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5401 /* XXX This is an error, but the next pass
5402 will catch it. */
5403 return;
5404 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005406 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005407 }
5408 return;
5409 case exprlist:
5410 case testlist:
5411 if (NCH(n) == 1) {
5412 n = CHILD(n, 0);
5413 goto loop;
5414 }
5415 else {
5416 int i;
5417 for (i = 0; i < NCH(n); i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005418 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 return;
5420 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005421 case atom:
5422 tmp = CHILD(n, 0);
5423 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5424 n = CHILD(n, 1);
5425 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005426 } else if (TYPE(tmp) == NAME) {
Jeremy Hyltona830b382001-04-09 16:07:59 +00005427 if (strcmp(STR(tmp), "__debug__") == 0)
5428 symtable_warn(st, ASSIGN_DEBUG);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005429 symtable_add_def(st, STR(tmp), DEF_LOCAL | flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005430 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 return;
5432 case dotted_as_name:
5433 if (NCH(n) == 3)
5434 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005435 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005436 else
5437 symtable_add_def(st,
5438 STR(CHILD(CHILD(n,
5439 0), 0)),
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005440 DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005441 return;
5442 case dotted_name:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005443 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005444 return;
5445 case NAME:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005446 symtable_add_def(st, STR(n), DEF_LOCAL | flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005447 return;
5448 default:
5449 if (NCH(n) == 0)
5450 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005451 if (NCH(n) == 1) {
5452 n = CHILD(n, 0);
5453 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005454 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005455 /* Should only occur for errors like x + 1 = 1,
5456 which will be caught in the next pass. */
5457 for (i = 0; i < NCH(n); ++i)
5458 if (TYPE(CHILD(n, i)) >= single_input)
5459 symtable_assign(st, CHILD(n, i), flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460 }
5461}