blob: b477513dc1fd05df42a0cea92de6eaa6d5af8261 [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;
271 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000272 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000273 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 consts == NULL || !PyTuple_Check(consts) ||
275 names == NULL || !PyTuple_Check(names) ||
276 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000277 freevars == NULL || !PyTuple_Check(freevars) ||
278 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 name == NULL || !PyString_Check(name) ||
280 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000281 lnotab == NULL || !PyString_Check(lnotab) ||
282 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000283 PyErr_BadInternalCall();
284 return NULL;
285 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000286 intern_strings(names);
287 intern_strings(varnames);
288 if (freevars == NULL)
289 freevars = PyTuple_New(0);
290 intern_strings(freevars);
291 if (cellvars == NULL)
292 cellvars = PyTuple_New(0);
293 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000294 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 for (i = PyTuple_Size(consts); --i >= 0; ) {
296 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000298 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000299 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000300 continue;
301 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000302 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000304 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305 co->co_argcount = argcount;
306 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000307 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000308 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000310 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000312 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000314 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000316 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000317 Py_INCREF(freevars);
318 co->co_freevars = freevars;
319 Py_INCREF(cellvars);
320 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000321 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000322 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000324 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000325 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000327 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000328 }
329 return co;
330}
331
332
333/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000334
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000335/* The compiler uses two passes to generate bytecodes. The first pass
336 builds the symbol table. The second pass generates the bytecode.
337
338 The first pass uses a single symtable struct. The second pass uses
339 a compiling struct for each code block. The compiling structs
340 share a reference to the symtable.
341
342 The two passes communicate via symtable_load_symbols() and via
343 is_local() and is_global(). The former initializes several slots
344 in the compiling struct: c_varnames, c_locals, c_nlocals,
345 c_argcount, c_globals, and c_flags.
346*/
347
Tim Peters2a7f3842001-06-09 09:26:21 +0000348/* All about c_lnotab.
349
350c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
351mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
352to source code line #s (when needed for tracebacks) via c_lnotab instead.
353The array is conceptually a list of
354 (bytecode offset increment, line number increment)
355pairs. The details are important and delicate, best illustrated by example:
356
357 byte code offset source code line number
358 0 1
359 6 2
360 50 7
361 350 307
362 361 308
363
364The first trick is that these numbers aren't stored, only the increments
365from one row to the next (this doesn't really work, but it's a start):
366
367 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
368
369The second trick is that an unsigned byte can't hold negative values, or
370values larger than 255, so (a) there's a deep assumption that byte code
371offsets and their corresponding line #s both increase monotonically, and (b)
372if at least one column jumps by more than 255 from one row to the next, more
373than one pair is written to the table. In case #b, there's no way to know
374from looking at the table later how many were written. That's the delicate
375part. A user of c_lnotab desiring to find the source line number
376corresponding to a bytecode address A should do something like this
377
378 lineno = addr = 0
379 for addr_incr, line_incr in c_lnotab:
380 addr += addr_incr
381 if addr > A:
382 return lineno
383 lineno += line_incr
384
385In order for this to work, when the addr field increments by more than 255,
386the line # increment in each pair generated must be 0 until the remaining addr
387increment is < 256. So, in the example above, com_set_lineno should not (as
388was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
389255, 0, 45, 255, 0, 45.
390*/
391
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000392struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000393 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000394 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000395 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000397 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 PyObject *c_globals; /* dictionary (value=None) */
399 PyObject *c_locals; /* dictionary (value=localID) */
400 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000401 PyObject *c_freevars; /* dictionary (value=None) */
402 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000403 int c_nlocals; /* index of next local */
404 int c_argcount; /* number of top-level arguments */
405 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000406 int c_nexti; /* index into c_code */
407 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000409 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000410 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000411 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000412 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000413 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000415 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000416 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000417 int c_stacklevel; /* Current stack level */
418 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000419 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000420 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000421 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000422 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000423 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000424 int c_nested; /* Is block nested funcdef or lamdef? */
425 int c_closure; /* Is nested w/freevars? */
426 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000427 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000428};
429
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000430static int
431is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000432{
433 if ((v & (USE | DEF_FREE))
434 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
435 return 1;
436 if (v & DEF_FREE_CLASS)
437 return 1;
438 return 0;
439}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000440
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000441static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000442com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000443{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000444 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
445
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000446 if (c == NULL) {
447 /* Error occurred via symtable call to
448 is_constant_false */
449 PyErr_SetString(exc, msg);
450 return;
451 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000452 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000453 if (c->c_lineno < 1 || c->c_interactive) {
454 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000456 return;
457 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000458 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000459 if (v == NULL)
460 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000461
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000462 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000463 if (line == NULL) {
464 Py_INCREF(Py_None);
465 line = Py_None;
466 }
467 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
468 Py_None, line);
469 if (t == NULL)
470 goto exit;
471 w = Py_BuildValue("(OO)", v, t);
472 if (w == NULL)
473 goto exit;
474 PyErr_SetObject(exc, w);
475 exit:
476 Py_XDECREF(t);
477 Py_XDECREF(v);
478 Py_XDECREF(w);
479 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000480}
481
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000482/* Interface to the block stack */
483
484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000485block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000486{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000487 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 com_error(c, PyExc_SystemError,
489 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000490 }
491 else {
492 c->c_block[c->c_nblocks++] = type;
493 }
494}
495
496static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000497block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498{
499 if (c->c_nblocks > 0)
500 c->c_nblocks--;
501 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000503 }
504}
505
Guido van Rossum681d79a1995-07-18 14:51:37 +0000506/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000507
Tim Petersdbd9ba62000-07-09 03:09:57 +0000508static int com_init(struct compiling *, char *);
509static void com_free(struct compiling *);
510static void com_push(struct compiling *, int);
511static void com_pop(struct compiling *, int);
512static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000513static void com_node(struct compiling *, node *);
514static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000515static void com_addbyte(struct compiling *, int);
516static void com_addint(struct compiling *, int);
517static void com_addoparg(struct compiling *, int, int);
518static void com_addfwref(struct compiling *, int, int *);
519static void com_backpatch(struct compiling *, int);
520static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
521static int com_addconst(struct compiling *, PyObject *);
522static int com_addname(struct compiling *, PyObject *);
523static void com_addopname(struct compiling *, int, node *);
524static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000525static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000526static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000527static void com_assign(struct compiling *, node *, int, node *);
528static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000529static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000530static PyCodeObject *jcompile(node *, char *, struct compiling *,
531 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000532static PyObject *parsestrplus(struct compiling*, node *);
533static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000534static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000535
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000536static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537
538/* symtable operations */
539static int symtable_build(struct compiling *, node *);
540static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000541static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000542static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000543static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000544static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000545static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000546
547static void symtable_node(struct symtable *, node *);
548static void symtable_funcdef(struct symtable *, node *);
549static void symtable_default_args(struct symtable *, node *);
550static void symtable_params(struct symtable *, node *);
551static void symtable_params_fplist(struct symtable *, node *n);
552static void symtable_global(struct symtable *, node *);
553static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000554static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000555static void symtable_list_comprehension(struct symtable *, node *);
556
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000557static int symtable_update_free_vars(struct symtable *);
558static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
559static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
560
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000561/* helper */
562static void
563do_pad(int pad)
564{
565 int i;
566 for (i = 0; i < pad; ++i)
567 fprintf(stderr, " ");
568}
569
570static void
571dump(node *n, int pad, int depth)
572{
573 int i;
574 if (depth == 0)
575 return;
576 do_pad(pad);
577 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
578 if (depth > 0)
579 depth--;
580 for (i = 0; i < NCH(n); ++i)
581 dump(CHILD(n, i), pad + 1, depth);
582}
583
584#define DUMP(N) dump(N, 0, -1)
585
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000586static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000587com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000588{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000589 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
591 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000592 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000594 goto fail;
595 if ((c->c_const_dict = PyDict_New()) == NULL)
596 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000598 goto fail;
599 if ((c->c_name_dict = PyDict_New()) == NULL)
600 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000602 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
604 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000605 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000606 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000607 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000608 c->c_freevars = NULL;
609 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000610 c->c_nlocals = 0;
611 c->c_argcount = 0;
612 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000613 c->c_nexti = 0;
614 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000615 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000616 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000617 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000618 c->c_begin = 0;
619 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000620 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000621 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000622 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000623 c->c_stacklevel = 0;
624 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000625 c->c_firstlineno = 0;
626 c->c_last_addr = 0;
627 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000628 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000629 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000630 c->c_nested = 0;
631 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000632 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633 return 1;
634
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000635 fail:
636 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000637 return 0;
638}
639
640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000641com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000642{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 Py_XDECREF(c->c_code);
644 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000645 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000647 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 Py_XDECREF(c->c_globals);
649 Py_XDECREF(c->c_locals);
650 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000651 Py_XDECREF(c->c_freevars);
652 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000654 if (c->c_future)
655 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000656}
657
658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000659com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000660{
661 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000662 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000663 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000664 /*
665 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
666 c->c_filename, c->c_name, c->c_lineno,
667 c->c_nexti, c->c_stacklevel, n);
668 */
669 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000670}
671
672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000673com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000674{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000675 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000676 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000677 else
678 c->c_stacklevel -= n;
679}
680
681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000682com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683{
684 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000685 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000686 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688}
689
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000690static int
691com_check_size(PyObject **s, int offset)
692{
693 int len = PyString_GET_SIZE(*s);
694 if (offset >= len)
695 return _PyString_Resize(s, len * 2);
696 return 0;
697}
698
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000700com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000701{
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);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000704 assert(c->c_code);
705 if (com_check_size(&c->c_code, c->c_nexti)) {
706 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000708 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000709 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000710}
711
712static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000713com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000715 com_addbyte(c, x & 0xff);
716 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000717}
718
719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000720com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000721{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000722 char *p;
723 if (c->c_lnotab == NULL)
724 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000725 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
726 c->c_errors++;
727 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000728 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000729 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000730 *p++ = addr;
731 *p++ = line;
732 c->c_lnotab_next += 2;
733}
734
735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000736com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000737{
738 c->c_lineno = lineno;
739 if (c->c_firstlineno == 0) {
740 c->c_firstlineno = c->c_last_line = lineno;
741 }
742 else {
743 int incr_addr = c->c_nexti - c->c_last_addr;
744 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000745 while (incr_addr > 255) {
746 com_add_lnotab(c, 255, 0);
747 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000748 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000749 while (incr_line > 255) {
750 com_add_lnotab(c, incr_addr, 255);
751 incr_line -=255;
752 incr_addr = 0;
753 }
754 if (incr_addr > 0 || incr_line > 0)
755 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000756 c->c_last_addr = c->c_nexti;
757 c->c_last_line = lineno;
758 }
759}
760
761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000762com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000763{
Fred Drakeef8ace32000-08-24 00:32:09 +0000764 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000765 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000766 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000767 if (Py_OptimizeFlag)
768 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000769 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000770 if (extended_arg){
771 com_addbyte(c, EXTENDED_ARG);
772 com_addint(c, extended_arg);
773 arg &= 0xffff;
774 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000775 com_addbyte(c, op);
776 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777}
778
779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000780com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781{
782 /* Compile a forward reference for backpatching */
783 int here;
784 int anchor;
785 com_addbyte(c, op);
786 here = c->c_nexti;
787 anchor = *p_anchor;
788 *p_anchor = here;
789 com_addint(c, anchor == 0 ? 0 : here - anchor);
790}
791
792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000793com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000795 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000797 int dist;
798 int prev;
799 for (;;) {
800 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000801 prev = code[anchor] + (code[anchor+1] << 8);
802 dist = target - (anchor+2);
803 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000804 dist >>= 8;
805 code[anchor+1] = dist;
806 dist >>= 8;
807 if (dist) {
808 com_error(c, PyExc_SystemError,
809 "com_backpatch: offset too large");
810 break;
811 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812 if (!prev)
813 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814 anchor -= prev;
815 }
816}
817
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000818/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819
820static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000821com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000823 PyObject *w, *t, *np=NULL;
824 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000825
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000826 t = Py_BuildValue("(OO)", v, v->ob_type);
827 if (t == NULL)
828 goto fail;
829 w = PyDict_GetItem(dict, t);
830 if (w != NULL) {
831 n = PyInt_AsLong(w);
832 } else {
833 n = PyList_Size(list);
834 np = PyInt_FromLong(n);
835 if (np == NULL)
836 goto fail;
837 if (PyList_Append(list, v) != 0)
838 goto fail;
839 if (PyDict_SetItem(dict, t, np) != 0)
840 goto fail;
841 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000842 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000843 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000844 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000845 fail:
846 Py_XDECREF(np);
847 Py_XDECREF(t);
848 c->c_errors++;
849 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850}
851
852static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000855 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000856}
857
858static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000860{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000861 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862}
863
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000864static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000865mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000866{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000867 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000869 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000870 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
871 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000872 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000873 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000874 return 0; /* Don't mangle __extremely_long_names */
875 if (name[nlen-1] == '_' && name[nlen-2] == '_')
876 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000877 /* Strip leading underscores from class name */
878 while (*p == '_')
879 p++;
880 if (*p == '\0')
881 return 0; /* Don't mangle if class is just underscores */
882 plen = strlen(p);
883 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000884 plen = maxlen-nlen-2; /* Truncate class name if too long */
885 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000886 buffer[0] = '_';
887 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000888 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000889 return 1;
890}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000891
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000892static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000893com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000894{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000897 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000898
899 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000900 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000901 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 c->c_errors++;
903 i = 255;
904 }
905 else {
906 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000908 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000909 com_addoparg(c, op, i);
910}
911
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000912#define NAME_LOCAL 0
913#define NAME_GLOBAL 1
914#define NAME_DEFAULT 2
915#define NAME_CLOSURE 3
916
917static int
918com_lookup_arg(PyObject *dict, PyObject *name)
919{
920 PyObject *v = PyDict_GetItem(dict, name);
921 if (v == NULL)
922 return -1;
923 else
924 return PyInt_AS_LONG(v);
925}
926
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000927static void
928com_addop_varname(struct compiling *c, int kind, char *name)
929{
930 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000931 int i, reftype;
932 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000933 int op = STOP_CODE;
934 char buffer[MANGLE_LEN];
935
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000936 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 name = buffer;
938 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
939 c->c_errors++;
940 i = 255;
941 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000942 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000943
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000944 reftype = get_ref_type(c, name);
945 switch (reftype) {
946 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000947 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 scope = NAME_LOCAL;
949 break;
950 case GLOBAL_EXPLICIT:
951 scope = NAME_GLOBAL;
952 break;
953 case GLOBAL_IMPLICIT:
954 if (c->c_flags & CO_OPTIMIZED)
955 scope = NAME_GLOBAL;
956 break;
957 case FREE:
958 case CELL:
959 scope = NAME_CLOSURE;
960 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961 }
962
963 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000964 if (scope == NAME_LOCAL)
965 i = com_lookup_arg(c->c_locals, v);
966 else if (reftype == FREE)
967 i = com_lookup_arg(c->c_freevars, v);
968 else if (reftype == CELL)
969 i = com_lookup_arg(c->c_cellvars, v);
970 if (i == -1) {
971 c->c_errors++; /* XXX no exception set */
972 i = 255;
973 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974 }
975 Py_DECREF(v);
976
977 switch (kind) {
978 case VAR_LOAD:
979 switch (scope) {
980 case NAME_LOCAL:
981 op = LOAD_FAST;
982 break;
983 case NAME_GLOBAL:
984 op = LOAD_GLOBAL;
985 break;
986 case NAME_DEFAULT:
987 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000988 break;
989 case NAME_CLOSURE:
990 op = LOAD_DEREF;
991 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000992 }
993 break;
994 case VAR_STORE:
995 switch (scope) {
996 case NAME_LOCAL:
997 op = STORE_FAST;
998 break;
999 case NAME_GLOBAL:
1000 op = STORE_GLOBAL;
1001 break;
1002 case NAME_DEFAULT:
1003 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001004 break;
1005 case NAME_CLOSURE:
1006 op = STORE_DEREF;
1007 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001008 }
1009 break;
1010 case VAR_DELETE:
1011 switch (scope) {
1012 case NAME_LOCAL:
1013 op = DELETE_FAST;
1014 break;
1015 case NAME_GLOBAL:
1016 op = DELETE_GLOBAL;
1017 break;
1018 case NAME_DEFAULT:
1019 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001020 break;
1021 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001022 char buf[500];
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001023 sprintf(buf, DEL_CLOSURE_ERROR, name);
1024 com_error(c, PyExc_SyntaxError, buf);
1025 i = 255;
1026 break;
1027 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001028 }
1029 break;
1030 }
1031done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032 com_addoparg(c, op, i);
1033}
1034
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001036com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001037{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001038 char *name;
1039 char buffer[1000];
1040 /* XXX it is possible to write this code without the 1000
1041 chars on the total length of dotted names, I just can't be
1042 bothered right now */
1043 if (TYPE(n) == STAR)
1044 name = "*";
1045 else if (TYPE(n) == dotted_name) {
1046 char *p = buffer;
1047 int i;
1048 name = buffer;
1049 for (i = 0; i < NCH(n); i += 2) {
1050 char *s = STR(CHILD(n, i));
1051 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001053 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001054 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001055 break;
1056 }
1057 if (p != buffer)
1058 *p++ = '.';
1059 strcpy(p, s);
1060 p = strchr(p, '\0');
1061 }
1062 }
1063 else {
1064 REQ(n, NAME);
1065 name = STR(n);
1066 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001067 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001068}
1069
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001071parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001073 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001075 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001076#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001077 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001078 int imflag;
1079#endif
1080
Guido van Rossum282914b1991-04-04 10:42:56 +00001081 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001082 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001083#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001084 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001085#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001086 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001088 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001090 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001092 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001093 if (errno != 0)
1094 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001096 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001097 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001098#ifndef WITHOUT_COMPLEX
1099 if (imflag) {
1100 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001101 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001102 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001103 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001105 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001106 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001107#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001108 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001109 PyFPE_START_PROTECT("atof", return 0)
1110 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001111 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001113 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114}
1115
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001117parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001120 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 char *buf;
1122 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001123 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001124 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001125 int first = *s;
1126 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001127 int rawmode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001128#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001129 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001130#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001131 if (isalpha(quote) || quote == '_') {
1132 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001133#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001134 quote = *++s;
1135 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001136#else
1137 com_error(com, PyExc_SyntaxError,
1138 "Unicode literals not supported in this Python");
1139 return NULL;
1140#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001141 }
1142 if (quote == 'r' || quote == 'R') {
1143 quote = *++s;
1144 rawmode = 1;
1145 }
1146 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001147 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149 return NULL;
1150 }
1151 s++;
1152 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001153 if (len > INT_MAX) {
1154 PyErr_SetString(PyExc_OverflowError, "string to parse is too long");
1155 return NULL;
1156 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001157 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159 return NULL;
1160 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001161 if (len >= 4 && s[0] == quote && s[1] == quote) {
1162 s += 2;
1163 len -= 2;
1164 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001166 return NULL;
1167 }
1168 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001169#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001170 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001171 if (rawmode)
1172 return PyUnicode_DecodeRawUnicodeEscape(
1173 s, len, NULL);
1174 else
1175 return PyUnicode_DecodeUnicodeEscape(
1176 s, len, NULL);
1177 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001178#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001179 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 return PyString_FromStringAndSize(s, len);
1181 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001182 if (v == NULL)
1183 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001185 end = s + len;
1186 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001187 if (*s != '\\') {
1188 *p++ = *s++;
1189 continue;
1190 }
1191 s++;
1192 switch (*s++) {
1193 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001194 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001195 case '\\': *p++ = '\\'; break;
1196 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001197 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 case 'b': *p++ = '\b'; break;
1199 case 'f': *p++ = '\014'; break; /* FF */
1200 case 't': *p++ = '\t'; break;
1201 case 'n': *p++ = '\n'; break;
1202 case 'r': *p++ = '\r'; break;
1203 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001204 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1205 case '0': case '1': case '2': case '3':
1206 case '4': case '5': case '6': case '7':
1207 c = s[-1] - '0';
1208 if ('0' <= *s && *s <= '7') {
1209 c = (c<<3) + *s++ - '0';
1210 if ('0' <= *s && *s <= '7')
1211 c = (c<<3) + *s++ - '0';
1212 }
1213 *p++ = c;
1214 break;
1215 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001216 if (isxdigit(Py_CHARMASK(s[0]))
1217 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001218 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001219 c = Py_CHARMASK(*s);
1220 s++;
1221 if (isdigit(c))
1222 x = c - '0';
1223 else if (islower(c))
1224 x = 10 + c - 'a';
1225 else
1226 x = 10 + c - 'A';
1227 x = x << 4;
1228 c = Py_CHARMASK(*s);
1229 s++;
1230 if (isdigit(c))
1231 x += c - '0';
1232 else if (islower(c))
1233 x += 10 + c - 'a';
1234 else
1235 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001236 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237 break;
1238 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001239 PyErr_SetString(PyExc_ValueError,
1240 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001241 Py_DECREF(v);
1242 return NULL;
1243 default:
1244 *p++ = '\\';
1245 *p++ = s[-1];
1246 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 }
1248 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250 return v;
1251}
1252
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001254parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001255{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001257 int i;
1258 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001259 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001260 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001261 for (i = 1; i < NCH(n); i++) {
1262 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001264 if (s == NULL)
1265 goto onError;
1266 if (PyString_Check(v) && PyString_Check(s)) {
1267 PyString_ConcatAndDel(&v, s);
1268 if (v == NULL)
1269 goto onError;
1270 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001271#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001272 else {
1273 PyObject *temp;
1274 temp = PyUnicode_Concat(v, s);
1275 Py_DECREF(s);
1276 if (temp == NULL)
1277 goto onError;
1278 Py_DECREF(v);
1279 v = temp;
1280 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001281#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001282 }
1283 }
1284 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001285
1286 onError:
1287 Py_XDECREF(v);
1288 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001289}
1290
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001292com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001294 int anchor = 0;
1295 int save_begin = c->c_begin;
1296
1297 /* list_iter: for v in expr [list_iter] */
1298 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001299 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001300 c->c_begin = c->c_nexti;
1301 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001302 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001303 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001304 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001305 c->c_loops++;
1306 com_list_iter(c, n, e, t);
1307 c->c_loops--;
1308 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1309 c->c_begin = save_begin;
1310 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001311 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001312}
1313
1314static void
1315com_list_if(struct compiling *c, node *n, node *e, char *t)
1316{
1317 int anchor = 0;
1318 int a = 0;
1319 /* list_iter: 'if' test [list_iter] */
1320 com_addoparg(c, SET_LINENO, n->n_lineno);
1321 com_node(c, CHILD(n, 1));
1322 com_addfwref(c, JUMP_IF_FALSE, &a);
1323 com_addbyte(c, POP_TOP);
1324 com_pop(c, 1);
1325 com_list_iter(c, n, e, t);
1326 com_addfwref(c, JUMP_FORWARD, &anchor);
1327 com_backpatch(c, a);
1328 /* We jump here with an extra entry which we now pop */
1329 com_addbyte(c, POP_TOP);
1330 com_backpatch(c, anchor);
1331}
1332
1333static void
1334com_list_iter(struct compiling *c,
1335 node *p, /* parent of list_iter node */
1336 node *e, /* element expression node */
1337 char *t /* name of result list temp local */)
1338{
1339 /* list_iter is the last child in a listmaker, list_for, or list_if */
1340 node *n = CHILD(p, NCH(p)-1);
1341 if (TYPE(n) == list_iter) {
1342 n = CHILD(n, 0);
1343 switch (TYPE(n)) {
1344 case list_for:
1345 com_list_for(c, n, e, t);
1346 break;
1347 case list_if:
1348 com_list_if(c, n, e, t);
1349 break;
1350 default:
1351 com_error(c, PyExc_SystemError,
1352 "invalid list_iter node type");
1353 }
1354 }
1355 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001356 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001357 com_push(c, 1);
1358 com_node(c, e);
1359 com_addoparg(c, CALL_FUNCTION, 1);
1360 com_addbyte(c, POP_TOP);
1361 com_pop(c, 2);
1362 }
1363}
1364
1365static void
1366com_list_comprehension(struct compiling *c, node *n)
1367{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001368 /* listmaker: test list_for */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001369 char tmpname[12];
Tim Peters30814212001-02-17 05:30:26 +00001370 sprintf(tmpname, "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001371 com_addoparg(c, BUILD_LIST, 0);
1372 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1373 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001374 com_addop_name(c, LOAD_ATTR, "append");
1375 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001376 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001377 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001378 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001379 --c->c_tmpname;
1380}
1381
1382static void
1383com_listmaker(struct compiling *c, node *n)
1384{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001385 /* listmaker: test ( list_for | (',' test)* [','] ) */
1386 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001387 com_list_comprehension(c, n);
1388 else {
1389 int len = 0;
1390 int i;
1391 for (i = 0; i < NCH(n); i += 2, len++)
1392 com_node(c, CHILD(n, i));
1393 com_addoparg(c, BUILD_LIST, len);
1394 com_pop(c, len-1);
1395 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396}
1397
1398static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001399com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001400{
1401 int i;
1402 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1403 for (i = 0; i+2 < NCH(n); i += 4) {
1404 /* We must arrange things just right for STORE_SUBSCR.
1405 It wants the stack to look like (value) (dict) (key) */
1406 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001407 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001408 com_node(c, CHILD(n, i+2)); /* value */
1409 com_addbyte(c, ROT_TWO);
1410 com_node(c, CHILD(n, i)); /* key */
1411 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001413 }
1414}
1415
1416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001417com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418{
1419 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001421 int i;
1422 REQ(n, atom);
1423 ch = CHILD(n, 0);
1424 switch (TYPE(ch)) {
1425 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001427 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001428 com_push(c, 1);
1429 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 else
1431 com_node(c, CHILD(n, 1));
1432 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001433 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001434 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001436 com_push(c, 1);
1437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001439 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001441 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001444 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001445 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 break;
1447 case BACKQUOTE:
1448 com_node(c, CHILD(n, 1));
1449 com_addbyte(c, UNARY_CONVERT);
1450 break;
1451 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001452 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 i = 255;
1454 }
1455 else {
1456 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001458 }
1459 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001460 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461 break;
1462 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001463 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001464 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001465 c->c_errors++;
1466 i = 255;
1467 }
1468 else {
1469 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 }
1472 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001473 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474 break;
1475 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001476 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001477 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 break;
1479 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 com_error(c, PyExc_SystemError,
1481 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 }
1483}
1484
1485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001486com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487{
1488 if (NCH(n) == 1) {
1489 com_addbyte(c, op);
1490 }
1491 else if (NCH(n) == 2) {
1492 if (TYPE(CHILD(n, 0)) != COLON) {
1493 com_node(c, CHILD(n, 0));
1494 com_addbyte(c, op+1);
1495 }
1496 else {
1497 com_node(c, CHILD(n, 1));
1498 com_addbyte(c, op+2);
1499 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001500 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501 }
1502 else {
1503 com_node(c, CHILD(n, 0));
1504 com_node(c, CHILD(n, 2));
1505 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001506 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507 }
1508}
1509
Guido van Rossum635abd21997-01-06 22:56:52 +00001510static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001511com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1512{
1513 if (NCH(n) == 1) {
1514 com_addbyte(c, DUP_TOP);
1515 com_push(c, 1);
1516 com_addbyte(c, SLICE);
1517 com_node(c, augn);
1518 com_addbyte(c, opcode);
1519 com_pop(c, 1);
1520 com_addbyte(c, ROT_TWO);
1521 com_addbyte(c, STORE_SLICE);
1522 com_pop(c, 2);
1523 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1524 com_node(c, CHILD(n, 0));
1525 com_addoparg(c, DUP_TOPX, 2);
1526 com_push(c, 2);
1527 com_addbyte(c, SLICE+1);
1528 com_pop(c, 1);
1529 com_node(c, augn);
1530 com_addbyte(c, opcode);
1531 com_pop(c, 1);
1532 com_addbyte(c, ROT_THREE);
1533 com_addbyte(c, STORE_SLICE+1);
1534 com_pop(c, 3);
1535 } else if (NCH(n) == 2) {
1536 com_node(c, CHILD(n, 1));
1537 com_addoparg(c, DUP_TOPX, 2);
1538 com_push(c, 2);
1539 com_addbyte(c, SLICE+2);
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+2);
1546 com_pop(c, 3);
1547 } else {
1548 com_node(c, CHILD(n, 0));
1549 com_node(c, CHILD(n, 2));
1550 com_addoparg(c, DUP_TOPX, 3);
1551 com_push(c, 3);
1552 com_addbyte(c, SLICE+3);
1553 com_pop(c, 2);
1554 com_node(c, augn);
1555 com_addbyte(c, opcode);
1556 com_pop(c, 1);
1557 com_addbyte(c, ROT_FOUR);
1558 com_addbyte(c, STORE_SLICE+3);
1559 com_pop(c, 4);
1560 }
1561}
1562
1563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001564com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001565{
1566 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001567 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001568 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001569 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001571 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001572 }
1573 else {
1574 com_node(c, CHILD(n, 0));
1575 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001576 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001577 }
1578 m = n;
1579 do {
1580 m = CHILD(m, 0);
1581 } while (NCH(m) == 1);
1582 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001583 /* f(lambda x: x[0] = 3) ends up getting parsed with
1584 * LHS test = lambda x: x[0], and RHS test = 3.
1585 * SF bug 132313 points out that complaining about a keyword
1586 * then is very confusing.
1587 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001589 TYPE(m) == lambdef ?
1590 "lambda cannot contain assignment" :
1591 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001592 }
1593 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001595 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001597 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001598 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001599 else if (*pkeywords == NULL) {
1600 c->c_errors++;
1601 Py_DECREF(v);
1602 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 if (PyDict_GetItem(*pkeywords, v) != NULL)
1604 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001605 "duplicate keyword argument");
1606 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001608 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001609 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001610 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001612 }
1613 }
1614 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001615}
1616
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001618com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001619{
1620 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001621 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 }
1623 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001625 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001626 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001627 int star_flag = 0;
1628 int starstar_flag = 0;
1629 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001630 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001631 na = 0;
1632 nk = 0;
1633 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001634 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001635 if (TYPE(ch) == STAR ||
1636 TYPE(ch) == DOUBLESTAR)
1637 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001638 if (ch->n_lineno != lineno) {
1639 lineno = ch->n_lineno;
1640 com_addoparg(c, SET_LINENO, lineno);
1641 }
1642 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001643 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 na++;
1645 else
1646 nk++;
1647 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001649 while (i < NCH(n)) {
1650 node *tok = CHILD(n, i);
1651 node *ch = CHILD(n, i+1);
1652 i += 3;
1653 switch (TYPE(tok)) {
1654 case STAR: star_flag = 1; break;
1655 case DOUBLESTAR: starstar_flag = 1; break;
1656 }
1657 com_node(c, ch);
1658 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001659 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 com_error(c, PyExc_SyntaxError,
1661 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001662 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001663 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001664 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001665 star_flag + (starstar_flag << 1);
1666 else
1667 opcode = CALL_FUNCTION;
1668 com_addoparg(c, opcode, na | (nk << 8));
1669 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001670 }
1671}
1672
1673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001674com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001675{
1676 com_addopname(c, LOAD_ATTR, n);
1677}
1678
1679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001680com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001681{
1682 int i=0;
1683 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001684 node *ch;
1685
1686 /* first argument */
1687 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001688 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001689 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001690 i++;
1691 }
1692 else {
1693 com_node(c, CHILD(n,i));
1694 i++;
1695 REQ(CHILD(n,i),COLON);
1696 i++;
1697 }
1698 /* second argument */
1699 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1700 com_node(c, CHILD(n,i));
1701 i++;
1702 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001705 com_push(c, 1);
1706 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001707 /* remaining arguments */
1708 for (; i < NCH(n); i++) {
1709 ns++;
1710 ch=CHILD(n,i);
1711 REQ(ch, sliceop);
1712 if (NCH(ch) == 1) {
1713 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 }
1717 else
1718 com_node(c, CHILD(ch,1));
1719 }
1720 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001721 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001722}
1723
1724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001725com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001726{
1727 node *ch;
1728 REQ(n, subscript);
1729 ch = CHILD(n,0);
1730 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001731 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001732 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001733 com_push(c, 1);
1734 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001735 else {
1736 /* check for slice */
1737 if ((TYPE(ch) == COLON || NCH(n) > 1))
1738 com_sliceobj(c, n);
1739 else {
1740 REQ(ch, test);
1741 com_node(c, ch);
1742 }
1743 }
1744}
1745
1746static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001747com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001748{
1749 int i, op;
1750 REQ(n, subscriptlist);
1751 /* Check to make backward compatible slice behavior for '[i:j]' */
1752 if (NCH(n) == 1) {
1753 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001754 /* 'Basic' slice, should have exactly one colon. */
1755 if ((TYPE(CHILD(sub, 0)) == COLON
1756 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1757 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1758 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001759 switch (assigning) {
1760 case OP_DELETE:
1761 op = DELETE_SLICE;
1762 break;
1763 case OP_ASSIGN:
1764 op = STORE_SLICE;
1765 break;
1766 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001767 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001768 break;
1769 default:
1770 com_augassign_slice(c, sub, assigning, augn);
1771 return;
1772 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001773 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001774 if (op == STORE_SLICE)
1775 com_pop(c, 2);
1776 else if (op == DELETE_SLICE)
1777 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001778 return;
1779 }
1780 }
1781 /* Else normal subscriptlist. Compile each subscript. */
1782 for (i = 0; i < NCH(n); i += 2)
1783 com_subscript(c, CHILD(n, i));
1784 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001785 if (NCH(n) > 1) {
1786 i = (NCH(n)+1) / 2;
1787 com_addoparg(c, BUILD_TUPLE, i);
1788 com_pop(c, i-1);
1789 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001790 switch (assigning) {
1791 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001792 op = DELETE_SUBSCR;
1793 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001794 break;
1795 default:
1796 case OP_ASSIGN:
1797 op = STORE_SUBSCR;
1798 i = 3;
1799 break;
1800 case OP_APPLY:
1801 op = BINARY_SUBSCR;
1802 i = 1;
1803 break;
1804 }
1805 if (assigning > OP_APPLY) {
1806 com_addoparg(c, DUP_TOPX, 2);
1807 com_push(c, 2);
1808 com_addbyte(c, BINARY_SUBSCR);
1809 com_pop(c, 1);
1810 com_node(c, augn);
1811 com_addbyte(c, assigning);
1812 com_pop(c, 1);
1813 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001814 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001815 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001816 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001817}
1818
1819static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001820com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001821{
1822 REQ(n, trailer);
1823 switch (TYPE(CHILD(n, 0))) {
1824 case LPAR:
1825 com_call_function(c, CHILD(n, 1));
1826 break;
1827 case DOT:
1828 com_select_member(c, CHILD(n, 1));
1829 break;
1830 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001831 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832 break;
1833 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001835 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836 }
1837}
1838
1839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001840com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001841{
1842 int i;
1843 REQ(n, power);
1844 com_atom(c, CHILD(n, 0));
1845 for (i = 1; i < NCH(n); i++) {
1846 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1847 com_factor(c, CHILD(n, i+1));
1848 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001849 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001850 break;
1851 }
1852 else
1853 com_apply_trailer(c, CHILD(n, i));
1854 }
1855}
1856
1857static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001858com_invert_constant(struct compiling *c, node *n)
1859{
1860 /* Compute the inverse of int and longs and use them directly,
1861 but be prepared to generate code for all other
1862 possibilities (invalid numbers, floats, complex).
1863 */
1864 PyObject *num, *inv = NULL;
1865 int i;
1866
1867 REQ(n, NUMBER);
1868 num = parsenumber(c, STR(n));
1869 if (num == NULL)
1870 i = 255;
1871 else {
1872 inv = PyNumber_Invert(num);
1873 if (inv == NULL) {
1874 PyErr_Clear();
1875 i = com_addconst(c, num);
1876 } else {
1877 i = com_addconst(c, inv);
1878 Py_DECREF(inv);
1879 }
1880 Py_DECREF(num);
1881 }
1882 com_addoparg(c, LOAD_CONST, i);
1883 com_push(c, 1);
1884 if (num != NULL && inv == NULL)
1885 com_addbyte(c, UNARY_INVERT);
1886}
1887
Tim Peters51e26512001-09-07 08:45:55 +00001888static int
1889is_float_zero(const char *p)
1890{
1891 int found_radix_point = 0;
1892 int ch;
1893 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1894 switch (ch) {
1895 case '0':
1896 /* no reason to believe it's not 0 -- continue */
1897 break;
1898
1899 case 'e': case 'E': case 'j': case 'J':
1900 /* If this was a hex constant, we already would have
1901 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1902 must be an exponent marker, and we haven't yet
1903 seen a non-zero digit, and it doesn't matter what
1904 the exponent is then. For 'j' or 'J' similarly,
1905 except that this is an imaginary 0 then. */
1906 return 1;
1907
1908 case '.':
1909 found_radix_point = 1;
1910 break;
1911
1912 default:
1913 return 0;
1914 }
1915 }
1916 return found_radix_point;
1917}
1918
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001919static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001920com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001922 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001923 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001924 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001925 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001926 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001927 approriate value as a constant. If the value is negative,
1928 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001929 negative in the 0th position -- unless we're doing unary minus
1930 of a floating zero! In that case the sign is significant, but
1931 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001932 */
1933 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001934 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001935 && TYPE((pfactor = CHILD(n, 1))) == factor
1936 && NCH(pfactor) == 1
1937 && TYPE((ppower = CHILD(pfactor, 0))) == power
1938 && NCH(ppower) == 1
1939 && TYPE((patom = CHILD(ppower, 0))) == atom
1940 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1941 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001942 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001943 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001944 return;
1945 }
1946 if (childtype == MINUS) {
Tim Peters51e26512001-09-07 08:45:55 +00001947 char *s = malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001948 if (s == NULL) {
1949 com_error(c, PyExc_MemoryError, "");
1950 com_addbyte(c, 255);
1951 return;
1952 }
1953 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001954 strcpy(s + 1, STR(pnum));
1955 free(STR(pnum));
1956 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001957 }
Tim Peters51e26512001-09-07 08:45:55 +00001958 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001959 }
1960 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001961 com_factor(c, CHILD(n, 1));
1962 com_addbyte(c, UNARY_POSITIVE);
1963 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001964 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 com_factor(c, CHILD(n, 1));
1966 com_addbyte(c, UNARY_NEGATIVE);
1967 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001968 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001969 com_factor(c, CHILD(n, 1));
1970 com_addbyte(c, UNARY_INVERT);
1971 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001973 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001974 }
1975}
1976
1977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001978com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979{
1980 int i;
1981 int op;
1982 REQ(n, term);
1983 com_factor(c, CHILD(n, 0));
1984 for (i = 2; i < NCH(n); i += 2) {
1985 com_factor(c, CHILD(n, i));
1986 switch (TYPE(CHILD(n, i-1))) {
1987 case STAR:
1988 op = BINARY_MULTIPLY;
1989 break;
1990 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00001991 if (c->c_flags & CO_FUTURE_DIVISION)
1992 op = BINARY_TRUE_DIVIDE;
1993 else
1994 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 break;
1996 case PERCENT:
1997 op = BINARY_MODULO;
1998 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00001999 case DOUBLESLASH:
2000 op = BINARY_FLOOR_DIVIDE;
2001 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002003 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002004 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002005 op = 255;
2006 }
2007 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002009 }
2010}
2011
2012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002013com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002014{
2015 int i;
2016 int op;
2017 REQ(n, arith_expr);
2018 com_term(c, CHILD(n, 0));
2019 for (i = 2; i < NCH(n); i += 2) {
2020 com_term(c, CHILD(n, i));
2021 switch (TYPE(CHILD(n, i-1))) {
2022 case PLUS:
2023 op = BINARY_ADD;
2024 break;
2025 case MINUS:
2026 op = BINARY_SUBTRACT;
2027 break;
2028 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002030 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002031 op = 255;
2032 }
2033 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002034 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002035 }
2036}
2037
2038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002040{
2041 int i;
2042 int op;
2043 REQ(n, shift_expr);
2044 com_arith_expr(c, CHILD(n, 0));
2045 for (i = 2; i < NCH(n); i += 2) {
2046 com_arith_expr(c, CHILD(n, i));
2047 switch (TYPE(CHILD(n, i-1))) {
2048 case LEFTSHIFT:
2049 op = BINARY_LSHIFT;
2050 break;
2051 case RIGHTSHIFT:
2052 op = BINARY_RSHIFT;
2053 break;
2054 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002056 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002057 op = 255;
2058 }
2059 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002060 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002061 }
2062}
2063
2064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002065com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002066{
2067 int i;
2068 int op;
2069 REQ(n, and_expr);
2070 com_shift_expr(c, CHILD(n, 0));
2071 for (i = 2; i < NCH(n); i += 2) {
2072 com_shift_expr(c, CHILD(n, i));
2073 if (TYPE(CHILD(n, i-1)) == AMPER) {
2074 op = BINARY_AND;
2075 }
2076 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002077 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002078 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002079 op = 255;
2080 }
2081 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002083 }
2084}
2085
2086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002087com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002088{
2089 int i;
2090 int op;
2091 REQ(n, xor_expr);
2092 com_and_expr(c, CHILD(n, 0));
2093 for (i = 2; i < NCH(n); i += 2) {
2094 com_and_expr(c, CHILD(n, i));
2095 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2096 op = BINARY_XOR;
2097 }
2098 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002099 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002100 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 op = 255;
2102 }
2103 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 }
2106}
2107
2108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002109com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110{
2111 int i;
2112 int op;
2113 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002114 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002116 com_xor_expr(c, CHILD(n, i));
2117 if (TYPE(CHILD(n, i-1)) == VBAR) {
2118 op = BINARY_OR;
2119 }
2120 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002121 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002122 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 op = 255;
2124 }
2125 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002126 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127 }
2128}
2129
2130static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002132{
2133 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002134 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002135 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2136 if (NCH(n) == 1) {
2137 n = CHILD(n, 0);
2138 switch (TYPE(n)) {
2139 case LESS: return LT;
2140 case GREATER: return GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002141 case EQEQUAL: /* == */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 case EQUAL: return EQ;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002143 case LESSEQUAL: return LE;
2144 case GREATEREQUAL: return GE;
2145 case NOTEQUAL: return NE; /* <> or != */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 case NAME: if (strcmp(STR(n), "in") == 0) return IN;
2147 if (strcmp(STR(n), "is") == 0) return IS;
2148 }
2149 }
2150 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
2153 return NOT_IN;
2154 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
2155 return IS_NOT;
2156 }
2157 }
2158 return BAD;
2159}
2160
2161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002162com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163{
2164 int i;
2165 enum cmp_op op;
2166 int anchor;
2167 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2168 com_expr(c, CHILD(n, 0));
2169 if (NCH(n) == 1)
2170 return;
2171
2172 /****************************************************************
2173 The following code is generated for all but the last
2174 comparison in a chain:
2175
2176 label: on stack: opcode: jump to:
2177
2178 a <code to load b>
2179 a, b DUP_TOP
2180 a, b, b ROT_THREE
2181 b, a, b COMPARE_OP
2182 b, 0-or-1 JUMP_IF_FALSE L1
2183 b, 1 POP_TOP
2184 b
2185
2186 We are now ready to repeat this sequence for the next
2187 comparison in the chain.
2188
2189 For the last we generate:
2190
2191 b <code to load c>
2192 b, c COMPARE_OP
2193 0-or-1
2194
2195 If there were any jumps to L1 (i.e., there was more than one
2196 comparison), we generate:
2197
2198 0-or-1 JUMP_FORWARD L2
2199 L1: b, 0 ROT_TWO
2200 0, b POP_TOP
2201 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 ****************************************************************/
2204
2205 anchor = 0;
2206
2207 for (i = 2; i < NCH(n); i += 2) {
2208 com_expr(c, CHILD(n, i));
2209 if (i+2 < NCH(n)) {
2210 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002211 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002212 com_addbyte(c, ROT_THREE);
2213 }
2214 op = cmp_type(CHILD(n, i-1));
2215 if (op == BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002216 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002217 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 }
2219 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002220 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002221 if (i+2 < NCH(n)) {
2222 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2223 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002224 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 }
2226 }
2227
2228 if (anchor) {
2229 int anchor2 = 0;
2230 com_addfwref(c, JUMP_FORWARD, &anchor2);
2231 com_backpatch(c, anchor);
2232 com_addbyte(c, ROT_TWO);
2233 com_addbyte(c, POP_TOP);
2234 com_backpatch(c, anchor2);
2235 }
2236}
2237
2238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002239com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240{
2241 REQ(n, not_test); /* 'not' not_test | comparison */
2242 if (NCH(n) == 1) {
2243 com_comparison(c, CHILD(n, 0));
2244 }
2245 else {
2246 com_not_test(c, CHILD(n, 1));
2247 com_addbyte(c, UNARY_NOT);
2248 }
2249}
2250
2251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002252com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002253{
2254 int i;
2255 int anchor;
2256 REQ(n, and_test); /* not_test ('and' not_test)* */
2257 anchor = 0;
2258 i = 0;
2259 for (;;) {
2260 com_not_test(c, CHILD(n, i));
2261 if ((i += 2) >= NCH(n))
2262 break;
2263 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2264 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002265 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002266 }
2267 if (anchor)
2268 com_backpatch(c, anchor);
2269}
2270
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002271static int
2272com_make_closure(struct compiling *c, PyCodeObject *co)
2273{
2274 int i, free = PyTuple_GET_SIZE(co->co_freevars);
2275 if (free == 0)
2276 return 0;
2277 for (i = 0; i < free; ++i) {
2278 /* Bypass com_addop_varname because it will generate
2279 LOAD_DEREF but LOAD_CLOSURE is needed.
2280 */
2281 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2282 int arg, reftype;
2283
2284 /* Special case: If a class contains a method with a
2285 free variable that has the same name as a method,
2286 the name will be considered free *and* local in the
2287 class. It should be handled by the closure, as
2288 well as by the normal name loookup logic.
2289 */
2290 reftype = get_ref_type(c, PyString_AS_STRING(name));
2291 if (reftype == CELL)
2292 arg = com_lookup_arg(c->c_cellvars, name);
2293 else /* (reftype == FREE) */
2294 arg = com_lookup_arg(c->c_freevars, name);
2295 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002296 fprintf(stderr, "lookup %s in %s %d %d\n"
2297 "freevars of %s: %s\n",
2298 PyObject_REPR(name),
2299 c->c_name,
2300 reftype, arg,
2301 PyString_AS_STRING(co->co_name),
2302 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002303 Py_FatalError("com_make_closure()");
2304 }
2305 com_addoparg(c, LOAD_CLOSURE, arg);
2306
2307 }
2308 com_push(c, free);
2309 return 1;
2310}
2311
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002313com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002315 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002316 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002317 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002318 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002319 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002320 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2321 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002322 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002323 if (co == NULL) {
2324 c->c_errors++;
2325 return;
2326 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002327 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002328 i = com_addconst(c, (PyObject *)co);
2329 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002330 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002332 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002333 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002334 com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
2335 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002336 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002337 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002340 else {
2341 int anchor = 0;
2342 int i = 0;
2343 for (;;) {
2344 com_and_test(c, CHILD(n, i));
2345 if ((i += 2) >= NCH(n))
2346 break;
2347 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2348 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002350 }
2351 if (anchor)
2352 com_backpatch(c, anchor);
2353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354}
2355
2356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002357com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358{
2359 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002360 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 com_node(c, CHILD(n, 0));
2362 }
2363 else {
2364 int i;
2365 int len;
2366 len = (NCH(n) + 1) / 2;
2367 for (i = 0; i < NCH(n); i += 2)
2368 com_node(c, CHILD(n, i));
2369 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002370 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 }
2372}
2373
2374
2375/* Begin of assignment compilation */
2376
Thomas Wouters434d0822000-08-24 20:11:32 +00002377
2378static void
2379com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2380{
2381 com_addbyte(c, DUP_TOP);
2382 com_push(c, 1);
2383 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002384 com_node(c, augn);
2385 com_addbyte(c, opcode);
2386 com_pop(c, 1);
2387 com_addbyte(c, ROT_TWO);
2388 com_addopname(c, STORE_ATTR, n);
2389 com_pop(c, 2);
2390}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391
2392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002393com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394{
2395 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002397}
2398
2399static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002400com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 REQ(n, trailer);
2403 switch (TYPE(CHILD(n, 0))) {
2404 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002405 com_error(c, PyExc_SyntaxError,
2406 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407 break;
2408 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002409 if (assigning > OP_APPLY)
2410 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2411 else
2412 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002414 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002415 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 break;
2417 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 }
2420}
2421
2422static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002423com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002424{
2425 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002426 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002428 if (assigning) {
2429 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002430 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002431 com_push(c, i-1);
2432 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002434 com_assign(c, CHILD(n, i), assigning, NULL);
2435}
2436
2437static void
2438com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2439{
2440 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002441 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002442 com_push(c, 1);
2443 com_node(c, augn);
2444 com_addbyte(c, opcode);
2445 com_pop(c, 1);
2446 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447}
2448
2449static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002450com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002451{
2452 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002453 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002454 if (assigning)
2455 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002456}
2457
2458static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002459com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002460{
2461 /* Loop to avoid trivial recursion */
2462 for (;;) {
2463 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002464
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465 case exprlist:
2466 case testlist:
2467 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002468 if (assigning > OP_APPLY) {
2469 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002470 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002471 return;
2472 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002473 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474 return;
2475 }
2476 n = CHILD(n, 0);
2477 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002478
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 case test:
2480 case and_test:
2481 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002483 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002484 case xor_expr:
2485 case and_expr:
2486 case shift_expr:
2487 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002489 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002491 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002492 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 return;
2494 }
2495 n = CHILD(n, 0);
2496 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002497
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002498 case power: /* atom trailer* ('**' power)*
2499 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002500 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002501 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002502 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503 return;
2504 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002505 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002506 int i;
2507 com_node(c, CHILD(n, 0));
2508 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002509 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002510 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002511 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002512 return;
2513 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 com_apply_trailer(c, CHILD(n, i));
2515 } /* NB i is still alive */
2516 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002517 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002518 return;
2519 }
2520 n = CHILD(n, 0);
2521 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002522
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523 case atom:
2524 switch (TYPE(CHILD(n, 0))) {
2525 case LPAR:
2526 n = CHILD(n, 1);
2527 if (TYPE(n) == RPAR) {
2528 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002530 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531 return;
2532 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002533 if (assigning > OP_APPLY) {
2534 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002535 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002536 return;
2537 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 break;
2539 case LSQB:
2540 n = CHILD(n, 1);
2541 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002542 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002543 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 return;
2545 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002546 if (assigning > OP_APPLY) {
2547 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002548 "augmented assign to list not possible");
2549 return;
2550 }
2551 if (NCH(n) > 1
2552 && TYPE(CHILD(n, 1)) == list_for) {
2553 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002554 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002555 return;
2556 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002557 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 return;
2559 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002560 if (assigning > OP_APPLY)
2561 com_augassign_name(c, CHILD(n, 0),
2562 assigning, augn);
2563 else
2564 com_assign_name(c, CHILD(n, 0),
2565 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 return;
2567 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002568 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002569 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 return;
2571 }
2572 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002573
2574 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002575 com_error(c, PyExc_SyntaxError,
2576 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002577 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002578
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002580 com_error(c, PyExc_SystemError,
2581 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002583
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 }
2585 }
2586}
Guido van Rossum7c531111997-03-11 18:42:21 +00002587
Thomas Wouters434d0822000-08-24 20:11:32 +00002588static void
2589com_augassign(struct compiling *c, node *n)
2590{
2591 int opcode;
2592
2593 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2594 case '+': opcode = INPLACE_ADD; break;
2595 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002596 case '/':
2597 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2598 opcode = INPLACE_FLOOR_DIVIDE;
2599 else if (c->c_flags & CO_FUTURE_DIVISION)
2600 opcode = INPLACE_TRUE_DIVIDE;
2601 else
2602 opcode = INPLACE_DIVIDE;
2603 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002604 case '%': opcode = INPLACE_MODULO; break;
2605 case '<': opcode = INPLACE_LSHIFT; break;
2606 case '>': opcode = INPLACE_RSHIFT; break;
2607 case '&': opcode = INPLACE_AND; break;
2608 case '^': opcode = INPLACE_XOR; break;
2609 case '|': opcode = INPLACE_OR; break;
2610 case '*':
2611 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2612 opcode = INPLACE_POWER;
2613 else
2614 opcode = INPLACE_MULTIPLY;
2615 break;
2616 default:
2617 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2618 return;
2619 }
2620 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2621}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622
2623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002624com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625{
Thomas Wouters434d0822000-08-24 20:11:32 +00002626 REQ(n, expr_stmt);
2627 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002628 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002629 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002630 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002631 if (NCH(n) == 1) {
2632 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002633 if (c->c_interactive)
2634 com_addbyte(c, PRINT_EXPR);
2635 else
2636 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002638 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002639 else if (TYPE(CHILD(n,1)) == augassign)
2640 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 else {
2642 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002643 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002644 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 com_push(c, 1);
2648 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002649 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002650 }
2651 }
2652}
2653
2654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002655com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002656{
2657 int a = 0, b = 0;
2658 int i;
2659 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2660 /* Generate code like for
2661
2662 if __debug__:
2663 if not <test>:
2664 raise AssertionError [, <message>]
2665
2666 where <message> is the second test, if present.
2667 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002668
Guido van Rossum228d7f31997-04-02 05:24:36 +00002669 if (Py_OptimizeFlag)
2670 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002671 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002672 com_push(c, 1);
2673 com_addfwref(c, JUMP_IF_FALSE, &a);
2674 com_addbyte(c, POP_TOP);
2675 com_pop(c, 1);
2676 com_node(c, CHILD(n, 1));
2677 com_addfwref(c, JUMP_IF_TRUE, &b);
2678 com_addbyte(c, POP_TOP);
2679 com_pop(c, 1);
2680 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002681 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002682 com_push(c, 1);
2683 i = NCH(n)/2; /* Either 2 or 4 */
2684 if (i > 1)
2685 com_node(c, CHILD(n, 3));
2686 com_addoparg(c, RAISE_VARARGS, i);
2687 com_pop(c, i);
2688 /* The interpreter does not fall through */
2689 /* All jumps converge here */
2690 com_backpatch(c, a);
2691 com_backpatch(c, b);
2692 com_addbyte(c, POP_TOP);
2693}
2694
2695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002696com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002697{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002698 int i = 1;
2699 node* stream = NULL;
2700
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002701 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002702
2703 /* are we using the extended print form? */
2704 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2705 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002706 com_node(c, stream);
2707 /* stack: [...] => [... stream] */
2708 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002709 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2710 i = 4;
2711 else
2712 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002714 for (; i < NCH(n); i += 2) {
2715 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002716 com_addbyte(c, DUP_TOP);
2717 /* stack: [stream] => [stream stream] */
2718 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002719 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002720 /* stack: [stream stream] => [stream stream obj] */
2721 com_addbyte(c, ROT_TWO);
2722 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002723 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002724 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002725 com_pop(c, 2);
2726 }
2727 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002728 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002729 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002730 com_addbyte(c, PRINT_ITEM);
2731 com_pop(c, 1);
2732 }
2733 }
2734 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002735 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002736 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002737 /* must pop the extra stream object off the stack */
2738 com_addbyte(c, POP_TOP);
2739 /* stack: [... stream] => [...] */
2740 com_pop(c, 1);
2741 }
2742 }
2743 else {
2744 if (stream != NULL) {
2745 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002746 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002747 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002748 com_pop(c, 1);
2749 }
2750 else
2751 com_addbyte(c, PRINT_NEWLINE);
2752 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002753}
2754
2755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002758 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002759 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002761 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002762 if (c->c_flags & CO_GENERATOR) {
2763 if (NCH(n) > 1) {
2764 com_error(c, PyExc_SyntaxError,
2765 "'return' with argument inside generator");
2766 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002767 }
2768 if (NCH(n) < 2) {
2769 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002770 com_push(c, 1);
2771 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002772 else
2773 com_node(c, CHILD(n, 1));
2774 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002775 com_pop(c, 1);
2776}
2777
2778static void
2779com_yield_stmt(struct compiling *c, node *n)
2780{
Tim Peters95c80f82001-06-23 02:07:08 +00002781 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002782 REQ(n, yield_stmt); /* 'yield' testlist */
2783 if (!c->c_infunction) {
2784 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2785 }
Tim Peters95c80f82001-06-23 02:07:08 +00002786
2787 for (i = 0; i < c->c_nblocks; ++i) {
2788 if (c->c_block[i] == SETUP_FINALLY) {
2789 com_error(c, PyExc_SyntaxError,
2790 "'yield' not allowed in a 'try' block "
2791 "with a 'finally' clause");
2792 return;
2793 }
2794 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002795 com_node(c, CHILD(n, 1));
2796 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002797 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798}
2799
2800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002801com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002803 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002804 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2805 if (NCH(n) > 1) {
2806 com_node(c, CHILD(n, 1));
2807 if (NCH(n) > 3) {
2808 com_node(c, CHILD(n, 3));
2809 if (NCH(n) > 5)
2810 com_node(c, CHILD(n, 5));
2811 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002812 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002813 i = NCH(n)/2;
2814 com_addoparg(c, RAISE_VARARGS, i);
2815 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816}
2817
2818static void
Thomas Wouters52152252000-08-17 22:55:00 +00002819com_from_import(struct compiling *c, node *n)
2820{
2821 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2822 com_push(c, 1);
2823 if (NCH(n) > 1) {
2824 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2825 com_error(c, PyExc_SyntaxError, "invalid syntax");
2826 return;
2827 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002828 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002829 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002830 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002831 com_pop(c, 1);
2832}
2833
2834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002835com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836{
2837 int i;
2838 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002839 /* 'import' dotted_name (',' dotted_name)* |
2840 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002842 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002843 /* 'from' dotted_name 'import' ... */
2844 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002845
2846 if (TYPE(CHILD(n, 3)) == STAR) {
2847 tup = Py_BuildValue("(s)", "*");
2848 } else {
2849 tup = PyTuple_New((NCH(n) - 2)/2);
2850 for (i = 3; i < NCH(n); i += 2) {
2851 PyTuple_SET_ITEM(tup, (i-3)/2,
2852 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002853 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002854 }
2855 }
2856 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002857 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002858 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002859 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002860 if (TYPE(CHILD(n, 3)) == STAR)
2861 com_addbyte(c, IMPORT_STAR);
2862 else {
2863 for (i = 3; i < NCH(n); i += 2)
2864 com_from_import(c, CHILD(n, i));
2865 com_addbyte(c, POP_TOP);
2866 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002867 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 }
2869 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002870 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002872 node *subn = CHILD(n, i);
2873 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002874 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002875 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002876 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002877 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002878 int j;
2879 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002880 com_error(c, PyExc_SyntaxError,
2881 "invalid syntax");
2882 return;
2883 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002884 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2885 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002886 CHILD(CHILD(subn, 0),
2887 j));
2888 com_addop_varname(c, VAR_STORE,
2889 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002890 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002891 com_addop_varname(c, VAR_STORE,
2892 STR(CHILD(CHILD(subn, 0),
2893 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002894 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 }
2896 }
2897}
2898
2899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002901{
2902 REQ(n, exec_stmt);
2903 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2904 com_node(c, CHILD(n, 1));
2905 if (NCH(n) >= 4)
2906 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002907 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002908 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002909 com_push(c, 1);
2910 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002911 if (NCH(n) >= 6)
2912 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002913 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002914 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002915 com_push(c, 1);
2916 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002917 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002919}
2920
Guido van Rossum7c531111997-03-11 18:42:21 +00002921static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002922is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002923{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002924 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002925 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002926 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002927
2928 /* Label to avoid tail recursion */
2929 next:
2930 switch (TYPE(n)) {
2931
2932 case suite:
2933 if (NCH(n) == 1) {
2934 n = CHILD(n, 0);
2935 goto next;
2936 }
2937 /* Fall through */
2938 case file_input:
2939 for (i = 0; i < NCH(n); i++) {
2940 node *ch = CHILD(n, i);
2941 if (TYPE(ch) == stmt) {
2942 n = ch;
2943 goto next;
2944 }
2945 }
2946 break;
2947
2948 case stmt:
2949 case simple_stmt:
2950 case small_stmt:
2951 n = CHILD(n, 0);
2952 goto next;
2953
2954 case expr_stmt:
2955 case testlist:
2956 case test:
2957 case and_test:
2958 case not_test:
2959 case comparison:
2960 case expr:
2961 case xor_expr:
2962 case and_expr:
2963 case shift_expr:
2964 case arith_expr:
2965 case term:
2966 case factor:
2967 case power:
2968 case atom:
2969 if (NCH(n) == 1) {
2970 n = CHILD(n, 0);
2971 goto next;
2972 }
2973 break;
2974
2975 case NAME:
2976 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2977 return 1;
2978 break;
2979
2980 case NUMBER:
2981 v = parsenumber(c, STR(n));
2982 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002983 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002984 break;
2985 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002986 i = PyObject_IsTrue(v);
2987 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002988 return i == 0;
2989
2990 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002991 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002992 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002993 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002994 break;
2995 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 i = PyObject_IsTrue(v);
2997 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002998 return i == 0;
2999
3000 }
3001 return 0;
3002}
3003
Tim Peters08a898f2001-06-28 01:52:22 +00003004
3005/* Look under n for a return stmt with an expression.
3006 * This hack is used to find illegal returns under "if 0:" blocks in
3007 * functions already known to be generators (as determined by the symtable
3008 * pass).
3009 * Return the offending return node if found, else NULL.
3010 */
3011static node *
3012look_for_offending_return(node *n)
3013{
3014 int i;
3015
3016 for (i = 0; i < NCH(n); ++i) {
3017 node *kid = CHILD(n, i);
3018
3019 switch (TYPE(kid)) {
3020 case classdef:
3021 case funcdef:
3022 case lambdef:
3023 /* Stuff in nested functions & classes doesn't
3024 affect the code block we started in. */
3025 return NULL;
3026
3027 case return_stmt:
3028 if (NCH(kid) > 1)
3029 return kid;
3030 break;
3031
3032 default: {
3033 node *bad = look_for_offending_return(kid);
3034 if (bad != NULL)
3035 return bad;
3036 }
3037 }
3038 }
3039
3040 return NULL;
3041}
3042
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003044com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045{
3046 int i;
3047 int anchor = 0;
3048 REQ(n, if_stmt);
3049 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3050 for (i = 0; i+3 < NCH(n); i+=4) {
3051 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003052 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003053 if (is_constant_false(c, ch)) {
3054 /* We're going to skip this block. However, if this
3055 is a generator, we have to check the dead code
3056 anyway to make sure there aren't any return stmts
3057 with expressions, in the same scope. */
3058 if (c->c_flags & CO_GENERATOR) {
3059 node *p = look_for_offending_return(n);
3060 if (p != NULL) {
3061 int savelineno = c->c_lineno;
3062 c->c_lineno = p->n_lineno;
3063 com_error(c, PyExc_SyntaxError,
3064 "'return' with argument "
3065 "inside generator");
3066 c->c_lineno = savelineno;
3067 }
3068 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003069 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003070 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003071 if (i > 0)
3072 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003073 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 com_addfwref(c, JUMP_IF_FALSE, &a);
3075 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 com_node(c, CHILD(n, i+3));
3078 com_addfwref(c, JUMP_FORWARD, &anchor);
3079 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 com_addbyte(c, POP_TOP);
3082 }
3083 if (i+2 < NCH(n))
3084 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003085 if (anchor)
3086 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087}
3088
3089static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003090com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091{
3092 int break_anchor = 0;
3093 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003094 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3096 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003097 block_push(c, SETUP_LOOP);
3098 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003099 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100 com_node(c, CHILD(n, 1));
3101 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3102 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003103 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003104 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003106 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003107 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3108 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003110 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003111 com_addbyte(c, POP_TOP);
3112 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003113 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 if (NCH(n) > 4)
3115 com_node(c, CHILD(n, 6));
3116 com_backpatch(c, break_anchor);
3117}
3118
3119static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003120com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 int break_anchor = 0;
3123 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003124 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 REQ(n, for_stmt);
3126 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3127 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003128 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003130 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003131 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003132 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003133 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003135 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003136 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003138 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003139 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3140 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003142 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003144 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 if (NCH(n) > 8)
3146 com_node(c, CHILD(n, 8));
3147 com_backpatch(c, break_anchor);
3148}
3149
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003150/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003151
3152 SETUP_FINALLY L
3153 <code for S>
3154 POP_BLOCK
3155 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003156 L: <code for Sf>
3157 END_FINALLY
3158
3159 The special instructions use the block stack. Each block
3160 stack entry contains the instruction that created it (here
3161 SETUP_FINALLY), the level of the value stack at the time the
3162 block stack entry was created, and a label (here L).
3163
3164 SETUP_FINALLY:
3165 Pushes the current value stack level and the label
3166 onto the block stack.
3167 POP_BLOCK:
3168 Pops en entry from the block stack, and pops the value
3169 stack until its level is the same as indicated on the
3170 block stack. (The label is ignored.)
3171 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003172 Pops a variable number of entries from the *value* stack
3173 and re-raises the exception they specify. The number of
3174 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003175
3176 The block stack is unwound when an exception is raised:
3177 when a SETUP_FINALLY entry is found, the exception is pushed
3178 onto the value stack (and the exception condition is cleared),
3179 and the interpreter jumps to the label gotten from the block
3180 stack.
3181
3182 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003183 (The contents of the value stack is shown in [], with the top
3184 at the right; 'tb' is trace-back info, 'val' the exception's
3185 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003186
3187 Value stack Label Instruction Argument
3188 [] SETUP_EXCEPT L1
3189 [] <code for S>
3190 [] POP_BLOCK
3191 [] JUMP_FORWARD L0
3192
Guido van Rossum3f5da241990-12-20 15:06:42 +00003193 [tb, val, exc] L1: DUP )
3194 [tb, val, exc, exc] <evaluate E1> )
3195 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3196 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3197 [tb, val, exc, 1] POP )
3198 [tb, val, exc] POP
3199 [tb, val] <assign to V1> (or POP if no V1)
3200 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003201 [] <code for S1>
3202 JUMP_FORWARD L0
3203
Guido van Rossum3f5da241990-12-20 15:06:42 +00003204 [tb, val, exc, 0] L2: POP
3205 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003206 .............................etc.......................
3207
Guido van Rossum3f5da241990-12-20 15:06:42 +00003208 [tb, val, exc, 0] Ln+1: POP
3209 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003210
3211 [] L0: <next statement>
3212
3213 Of course, parts are not generated if Vi or Ei is not present.
3214*/
3215
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003217com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003218{
3219 int except_anchor = 0;
3220 int end_anchor = 0;
3221 int else_anchor = 0;
3222 int i;
3223 node *ch;
3224
3225 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3226 block_push(c, SETUP_EXCEPT);
3227 com_node(c, CHILD(n, 2));
3228 com_addbyte(c, POP_BLOCK);
3229 block_pop(c, SETUP_EXCEPT);
3230 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3231 com_backpatch(c, except_anchor);
3232 for (i = 3;
3233 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3234 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003236 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003237 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003238 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003239 break;
3240 }
3241 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003242 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243 com_addoparg(c, SET_LINENO, ch->n_lineno);
3244 if (NCH(ch) > 1) {
3245 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247 com_node(c, CHILD(ch, 1));
3248 com_addoparg(c, COMPARE_OP, EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3251 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003253 }
3254 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003255 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003257 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003259 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_pop(c, 1);
3261 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003262 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 com_node(c, CHILD(n, i+2));
3265 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3266 if (except_anchor) {
3267 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003268 /* We come in with [tb, val, exc, 0] on the
3269 stack; one pop and it's the same as
3270 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003271 com_addbyte(c, POP_TOP);
3272 }
3273 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003274 /* We actually come in here with [tb, val, exc] but the
3275 END_FINALLY will zap those and jump around.
3276 The c_stacklevel does not reflect them so we need not pop
3277 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003278 com_addbyte(c, END_FINALLY);
3279 com_backpatch(c, else_anchor);
3280 if (i < NCH(n))
3281 com_node(c, CHILD(n, i+2));
3282 com_backpatch(c, end_anchor);
3283}
3284
3285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003286com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287{
3288 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003289 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003290
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3292 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003294 com_addbyte(c, POP_BLOCK);
3295 block_pop(c, SETUP_FINALLY);
3296 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003297 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 /* While the generated code pushes only one item,
3299 the try-finally handling can enter here with
3300 up to three items. OK, here are the details:
3301 3 for an exception, 2 for RETURN, 1 for BREAK. */
3302 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303 com_backpatch(c, finally_anchor);
3304 ch = CHILD(n, NCH(n)-1);
3305 com_addoparg(c, SET_LINENO, ch->n_lineno);
3306 com_node(c, ch);
3307 com_addbyte(c, END_FINALLY);
3308 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003310}
3311
3312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003313com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003314{
3315 REQ(n, try_stmt);
3316 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3317 | 'try' ':' suite 'finally' ':' suite */
3318 if (TYPE(CHILD(n, 3)) != except_clause)
3319 com_try_finally(c, n);
3320 else
3321 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322}
3323
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003325get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003326{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003327 int i;
3328
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 /* Label to avoid tail recursion */
3330 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003331 switch (TYPE(n)) {
3332
3333 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 if (NCH(n) == 1) {
3335 n = CHILD(n, 0);
3336 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003337 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003339 case file_input:
3340 for (i = 0; i < NCH(n); i++) {
3341 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 if (TYPE(ch) == stmt) {
3343 n = ch;
3344 goto next;
3345 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003346 }
3347 break;
3348
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003349 case stmt:
3350 case simple_stmt:
3351 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 n = CHILD(n, 0);
3353 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003354
3355 case expr_stmt:
3356 case testlist:
3357 case test:
3358 case and_test:
3359 case not_test:
3360 case comparison:
3361 case expr:
3362 case xor_expr:
3363 case and_expr:
3364 case shift_expr:
3365 case arith_expr:
3366 case term:
3367 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003368 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003369 if (NCH(n) == 1) {
3370 n = CHILD(n, 0);
3371 goto next;
3372 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003373 break;
3374
3375 case atom:
3376 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003377 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003378 break;
3379
3380 }
3381 return NULL;
3382}
3383
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003385get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003386{
Guido van Rossum541563e1999-01-28 15:08:09 +00003387 /* Don't generate doc-strings if run with -OO */
3388 if (Py_OptimizeFlag > 1)
3389 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 n = get_rawdocstring(n);
3391 if (n == NULL)
3392 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003393 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394}
3395
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003397com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398{
3399 REQ(n, suite);
3400 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3401 if (NCH(n) == 1) {
3402 com_node(c, CHILD(n, 0));
3403 }
3404 else {
3405 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003406 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 node *ch = CHILD(n, i);
3408 if (TYPE(ch) == stmt)
3409 com_node(c, ch);
3410 }
3411 }
3412}
3413
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003414/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003416com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003417{
3418 int i = c->c_nblocks;
3419 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3420 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3421 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003422 else if (i <= 0) {
3423 /* at the outer level */
3424 com_error(c, PyExc_SyntaxError,
3425 "'continue' not properly in loop");
3426 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003427 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003428 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003429 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003430 if (c->c_block[j] == SETUP_LOOP)
3431 break;
3432 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003433 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003434 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003435 for (; i > j; --i) {
3436 if (c->c_block[i] == SETUP_EXCEPT ||
3437 c->c_block[i] == SETUP_FINALLY) {
3438 com_addoparg(c, CONTINUE_LOOP,
3439 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003440 return;
3441 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003442 if (c->c_block[i] == END_FINALLY) {
3443 com_error(c, PyExc_SyntaxError,
3444 "'continue' not supported inside 'finally' clause");
3445 return;
3446 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003447 }
3448 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003449 com_error(c, PyExc_SyntaxError,
3450 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003451 }
3452 /* XXX Could allow it inside a 'finally' clause
3453 XXX if we could pop the exception still on the stack */
3454}
3455
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003456static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003458{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003459 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003460 if (TYPE(n) == lambdef) {
3461 /* lambdef: 'lambda' [varargslist] ':' test */
3462 n = CHILD(n, 1);
3463 }
3464 else {
3465 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3466 n = CHILD(n, 2);
3467 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3468 n = CHILD(n, 1);
3469 }
3470 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003471 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003472 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003473 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003474 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3475 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003476 nargs = 0;
3477 ndefs = 0;
3478 for (i = 0; i < nch; i++) {
3479 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003480 if (TYPE(CHILD(n, i)) == STAR ||
3481 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003482 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003483 nargs++;
3484 i++;
3485 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003486 t = RPAR; /* Anything except EQUAL or COMMA */
3487 else
3488 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003489 if (t == EQUAL) {
3490 i++;
3491 ndefs++;
3492 com_node(c, CHILD(n, i));
3493 i++;
3494 if (i >= nch)
3495 break;
3496 t = TYPE(CHILD(n, i));
3497 }
3498 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003499 /* Treat "(a=1, b)" as an error */
3500 if (ndefs)
3501 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003502 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 }
3504 if (t != COMMA)
3505 break;
3506 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003507 return ndefs;
3508}
3509
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003510static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003511com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003513 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003514 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003516 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003517 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3518 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003519 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003520 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003521 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 c->c_errors++;
3523 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003524 int closure = com_make_closure(c, (PyCodeObject *)co);
3525 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003528 if (closure)
3529 com_addoparg(c, MAKE_CLOSURE, ndefs);
3530 else
3531 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003532 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003533 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003534 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003535 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536 }
3537}
3538
3539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003540com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003541{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003542 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003543 REQ(n, testlist);
3544 /* testlist: test (',' test)* [','] */
3545 for (i = 0; i < NCH(n); i += 2)
3546 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 i = (NCH(n)+1) / 2;
3548 com_addoparg(c, BUILD_TUPLE, i);
3549 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003550}
3551
3552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003553com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554{
Guido van Rossum25831651993-05-19 14:50:45 +00003555 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003556 PyObject *v;
3557 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003558 char *name;
3559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003561 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003562 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003563 c->c_errors++;
3564 return;
3565 }
3566 /* Push the class name on the stack */
3567 i = com_addconst(c, v);
3568 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003569 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003570 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003571 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003572 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003573 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 com_push(c, 1);
3575 }
Guido van Rossum25831651993-05-19 14:50:45 +00003576 else
3577 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003578 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003579 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003580 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003581 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003582 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003583 c->c_errors++;
3584 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003585 int closure = com_make_closure(c, co);
3586 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003587 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003589 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003590 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003591 com_pop(c, PyTuple_GET_SIZE(co->co_freevars));
3592 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003593 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003594 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003595 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003596 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003597 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003598 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003599 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003600 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601}
3602
3603static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003604com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003605{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003606 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003607 if (c->c_errors)
3608 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003609 switch (TYPE(n)) {
3610
3611 /* Definition nodes */
3612
3613 case funcdef:
3614 com_funcdef(c, n);
3615 break;
3616 case classdef:
3617 com_classdef(c, n);
3618 break;
3619
3620 /* Trivial parse tree nodes */
3621
3622 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003623 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003624 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003625 n = CHILD(n, 0);
3626 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003627
3628 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003629 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3630 com_addoparg(c, SET_LINENO, n->n_lineno);
3631 {
3632 int i;
3633 for (i = 0; i < NCH(n)-1; i += 2)
3634 com_node(c, CHILD(n, i));
3635 }
3636 break;
3637
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003639 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003640 n = CHILD(n, 0);
3641 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642
3643 /* Statement nodes */
3644
3645 case expr_stmt:
3646 com_expr_stmt(c, n);
3647 break;
3648 case print_stmt:
3649 com_print_stmt(c, n);
3650 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003651 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003652 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653 break;
3654 case pass_stmt:
3655 break;
3656 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003657 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003658 com_error(c, PyExc_SyntaxError,
3659 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003660 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661 com_addbyte(c, BREAK_LOOP);
3662 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003663 case continue_stmt:
3664 com_continue_stmt(c, n);
3665 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666 case return_stmt:
3667 com_return_stmt(c, n);
3668 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003669 case yield_stmt:
3670 com_yield_stmt(c, n);
3671 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003672 case raise_stmt:
3673 com_raise_stmt(c, n);
3674 break;
3675 case import_stmt:
3676 com_import_stmt(c, n);
3677 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003678 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003679 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 case exec_stmt:
3681 com_exec_stmt(c, n);
3682 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003683 case assert_stmt:
3684 com_assert_stmt(c, n);
3685 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686 case if_stmt:
3687 com_if_stmt(c, n);
3688 break;
3689 case while_stmt:
3690 com_while_stmt(c, n);
3691 break;
3692 case for_stmt:
3693 com_for_stmt(c, n);
3694 break;
3695 case try_stmt:
3696 com_try_stmt(c, n);
3697 break;
3698 case suite:
3699 com_suite(c, n);
3700 break;
3701
3702 /* Expression nodes */
3703
3704 case testlist:
Guido van Rossum1c917072001-10-15 15:44:05 +00003705 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003706 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003707 break;
3708 case test:
3709 com_test(c, n);
3710 break;
3711 case and_test:
3712 com_and_test(c, n);
3713 break;
3714 case not_test:
3715 com_not_test(c, n);
3716 break;
3717 case comparison:
3718 com_comparison(c, n);
3719 break;
3720 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003721 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722 break;
3723 case expr:
3724 com_expr(c, n);
3725 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003726 case xor_expr:
3727 com_xor_expr(c, n);
3728 break;
3729 case and_expr:
3730 com_and_expr(c, n);
3731 break;
3732 case shift_expr:
3733 com_shift_expr(c, n);
3734 break;
3735 case arith_expr:
3736 com_arith_expr(c, n);
3737 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 case term:
3739 com_term(c, n);
3740 break;
3741 case factor:
3742 com_factor(c, n);
3743 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003744 case power:
3745 com_power(c, n);
3746 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 case atom:
3748 com_atom(c, n);
3749 break;
3750
3751 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003752 com_error(c, PyExc_SystemError,
3753 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754 }
3755}
3756
Tim Petersdbd9ba62000-07-09 03:09:57 +00003757static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758
3759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003760com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761{
3762 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3763 if (TYPE(CHILD(n, 0)) == LPAR)
3764 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003766 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003767 com_pop(c, 1);
3768 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769}
3770
3771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003774 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775 if (NCH(n) == 1) {
3776 com_fpdef(c, CHILD(n, 0));
3777 }
3778 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003780 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 for (i = 0; i < NCH(n); i += 2)
3783 com_fpdef(c, CHILD(n, i));
3784 }
3785}
3786
3787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003788com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003789{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003790 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003791 int complex = 0;
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003792 char nbuf[10];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003793 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003794 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003795 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003796 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003797 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003798 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003799 node *ch = CHILD(n, i);
3800 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003801 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003802 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003803 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3804 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003805 if (TYPE(fp) != NAME) {
Guido van Rossumdb9e20f1997-07-10 01:06:53 +00003806 sprintf(nbuf, ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003807 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003808 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003809 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003810 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003811 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003812 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003813 ch = CHILD(n, i);
3814 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003815 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003816 else
3817 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003818 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003819 if (complex) {
3820 /* Generate code for complex arguments only after
3821 having counted the simple arguments */
3822 int ilocal = 0;
3823 for (i = 0; i < nch; i++) {
3824 node *ch = CHILD(n, i);
3825 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003826 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003827 break;
3828 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3829 fp = CHILD(ch, 0);
3830 if (TYPE(fp) != NAME) {
3831 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003832 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003833 com_fpdef(c, ch);
3834 }
3835 ilocal++;
3836 if (++i >= nch)
3837 break;
3838 ch = CHILD(n, i);
3839 if (TYPE(ch) == EQUAL)
3840 i += 2;
3841 else
3842 REQ(ch, COMMA);
3843 }
3844 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003845}
3846
3847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849{
3850 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003851 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003853 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003854 if (doc != NULL) {
3855 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003856 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003857 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003858 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003859 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003860 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003861 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862 for (i = 0; i < NCH(n); i++) {
3863 node *ch = CHILD(n, i);
3864 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3865 com_node(c, ch);
3866 }
3867}
3868
3869/* Top-level compile-node interface */
3870
3871static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003872compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003873{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003874 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003875 node *ch;
3876 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003877 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003878 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003879 if (doc != NULL) {
3880 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003882 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003883 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003884 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003885 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3886 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003887 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003888 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003889 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003891 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003892 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3893 com_push(c, 1);
3894 com_addbyte(c, RETURN_VALUE);
3895 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896}
3897
3898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003899compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003900{
Guido van Rossum590baa41993-11-30 13:40:46 +00003901 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003902 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003903 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003904
3905 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003906 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003907 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003908 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003909 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003910 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003911 else
3912 ch = CHILD(n, 2);
3913 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003914 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003916}
3917
3918static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003919compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003920{
3921 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003922 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003923 REQ(n, classdef);
3924 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3925 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003926 c->c_private = c->c_name;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003927 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003928 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003929 if (doc != NULL) {
3930 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003931 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003932 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003933 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003934 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003935 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003936 }
3937 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003938 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003939 com_node(c, ch);
3940 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003941 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003942 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003943 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003944}
3945
3946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003947compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003948{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003949 com_addoparg(c, SET_LINENO, n->n_lineno);
3950
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 switch (TYPE(n)) {
3952
Guido van Rossum4c417781991-01-21 16:09:22 +00003953 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003954 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003955 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003956 n = CHILD(n, 0);
3957 if (TYPE(n) != NEWLINE)
3958 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003959 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003960 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003961 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003962 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964 break;
3965
Guido van Rossum4c417781991-01-21 16:09:22 +00003966 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003967 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003969 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003970 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003971 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972 break;
3973
Guido van Rossum590baa41993-11-30 13:40:46 +00003974 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003975 com_node(c, CHILD(n, 0));
3976 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003977 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003978 break;
3979
Guido van Rossum590baa41993-11-30 13:40:46 +00003980 case lambdef: /* anonymous function definition */
3981 compile_lambdef(c, n);
3982 break;
3983
Guido van Rossum4c417781991-01-21 16:09:22 +00003984 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 compile_funcdef(c, n);
3986 break;
3987
Guido van Rossum4c417781991-01-21 16:09:22 +00003988 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003989 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003990 break;
3991
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003992 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003993 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003994 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003995 }
3996}
3997
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003998static PyObject *
3999dict_keys_inorder(PyObject *dict, int offset)
4000{
4001 PyObject *tuple, *k, *v;
4002 int i, pos = 0, size = PyDict_Size(dict);
4003
4004 tuple = PyTuple_New(size);
4005 if (tuple == NULL)
4006 return NULL;
4007 while (PyDict_Next(dict, &pos, &k, &v)) {
4008 i = PyInt_AS_LONG(v);
4009 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004010 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004011 PyTuple_SET_ITEM(tuple, i - offset, k);
4012 }
4013 return tuple;
4014}
4015
Guido van Rossum79f25d91997-04-29 20:08:16 +00004016PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004017PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004018{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004019 return PyNode_CompileFlags(n, filename, NULL);
4020}
4021
4022PyCodeObject *
4023PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4024{
4025 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004026}
4027
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004028struct symtable *
4029PyNode_CompileSymtable(node *n, char *filename)
4030{
4031 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004032 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004033
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004034 ff = PyNode_Future(n, filename);
4035 if (ff == NULL)
4036 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004037
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004038 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004039 if (st == NULL) {
4040 PyMem_Free((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004041 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004042 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004043 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004044 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004045 if (st->st_errors > 0)
4046 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004047 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004048 if (st->st_errors > 0)
4049 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004050
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004051 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004052 fail:
4053 PyMem_Free((void *)ff);
4054 st->st_future = NULL;
4055 PySymtable_Free(st);
4056 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004057}
4058
Guido van Rossum79f25d91997-04-29 20:08:16 +00004059static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004060icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004061{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004062 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004063}
4064
Guido van Rossum79f25d91997-04-29 20:08:16 +00004065static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004066jcompile(node *n, char *filename, struct compiling *base,
4067 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004068{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004070 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004071 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004072 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004073 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004074 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004075 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004076 /* c_symtable still points to parent's symbols */
4077 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004078 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004079 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004080 sc.c_flags |= base->c_flags & PyCF_MASK;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004081 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004082 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004083 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004084 if (sc.c_future == NULL) {
4085 com_free(&sc);
4086 return NULL;
4087 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004088 if (flags) {
4089 int merged = sc.c_future->ff_features |
4090 flags->cf_flags;
4091 sc.c_future->ff_features = merged;
4092 flags->cf_flags = merged;
4093 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004094 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004095 com_free(&sc);
4096 return NULL;
4097 }
4098 }
4099 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004100 if (symtable_load_symbols(&sc) < 0) {
4101 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004102 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004103 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104 compile_node(&sc, n);
4105 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004106 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004107 PyObject *consts, *names, *varnames, *filename, *name,
4108 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004109 consts = PyList_AsTuple(sc.c_consts);
4110 names = PyList_AsTuple(sc.c_names);
4111 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004112 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4113 freevars = dict_keys_inorder(sc.c_freevars,
4114 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004115 filename = PyString_InternFromString(sc.c_filename);
4116 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004117 if (!PyErr_Occurred())
4118 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004119 sc.c_nlocals,
4120 sc.c_maxstacklevel,
4121 sc.c_flags,
4122 sc.c_code,
4123 consts,
4124 names,
4125 varnames,
4126 freevars,
4127 cellvars,
4128 filename,
4129 name,
4130 sc.c_firstlineno,
4131 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004132 Py_XDECREF(consts);
4133 Py_XDECREF(names);
4134 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004135 Py_XDECREF(freevars);
4136 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004137 Py_XDECREF(filename);
4138 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004139 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004140 else if (!PyErr_Occurred()) {
4141 /* This could happen if someone called PyErr_Clear() after an
4142 error was reported above. That's not supposed to happen,
4143 but I just plugged one case and I'm not sure there can't be
4144 others. In that case, raise SystemError so that at least
4145 it gets reported instead dumping core. */
4146 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4147 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004148 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004149 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004150 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004151 sc.c_symtable = NULL;
4152 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004153 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004154 return co;
4155}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004156
4157int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004158PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004159{
4160 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004161 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004162 int line = co->co_firstlineno;
4163 int addr = 0;
4164 while (--size >= 0) {
4165 addr += *p++;
4166 if (addr > addrq)
4167 break;
4168 line += *p++;
4169 }
4170 return line;
4171}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004172
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004173/* The test for LOCAL must come before the test for FREE in order to
4174 handle classes where name is both local and free. The local var is
4175 a method and the free var is a free var referenced within a method.
4176*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004177
4178static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004179get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004180{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004181 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004182 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004183
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004184 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4185 return CELL;
4186 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4187 return LOCAL;
4188 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4189 return FREE;
4190 v = PyDict_GetItemString(c->c_globals, name);
4191 if (v) {
4192 if (v == Py_None)
4193 return GLOBAL_EXPLICIT;
4194 else {
4195 return GLOBAL_IMPLICIT;
4196 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004197 }
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004198 sprintf(buf,
4199 "unknown scope for %.100s in %.100s(%s) "
4200 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4201 name, c->c_name,
4202 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4203 c->c_filename,
4204 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4205 PyObject_REPR(c->c_locals),
4206 PyObject_REPR(c->c_globals)
4207 );
4208
4209 Py_FatalError(buf);
4210 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004211}
4212
Guido van Rossum207fda62001-03-02 03:30:41 +00004213/* Helper functions to issue warnings */
4214
4215static int
4216issue_warning(char *msg, char *filename, int lineno)
4217{
4218 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4219 lineno, NULL, NULL) < 0) {
4220 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4221 PyErr_SetString(PyExc_SyntaxError, msg);
4222 PyErr_SyntaxLocation(filename, lineno);
4223 }
4224 return -1;
4225 }
4226 return 0;
4227}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004228
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004229static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004230symtable_warn(struct symtable *st, char *msg)
4231{
Guido van Rossum207fda62001-03-02 03:30:41 +00004232 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004233 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004234 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004235 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004236 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004237}
4238
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004239/* Helper function for setting lineno and filename */
4240
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004241static int
4242symtable_build(struct compiling *c, node *n)
4243{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004244 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004245 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004246 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004247 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004248 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4249 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250 return -1;
4251 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004252 if (c->c_symtable->st_errors > 0)
4253 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004254 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004255 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004256 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004257 return 0;
4258}
4259
4260static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004261symtable_init_compiling_symbols(struct compiling *c)
4262{
4263 PyObject *varnames;
4264
4265 varnames = c->c_symtable->st_cur->ste_varnames;
4266 if (varnames == NULL) {
4267 varnames = PyList_New(0);
4268 if (varnames == NULL)
4269 return -1;
4270 c->c_symtable->st_cur->ste_varnames = varnames;
4271 Py_INCREF(varnames);
4272 } else
4273 Py_INCREF(varnames);
4274 c->c_varnames = varnames;
4275
4276 c->c_globals = PyDict_New();
4277 if (c->c_globals == NULL)
4278 return -1;
4279 c->c_freevars = PyDict_New();
4280 if (c->c_freevars == NULL)
4281 return -1;
4282 c->c_cellvars = PyDict_New();
4283 if (c->c_cellvars == NULL)
4284 return -1;
4285 return 0;
4286}
4287
4288struct symbol_info {
4289 int si_nlocals;
4290 int si_ncells;
4291 int si_nfrees;
4292 int si_nimplicit;
4293};
4294
4295static void
4296symtable_init_info(struct symbol_info *si)
4297{
4298 si->si_nlocals = 0;
4299 si->si_ncells = 0;
4300 si->si_nfrees = 0;
4301 si->si_nimplicit = 0;
4302}
4303
4304static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004305symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004306 struct symbol_info *si)
4307{
4308 PyObject *dict, *v;
4309
4310 /* Seperate logic for DEF_FREE. If it occurs in a function,
4311 it indicates a local that we must allocate storage for (a
4312 cell var). If it occurs in a class, then the class has a
4313 method and a free variable with the same name.
4314 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004315 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004316 /* If it isn't declared locally, it can't be a cell. */
4317 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4318 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004319 v = PyInt_FromLong(si->si_ncells++);
4320 dict = c->c_cellvars;
4321 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004322 /* If it is free anyway, then there is no need to do
4323 anything here.
4324 */
4325 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004326 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004327 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004328 v = PyInt_FromLong(si->si_nfrees++);
4329 dict = c->c_freevars;
4330 }
4331 if (v == NULL)
4332 return -1;
4333 if (PyDict_SetItem(dict, name, v) < 0) {
4334 Py_DECREF(v);
4335 return -1;
4336 }
4337 Py_DECREF(v);
4338 return 0;
4339}
4340
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004341/* If a variable is a cell and an argument, make sure that appears in
4342 co_cellvars before any variable to its right in varnames.
4343*/
4344
4345
4346static int
4347symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4348 PyObject *varnames, int flags)
4349{
4350 PyObject *v, *w, *d, *list = NULL;
4351 int i, pos;
4352
4353 if (flags & CO_VARARGS)
4354 argcount++;
4355 if (flags & CO_VARKEYWORDS)
4356 argcount++;
4357 for (i = argcount; --i >= 0; ) {
4358 v = PyList_GET_ITEM(varnames, i);
4359 if (PyDict_GetItem(*cellvars, v)) {
4360 if (list == NULL) {
4361 list = PyList_New(1);
4362 if (list == NULL)
4363 return -1;
4364 PyList_SET_ITEM(list, 0, v);
4365 Py_INCREF(v);
4366 } else
4367 PyList_Insert(list, 0, v);
4368 }
4369 }
4370 if (list == NULL || PyList_GET_SIZE(list) == 0)
4371 return 0;
4372 /* There are cellvars that are also arguments. Create a dict
4373 to replace cellvars and put the args at the front.
4374 */
4375 d = PyDict_New();
4376 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4377 v = PyInt_FromLong(i);
4378 if (v == NULL)
4379 goto fail;
4380 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4381 goto fail;
4382 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4383 goto fail;
4384 }
4385 pos = 0;
4386 i = PyList_GET_SIZE(list);
4387 Py_DECREF(list);
4388 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4389 w = PyInt_FromLong(i++); /* don't care about the old key */
4390 if (PyDict_SetItem(d, v, w) < 0) {
4391 Py_DECREF(w);
4392 goto fail;
4393 }
4394 Py_DECREF(w);
4395 }
4396 Py_DECREF(*cellvars);
4397 *cellvars = d;
4398 return 1;
4399 fail:
4400 Py_DECREF(d);
4401 return -1;
4402}
4403
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004404static int
4405symtable_freevar_offsets(PyObject *freevars, int offset)
4406{
4407 PyObject *name, *v;
4408 int pos;
4409
4410 /* The cell vars are the first elements of the closure,
4411 followed by the free vars. Update the offsets in
4412 c_freevars to account for number of cellvars. */
4413 pos = 0;
4414 while (PyDict_Next(freevars, &pos, &name, &v)) {
4415 int i = PyInt_AS_LONG(v) + offset;
4416 PyObject *o = PyInt_FromLong(i);
4417 if (o == NULL)
4418 return -1;
4419 if (PyDict_SetItem(freevars, name, o) < 0) {
4420 Py_DECREF(o);
4421 return -1;
4422 }
4423 Py_DECREF(o);
4424 }
4425 return 0;
4426}
4427
4428static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004429symtable_check_unoptimized(struct compiling *c,
4430 PySymtableEntryObject *ste,
4431 struct symbol_info *si)
4432{
4433 char buf[300];
4434
4435 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4436 || (ste->ste_nested && si->si_nimplicit)))
4437 return 0;
4438
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004439#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4440
4441#define ILLEGAL_IS "is a nested function"
4442
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004443#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004444"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004445
4446#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004447"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004448
4449#define ILLEGAL_EXEC_AND_IMPORT_STAR \
4450"function '%.100s' uses import * and bare exec, which are illegal" \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004451"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004452
4453 /* XXX perhaps the linenos for these opt-breaking statements
4454 should be stored so the exception can point to them. */
4455
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004456 if (ste->ste_child_free) {
4457 if (ste->ste_optimized == OPT_IMPORT_STAR)
4458 sprintf(buf, ILLEGAL_IMPORT_STAR,
4459 PyString_AS_STRING(ste->ste_name),
4460 ILLEGAL_CONTAINS);
4461 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4462 sprintf(buf, ILLEGAL_BARE_EXEC,
4463 PyString_AS_STRING(ste->ste_name),
4464 ILLEGAL_CONTAINS);
4465 else {
4466 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4467 PyString_AS_STRING(ste->ste_name),
4468 ILLEGAL_CONTAINS);
4469 }
4470 } else {
4471 if (ste->ste_optimized == OPT_IMPORT_STAR)
4472 sprintf(buf, ILLEGAL_IMPORT_STAR,
4473 PyString_AS_STRING(ste->ste_name),
4474 ILLEGAL_IS);
4475 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
4476 sprintf(buf, ILLEGAL_BARE_EXEC,
4477 PyString_AS_STRING(ste->ste_name),
4478 ILLEGAL_IS);
4479 else {
4480 sprintf(buf, ILLEGAL_EXEC_AND_IMPORT_STAR,
4481 PyString_AS_STRING(ste->ste_name),
4482 ILLEGAL_IS);
4483 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004484 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004485
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004486 PyErr_SetString(PyExc_SyntaxError, buf);
4487 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4488 ste->ste_opt_lineno);
4489 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004490}
4491
4492static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004493symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4494 struct symbol_info *si)
4495{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004496 if (c->c_future)
4497 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004498 if (ste->ste_generator)
4499 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004500 if (ste->ste_type != TYPE_MODULE)
4501 c->c_flags |= CO_NEWLOCALS;
4502 if (ste->ste_type == TYPE_FUNCTION) {
4503 c->c_nlocals = si->si_nlocals;
4504 if (ste->ste_optimized == 0)
4505 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004506 else if (ste->ste_optimized != OPT_EXEC)
4507 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004508 }
4509 return 0;
4510}
4511
4512static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004513symtable_load_symbols(struct compiling *c)
4514{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004515 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004516 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004517 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004518 PyObject *name, *varnames, *v;
4519 int i, flags, pos;
4520 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004521
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004522 if (implicit == NULL) {
4523 implicit = PyInt_FromLong(1);
4524 if (implicit == NULL)
4525 return -1;
4526 }
4527 v = NULL;
4528
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004529 if (symtable_init_compiling_symbols(c) < 0)
4530 goto fail;
4531 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533 si.si_nlocals = PyList_GET_SIZE(varnames);
4534 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004535
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004536 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004537 v = PyInt_FromLong(i);
4538 if (PyDict_SetItem(c->c_locals,
4539 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004540 goto fail;
4541 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004542 }
4543
4544 /* XXX The cases below define the rules for whether a name is
4545 local or global. The logic could probably be clearer. */
4546 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004547 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4548 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004549
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004550 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004551 /* undo the original DEF_FREE */
4552 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004553
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004554 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004555 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004556 2. Free variables in methods that are also class
4557 variables or declared global.
4558 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004559 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004560 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004562 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004563 c->c_argcount--;
4564 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004565 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004566 c->c_argcount--;
4567 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004568 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004569 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004570 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004571 if (flags & DEF_PARAM) {
4572 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004573 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004574 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004575 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004576 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004577 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004578 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4580 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004581 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004582 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4584 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004586 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004587 if (v == NULL)
4588 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004589 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 goto fail;
4591 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004592 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004595 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004596 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004597 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004598 if (v == NULL)
4599 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004600 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601 goto fail;
4602 Py_DECREF(v);
4603 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004604 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004605 if (PyDict_SetItem(c->c_globals, name,
4606 implicit) < 0)
4607 goto fail;
4608 if (st->st_nscopes != 1) {
4609 v = PyInt_FromLong(flags);
4610 if (PyDict_SetItem(st->st_global,
4611 name, v))
4612 goto fail;
4613 Py_DECREF(v);
4614 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004615 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004616 }
4617 }
4618
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004619 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4620
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004621 if (si.si_ncells > 1) { /* one cell is always in order */
4622 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4623 c->c_varnames, c->c_flags) < 0)
4624 return -1;
4625 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004626 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4627 return -1;
4628 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 fail:
4630 /* is this always the right thing to do? */
4631 Py_XDECREF(v);
4632 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633}
4634
4635static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004636symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004637{
4638 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639
4640 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4641 if (st == NULL)
4642 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004643 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004644
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004645 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004646 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647 goto fail;
4648 if ((st->st_symbols = PyDict_New()) == NULL)
4649 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004650 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004651 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652 st->st_errors = 0;
4653 st->st_tmpname = 0;
4654 st->st_private = NULL;
4655 return st;
4656 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004657 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004658 return NULL;
4659}
4660
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004661void
4662PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004663{
4664 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004666 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667 PyMem_Free((void *)st);
4668}
4669
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670/* When the compiler exits a scope, it must should update the scope's
4671 free variable information with the list of free variables in its
4672 children.
4673
4674 Variables that are free in children and defined in the current
4675 scope are cellvars.
4676
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004677 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004678 false), free variables in children that are not defined here are
4679 implicit globals.
4680
4681*/
4682
4683static int
4684symtable_update_free_vars(struct symtable *st)
4685{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004686 int i, j, def;
4687 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004688 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004690 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004691 def = DEF_FREE_CLASS;
4692 else
4693 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004694 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695 int pos = 0;
4696
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004697 if (list)
4698 PyList_SetSlice(list, 0,
4699 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004700 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004701 PyList_GET_ITEM(ste->ste_children, i);
4702 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004703 int flags = PyInt_AS_LONG(o);
4704 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004705 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004706 if (list == NULL) {
4707 list = PyList_New(0);
4708 if (list == NULL)
4709 return -1;
4710 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004712 if (PyList_Append(list, name) < 0) {
4713 Py_DECREF(list);
4714 return -1;
4715 }
4716 }
4717 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004718 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004719 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004720 v = PyDict_GetItem(ste->ste_symbols, name);
4721 /* If a name N is declared global in scope A and
4722 referenced in scope B contained (perhaps
4723 indirectly) in A and there are no scopes
4724 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004725 is global in B. Unless A is a class scope,
4726 because class scopes are not considered for
4727 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004728 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004729 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004730 int flags = PyInt_AS_LONG(v);
4731 if (flags & DEF_GLOBAL) {
4732 symtable_undo_free(st, child->ste_id,
4733 name);
4734 continue;
4735 }
4736 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004737 if (ste->ste_nested) {
4738 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004739 name, def) < 0) {
4740 Py_DECREF(list);
4741 return -1;
4742 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004743 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004744 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004745 name) < 0) {
4746 Py_DECREF(list);
4747 return -1;
4748 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004749 }
4750 }
4751 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004752
4753 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754 return 0;
4755}
4756
4757/* If the current scope is a non-nested class or if name is not
4758 defined in the current, non-nested scope, then it is an implicit
4759 global in all nested scopes.
4760*/
4761
4762static int
4763symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4764{
4765 PyObject *o;
4766 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004767 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004768
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004769 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004770 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004771 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004772 if (o == NULL)
4773 return symtable_undo_free(st, child, name);
4774 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004775
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004776 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 return symtable_undo_free(st, child, name);
4778 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004779 return symtable_add_def_o(st, ste->ste_symbols,
4780 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004781}
4782
4783static int
4784symtable_undo_free(struct symtable *st, PyObject *id,
4785 PyObject *name)
4786{
4787 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 PyObject *info;
4789 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4792 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004794
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 if (info == NULL)
4797 return 0;
4798 v = PyInt_AS_LONG(info);
4799 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004800 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004801 DEF_FREE_GLOBAL) < 0)
4802 return -1;
4803 } else
4804 /* If the name is defined here or declared global,
4805 then the recursion stops. */
4806 return 0;
4807
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004808 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4809 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004810 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004811 PyList_GET_ITEM(ste->ste_children, i);
4812 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813 if (x < 0)
4814 return x;
4815 }
4816 return 0;
4817}
4818
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004819/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4820 This reference is released when the scope is exited, via the DECREF
4821 in symtable_exit_scope().
4822*/
4823
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824static int
4825symtable_exit_scope(struct symtable *st)
4826{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004827 int end;
4828
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004829 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004830 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004832 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004833 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4834 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004835 if (PySequence_DelItem(st->st_stack, end) < 0)
4836 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004837 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004838}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004840static void
4841symtable_enter_scope(struct symtable *st, char *name, int type,
4842 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004843{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004844 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845
4846 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004847 prev = st->st_cur;
4848 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4849 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004850 st->st_errors++;
4851 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004852 }
4853 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004854 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004855 PySymtableEntry_New(st, name, type, lineno);
4856 if (strcmp(name, TOP) == 0)
4857 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004858 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004859 if (PyList_Append(prev->ste_children,
4860 (PyObject *)st->st_cur) < 0)
4861 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004862 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863}
4864
4865static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004866symtable_lookup(struct symtable *st, char *name)
4867{
4868 char buffer[MANGLE_LEN];
4869 PyObject *v;
4870 int flags;
4871
4872 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4873 name = buffer;
4874 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4875 if (v == NULL) {
4876 if (PyErr_Occurred())
4877 return -1;
4878 else
4879 return 0;
4880 }
4881
4882 flags = PyInt_AS_LONG(v);
4883 return flags;
4884}
4885
4886static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004887symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004888{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004890 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004891 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004892
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004893 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004894 name = buffer;
4895 if ((s = PyString_InternFromString(name)) == NULL)
4896 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004897 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4898 Py_DECREF(s);
4899 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900}
4901
4902/* Must only be called with mangled names */
4903
4904static int
4905symtable_add_def_o(struct symtable *st, PyObject *dict,
4906 PyObject *name, int flag)
4907{
4908 PyObject *o;
4909 int val;
4910
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004914 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004915 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004916 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004917 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 return -1;
4919 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004921 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004922 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004923 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004924 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 Py_DECREF(o);
4926 return -1;
4927 }
4928 Py_DECREF(o);
4929
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004931 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004932 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004933 } else if (flag & DEF_GLOBAL) {
4934 /* XXX need to update DEF_GLOBAL for other flags too;
4935 perhaps only DEF_FREE_GLOBAL */
4936 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004937 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004938 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004939 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004940 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004943 Py_DECREF(o);
4944 return -1;
4945 }
4946 Py_DECREF(o);
4947 }
4948 return 0;
4949}
4950
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004951#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004952
Tim Peters08a898f2001-06-28 01:52:22 +00004953/* Look for a yield stmt under n. Return 1 if found, else 0.
4954 This hack is used to look inside "if 0:" blocks (which are normally
4955 ignored) in case those are the only places a yield occurs (so that this
4956 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004957static int
4958look_for_yield(node *n)
4959{
4960 int i;
4961
4962 for (i = 0; i < NCH(n); ++i) {
4963 node *kid = CHILD(n, i);
4964
4965 switch (TYPE(kid)) {
4966
4967 case classdef:
4968 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004969 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004970 /* Stuff in nested functions and classes can't make
4971 the parent a generator. */
4972 return 0;
4973
4974 case yield_stmt:
4975 return 1;
4976
4977 default:
4978 if (look_for_yield(kid))
4979 return 1;
4980 }
4981 }
4982 return 0;
4983}
4984
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004985static void
4986symtable_node(struct symtable *st, node *n)
4987{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00004988 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004989
4990 loop:
4991 switch (TYPE(n)) {
4992 case funcdef: {
4993 char *func_name = STR(CHILD(n, 1));
4994 symtable_add_def(st, func_name, DEF_LOCAL);
4995 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004996 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997 symtable_funcdef(st, n);
4998 symtable_exit_scope(st);
4999 break;
5000 }
5001 case lambdef:
5002 if (NCH(n) == 4)
5003 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005004 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005005 symtable_funcdef(st, n);
5006 symtable_exit_scope(st);
5007 break;
5008 case classdef: {
5009 char *tmp, *class_name = STR(CHILD(n, 1));
5010 symtable_add_def(st, class_name, DEF_LOCAL);
5011 if (TYPE(CHILD(n, 2)) == LPAR) {
5012 node *bases = CHILD(n, 3);
5013 int i;
5014 for (i = 0; i < NCH(bases); i += 2) {
5015 symtable_node(st, CHILD(bases, i));
5016 }
5017 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005018 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005019 tmp = st->st_private;
5020 st->st_private = class_name;
5021 symtable_node(st, CHILD(n, NCH(n) - 1));
5022 st->st_private = tmp;
5023 symtable_exit_scope(st);
5024 break;
5025 }
5026 case if_stmt:
5027 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005028 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5029 if (st->st_cur->ste_generator == 0)
5030 st->st_cur->ste_generator =
5031 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005032 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005033 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005034 symtable_node(st, CHILD(n, i + 1));
5035 symtable_node(st, CHILD(n, i + 3));
5036 }
5037 if (i + 2 < NCH(n))
5038 symtable_node(st, CHILD(n, i + 2));
5039 break;
5040 case global_stmt:
5041 symtable_global(st, n);
5042 break;
5043 case import_stmt:
5044 symtable_import(st, n);
5045 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005046 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005047 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005048 symtable_node(st, CHILD(n, 1));
5049 if (NCH(n) > 2)
5050 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005051 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005052 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005053 st->st_cur->ste_opt_lineno = n->n_lineno;
5054 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055 if (NCH(n) > 4)
5056 symtable_node(st, CHILD(n, 5));
5057 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005058
5059 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005060 case assert_stmt:
5061 if (Py_OptimizeFlag)
5062 return;
5063 if (NCH(n) == 2) {
5064 n = CHILD(n, 1);
5065 goto loop;
5066 } else {
5067 symtable_node(st, CHILD(n, 1));
5068 n = CHILD(n, 3);
5069 goto loop;
5070 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071 case except_clause:
5072 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005073 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074 if (NCH(n) > 1) {
5075 n = CHILD(n, 1);
5076 goto loop;
5077 }
5078 break;
5079 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005080 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005081 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005082 case yield_stmt:
5083 st->st_cur->ste_generator = 1;
5084 n = CHILD(n, 1);
5085 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 case expr_stmt:
5087 if (NCH(n) == 1)
5088 n = CHILD(n, 0);
5089 else {
5090 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005091 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 symtable_node(st, CHILD(n, 2));
5093 break;
5094 } else {
5095 int i;
5096 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005097 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 n = CHILD(n, NCH(n) - 1);
5099 }
5100 }
5101 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005102 case list_iter:
5103 n = CHILD(n, 0);
5104 if (TYPE(n) == list_for) {
5105 st->st_tmpname++;
5106 symtable_list_comprehension(st, n);
5107 st->st_tmpname--;
5108 } else {
5109 REQ(n, list_if);
5110 symtable_node(st, CHILD(n, 1));
5111 if (NCH(n) == 3) {
5112 n = CHILD(n, 2);
5113 goto loop;
5114 }
5115 }
5116 break;
5117 case for_stmt:
5118 symtable_assign(st, CHILD(n, 1), 0);
5119 for (i = 3; i < NCH(n); ++i)
5120 if (TYPE(CHILD(n, i)) >= single_input)
5121 symtable_node(st, CHILD(n, i));
5122 break;
5123 /* The remaining cases fall through to default except in
5124 special circumstances. This requires the individual cases
5125 to be coded with great care, even though they look like
5126 rather innocuous. Each case must double-check TYPE(n).
5127 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005128 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005129 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 n = CHILD(n, 2);
5131 goto loop;
5132 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005133 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134 case listmaker:
5135 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005136 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005137 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005138 symtable_node(st, CHILD(n, 0));
5139 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005140 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005141 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005142 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005143 case atom:
5144 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5145 symtable_add_use(st, STR(CHILD(n, 0)));
5146 break;
5147 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005148 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005149 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005150 /* Walk over every non-token child with a special case
5151 for one child.
5152 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005153 if (NCH(n) == 1) {
5154 n = CHILD(n, 0);
5155 goto loop;
5156 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005157 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005158 if (TYPE(CHILD(n, i)) >= single_input)
5159 symtable_node(st, CHILD(n, i));
5160 }
5161}
5162
5163static void
5164symtable_funcdef(struct symtable *st, node *n)
5165{
5166 node *body;
5167
5168 if (TYPE(n) == lambdef) {
5169 if (NCH(n) == 4)
5170 symtable_params(st, CHILD(n, 1));
5171 } else
5172 symtable_params(st, CHILD(n, 2));
5173 body = CHILD(n, NCH(n) - 1);
5174 symtable_node(st, body);
5175}
5176
5177/* The next two functions parse the argument tuple.
5178 symtable_default_arg() checks for names in the default arguments,
5179 which are references in the defining scope. symtable_params()
5180 parses the parameter names, which are defined in the function's
5181 body.
5182
5183 varargslist:
5184 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5185 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5186*/
5187
5188static void
5189symtable_default_args(struct symtable *st, node *n)
5190{
5191 node *c;
5192 int i;
5193
5194 if (TYPE(n) == parameters) {
5195 n = CHILD(n, 1);
5196 if (TYPE(n) == RPAR)
5197 return;
5198 }
5199 REQ(n, varargslist);
5200 for (i = 0; i < NCH(n); i += 2) {
5201 c = CHILD(n, i);
5202 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5203 break;
5204 }
5205 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5206 symtable_node(st, CHILD(n, i));
5207 }
5208}
5209
5210static void
5211symtable_params(struct symtable *st, node *n)
5212{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005213 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005214 node *c = NULL;
5215
5216 if (TYPE(n) == parameters) {
5217 n = CHILD(n, 1);
5218 if (TYPE(n) == RPAR)
5219 return;
5220 }
5221 REQ(n, varargslist);
5222 for (i = 0; i < NCH(n); i += 2) {
5223 c = CHILD(n, i);
5224 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5225 ext = 1;
5226 break;
5227 }
5228 if (TYPE(c) == test) {
5229 continue;
5230 }
5231 if (TYPE(CHILD(c, 0)) == NAME)
5232 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5233 else {
5234 char nbuf[10];
5235 sprintf(nbuf, ".%d", i);
5236 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005237 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 }
5239 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240 if (ext) {
5241 c = CHILD(n, i);
5242 if (TYPE(c) == STAR) {
5243 i++;
5244 symtable_add_def(st, STR(CHILD(n, i)),
5245 DEF_PARAM | DEF_STAR);
5246 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005247 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005248 c = NULL;
5249 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005250 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005252 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253 i++;
5254 symtable_add_def(st, STR(CHILD(n, i)),
5255 DEF_PARAM | DEF_DOUBLESTAR);
5256 }
5257 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005258 if (complex >= 0) {
5259 int j;
5260 for (j = 0; j <= complex; j++) {
5261 c = CHILD(n, j);
5262 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005263 c = CHILD(n, ++j);
5264 else if (TYPE(c) == EQUAL)
5265 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005266 if (TYPE(CHILD(c, 0)) == LPAR)
5267 symtable_params_fplist(st, CHILD(c, 1));
5268 }
5269 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005270}
5271
5272static void
5273symtable_params_fplist(struct symtable *st, node *n)
5274{
5275 int i;
5276 node *c;
5277
5278 REQ(n, fplist);
5279 for (i = 0; i < NCH(n); i += 2) {
5280 c = CHILD(n, i);
5281 REQ(c, fpdef);
5282 if (NCH(c) == 1)
5283 symtable_add_def(st, STR(CHILD(c, 0)),
5284 DEF_PARAM | DEF_INTUPLE);
5285 else
5286 symtable_params_fplist(st, CHILD(c, 1));
5287 }
5288
5289}
5290
5291static void
5292symtable_global(struct symtable *st, node *n)
5293{
5294 int i;
5295
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005296 /* XXX It might be helpful to warn about module-level global
5297 statements, but it's hard to tell the difference between
5298 module-level and a string passed to exec.
5299 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005300
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005301 for (i = 1; i < NCH(n); i += 2) {
5302 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005303 int flags;
5304
5305 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005306 if (flags < 0)
5307 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005308 if (flags && flags != DEF_GLOBAL) {
5309 char buf[500];
5310 if (flags & DEF_PARAM) {
5311 PyErr_Format(PyExc_SyntaxError,
5312 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005313 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005314 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005315 st->st_cur->ste_lineno);
5316 st->st_errors++;
5317 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005318 }
5319 else {
5320 if (flags & DEF_LOCAL)
5321 sprintf(buf, GLOBAL_AFTER_ASSIGN,
5322 name);
5323 else
5324 sprintf(buf, GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005325 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005326 }
5327 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005328 symtable_add_def(st, name, DEF_GLOBAL);
5329 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005330}
5331
5332static void
5333symtable_list_comprehension(struct symtable *st, node *n)
5334{
5335 char tmpname[12];
5336
Jeremy Hylton23b42272001-03-19 20:38:06 +00005337 sprintf(tmpname, "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005338 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005339 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005340 symtable_node(st, CHILD(n, 3));
5341 if (NCH(n) == 5)
5342 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005343}
5344
5345static void
5346symtable_import(struct symtable *st, node *n)
5347{
5348 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005349 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 | 'from' dotted_name 'import'
5351 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005352 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005353 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005354 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005355 node *dotname = CHILD(n, 1);
5356 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5357 /* check for bogus imports */
5358 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5359 PyErr_SetString(PyExc_SyntaxError,
5360 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005361 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005362 n->n_lineno);
5363 st->st_errors++;
5364 return;
5365 }
5366 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005368 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005369 if (symtable_warn(st,
5370 "import * only allowed at module level") < 0)
5371 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005372 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005373 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005374 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005375 } else {
5376 for (i = 3; i < NCH(n); i += 2) {
5377 node *c = CHILD(n, i);
5378 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005379 symtable_assign(st, CHILD(c, 2),
5380 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005382 symtable_assign(st, CHILD(c, 0),
5383 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005384 }
5385 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005386 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005388 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389 }
5390 }
5391}
5392
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005393/* The third argument to symatble_assign() is a flag to be passed to
5394 symtable_add_def() if it is eventually called. The flag is useful
5395 to specify the particular type of assignment that should be
5396 recorded, e.g. an assignment caused by import.
5397 */
5398
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005399static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005400symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005401{
5402 node *tmp;
5403 int i;
5404
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405 loop:
5406 switch (TYPE(n)) {
5407 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005408 /* invalid assignment, e.g. lambda x:x=2. The next
5409 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005410 return;
5411 case power:
5412 if (NCH(n) > 2) {
5413 for (i = 2; i < NCH(n); ++i)
5414 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5415 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005416 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 if (NCH(n) > 1) {
5418 symtable_node(st, CHILD(n, 0));
5419 symtable_node(st, CHILD(n, 1));
5420 } else {
5421 n = CHILD(n, 0);
5422 goto loop;
5423 }
5424 return;
5425 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005426 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5427 /* XXX This is an error, but the next pass
5428 will catch it. */
5429 return;
5430 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005432 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005433 }
5434 return;
5435 case exprlist:
5436 case testlist:
5437 if (NCH(n) == 1) {
5438 n = CHILD(n, 0);
5439 goto loop;
5440 }
5441 else {
5442 int i;
5443 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005444 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005445 return;
5446 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005447 case atom:
5448 tmp = CHILD(n, 0);
5449 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5450 n = CHILD(n, 1);
5451 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005452 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005453 if (strcmp(STR(tmp), "__debug__") == 0) {
5454 PyErr_SetString(PyExc_SyntaxError,
5455 ASSIGN_DEBUG);
5456 PyErr_SyntaxLocation(st->st_filename,
5457 st->st_cur->ste_opt_lineno);
5458 st->st_errors++;
5459 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005460 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005461 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005462 return;
5463 case dotted_as_name:
5464 if (NCH(n) == 3)
5465 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005466 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005467 else
5468 symtable_add_def(st,
5469 STR(CHILD(CHILD(n,
5470 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005471 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472 return;
5473 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005474 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005475 return;
5476 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005477 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005478 return;
5479 default:
5480 if (NCH(n) == 0)
5481 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005482 if (NCH(n) == 1) {
5483 n = CHILD(n, 0);
5484 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005485 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005486 /* Should only occur for errors like x + 1 = 1,
5487 which will be caught in the next pass. */
5488 for (i = 0; i < NCH(n); ++i)
5489 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005490 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005491 }
5492}