blob: de0a8e235a635845efbd7a9ffb595fbf65963ec5 [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 \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000064"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000065
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);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000123 PyOS_snprintf(buf, sizeof(buf),
124 "<code object %.100s at %p, file \"%.300s\", line %d>",
125 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000127}
128
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000129static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000130code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000131{
132 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000133 cmp = PyObject_Compare(co->co_name, cp->co_name);
134 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000135 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000136 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000137 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000138 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000139 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000140 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000141 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000142 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000144 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000145 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000146 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000148 if (cmp) return cmp;
149 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
150 if (cmp) return cmp;
151 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000152 return cmp;
153}
154
155static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000157{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000158 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000159 h0 = PyObject_Hash(co->co_name);
160 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000161 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000162 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000164 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000166 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000168 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000169 h5 = PyObject_Hash(co->co_freevars);
170 if (h5 == -1) return -1;
171 h6 = PyObject_Hash(co->co_cellvars);
172 if (h6 == -1) return -1;
173 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000174 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000175 if (h == -1) h = -2;
176 return h;
177}
178
Jeremy Hylton78891072001-03-01 06:09:34 +0000179/* XXX code objects need to participate in GC? */
180
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181PyTypeObject PyCode_Type = {
182 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000183 0,
184 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000186 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000187 (destructor)code_dealloc, /* tp_dealloc */
188 0, /* tp_print */
189 0, /* tp_getattr */
190 0, /* tp_setattr */
191 (cmpfunc)code_compare, /* tp_compare */
192 (reprfunc)code_repr, /* tp_repr */
193 0, /* tp_as_number */
194 0, /* tp_as_sequence */
195 0, /* tp_as_mapping */
196 (hashfunc)code_hash, /* tp_hash */
197 0, /* tp_call */
198 0, /* tp_str */
199 PyObject_GenericGetAttr, /* tp_getattro */
200 0, /* tp_setattro */
201 0, /* tp_as_buffer */
202 Py_TPFLAGS_DEFAULT, /* tp_flags */
203 0, /* tp_doc */
204 0, /* tp_traverse */
205 0, /* tp_clear */
206 0, /* tp_richcompare */
207 0, /* tp_weaklistoffset */
208 0, /* tp_iter */
209 0, /* tp_iternext */
210 0, /* tp_methods */
211 code_memberlist, /* tp_members */
212 0, /* tp_getset */
213 0, /* tp_base */
214 0, /* tp_dict */
215 0, /* tp_descr_get */
216 0, /* tp_descr_set */
217 0, /* tp_dictoffset */
218 0, /* tp_init */
219 0, /* tp_alloc */
220 0, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000221};
222
Guido van Rossum644a12b1997-04-09 19:24:53 +0000223#define NAME_CHARS \
224 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
225
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000226/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
227
228static int
229all_name_chars(unsigned char *s)
230{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000231 static char ok_name_char[256];
232 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000233
Guido van Rossumcd90c202001-02-09 15:06:42 +0000234 if (ok_name_char[*name_chars] == 0) {
235 unsigned char *p;
236 for (p = name_chars; *p; p++)
237 ok_name_char[*p] = 1;
238 }
239 while (*s) {
240 if (ok_name_char[*s++] == 0)
241 return 0;
242 }
243 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000244}
245
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000246static int
247intern_strings(PyObject *tuple)
248{
249 int i;
250
251 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
252 PyObject *v = PyTuple_GET_ITEM(tuple, i);
253 if (v == NULL || !PyString_Check(v)) {
254 Py_FatalError("non-string found in code slot");
255 PyErr_BadInternalCall();
256 return -1;
257 }
258 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
259 }
260 return 0;
261}
262
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000264PyCode_New(int argcount, int nlocals, int stacksize, int flags,
265 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000266 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
267 PyObject *filename, PyObject *name, int firstlineno,
268 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000269{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000271 int i;
272 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000273 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000274 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 consts == NULL || !PyTuple_Check(consts) ||
276 names == NULL || !PyTuple_Check(names) ||
277 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000278 freevars == NULL || !PyTuple_Check(freevars) ||
279 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280 name == NULL || !PyString_Check(name) ||
281 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000282 lnotab == NULL || !PyString_Check(lnotab) ||
283 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 PyErr_BadInternalCall();
285 return NULL;
286 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000287 intern_strings(names);
288 intern_strings(varnames);
289 if (freevars == NULL)
290 freevars = PyTuple_New(0);
291 intern_strings(freevars);
292 if (cellvars == NULL)
293 cellvars = PyTuple_New(0);
294 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000295 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 for (i = PyTuple_Size(consts); --i >= 0; ) {
297 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000299 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000300 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000301 continue;
302 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000303 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000305 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000306 co->co_argcount = argcount;
307 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000308 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000309 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000311 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000313 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000315 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000317 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000318 Py_INCREF(freevars);
319 co->co_freevars = freevars;
320 Py_INCREF(cellvars);
321 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000323 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000325 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000326 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000328 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000329 }
330 return co;
331}
332
333
334/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000335
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000336/* The compiler uses two passes to generate bytecodes. The first pass
337 builds the symbol table. The second pass generates the bytecode.
338
339 The first pass uses a single symtable struct. The second pass uses
340 a compiling struct for each code block. The compiling structs
341 share a reference to the symtable.
342
343 The two passes communicate via symtable_load_symbols() and via
344 is_local() and is_global(). The former initializes several slots
345 in the compiling struct: c_varnames, c_locals, c_nlocals,
346 c_argcount, c_globals, and c_flags.
347*/
348
Tim Peters2a7f3842001-06-09 09:26:21 +0000349/* All about c_lnotab.
350
351c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
352mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
353to source code line #s (when needed for tracebacks) via c_lnotab instead.
354The array is conceptually a list of
355 (bytecode offset increment, line number increment)
356pairs. The details are important and delicate, best illustrated by example:
357
358 byte code offset source code line number
359 0 1
360 6 2
361 50 7
362 350 307
363 361 308
364
365The first trick is that these numbers aren't stored, only the increments
366from one row to the next (this doesn't really work, but it's a start):
367
368 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
369
370The second trick is that an unsigned byte can't hold negative values, or
371values larger than 255, so (a) there's a deep assumption that byte code
372offsets and their corresponding line #s both increase monotonically, and (b)
373if at least one column jumps by more than 255 from one row to the next, more
374than one pair is written to the table. In case #b, there's no way to know
375from looking at the table later how many were written. That's the delicate
376part. A user of c_lnotab desiring to find the source line number
377corresponding to a bytecode address A should do something like this
378
379 lineno = addr = 0
380 for addr_incr, line_incr in c_lnotab:
381 addr += addr_incr
382 if addr > A:
383 return lineno
384 lineno += line_incr
385
386In order for this to work, when the addr field increments by more than 255,
387the line # increment in each pair generated must be 0 until the remaining addr
388increment is < 256. So, in the example above, com_set_lineno should not (as
389was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
390255, 0, 45, 255, 0, 45.
391*/
392
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000393struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000394 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000396 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000398 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyObject *c_globals; /* dictionary (value=None) */
400 PyObject *c_locals; /* dictionary (value=localID) */
401 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000402 PyObject *c_freevars; /* dictionary (value=None) */
403 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000404 int c_nlocals; /* index of next local */
405 int c_argcount; /* number of top-level arguments */
406 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000407 int c_nexti; /* index into c_code */
408 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000410 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000412 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000413 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000414 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000415 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000416 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000417 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000418 int c_stacklevel; /* Current stack level */
419 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000420 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000421 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000422 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000423 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000424 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000425 int c_nested; /* Is block nested funcdef or lamdef? */
426 int c_closure; /* Is nested w/freevars? */
427 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000428 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000429};
430
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000431static int
432is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000433{
434 if ((v & (USE | DEF_FREE))
435 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
436 return 1;
437 if (v & DEF_FREE_CLASS)
438 return 1;
439 return 0;
440}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000441
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000443com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000444{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000445 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
446
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000447 if (c == NULL) {
448 /* Error occurred via symtable call to
449 is_constant_false */
450 PyErr_SetString(exc, msg);
451 return;
452 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000453 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000454 if (c->c_lineno < 1 || c->c_interactive) {
455 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000457 return;
458 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000459 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000460 if (v == NULL)
461 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000462
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000463 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000464 if (line == NULL) {
465 Py_INCREF(Py_None);
466 line = Py_None;
467 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000468 if (exc == PyExc_SyntaxError) {
469 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
470 Py_None, line);
471 if (t == NULL)
472 goto exit;
473 w = Py_BuildValue("(OO)", v, t);
474 if (w == NULL)
475 goto exit;
476 PyErr_SetObject(exc, w);
477 } else {
478 /* Make sure additional exceptions are printed with
479 file and line, also. */
480 PyErr_SetObject(exc, v);
481 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
482 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000483 exit:
484 Py_XDECREF(t);
485 Py_XDECREF(v);
486 Py_XDECREF(w);
487 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000488}
489
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000490/* Interface to the block stack */
491
492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000493block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000495 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 com_error(c, PyExc_SystemError,
497 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000498 }
499 else {
500 c->c_block[c->c_nblocks++] = type;
501 }
502}
503
504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000505block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000506{
507 if (c->c_nblocks > 0)
508 c->c_nblocks--;
509 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000511 }
512}
513
Guido van Rossum681d79a1995-07-18 14:51:37 +0000514/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000515
Tim Petersdbd9ba62000-07-09 03:09:57 +0000516static int com_init(struct compiling *, char *);
517static void com_free(struct compiling *);
518static void com_push(struct compiling *, int);
519static void com_pop(struct compiling *, int);
520static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000521static void com_node(struct compiling *, node *);
522static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000523static void com_addbyte(struct compiling *, int);
524static void com_addint(struct compiling *, int);
525static void com_addoparg(struct compiling *, int, int);
526static void com_addfwref(struct compiling *, int, int *);
527static void com_backpatch(struct compiling *, int);
528static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
529static int com_addconst(struct compiling *, PyObject *);
530static int com_addname(struct compiling *, PyObject *);
531static void com_addopname(struct compiling *, int, node *);
532static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000533static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000534static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000535static void com_assign(struct compiling *, node *, int, node *);
536static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000537static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000538static PyCodeObject *jcompile(node *, char *, struct compiling *,
539 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000540static PyObject *parsestrplus(struct compiling*, node *);
541static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000542static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000543
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000544static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000545
546/* symtable operations */
547static int symtable_build(struct compiling *, node *);
548static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000549static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000550static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000551static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000552static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000553static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000554
555static void symtable_node(struct symtable *, node *);
556static void symtable_funcdef(struct symtable *, node *);
557static void symtable_default_args(struct symtable *, node *);
558static void symtable_params(struct symtable *, node *);
559static void symtable_params_fplist(struct symtable *, node *n);
560static void symtable_global(struct symtable *, node *);
561static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000562static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000563static void symtable_list_comprehension(struct symtable *, node *);
564
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000565static int symtable_update_free_vars(struct symtable *);
566static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
567static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
568
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000569/* helper */
570static void
571do_pad(int pad)
572{
573 int i;
574 for (i = 0; i < pad; ++i)
575 fprintf(stderr, " ");
576}
577
578static void
579dump(node *n, int pad, int depth)
580{
581 int i;
582 if (depth == 0)
583 return;
584 do_pad(pad);
585 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
586 if (depth > 0)
587 depth--;
588 for (i = 0; i < NCH(n); ++i)
589 dump(CHILD(n, i), pad + 1, depth);
590}
591
592#define DUMP(N) dump(N, 0, -1)
593
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000594static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000595com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000596{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000597 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
599 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000600 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000602 goto fail;
603 if ((c->c_const_dict = PyDict_New()) == NULL)
604 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 goto fail;
607 if ((c->c_name_dict = PyDict_New()) == NULL)
608 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000610 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
612 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000613 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000614 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000615 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000616 c->c_freevars = NULL;
617 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000618 c->c_nlocals = 0;
619 c->c_argcount = 0;
620 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 c->c_nexti = 0;
622 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000623 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000624 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000625 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000626 c->c_begin = 0;
627 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000628 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000629 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000630 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000631 c->c_stacklevel = 0;
632 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000633 c->c_firstlineno = 0;
634 c->c_last_addr = 0;
635 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000636 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000637 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000638 c->c_nested = 0;
639 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000640 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641 return 1;
642
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000643 fail:
644 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000645 return 0;
646}
647
648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000649com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000651 Py_XDECREF(c->c_code);
652 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000653 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000655 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 Py_XDECREF(c->c_globals);
657 Py_XDECREF(c->c_locals);
658 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000659 Py_XDECREF(c->c_freevars);
660 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000662 if (c->c_future)
663 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000664}
665
666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000667com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000668{
669 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000670 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000671 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000672 /*
673 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
674 c->c_filename, c->c_name, c->c_lineno,
675 c->c_nexti, c->c_stacklevel, n);
676 */
677 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000678}
679
680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000682{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000683 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000684 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000685 else
686 c->c_stacklevel -= n;
687}
688
689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000690com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000691{
692 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000694 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000696}
697
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000698static int
699com_check_size(PyObject **s, int offset)
700{
701 int len = PyString_GET_SIZE(*s);
702 if (offset >= len)
703 return _PyString_Resize(s, len * 2);
704 return 0;
705}
706
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000708com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000710 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000711 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000712 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000713 if (com_check_size(&c->c_code, c->c_nexti)) {
714 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000717 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718}
719
720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000721com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000723 com_addbyte(c, x & 0xff);
724 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000725}
726
727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000728com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000729{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000730 char *p;
731 if (c->c_lnotab == NULL)
732 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000733 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
734 c->c_errors++;
735 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000736 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000737 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000738 *p++ = addr;
739 *p++ = line;
740 c->c_lnotab_next += 2;
741}
742
743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000744com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000745{
746 c->c_lineno = lineno;
747 if (c->c_firstlineno == 0) {
748 c->c_firstlineno = c->c_last_line = lineno;
749 }
750 else {
751 int incr_addr = c->c_nexti - c->c_last_addr;
752 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000753 while (incr_addr > 255) {
754 com_add_lnotab(c, 255, 0);
755 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000756 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000757 while (incr_line > 255) {
758 com_add_lnotab(c, incr_addr, 255);
759 incr_line -=255;
760 incr_addr = 0;
761 }
762 if (incr_addr > 0 || incr_line > 0)
763 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000764 c->c_last_addr = c->c_nexti;
765 c->c_last_line = lineno;
766 }
767}
768
769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000770com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000771{
Fred Drakeef8ace32000-08-24 00:32:09 +0000772 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000773 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000774 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000775 if (Py_OptimizeFlag)
776 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000777 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000778 if (extended_arg){
779 com_addbyte(c, EXTENDED_ARG);
780 com_addint(c, extended_arg);
781 arg &= 0xffff;
782 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000783 com_addbyte(c, op);
784 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785}
786
787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000788com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000789{
790 /* Compile a forward reference for backpatching */
791 int here;
792 int anchor;
793 com_addbyte(c, op);
794 here = c->c_nexti;
795 anchor = *p_anchor;
796 *p_anchor = here;
797 com_addint(c, anchor == 0 ? 0 : here - anchor);
798}
799
800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000801com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000802{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000803 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805 int dist;
806 int prev;
807 for (;;) {
808 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000809 prev = code[anchor] + (code[anchor+1] << 8);
810 dist = target - (anchor+2);
811 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000812 dist >>= 8;
813 code[anchor+1] = dist;
814 dist >>= 8;
815 if (dist) {
816 com_error(c, PyExc_SystemError,
817 "com_backpatch: offset too large");
818 break;
819 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820 if (!prev)
821 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 anchor -= prev;
823 }
824}
825
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000826/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000827
828static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000829com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000830{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000831 PyObject *w, *t, *np=NULL;
832 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000833
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000834 t = Py_BuildValue("(OO)", v, v->ob_type);
835 if (t == NULL)
836 goto fail;
837 w = PyDict_GetItem(dict, t);
838 if (w != NULL) {
839 n = PyInt_AsLong(w);
840 } else {
841 n = PyList_Size(list);
842 np = PyInt_FromLong(n);
843 if (np == NULL)
844 goto fail;
845 if (PyList_Append(list, v) != 0)
846 goto fail;
847 if (PyDict_SetItem(dict, t, np) != 0)
848 goto fail;
849 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000850 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000851 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000852 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000853 fail:
854 Py_XDECREF(np);
855 Py_XDECREF(t);
856 c->c_errors++;
857 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858}
859
860static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000861com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000862{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000863 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864}
865
866static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000867com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000868{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000869 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000870}
871
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000872static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000873mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000874{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000875 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000876 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000877 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000878 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
879 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000880 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000881 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000882 return 0; /* Don't mangle __extremely_long_names */
883 if (name[nlen-1] == '_' && name[nlen-2] == '_')
884 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000885 /* Strip leading underscores from class name */
886 while (*p == '_')
887 p++;
888 if (*p == '\0')
889 return 0; /* Don't mangle if class is just underscores */
890 plen = strlen(p);
891 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000892 plen = maxlen-nlen-2; /* Truncate class name if too long */
893 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000894 buffer[0] = '_';
895 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000896 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000897 return 1;
898}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000899
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000901com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000906
907 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000908 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000909 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910 c->c_errors++;
911 i = 255;
912 }
913 else {
914 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000916 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000917 com_addoparg(c, op, i);
918}
919
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000920#define NAME_LOCAL 0
921#define NAME_GLOBAL 1
922#define NAME_DEFAULT 2
923#define NAME_CLOSURE 3
924
925static int
926com_lookup_arg(PyObject *dict, PyObject *name)
927{
928 PyObject *v = PyDict_GetItem(dict, name);
929 if (v == NULL)
930 return -1;
931 else
932 return PyInt_AS_LONG(v);
933}
934
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000935static void
936com_addop_varname(struct compiling *c, int kind, char *name)
937{
938 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000939 int i, reftype;
940 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000941 int op = STOP_CODE;
942 char buffer[MANGLE_LEN];
943
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000944 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000945 name = buffer;
946 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
947 c->c_errors++;
948 i = 255;
949 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000950 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000951
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000952 reftype = get_ref_type(c, name);
953 switch (reftype) {
954 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000955 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000956 scope = NAME_LOCAL;
957 break;
958 case GLOBAL_EXPLICIT:
959 scope = NAME_GLOBAL;
960 break;
961 case GLOBAL_IMPLICIT:
962 if (c->c_flags & CO_OPTIMIZED)
963 scope = NAME_GLOBAL;
964 break;
965 case FREE:
966 case CELL:
967 scope = NAME_CLOSURE;
968 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000969 }
970
971 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000972 if (scope == NAME_LOCAL)
973 i = com_lookup_arg(c->c_locals, v);
974 else if (reftype == FREE)
975 i = com_lookup_arg(c->c_freevars, v);
976 else if (reftype == CELL)
977 i = com_lookup_arg(c->c_cellvars, v);
978 if (i == -1) {
979 c->c_errors++; /* XXX no exception set */
980 i = 255;
981 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000982 }
983 Py_DECREF(v);
984
985 switch (kind) {
986 case VAR_LOAD:
987 switch (scope) {
988 case NAME_LOCAL:
989 op = LOAD_FAST;
990 break;
991 case NAME_GLOBAL:
992 op = LOAD_GLOBAL;
993 break;
994 case NAME_DEFAULT:
995 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000996 break;
997 case NAME_CLOSURE:
998 op = LOAD_DEREF;
999 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001000 }
1001 break;
1002 case VAR_STORE:
1003 switch (scope) {
1004 case NAME_LOCAL:
1005 op = STORE_FAST;
1006 break;
1007 case NAME_GLOBAL:
1008 op = STORE_GLOBAL;
1009 break;
1010 case NAME_DEFAULT:
1011 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001012 break;
1013 case NAME_CLOSURE:
1014 op = STORE_DEREF;
1015 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001016 }
1017 break;
1018 case VAR_DELETE:
1019 switch (scope) {
1020 case NAME_LOCAL:
1021 op = DELETE_FAST;
1022 break;
1023 case NAME_GLOBAL:
1024 op = DELETE_GLOBAL;
1025 break;
1026 case NAME_DEFAULT:
1027 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001028 break;
1029 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001030 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001031 PyOS_snprintf(buf, sizeof(buf),
1032 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001033 com_error(c, PyExc_SyntaxError, buf);
1034 i = 255;
1035 break;
1036 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001037 }
1038 break;
1039 }
1040done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 com_addoparg(c, op, i);
1042}
1043
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001044static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001045com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001046{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001047 char *name;
1048 char buffer[1000];
1049 /* XXX it is possible to write this code without the 1000
1050 chars on the total length of dotted names, I just can't be
1051 bothered right now */
1052 if (TYPE(n) == STAR)
1053 name = "*";
1054 else if (TYPE(n) == dotted_name) {
1055 char *p = buffer;
1056 int i;
1057 name = buffer;
1058 for (i = 0; i < NCH(n); i += 2) {
1059 char *s = STR(CHILD(n, i));
1060 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001062 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001063 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001064 break;
1065 }
1066 if (p != buffer)
1067 *p++ = '.';
1068 strcpy(p, s);
1069 p = strchr(p, '\0');
1070 }
1071 }
1072 else {
1073 REQ(n, NAME);
1074 name = STR(n);
1075 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001077}
1078
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001080parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001082 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001083 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001084 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001085#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001086 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001087 int imflag;
1088#endif
1089
Guido van Rossum282914b1991-04-04 10:42:56 +00001090 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001091 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001092#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001093 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001094#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001095 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001097 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001099 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001101 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001102 if (errno != 0)
1103 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001105 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001106 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001107#ifndef WITHOUT_COMPLEX
1108 if (imflag) {
1109 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001110 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001111 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001112 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001114 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001115 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001116#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001117 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001118 PyFPE_START_PROTECT("atof", return 0)
1119 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001120 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001122 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123}
1124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001126parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001129 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001130 char *buf;
1131 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001132 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001134 int first = *s;
1135 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001136 int rawmode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001137#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001138 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001139#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001140 if (isalpha(quote) || quote == '_') {
1141 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001142#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001143 quote = *++s;
1144 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001145#else
1146 com_error(com, PyExc_SyntaxError,
1147 "Unicode literals not supported in this Python");
1148 return NULL;
1149#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001150 }
1151 if (quote == 'r' || quote == 'R') {
1152 quote = *++s;
1153 rawmode = 1;
1154 }
1155 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001156 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 return NULL;
1159 }
1160 s++;
1161 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001162 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001163 com_error(com, PyExc_OverflowError,
1164 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001165 return NULL;
1166 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001167 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 return NULL;
1170 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001171 if (len >= 4 && s[0] == quote && s[1] == quote) {
1172 s += 2;
1173 len -= 2;
1174 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001176 return NULL;
1177 }
1178 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001179#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001180 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001181 if (rawmode)
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001182 v = PyUnicode_DecodeRawUnicodeEscape(
1183 s, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001184 else
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001185 v = PyUnicode_DecodeUnicodeEscape(
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001186 s, len, NULL);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001187 if (v == NULL)
1188 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1189 return v;
1190
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001191 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001192#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001193 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 return PyString_FromStringAndSize(s, len);
1195 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001196 if (v == NULL)
1197 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001199 end = s + len;
1200 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 if (*s != '\\') {
1202 *p++ = *s++;
1203 continue;
1204 }
1205 s++;
1206 switch (*s++) {
1207 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001208 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209 case '\\': *p++ = '\\'; break;
1210 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001211 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001212 case 'b': *p++ = '\b'; break;
1213 case 'f': *p++ = '\014'; break; /* FF */
1214 case 't': *p++ = '\t'; break;
1215 case 'n': *p++ = '\n'; break;
1216 case 'r': *p++ = '\r'; break;
1217 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1219 case '0': case '1': case '2': case '3':
1220 case '4': case '5': case '6': case '7':
1221 c = s[-1] - '0';
1222 if ('0' <= *s && *s <= '7') {
1223 c = (c<<3) + *s++ - '0';
1224 if ('0' <= *s && *s <= '7')
1225 c = (c<<3) + *s++ - '0';
1226 }
1227 *p++ = c;
1228 break;
1229 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001230 if (isxdigit(Py_CHARMASK(s[0]))
1231 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001232 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001233 c = Py_CHARMASK(*s);
1234 s++;
1235 if (isdigit(c))
1236 x = c - '0';
1237 else if (islower(c))
1238 x = 10 + c - 'a';
1239 else
1240 x = 10 + c - 'A';
1241 x = x << 4;
1242 c = Py_CHARMASK(*s);
1243 s++;
1244 if (isdigit(c))
1245 x += c - '0';
1246 else if (islower(c))
1247 x += 10 + c - 'a';
1248 else
1249 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001250 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001251 break;
1252 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001253 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001254 com_error(com, PyExc_ValueError,
1255 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001256 return NULL;
1257 default:
1258 *p++ = '\\';
1259 *p++ = s[-1];
1260 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 }
1262 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001264 return v;
1265}
1266
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001268parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001269{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001271 int i;
1272 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001273 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001274 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001275 for (i = 1; i < NCH(n); i++) {
1276 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001277 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001278 if (s == NULL)
1279 goto onError;
1280 if (PyString_Check(v) && PyString_Check(s)) {
1281 PyString_ConcatAndDel(&v, s);
1282 if (v == NULL)
1283 goto onError;
1284 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001285#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001286 else {
1287 PyObject *temp;
1288 temp = PyUnicode_Concat(v, s);
1289 Py_DECREF(s);
1290 if (temp == NULL)
1291 goto onError;
1292 Py_DECREF(v);
1293 v = temp;
1294 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001295#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001296 }
1297 }
1298 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001299
1300 onError:
1301 Py_XDECREF(v);
1302 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001303}
1304
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001306com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001308 int anchor = 0;
1309 int save_begin = c->c_begin;
1310
1311 /* list_iter: for v in expr [list_iter] */
1312 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001313 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001314 c->c_begin = c->c_nexti;
1315 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001316 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001317 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001318 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001319 c->c_loops++;
1320 com_list_iter(c, n, e, t);
1321 c->c_loops--;
1322 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1323 c->c_begin = save_begin;
1324 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001325 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001326}
1327
1328static void
1329com_list_if(struct compiling *c, node *n, node *e, char *t)
1330{
1331 int anchor = 0;
1332 int a = 0;
1333 /* list_iter: 'if' test [list_iter] */
1334 com_addoparg(c, SET_LINENO, n->n_lineno);
1335 com_node(c, CHILD(n, 1));
1336 com_addfwref(c, JUMP_IF_FALSE, &a);
1337 com_addbyte(c, POP_TOP);
1338 com_pop(c, 1);
1339 com_list_iter(c, n, e, t);
1340 com_addfwref(c, JUMP_FORWARD, &anchor);
1341 com_backpatch(c, a);
1342 /* We jump here with an extra entry which we now pop */
1343 com_addbyte(c, POP_TOP);
1344 com_backpatch(c, anchor);
1345}
1346
1347static void
1348com_list_iter(struct compiling *c,
1349 node *p, /* parent of list_iter node */
1350 node *e, /* element expression node */
1351 char *t /* name of result list temp local */)
1352{
1353 /* list_iter is the last child in a listmaker, list_for, or list_if */
1354 node *n = CHILD(p, NCH(p)-1);
1355 if (TYPE(n) == list_iter) {
1356 n = CHILD(n, 0);
1357 switch (TYPE(n)) {
1358 case list_for:
1359 com_list_for(c, n, e, t);
1360 break;
1361 case list_if:
1362 com_list_if(c, n, e, t);
1363 break;
1364 default:
1365 com_error(c, PyExc_SystemError,
1366 "invalid list_iter node type");
1367 }
1368 }
1369 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001370 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001371 com_push(c, 1);
1372 com_node(c, e);
1373 com_addoparg(c, CALL_FUNCTION, 1);
1374 com_addbyte(c, POP_TOP);
1375 com_pop(c, 2);
1376 }
1377}
1378
1379static void
1380com_list_comprehension(struct compiling *c, node *n)
1381{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001382 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001383 char tmpname[30];
1384 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001385 com_addoparg(c, BUILD_LIST, 0);
1386 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1387 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001388 com_addop_name(c, LOAD_ATTR, "append");
1389 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001390 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001391 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001392 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001393 --c->c_tmpname;
1394}
1395
1396static void
1397com_listmaker(struct compiling *c, node *n)
1398{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001399 /* listmaker: test ( list_for | (',' test)* [','] ) */
1400 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001401 com_list_comprehension(c, n);
1402 else {
1403 int len = 0;
1404 int i;
1405 for (i = 0; i < NCH(n); i += 2, len++)
1406 com_node(c, CHILD(n, i));
1407 com_addoparg(c, BUILD_LIST, len);
1408 com_pop(c, len-1);
1409 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410}
1411
1412static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001413com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001414{
1415 int i;
1416 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1417 for (i = 0; i+2 < NCH(n); i += 4) {
1418 /* We must arrange things just right for STORE_SUBSCR.
1419 It wants the stack to look like (value) (dict) (key) */
1420 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001421 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001422 com_node(c, CHILD(n, i+2)); /* value */
1423 com_addbyte(c, ROT_TWO);
1424 com_node(c, CHILD(n, i)); /* key */
1425 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001426 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001427 }
1428}
1429
1430static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001431com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432{
1433 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435 int i;
1436 REQ(n, atom);
1437 ch = CHILD(n, 0);
1438 switch (TYPE(ch)) {
1439 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001440 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001442 com_push(c, 1);
1443 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 else
1445 com_node(c, CHILD(n, 1));
1446 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001447 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001448 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001450 com_push(c, 1);
1451 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001453 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001455 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001457 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001458 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001459 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 break;
1461 case BACKQUOTE:
1462 com_node(c, CHILD(n, 1));
1463 com_addbyte(c, UNARY_CONVERT);
1464 break;
1465 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001466 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467 i = 255;
1468 }
1469 else {
1470 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472 }
1473 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001474 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 break;
1476 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001477 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001478 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001479 c->c_errors++;
1480 i = 255;
1481 }
1482 else {
1483 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485 }
1486 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001487 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488 break;
1489 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001490 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001491 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 break;
1493 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 com_error(c, PyExc_SystemError,
1495 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001496 }
1497}
1498
1499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001500com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501{
1502 if (NCH(n) == 1) {
1503 com_addbyte(c, op);
1504 }
1505 else if (NCH(n) == 2) {
1506 if (TYPE(CHILD(n, 0)) != COLON) {
1507 com_node(c, CHILD(n, 0));
1508 com_addbyte(c, op+1);
1509 }
1510 else {
1511 com_node(c, CHILD(n, 1));
1512 com_addbyte(c, op+2);
1513 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001514 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001515 }
1516 else {
1517 com_node(c, CHILD(n, 0));
1518 com_node(c, CHILD(n, 2));
1519 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001520 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521 }
1522}
1523
Guido van Rossum635abd21997-01-06 22:56:52 +00001524static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001525com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1526{
1527 if (NCH(n) == 1) {
1528 com_addbyte(c, DUP_TOP);
1529 com_push(c, 1);
1530 com_addbyte(c, SLICE);
1531 com_node(c, augn);
1532 com_addbyte(c, opcode);
1533 com_pop(c, 1);
1534 com_addbyte(c, ROT_TWO);
1535 com_addbyte(c, STORE_SLICE);
1536 com_pop(c, 2);
1537 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1538 com_node(c, CHILD(n, 0));
1539 com_addoparg(c, DUP_TOPX, 2);
1540 com_push(c, 2);
1541 com_addbyte(c, SLICE+1);
1542 com_pop(c, 1);
1543 com_node(c, augn);
1544 com_addbyte(c, opcode);
1545 com_pop(c, 1);
1546 com_addbyte(c, ROT_THREE);
1547 com_addbyte(c, STORE_SLICE+1);
1548 com_pop(c, 3);
1549 } else if (NCH(n) == 2) {
1550 com_node(c, CHILD(n, 1));
1551 com_addoparg(c, DUP_TOPX, 2);
1552 com_push(c, 2);
1553 com_addbyte(c, SLICE+2);
1554 com_pop(c, 1);
1555 com_node(c, augn);
1556 com_addbyte(c, opcode);
1557 com_pop(c, 1);
1558 com_addbyte(c, ROT_THREE);
1559 com_addbyte(c, STORE_SLICE+2);
1560 com_pop(c, 3);
1561 } else {
1562 com_node(c, CHILD(n, 0));
1563 com_node(c, CHILD(n, 2));
1564 com_addoparg(c, DUP_TOPX, 3);
1565 com_push(c, 3);
1566 com_addbyte(c, SLICE+3);
1567 com_pop(c, 2);
1568 com_node(c, augn);
1569 com_addbyte(c, opcode);
1570 com_pop(c, 1);
1571 com_addbyte(c, ROT_FOUR);
1572 com_addbyte(c, STORE_SLICE+3);
1573 com_pop(c, 4);
1574 }
1575}
1576
1577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001578com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001579{
1580 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001581 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001582 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001583 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001585 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001586 }
1587 else {
1588 com_node(c, CHILD(n, 0));
1589 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001590 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001591 }
1592 m = n;
1593 do {
1594 m = CHILD(m, 0);
1595 } while (NCH(m) == 1);
1596 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001597 /* f(lambda x: x[0] = 3) ends up getting parsed with
1598 * LHS test = lambda x: x[0], and RHS test = 3.
1599 * SF bug 132313 points out that complaining about a keyword
1600 * then is very confusing.
1601 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001602 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001603 TYPE(m) == lambdef ?
1604 "lambda cannot contain assignment" :
1605 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001606 }
1607 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001609 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001611 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001612 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001613 else if (*pkeywords == NULL) {
1614 c->c_errors++;
1615 Py_DECREF(v);
1616 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 if (PyDict_GetItem(*pkeywords, v) != NULL)
1618 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001619 "duplicate keyword argument");
1620 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001622 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001623 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001624 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001625 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001626 }
1627 }
1628 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001629}
1630
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001632com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001633{
1634 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001635 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636 }
1637 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001638 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001639 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001640 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001641 int star_flag = 0;
1642 int starstar_flag = 0;
1643 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001645 na = 0;
1646 nk = 0;
1647 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001648 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001649 if (TYPE(ch) == STAR ||
1650 TYPE(ch) == DOUBLESTAR)
1651 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001652 if (ch->n_lineno != lineno) {
1653 lineno = ch->n_lineno;
1654 com_addoparg(c, SET_LINENO, lineno);
1655 }
1656 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001657 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001658 na++;
1659 else
1660 nk++;
1661 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001663 while (i < NCH(n)) {
1664 node *tok = CHILD(n, i);
1665 node *ch = CHILD(n, i+1);
1666 i += 3;
1667 switch (TYPE(tok)) {
1668 case STAR: star_flag = 1; break;
1669 case DOUBLESTAR: starstar_flag = 1; break;
1670 }
1671 com_node(c, ch);
1672 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001673 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 com_error(c, PyExc_SyntaxError,
1675 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001676 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001677 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001678 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001679 star_flag + (starstar_flag << 1);
1680 else
1681 opcode = CALL_FUNCTION;
1682 com_addoparg(c, opcode, na | (nk << 8));
1683 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684 }
1685}
1686
1687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001688com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689{
1690 com_addopname(c, LOAD_ATTR, n);
1691}
1692
1693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001695{
1696 int i=0;
1697 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001698 node *ch;
1699
1700 /* first argument */
1701 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001703 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001704 i++;
1705 }
1706 else {
1707 com_node(c, CHILD(n,i));
1708 i++;
1709 REQ(CHILD(n,i),COLON);
1710 i++;
1711 }
1712 /* second argument */
1713 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1714 com_node(c, CHILD(n,i));
1715 i++;
1716 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001717 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001719 com_push(c, 1);
1720 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001721 /* remaining arguments */
1722 for (; i < NCH(n); i++) {
1723 ns++;
1724 ch=CHILD(n,i);
1725 REQ(ch, sliceop);
1726 if (NCH(ch) == 1) {
1727 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001728 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001729 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001730 }
1731 else
1732 com_node(c, CHILD(ch,1));
1733 }
1734 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001735 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001736}
1737
1738static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001739com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001740{
1741 node *ch;
1742 REQ(n, subscript);
1743 ch = CHILD(n,0);
1744 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001745 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001746 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001747 com_push(c, 1);
1748 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001749 else {
1750 /* check for slice */
1751 if ((TYPE(ch) == COLON || NCH(n) > 1))
1752 com_sliceobj(c, n);
1753 else {
1754 REQ(ch, test);
1755 com_node(c, ch);
1756 }
1757 }
1758}
1759
1760static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001761com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001762{
1763 int i, op;
1764 REQ(n, subscriptlist);
1765 /* Check to make backward compatible slice behavior for '[i:j]' */
1766 if (NCH(n) == 1) {
1767 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001768 /* 'Basic' slice, should have exactly one colon. */
1769 if ((TYPE(CHILD(sub, 0)) == COLON
1770 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1771 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1772 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001773 switch (assigning) {
1774 case OP_DELETE:
1775 op = DELETE_SLICE;
1776 break;
1777 case OP_ASSIGN:
1778 op = STORE_SLICE;
1779 break;
1780 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001781 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001782 break;
1783 default:
1784 com_augassign_slice(c, sub, assigning, augn);
1785 return;
1786 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001787 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001788 if (op == STORE_SLICE)
1789 com_pop(c, 2);
1790 else if (op == DELETE_SLICE)
1791 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001792 return;
1793 }
1794 }
1795 /* Else normal subscriptlist. Compile each subscript. */
1796 for (i = 0; i < NCH(n); i += 2)
1797 com_subscript(c, CHILD(n, i));
1798 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001799 if (NCH(n) > 1) {
1800 i = (NCH(n)+1) / 2;
1801 com_addoparg(c, BUILD_TUPLE, i);
1802 com_pop(c, i-1);
1803 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001804 switch (assigning) {
1805 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001806 op = DELETE_SUBSCR;
1807 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001808 break;
1809 default:
1810 case OP_ASSIGN:
1811 op = STORE_SUBSCR;
1812 i = 3;
1813 break;
1814 case OP_APPLY:
1815 op = BINARY_SUBSCR;
1816 i = 1;
1817 break;
1818 }
1819 if (assigning > OP_APPLY) {
1820 com_addoparg(c, DUP_TOPX, 2);
1821 com_push(c, 2);
1822 com_addbyte(c, BINARY_SUBSCR);
1823 com_pop(c, 1);
1824 com_node(c, augn);
1825 com_addbyte(c, assigning);
1826 com_pop(c, 1);
1827 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001828 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001829 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001830 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001831}
1832
1833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
1836 REQ(n, trailer);
1837 switch (TYPE(CHILD(n, 0))) {
1838 case LPAR:
1839 com_call_function(c, CHILD(n, 1));
1840 break;
1841 case DOT:
1842 com_select_member(c, CHILD(n, 1));
1843 break;
1844 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001845 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 break;
1847 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001849 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001850 }
1851}
1852
1853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001854com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001855{
1856 int i;
1857 REQ(n, power);
1858 com_atom(c, CHILD(n, 0));
1859 for (i = 1; i < NCH(n); i++) {
1860 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1861 com_factor(c, CHILD(n, i+1));
1862 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001863 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001864 break;
1865 }
1866 else
1867 com_apply_trailer(c, CHILD(n, i));
1868 }
1869}
1870
1871static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001872com_invert_constant(struct compiling *c, node *n)
1873{
1874 /* Compute the inverse of int and longs and use them directly,
1875 but be prepared to generate code for all other
1876 possibilities (invalid numbers, floats, complex).
1877 */
1878 PyObject *num, *inv = NULL;
1879 int i;
1880
1881 REQ(n, NUMBER);
1882 num = parsenumber(c, STR(n));
1883 if (num == NULL)
1884 i = 255;
1885 else {
1886 inv = PyNumber_Invert(num);
1887 if (inv == NULL) {
1888 PyErr_Clear();
1889 i = com_addconst(c, num);
1890 } else {
1891 i = com_addconst(c, inv);
1892 Py_DECREF(inv);
1893 }
1894 Py_DECREF(num);
1895 }
1896 com_addoparg(c, LOAD_CONST, i);
1897 com_push(c, 1);
1898 if (num != NULL && inv == NULL)
1899 com_addbyte(c, UNARY_INVERT);
1900}
1901
Tim Peters51e26512001-09-07 08:45:55 +00001902static int
1903is_float_zero(const char *p)
1904{
1905 int found_radix_point = 0;
1906 int ch;
1907 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1908 switch (ch) {
1909 case '0':
1910 /* no reason to believe it's not 0 -- continue */
1911 break;
1912
1913 case 'e': case 'E': case 'j': case 'J':
1914 /* If this was a hex constant, we already would have
1915 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1916 must be an exponent marker, and we haven't yet
1917 seen a non-zero digit, and it doesn't matter what
1918 the exponent is then. For 'j' or 'J' similarly,
1919 except that this is an imaginary 0 then. */
1920 return 1;
1921
1922 case '.':
1923 found_radix_point = 1;
1924 break;
1925
1926 default:
1927 return 0;
1928 }
1929 }
1930 return found_radix_point;
1931}
1932
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001934com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001935{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001936 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001937 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001938 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001939 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001940 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001941 approriate value as a constant. If the value is negative,
1942 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001943 negative in the 0th position -- unless we're doing unary minus
1944 of a floating zero! In that case the sign is significant, but
1945 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001946 */
1947 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001948 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001949 && TYPE((pfactor = CHILD(n, 1))) == factor
1950 && NCH(pfactor) == 1
1951 && TYPE((ppower = CHILD(pfactor, 0))) == power
1952 && NCH(ppower) == 1
1953 && TYPE((patom = CHILD(ppower, 0))) == atom
1954 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1955 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001956 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001957 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001958 return;
1959 }
1960 if (childtype == MINUS) {
Tim Peters51e26512001-09-07 08:45:55 +00001961 char *s = malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001962 if (s == NULL) {
1963 com_error(c, PyExc_MemoryError, "");
1964 com_addbyte(c, 255);
1965 return;
1966 }
1967 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001968 strcpy(s + 1, STR(pnum));
1969 free(STR(pnum));
1970 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001971 }
Tim Peters51e26512001-09-07 08:45:55 +00001972 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001973 }
1974 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 com_factor(c, CHILD(n, 1));
1976 com_addbyte(c, UNARY_POSITIVE);
1977 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001978 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 com_factor(c, CHILD(n, 1));
1980 com_addbyte(c, UNARY_NEGATIVE);
1981 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001982 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001983 com_factor(c, CHILD(n, 1));
1984 com_addbyte(c, UNARY_INVERT);
1985 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001987 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 }
1989}
1990
1991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001992com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993{
1994 int i;
1995 int op;
1996 REQ(n, term);
1997 com_factor(c, CHILD(n, 0));
1998 for (i = 2; i < NCH(n); i += 2) {
1999 com_factor(c, CHILD(n, i));
2000 switch (TYPE(CHILD(n, i-1))) {
2001 case STAR:
2002 op = BINARY_MULTIPLY;
2003 break;
2004 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002005 if (c->c_flags & CO_FUTURE_DIVISION)
2006 op = BINARY_TRUE_DIVIDE;
2007 else
2008 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 break;
2010 case PERCENT:
2011 op = BINARY_MODULO;
2012 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002013 case DOUBLESLASH:
2014 op = BINARY_FLOOR_DIVIDE;
2015 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002016 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002018 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002019 op = 255;
2020 }
2021 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002022 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002023 }
2024}
2025
2026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002027com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002028{
2029 int i;
2030 int op;
2031 REQ(n, arith_expr);
2032 com_term(c, CHILD(n, 0));
2033 for (i = 2; i < NCH(n); i += 2) {
2034 com_term(c, CHILD(n, i));
2035 switch (TYPE(CHILD(n, i-1))) {
2036 case PLUS:
2037 op = BINARY_ADD;
2038 break;
2039 case MINUS:
2040 op = BINARY_SUBTRACT;
2041 break;
2042 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002044 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002045 op = 255;
2046 }
2047 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002049 }
2050}
2051
2052static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002053com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002054{
2055 int i;
2056 int op;
2057 REQ(n, shift_expr);
2058 com_arith_expr(c, CHILD(n, 0));
2059 for (i = 2; i < NCH(n); i += 2) {
2060 com_arith_expr(c, CHILD(n, i));
2061 switch (TYPE(CHILD(n, i-1))) {
2062 case LEFTSHIFT:
2063 op = BINARY_LSHIFT;
2064 break;
2065 case RIGHTSHIFT:
2066 op = BINARY_RSHIFT;
2067 break;
2068 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002070 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002071 op = 255;
2072 }
2073 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002074 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002075 }
2076}
2077
2078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002079com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002080{
2081 int i;
2082 int op;
2083 REQ(n, and_expr);
2084 com_shift_expr(c, CHILD(n, 0));
2085 for (i = 2; i < NCH(n); i += 2) {
2086 com_shift_expr(c, CHILD(n, i));
2087 if (TYPE(CHILD(n, i-1)) == AMPER) {
2088 op = BINARY_AND;
2089 }
2090 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002091 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002092 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002093 op = 255;
2094 }
2095 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002096 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002097 }
2098}
2099
2100static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002101com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002102{
2103 int i;
2104 int op;
2105 REQ(n, xor_expr);
2106 com_and_expr(c, CHILD(n, 0));
2107 for (i = 2; i < NCH(n); i += 2) {
2108 com_and_expr(c, CHILD(n, i));
2109 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2110 op = BINARY_XOR;
2111 }
2112 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002113 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002114 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 op = 255;
2116 }
2117 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002118 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002119 }
2120}
2121
2122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002123com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002124{
2125 int i;
2126 int op;
2127 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002128 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002129 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002130 com_xor_expr(c, CHILD(n, i));
2131 if (TYPE(CHILD(n, i-1)) == VBAR) {
2132 op = BINARY_OR;
2133 }
2134 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002135 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002136 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 op = 255;
2138 }
2139 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 }
2142}
2143
2144static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002145cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146{
2147 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002148 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2150 if (NCH(n) == 1) {
2151 n = CHILD(n, 0);
2152 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002153 case LESS: return PyCmp_LT;
2154 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002155 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002156 case EQUAL: return PyCmp_EQ;
2157 case LESSEQUAL: return PyCmp_LE;
2158 case GREATEREQUAL: return PyCmp_GE;
2159 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2160 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2161 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 }
2163 }
2164 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002165 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002167 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002169 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 }
2171 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002172 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173}
2174
2175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002176com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177{
2178 int i;
2179 enum cmp_op op;
2180 int anchor;
2181 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2182 com_expr(c, CHILD(n, 0));
2183 if (NCH(n) == 1)
2184 return;
2185
2186 /****************************************************************
2187 The following code is generated for all but the last
2188 comparison in a chain:
2189
2190 label: on stack: opcode: jump to:
2191
2192 a <code to load b>
2193 a, b DUP_TOP
2194 a, b, b ROT_THREE
2195 b, a, b COMPARE_OP
2196 b, 0-or-1 JUMP_IF_FALSE L1
2197 b, 1 POP_TOP
2198 b
2199
2200 We are now ready to repeat this sequence for the next
2201 comparison in the chain.
2202
2203 For the last we generate:
2204
2205 b <code to load c>
2206 b, c COMPARE_OP
2207 0-or-1
2208
2209 If there were any jumps to L1 (i.e., there was more than one
2210 comparison), we generate:
2211
2212 0-or-1 JUMP_FORWARD L2
2213 L1: b, 0 ROT_TWO
2214 0, b POP_TOP
2215 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002216 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217 ****************************************************************/
2218
2219 anchor = 0;
2220
2221 for (i = 2; i < NCH(n); i += 2) {
2222 com_expr(c, CHILD(n, i));
2223 if (i+2 < NCH(n)) {
2224 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002225 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002226 com_addbyte(c, ROT_THREE);
2227 }
2228 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002229 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002230 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002231 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 }
2233 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002234 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 if (i+2 < NCH(n)) {
2236 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2237 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 }
2240 }
2241
2242 if (anchor) {
2243 int anchor2 = 0;
2244 com_addfwref(c, JUMP_FORWARD, &anchor2);
2245 com_backpatch(c, anchor);
2246 com_addbyte(c, ROT_TWO);
2247 com_addbyte(c, POP_TOP);
2248 com_backpatch(c, anchor2);
2249 }
2250}
2251
2252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002253com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002254{
2255 REQ(n, not_test); /* 'not' not_test | comparison */
2256 if (NCH(n) == 1) {
2257 com_comparison(c, CHILD(n, 0));
2258 }
2259 else {
2260 com_not_test(c, CHILD(n, 1));
2261 com_addbyte(c, UNARY_NOT);
2262 }
2263}
2264
2265static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002266com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267{
2268 int i;
2269 int anchor;
2270 REQ(n, and_test); /* not_test ('and' not_test)* */
2271 anchor = 0;
2272 i = 0;
2273 for (;;) {
2274 com_not_test(c, CHILD(n, i));
2275 if ((i += 2) >= NCH(n))
2276 break;
2277 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2278 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002280 }
2281 if (anchor)
2282 com_backpatch(c, anchor);
2283}
2284
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002285static int
2286com_make_closure(struct compiling *c, PyCodeObject *co)
2287{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002288 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002289 if (free == 0)
2290 return 0;
2291 for (i = 0; i < free; ++i) {
2292 /* Bypass com_addop_varname because it will generate
2293 LOAD_DEREF but LOAD_CLOSURE is needed.
2294 */
2295 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2296 int arg, reftype;
2297
2298 /* Special case: If a class contains a method with a
2299 free variable that has the same name as a method,
2300 the name will be considered free *and* local in the
2301 class. It should be handled by the closure, as
2302 well as by the normal name loookup logic.
2303 */
2304 reftype = get_ref_type(c, PyString_AS_STRING(name));
2305 if (reftype == CELL)
2306 arg = com_lookup_arg(c->c_cellvars, name);
2307 else /* (reftype == FREE) */
2308 arg = com_lookup_arg(c->c_freevars, name);
2309 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002310 fprintf(stderr, "lookup %s in %s %d %d\n"
2311 "freevars of %s: %s\n",
2312 PyObject_REPR(name),
2313 c->c_name,
2314 reftype, arg,
2315 PyString_AS_STRING(co->co_name),
2316 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002317 Py_FatalError("com_make_closure()");
2318 }
2319 com_addoparg(c, LOAD_CLOSURE, arg);
2320
2321 }
2322 com_push(c, free);
2323 return 1;
2324}
2325
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002327com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002330 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002331 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002332 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002333 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002334 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2335 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002336 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002337 if (co == NULL) {
2338 c->c_errors++;
2339 return;
2340 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002341 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002342 i = com_addconst(c, (PyObject *)co);
2343 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002344 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002345 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002346 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002347 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002348 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002349 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002350 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002351 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002352 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002353 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002354 else {
2355 int anchor = 0;
2356 int i = 0;
2357 for (;;) {
2358 com_and_test(c, CHILD(n, i));
2359 if ((i += 2) >= NCH(n))
2360 break;
2361 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2362 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002364 }
2365 if (anchor)
2366 com_backpatch(c, anchor);
2367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368}
2369
2370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372{
2373 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002374 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_node(c, CHILD(n, 0));
2376 }
2377 else {
2378 int i;
2379 int len;
2380 len = (NCH(n) + 1) / 2;
2381 for (i = 0; i < NCH(n); i += 2)
2382 com_node(c, CHILD(n, i));
2383 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 }
2386}
2387
2388
2389/* Begin of assignment compilation */
2390
Thomas Wouters434d0822000-08-24 20:11:32 +00002391
2392static void
2393com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2394{
2395 com_addbyte(c, DUP_TOP);
2396 com_push(c, 1);
2397 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002398 com_node(c, augn);
2399 com_addbyte(c, opcode);
2400 com_pop(c, 1);
2401 com_addbyte(c, ROT_TWO);
2402 com_addopname(c, STORE_ATTR, n);
2403 com_pop(c, 2);
2404}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405
2406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002407com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408{
2409 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002410 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411}
2412
2413static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002414com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 REQ(n, trailer);
2417 switch (TYPE(CHILD(n, 0))) {
2418 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002419 com_error(c, PyExc_SyntaxError,
2420 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 break;
2422 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002423 if (assigning > OP_APPLY)
2424 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2425 else
2426 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002428 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002429 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430 break;
2431 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002433 }
2434}
2435
2436static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002437com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438{
2439 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002440 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 if (assigning) {
2443 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002444 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002445 com_push(c, i-1);
2446 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002448 com_assign(c, CHILD(n, i), assigning, NULL);
2449}
2450
2451static void
2452com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2453{
2454 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002455 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002456 com_push(c, 1);
2457 com_node(c, augn);
2458 com_addbyte(c, opcode);
2459 com_pop(c, 1);
2460 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461}
2462
2463static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002464com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002465{
2466 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002467 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002468 if (assigning)
2469 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470}
2471
2472static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002473com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474{
2475 /* Loop to avoid trivial recursion */
2476 for (;;) {
2477 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002478
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 case exprlist:
2480 case testlist:
2481 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002482 if (assigning > OP_APPLY) {
2483 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002484 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002485 return;
2486 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002487 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002488 return;
2489 }
2490 n = CHILD(n, 0);
2491 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002492
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 case test:
2494 case and_test:
2495 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002497 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002498 case xor_expr:
2499 case and_expr:
2500 case shift_expr:
2501 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002503 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002505 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002506 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 return;
2508 }
2509 n = CHILD(n, 0);
2510 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002511
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002512 case power: /* atom trailer* ('**' power)*
2513 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002514 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002515 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002516 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 return;
2518 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002519 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 int i;
2521 com_node(c, CHILD(n, 0));
2522 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002523 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002524 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002525 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002526 return;
2527 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 com_apply_trailer(c, CHILD(n, i));
2529 } /* NB i is still alive */
2530 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002531 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532 return;
2533 }
2534 n = CHILD(n, 0);
2535 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002536
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 case atom:
2538 switch (TYPE(CHILD(n, 0))) {
2539 case LPAR:
2540 n = CHILD(n, 1);
2541 if (TYPE(n) == RPAR) {
2542 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002544 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 return;
2546 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002547 if (assigning > OP_APPLY) {
2548 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002549 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002550 return;
2551 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002552 break;
2553 case LSQB:
2554 n = CHILD(n, 1);
2555 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002556 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002557 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 return;
2559 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002560 if (assigning > OP_APPLY) {
2561 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002562 "augmented assign to list not possible");
2563 return;
2564 }
2565 if (NCH(n) > 1
2566 && TYPE(CHILD(n, 1)) == list_for) {
2567 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002568 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002569 return;
2570 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002571 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002572 return;
2573 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002574 if (assigning > OP_APPLY)
2575 com_augassign_name(c, CHILD(n, 0),
2576 assigning, augn);
2577 else
2578 com_assign_name(c, CHILD(n, 0),
2579 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002580 return;
2581 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002582 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002583 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 return;
2585 }
2586 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002587
2588 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002589 com_error(c, PyExc_SyntaxError,
2590 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002591 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002592
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 com_error(c, PyExc_SystemError,
2595 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002597
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002598 }
2599 }
2600}
Guido van Rossum7c531111997-03-11 18:42:21 +00002601
Thomas Wouters434d0822000-08-24 20:11:32 +00002602static void
2603com_augassign(struct compiling *c, node *n)
2604{
2605 int opcode;
2606
2607 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2608 case '+': opcode = INPLACE_ADD; break;
2609 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002610 case '/':
2611 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2612 opcode = INPLACE_FLOOR_DIVIDE;
2613 else if (c->c_flags & CO_FUTURE_DIVISION)
2614 opcode = INPLACE_TRUE_DIVIDE;
2615 else
2616 opcode = INPLACE_DIVIDE;
2617 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002618 case '%': opcode = INPLACE_MODULO; break;
2619 case '<': opcode = INPLACE_LSHIFT; break;
2620 case '>': opcode = INPLACE_RSHIFT; break;
2621 case '&': opcode = INPLACE_AND; break;
2622 case '^': opcode = INPLACE_XOR; break;
2623 case '|': opcode = INPLACE_OR; break;
2624 case '*':
2625 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2626 opcode = INPLACE_POWER;
2627 else
2628 opcode = INPLACE_MULTIPLY;
2629 break;
2630 default:
2631 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2632 return;
2633 }
2634 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2635}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636
2637static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002638com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639{
Thomas Wouters434d0822000-08-24 20:11:32 +00002640 REQ(n, expr_stmt);
2641 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002643 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002644 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002645 if (NCH(n) == 1) {
2646 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002647 if (c->c_interactive)
2648 com_addbyte(c, PRINT_EXPR);
2649 else
2650 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002653 else if (TYPE(CHILD(n,1)) == augassign)
2654 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002655 else {
2656 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002657 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002658 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, 1);
2662 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002663 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664 }
2665 }
2666}
2667
2668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002669com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002670{
2671 int a = 0, b = 0;
2672 int i;
2673 REQ(n, assert_stmt); /* 'assert' test [',' test] */
2674 /* Generate code like for
2675
2676 if __debug__:
2677 if not <test>:
2678 raise AssertionError [, <message>]
2679
2680 where <message> is the second test, if present.
2681 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002682
Guido van Rossum228d7f31997-04-02 05:24:36 +00002683 if (Py_OptimizeFlag)
2684 return;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002685 com_addop_name(c, LOAD_GLOBAL, "__debug__");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002686 com_push(c, 1);
2687 com_addfwref(c, JUMP_IF_FALSE, &a);
2688 com_addbyte(c, POP_TOP);
2689 com_pop(c, 1);
2690 com_node(c, CHILD(n, 1));
2691 com_addfwref(c, JUMP_IF_TRUE, &b);
2692 com_addbyte(c, POP_TOP);
2693 com_pop(c, 1);
2694 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002695 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002696 com_push(c, 1);
2697 i = NCH(n)/2; /* Either 2 or 4 */
2698 if (i > 1)
2699 com_node(c, CHILD(n, 3));
2700 com_addoparg(c, RAISE_VARARGS, i);
2701 com_pop(c, i);
2702 /* The interpreter does not fall through */
2703 /* All jumps converge here */
2704 com_backpatch(c, a);
2705 com_backpatch(c, b);
2706 com_addbyte(c, POP_TOP);
2707}
2708
2709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002712 int i = 1;
2713 node* stream = NULL;
2714
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002715 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002716
2717 /* are we using the extended print form? */
2718 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2719 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002720 com_node(c, stream);
2721 /* stack: [...] => [... stream] */
2722 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002723 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2724 i = 4;
2725 else
2726 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002728 for (; i < NCH(n); i += 2) {
2729 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002730 com_addbyte(c, DUP_TOP);
2731 /* stack: [stream] => [stream stream] */
2732 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002733 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002734 /* stack: [stream stream] => [stream stream obj] */
2735 com_addbyte(c, ROT_TWO);
2736 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002737 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002738 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002739 com_pop(c, 2);
2740 }
2741 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002742 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002743 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002744 com_addbyte(c, PRINT_ITEM);
2745 com_pop(c, 1);
2746 }
2747 }
2748 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002749 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002750 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002751 /* must pop the extra stream object off the stack */
2752 com_addbyte(c, POP_TOP);
2753 /* stack: [... stream] => [...] */
2754 com_pop(c, 1);
2755 }
2756 }
2757 else {
2758 if (stream != NULL) {
2759 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002760 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002761 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002762 com_pop(c, 1);
2763 }
2764 else
2765 com_addbyte(c, PRINT_NEWLINE);
2766 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767}
2768
2769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002771{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002772 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002773 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002774 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002775 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002776 if (c->c_flags & CO_GENERATOR) {
2777 if (NCH(n) > 1) {
2778 com_error(c, PyExc_SyntaxError,
2779 "'return' with argument inside generator");
2780 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002781 }
2782 if (NCH(n) < 2) {
2783 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002784 com_push(c, 1);
2785 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002786 else
2787 com_node(c, CHILD(n, 1));
2788 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002789 com_pop(c, 1);
2790}
2791
2792static void
2793com_yield_stmt(struct compiling *c, node *n)
2794{
Tim Peters95c80f82001-06-23 02:07:08 +00002795 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002796 REQ(n, yield_stmt); /* 'yield' testlist */
2797 if (!c->c_infunction) {
2798 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2799 }
Tim Peters95c80f82001-06-23 02:07:08 +00002800
2801 for (i = 0; i < c->c_nblocks; ++i) {
2802 if (c->c_block[i] == SETUP_FINALLY) {
2803 com_error(c, PyExc_SyntaxError,
2804 "'yield' not allowed in a 'try' block "
2805 "with a 'finally' clause");
2806 return;
2807 }
2808 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002809 com_node(c, CHILD(n, 1));
2810 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002812}
2813
2814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002815com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002816{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002817 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002818 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2819 if (NCH(n) > 1) {
2820 com_node(c, CHILD(n, 1));
2821 if (NCH(n) > 3) {
2822 com_node(c, CHILD(n, 3));
2823 if (NCH(n) > 5)
2824 com_node(c, CHILD(n, 5));
2825 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002826 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002827 i = NCH(n)/2;
2828 com_addoparg(c, RAISE_VARARGS, i);
2829 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830}
2831
2832static void
Thomas Wouters52152252000-08-17 22:55:00 +00002833com_from_import(struct compiling *c, node *n)
2834{
2835 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2836 com_push(c, 1);
2837 if (NCH(n) > 1) {
2838 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2839 com_error(c, PyExc_SyntaxError, "invalid syntax");
2840 return;
2841 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002842 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002843 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002844 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002845 com_pop(c, 1);
2846}
2847
2848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002849com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850{
2851 int i;
2852 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002853 /* 'import' dotted_name (',' dotted_name)* |
2854 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002855 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002856 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002857 /* 'from' dotted_name 'import' ... */
2858 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002859
2860 if (TYPE(CHILD(n, 3)) == STAR) {
2861 tup = Py_BuildValue("(s)", "*");
2862 } else {
2863 tup = PyTuple_New((NCH(n) - 2)/2);
2864 for (i = 3; i < NCH(n); i += 2) {
2865 PyTuple_SET_ITEM(tup, (i-3)/2,
2866 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002867 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002868 }
2869 }
2870 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002871 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002872 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002873 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002874 if (TYPE(CHILD(n, 3)) == STAR)
2875 com_addbyte(c, IMPORT_STAR);
2876 else {
2877 for (i = 3; i < NCH(n); i += 2)
2878 com_from_import(c, CHILD(n, i));
2879 com_addbyte(c, POP_TOP);
2880 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002881 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 }
2883 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002884 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002886 node *subn = CHILD(n, i);
2887 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002888 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002889 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002890 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002891 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002892 int j;
2893 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002894 com_error(c, PyExc_SyntaxError,
2895 "invalid syntax");
2896 return;
2897 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002898 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2899 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002900 CHILD(CHILD(subn, 0),
2901 j));
2902 com_addop_varname(c, VAR_STORE,
2903 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002904 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002905 com_addop_varname(c, VAR_STORE,
2906 STR(CHILD(CHILD(subn, 0),
2907 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002908 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 }
2910 }
2911}
2912
2913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002914com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002915{
2916 REQ(n, exec_stmt);
2917 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2918 com_node(c, CHILD(n, 1));
2919 if (NCH(n) >= 4)
2920 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002922 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002923 com_push(c, 1);
2924 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002925 if (NCH(n) >= 6)
2926 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002927 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002928 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002929 com_push(c, 1);
2930 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002931 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002932 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002933}
2934
Guido van Rossum7c531111997-03-11 18:42:21 +00002935static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002936is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002937{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002938 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002939 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002940 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002941
2942 /* Label to avoid tail recursion */
2943 next:
2944 switch (TYPE(n)) {
2945
2946 case suite:
2947 if (NCH(n) == 1) {
2948 n = CHILD(n, 0);
2949 goto next;
2950 }
2951 /* Fall through */
2952 case file_input:
2953 for (i = 0; i < NCH(n); i++) {
2954 node *ch = CHILD(n, i);
2955 if (TYPE(ch) == stmt) {
2956 n = ch;
2957 goto next;
2958 }
2959 }
2960 break;
2961
2962 case stmt:
2963 case simple_stmt:
2964 case small_stmt:
2965 n = CHILD(n, 0);
2966 goto next;
2967
2968 case expr_stmt:
2969 case testlist:
2970 case test:
2971 case and_test:
2972 case not_test:
2973 case comparison:
2974 case expr:
2975 case xor_expr:
2976 case and_expr:
2977 case shift_expr:
2978 case arith_expr:
2979 case term:
2980 case factor:
2981 case power:
2982 case atom:
2983 if (NCH(n) == 1) {
2984 n = CHILD(n, 0);
2985 goto next;
2986 }
2987 break;
2988
2989 case NAME:
2990 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2991 return 1;
2992 break;
2993
2994 case NUMBER:
2995 v = parsenumber(c, STR(n));
2996 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002998 break;
2999 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003000 i = PyObject_IsTrue(v);
3001 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003002 return i == 0;
3003
3004 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003005 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003006 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003007 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003008 break;
3009 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003010 i = PyObject_IsTrue(v);
3011 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003012 return i == 0;
3013
3014 }
3015 return 0;
3016}
3017
Tim Peters08a898f2001-06-28 01:52:22 +00003018
3019/* Look under n for a return stmt with an expression.
3020 * This hack is used to find illegal returns under "if 0:" blocks in
3021 * functions already known to be generators (as determined by the symtable
3022 * pass).
3023 * Return the offending return node if found, else NULL.
3024 */
3025static node *
3026look_for_offending_return(node *n)
3027{
3028 int i;
3029
3030 for (i = 0; i < NCH(n); ++i) {
3031 node *kid = CHILD(n, i);
3032
3033 switch (TYPE(kid)) {
3034 case classdef:
3035 case funcdef:
3036 case lambdef:
3037 /* Stuff in nested functions & classes doesn't
3038 affect the code block we started in. */
3039 return NULL;
3040
3041 case return_stmt:
3042 if (NCH(kid) > 1)
3043 return kid;
3044 break;
3045
3046 default: {
3047 node *bad = look_for_offending_return(kid);
3048 if (bad != NULL)
3049 return bad;
3050 }
3051 }
3052 }
3053
3054 return NULL;
3055}
3056
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003057static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
3060 int i;
3061 int anchor = 0;
3062 REQ(n, if_stmt);
3063 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3064 for (i = 0; i+3 < NCH(n); i+=4) {
3065 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003066 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003067 if (is_constant_false(c, ch)) {
3068 /* We're going to skip this block. However, if this
3069 is a generator, we have to check the dead code
3070 anyway to make sure there aren't any return stmts
3071 with expressions, in the same scope. */
3072 if (c->c_flags & CO_GENERATOR) {
3073 node *p = look_for_offending_return(n);
3074 if (p != NULL) {
3075 int savelineno = c->c_lineno;
3076 c->c_lineno = p->n_lineno;
3077 com_error(c, PyExc_SyntaxError,
3078 "'return' with argument "
3079 "inside generator");
3080 c->c_lineno = savelineno;
3081 }
3082 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003083 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003084 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003085 if (i > 0)
3086 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003087 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 com_addfwref(c, JUMP_IF_FALSE, &a);
3089 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003090 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 com_node(c, CHILD(n, i+3));
3092 com_addfwref(c, JUMP_FORWARD, &anchor);
3093 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 com_addbyte(c, POP_TOP);
3096 }
3097 if (i+2 < NCH(n))
3098 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003099 if (anchor)
3100 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101}
3102
3103static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003104com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105{
3106 int break_anchor = 0;
3107 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003108 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3110 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003111 block_push(c, SETUP_LOOP);
3112 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003113 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 com_node(c, CHILD(n, 1));
3115 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3116 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003117 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003118 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003120 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003121 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3122 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003124 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 com_addbyte(c, POP_TOP);
3126 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003127 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003128 if (NCH(n) > 4)
3129 com_node(c, CHILD(n, 6));
3130 com_backpatch(c, break_anchor);
3131}
3132
3133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003134com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003136 int break_anchor = 0;
3137 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003138 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 REQ(n, for_stmt);
3140 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3141 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003142 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003144 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003145 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003146 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003147 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003149 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003150 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003152 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003153 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3154 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003156 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003158 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 if (NCH(n) > 8)
3160 com_node(c, CHILD(n, 8));
3161 com_backpatch(c, break_anchor);
3162}
3163
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003164/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003165
3166 SETUP_FINALLY L
3167 <code for S>
3168 POP_BLOCK
3169 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003170 L: <code for Sf>
3171 END_FINALLY
3172
3173 The special instructions use the block stack. Each block
3174 stack entry contains the instruction that created it (here
3175 SETUP_FINALLY), the level of the value stack at the time the
3176 block stack entry was created, and a label (here L).
3177
3178 SETUP_FINALLY:
3179 Pushes the current value stack level and the label
3180 onto the block stack.
3181 POP_BLOCK:
3182 Pops en entry from the block stack, and pops the value
3183 stack until its level is the same as indicated on the
3184 block stack. (The label is ignored.)
3185 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003186 Pops a variable number of entries from the *value* stack
3187 and re-raises the exception they specify. The number of
3188 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003189
3190 The block stack is unwound when an exception is raised:
3191 when a SETUP_FINALLY entry is found, the exception is pushed
3192 onto the value stack (and the exception condition is cleared),
3193 and the interpreter jumps to the label gotten from the block
3194 stack.
3195
3196 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003197 (The contents of the value stack is shown in [], with the top
3198 at the right; 'tb' is trace-back info, 'val' the exception's
3199 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003200
3201 Value stack Label Instruction Argument
3202 [] SETUP_EXCEPT L1
3203 [] <code for S>
3204 [] POP_BLOCK
3205 [] JUMP_FORWARD L0
3206
Guido van Rossum3f5da241990-12-20 15:06:42 +00003207 [tb, val, exc] L1: DUP )
3208 [tb, val, exc, exc] <evaluate E1> )
3209 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3210 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3211 [tb, val, exc, 1] POP )
3212 [tb, val, exc] POP
3213 [tb, val] <assign to V1> (or POP if no V1)
3214 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003215 [] <code for S1>
3216 JUMP_FORWARD L0
3217
Guido van Rossum3f5da241990-12-20 15:06:42 +00003218 [tb, val, exc, 0] L2: POP
3219 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003220 .............................etc.......................
3221
Guido van Rossum3f5da241990-12-20 15:06:42 +00003222 [tb, val, exc, 0] Ln+1: POP
3223 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003224
3225 [] L0: <next statement>
3226
3227 Of course, parts are not generated if Vi or Ei is not present.
3228*/
3229
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003231com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003232{
3233 int except_anchor = 0;
3234 int end_anchor = 0;
3235 int else_anchor = 0;
3236 int i;
3237 node *ch;
3238
3239 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3240 block_push(c, SETUP_EXCEPT);
3241 com_node(c, CHILD(n, 2));
3242 com_addbyte(c, POP_BLOCK);
3243 block_pop(c, SETUP_EXCEPT);
3244 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3245 com_backpatch(c, except_anchor);
3246 for (i = 3;
3247 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3248 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003249 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003250 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003251 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003252 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003253 break;
3254 }
3255 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257 com_addoparg(c, SET_LINENO, ch->n_lineno);
3258 if (NCH(ch) > 1) {
3259 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003260 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003261 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003262 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003264 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3265 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003267 }
3268 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003270 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003271 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003272 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003273 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003274 com_pop(c, 1);
3275 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003276 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003278 com_node(c, CHILD(n, i+2));
3279 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3280 if (except_anchor) {
3281 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003282 /* We come in with [tb, val, exc, 0] on the
3283 stack; one pop and it's the same as
3284 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003285 com_addbyte(c, POP_TOP);
3286 }
3287 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 /* We actually come in here with [tb, val, exc] but the
3289 END_FINALLY will zap those and jump around.
3290 The c_stacklevel does not reflect them so we need not pop
3291 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 com_addbyte(c, END_FINALLY);
3293 com_backpatch(c, else_anchor);
3294 if (i < NCH(n))
3295 com_node(c, CHILD(n, i+2));
3296 com_backpatch(c, end_anchor);
3297}
3298
3299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003300com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301{
3302 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003303 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003304
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003305 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3306 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003308 com_addbyte(c, POP_BLOCK);
3309 block_pop(c, SETUP_FINALLY);
3310 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003311 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 /* While the generated code pushes only one item,
3313 the try-finally handling can enter here with
3314 up to three items. OK, here are the details:
3315 3 for an exception, 2 for RETURN, 1 for BREAK. */
3316 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003317 com_backpatch(c, finally_anchor);
3318 ch = CHILD(n, NCH(n)-1);
3319 com_addoparg(c, SET_LINENO, ch->n_lineno);
3320 com_node(c, ch);
3321 com_addbyte(c, END_FINALLY);
3322 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003323 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003324}
3325
3326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003327com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003328{
3329 REQ(n, try_stmt);
3330 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3331 | 'try' ':' suite 'finally' ':' suite */
3332 if (TYPE(CHILD(n, 3)) != except_clause)
3333 com_try_finally(c, n);
3334 else
3335 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336}
3337
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003339get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003340{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003341 int i;
3342
Guido van Rossum8b993a91997-01-17 21:04:03 +00003343 /* Label to avoid tail recursion */
3344 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003345 switch (TYPE(n)) {
3346
3347 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 if (NCH(n) == 1) {
3349 n = CHILD(n, 0);
3350 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003351 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003353 case file_input:
3354 for (i = 0; i < NCH(n); i++) {
3355 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003356 if (TYPE(ch) == stmt) {
3357 n = ch;
3358 goto next;
3359 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003360 }
3361 break;
3362
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003363 case stmt:
3364 case simple_stmt:
3365 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003366 n = CHILD(n, 0);
3367 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003368
3369 case expr_stmt:
3370 case testlist:
3371 case test:
3372 case and_test:
3373 case not_test:
3374 case comparison:
3375 case expr:
3376 case xor_expr:
3377 case and_expr:
3378 case shift_expr:
3379 case arith_expr:
3380 case term:
3381 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003382 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 if (NCH(n) == 1) {
3384 n = CHILD(n, 0);
3385 goto next;
3386 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003387 break;
3388
3389 case atom:
3390 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003392 break;
3393
3394 }
3395 return NULL;
3396}
3397
Guido van Rossum79f25d91997-04-29 20:08:16 +00003398static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003399get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003400{
Guido van Rossum541563e1999-01-28 15:08:09 +00003401 /* Don't generate doc-strings if run with -OO */
3402 if (Py_OptimizeFlag > 1)
3403 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 n = get_rawdocstring(n);
3405 if (n == NULL)
3406 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003407 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408}
3409
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003411com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412{
3413 REQ(n, suite);
3414 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3415 if (NCH(n) == 1) {
3416 com_node(c, CHILD(n, 0));
3417 }
3418 else {
3419 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003420 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 node *ch = CHILD(n, i);
3422 if (TYPE(ch) == stmt)
3423 com_node(c, ch);
3424 }
3425 }
3426}
3427
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003428/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003430com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003431{
3432 int i = c->c_nblocks;
3433 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3434 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3435 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003436 else if (i <= 0) {
3437 /* at the outer level */
3438 com_error(c, PyExc_SyntaxError,
3439 "'continue' not properly in loop");
3440 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003441 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003442 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003443 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003444 if (c->c_block[j] == SETUP_LOOP)
3445 break;
3446 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003447 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003448 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003449 for (; i > j; --i) {
3450 if (c->c_block[i] == SETUP_EXCEPT ||
3451 c->c_block[i] == SETUP_FINALLY) {
3452 com_addoparg(c, CONTINUE_LOOP,
3453 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003454 return;
3455 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003456 if (c->c_block[i] == END_FINALLY) {
3457 com_error(c, PyExc_SyntaxError,
3458 "'continue' not supported inside 'finally' clause");
3459 return;
3460 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003461 }
3462 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 com_error(c, PyExc_SyntaxError,
3464 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003465 }
3466 /* XXX Could allow it inside a 'finally' clause
3467 XXX if we could pop the exception still on the stack */
3468}
3469
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003470static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003471com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003472{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003473 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003474 if (TYPE(n) == lambdef) {
3475 /* lambdef: 'lambda' [varargslist] ':' test */
3476 n = CHILD(n, 1);
3477 }
3478 else {
3479 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3480 n = CHILD(n, 2);
3481 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3482 n = CHILD(n, 1);
3483 }
3484 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003485 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003486 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003487 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003488 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3489 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003490 nargs = 0;
3491 ndefs = 0;
3492 for (i = 0; i < nch; i++) {
3493 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003494 if (TYPE(CHILD(n, i)) == STAR ||
3495 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003496 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003497 nargs++;
3498 i++;
3499 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003500 t = RPAR; /* Anything except EQUAL or COMMA */
3501 else
3502 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003503 if (t == EQUAL) {
3504 i++;
3505 ndefs++;
3506 com_node(c, CHILD(n, i));
3507 i++;
3508 if (i >= nch)
3509 break;
3510 t = TYPE(CHILD(n, i));
3511 }
3512 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003513 /* Treat "(a=1, b)" as an error */
3514 if (ndefs)
3515 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003516 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003517 }
3518 if (t != COMMA)
3519 break;
3520 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003521 return ndefs;
3522}
3523
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003525com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003527 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003528 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003530 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003531 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3532 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003533 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003534 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003535 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536 c->c_errors++;
3537 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003538 int closure = com_make_closure(c, (PyCodeObject *)co);
3539 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003541 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003542 if (closure)
3543 com_addoparg(c, MAKE_CLOSURE, ndefs);
3544 else
3545 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003547 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003548 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003549 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550 }
3551}
3552
3553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003554com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003555{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003556 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003557 REQ(n, testlist);
3558 /* testlist: test (',' test)* [','] */
3559 for (i = 0; i < NCH(n); i += 2)
3560 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 i = (NCH(n)+1) / 2;
3562 com_addoparg(c, BUILD_TUPLE, i);
3563 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003564}
3565
3566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003567com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568{
Guido van Rossum25831651993-05-19 14:50:45 +00003569 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003570 PyObject *v;
3571 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003572 char *name;
3573
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003575 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003576 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003577 c->c_errors++;
3578 return;
3579 }
3580 /* Push the class name on the stack */
3581 i = com_addconst(c, v);
3582 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003583 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003584 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003585 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003586 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003587 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 com_push(c, 1);
3589 }
Guido van Rossum25831651993-05-19 14:50:45 +00003590 else
3591 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003592 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003593 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003594 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003595 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003596 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003597 c->c_errors++;
3598 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003599 int closure = com_make_closure(c, co);
3600 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003601 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003603 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003604 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003605 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003606 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003607 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003608 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003609 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003610 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003611 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003612 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003613 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003614 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003615}
3616
3617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003618com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003620 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003621 if (c->c_errors)
3622 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623 switch (TYPE(n)) {
3624
3625 /* Definition nodes */
3626
3627 case funcdef:
3628 com_funcdef(c, n);
3629 break;
3630 case classdef:
3631 com_classdef(c, n);
3632 break;
3633
3634 /* Trivial parse tree nodes */
3635
3636 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003637 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003639 n = CHILD(n, 0);
3640 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003641
3642 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003643 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3644 com_addoparg(c, SET_LINENO, n->n_lineno);
3645 {
3646 int i;
3647 for (i = 0; i < NCH(n)-1; i += 2)
3648 com_node(c, CHILD(n, i));
3649 }
3650 break;
3651
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003653 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003654 n = CHILD(n, 0);
3655 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656
3657 /* Statement nodes */
3658
3659 case expr_stmt:
3660 com_expr_stmt(c, n);
3661 break;
3662 case print_stmt:
3663 com_print_stmt(c, n);
3664 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003665 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003666 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667 break;
3668 case pass_stmt:
3669 break;
3670 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003671 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003672 com_error(c, PyExc_SyntaxError,
3673 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003674 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 com_addbyte(c, BREAK_LOOP);
3676 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003677 case continue_stmt:
3678 com_continue_stmt(c, n);
3679 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680 case return_stmt:
3681 com_return_stmt(c, n);
3682 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003683 case yield_stmt:
3684 com_yield_stmt(c, n);
3685 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686 case raise_stmt:
3687 com_raise_stmt(c, n);
3688 break;
3689 case import_stmt:
3690 com_import_stmt(c, n);
3691 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003692 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003693 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003694 case exec_stmt:
3695 com_exec_stmt(c, n);
3696 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003697 case assert_stmt:
3698 com_assert_stmt(c, n);
3699 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003700 case if_stmt:
3701 com_if_stmt(c, n);
3702 break;
3703 case while_stmt:
3704 com_while_stmt(c, n);
3705 break;
3706 case for_stmt:
3707 com_for_stmt(c, n);
3708 break;
3709 case try_stmt:
3710 com_try_stmt(c, n);
3711 break;
3712 case suite:
3713 com_suite(c, n);
3714 break;
3715
3716 /* Expression nodes */
3717
3718 case testlist:
Guido van Rossum1c917072001-10-15 15:44:05 +00003719 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003720 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003721 break;
3722 case test:
3723 com_test(c, n);
3724 break;
3725 case and_test:
3726 com_and_test(c, n);
3727 break;
3728 case not_test:
3729 com_not_test(c, n);
3730 break;
3731 case comparison:
3732 com_comparison(c, n);
3733 break;
3734 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003735 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 break;
3737 case expr:
3738 com_expr(c, n);
3739 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003740 case xor_expr:
3741 com_xor_expr(c, n);
3742 break;
3743 case and_expr:
3744 com_and_expr(c, n);
3745 break;
3746 case shift_expr:
3747 com_shift_expr(c, n);
3748 break;
3749 case arith_expr:
3750 com_arith_expr(c, n);
3751 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 case term:
3753 com_term(c, n);
3754 break;
3755 case factor:
3756 com_factor(c, n);
3757 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003758 case power:
3759 com_power(c, n);
3760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 case atom:
3762 com_atom(c, n);
3763 break;
3764
3765 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003766 com_error(c, PyExc_SystemError,
3767 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 }
3769}
3770
Tim Petersdbd9ba62000-07-09 03:09:57 +00003771static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772
3773static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003774com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775{
3776 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3777 if (TYPE(CHILD(n, 0)) == LPAR)
3778 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003779 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003780 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_pop(c, 1);
3782 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783}
3784
3785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003786com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003787{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003788 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 if (NCH(n) == 1) {
3790 com_fpdef(c, CHILD(n, 0));
3791 }
3792 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003793 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003794 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003795 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 for (i = 0; i < NCH(n); i += 2)
3797 com_fpdef(c, CHILD(n, i));
3798 }
3799}
3800
3801static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003802com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003803{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003804 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003805 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003806 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003807 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003808 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003809 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003810 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003811 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003812 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003813 node *ch = CHILD(n, i);
3814 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003815 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003816 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003817 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3818 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003819 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003820 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003821 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003822 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003823 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003824 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003825 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003826 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003827 ch = CHILD(n, i);
3828 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003829 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003830 else
3831 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003832 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003833 if (complex) {
3834 /* Generate code for complex arguments only after
3835 having counted the simple arguments */
3836 int ilocal = 0;
3837 for (i = 0; i < nch; i++) {
3838 node *ch = CHILD(n, i);
3839 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003840 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003841 break;
3842 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3843 fp = CHILD(ch, 0);
3844 if (TYPE(fp) != NAME) {
3845 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003846 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003847 com_fpdef(c, ch);
3848 }
3849 ilocal++;
3850 if (++i >= nch)
3851 break;
3852 ch = CHILD(n, i);
3853 if (TYPE(ch) == EQUAL)
3854 i += 2;
3855 else
3856 REQ(ch, COMMA);
3857 }
3858 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003859}
3860
3861static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003862com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003863{
3864 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003865 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003867 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003868 if (doc != NULL) {
3869 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003870 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003871 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003873 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003874 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003875 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 for (i = 0; i < NCH(n); i++) {
3877 node *ch = CHILD(n, i);
3878 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3879 com_node(c, ch);
3880 }
3881}
3882
3883/* Top-level compile-node interface */
3884
3885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003886compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003888 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889 node *ch;
3890 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003891 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003892 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003893 if (doc != NULL) {
3894 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003895 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003896 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003897 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003899 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3900 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003901 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003902 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003903 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003905 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003906 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3907 com_push(c, 1);
3908 com_addbyte(c, RETURN_VALUE);
3909 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003910}
3911
3912static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003913compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003914{
Guido van Rossum590baa41993-11-30 13:40:46 +00003915 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003916 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003917 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003918
3919 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003920 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003921 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003922 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003923 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003924 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003925 else
3926 ch = CHILD(n, 2);
3927 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003928 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003929 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003930}
3931
3932static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003933compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003934{
3935 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003936 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003937 REQ(n, classdef);
3938 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3939 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003940 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00003941 /* Initialize local __module__ from global __name__ */
3942 com_addop_name(c, LOAD_GLOBAL, "__name__");
3943 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003944 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003945 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003946 if (doc != NULL) {
3947 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003948 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003949 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003950 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003951 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003952 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003953 }
3954 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003955 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003956 com_node(c, ch);
3957 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003958 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003959 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003960 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003961}
3962
3963static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003964compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003966 com_addoparg(c, SET_LINENO, n->n_lineno);
3967
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003968 switch (TYPE(n)) {
3969
Guido van Rossum4c417781991-01-21 16:09:22 +00003970 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003971 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003972 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973 n = CHILD(n, 0);
3974 if (TYPE(n) != NEWLINE)
3975 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003976 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003977 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003978 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003979 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003980 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003981 break;
3982
Guido van Rossum4c417781991-01-21 16:09:22 +00003983 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003984 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003985 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003987 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989 break;
3990
Guido van Rossum590baa41993-11-30 13:40:46 +00003991 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003992 com_node(c, CHILD(n, 0));
3993 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003994 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003995 break;
3996
Guido van Rossum590baa41993-11-30 13:40:46 +00003997 case lambdef: /* anonymous function definition */
3998 compile_lambdef(c, n);
3999 break;
4000
Guido van Rossum4c417781991-01-21 16:09:22 +00004001 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 compile_funcdef(c, n);
4003 break;
4004
Guido van Rossum4c417781991-01-21 16:09:22 +00004005 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004007 break;
4008
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004010 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004011 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004012 }
4013}
4014
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004015static PyObject *
4016dict_keys_inorder(PyObject *dict, int offset)
4017{
4018 PyObject *tuple, *k, *v;
4019 int i, pos = 0, size = PyDict_Size(dict);
4020
4021 tuple = PyTuple_New(size);
4022 if (tuple == NULL)
4023 return NULL;
4024 while (PyDict_Next(dict, &pos, &k, &v)) {
4025 i = PyInt_AS_LONG(v);
4026 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004027 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004028 PyTuple_SET_ITEM(tuple, i - offset, k);
4029 }
4030 return tuple;
4031}
4032
Guido van Rossum79f25d91997-04-29 20:08:16 +00004033PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004034PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004036 return PyNode_CompileFlags(n, filename, NULL);
4037}
4038
4039PyCodeObject *
4040PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4041{
4042 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004043}
4044
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004045struct symtable *
4046PyNode_CompileSymtable(node *n, char *filename)
4047{
4048 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004049 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004050
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004051 ff = PyNode_Future(n, filename);
4052 if (ff == NULL)
4053 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004054
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004055 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004056 if (st == NULL) {
4057 PyMem_Free((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004058 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004059 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004060 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004061 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004062 if (st->st_errors > 0)
4063 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004064 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004065 if (st->st_errors > 0)
4066 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004067
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004068 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004069 fail:
4070 PyMem_Free((void *)ff);
4071 st->st_future = NULL;
4072 PySymtable_Free(st);
4073 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004074}
4075
Guido van Rossum79f25d91997-04-29 20:08:16 +00004076static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004077icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004078{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004079 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004080}
4081
Guido van Rossum79f25d91997-04-29 20:08:16 +00004082static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004083jcompile(node *n, char *filename, struct compiling *base,
4084 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004085{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004087 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004088 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004090 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004091 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004092 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004093 /* c_symtable still points to parent's symbols */
4094 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004095 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004096 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004097 sc.c_flags |= base->c_flags & PyCF_MASK;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004098 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004099 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004100 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004101 if (sc.c_future == NULL) {
4102 com_free(&sc);
4103 return NULL;
4104 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004105 if (flags) {
4106 int merged = sc.c_future->ff_features |
4107 flags->cf_flags;
4108 sc.c_future->ff_features = merged;
4109 flags->cf_flags = merged;
4110 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004111 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004112 com_free(&sc);
4113 return NULL;
4114 }
4115 }
4116 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004117 if (symtable_load_symbols(&sc) < 0) {
4118 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004119 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004120 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004121 compile_node(&sc, n);
4122 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004123 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004124 PyObject *consts, *names, *varnames, *filename, *name,
4125 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004126 consts = PyList_AsTuple(sc.c_consts);
4127 names = PyList_AsTuple(sc.c_names);
4128 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004129 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4130 freevars = dict_keys_inorder(sc.c_freevars,
4131 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004132 filename = PyString_InternFromString(sc.c_filename);
4133 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004134 if (!PyErr_Occurred())
4135 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004136 sc.c_nlocals,
4137 sc.c_maxstacklevel,
4138 sc.c_flags,
4139 sc.c_code,
4140 consts,
4141 names,
4142 varnames,
4143 freevars,
4144 cellvars,
4145 filename,
4146 name,
4147 sc.c_firstlineno,
4148 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004149 Py_XDECREF(consts);
4150 Py_XDECREF(names);
4151 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004152 Py_XDECREF(freevars);
4153 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004154 Py_XDECREF(filename);
4155 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004156 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004157 else if (!PyErr_Occurred()) {
4158 /* This could happen if someone called PyErr_Clear() after an
4159 error was reported above. That's not supposed to happen,
4160 but I just plugged one case and I'm not sure there can't be
4161 others. In that case, raise SystemError so that at least
4162 it gets reported instead dumping core. */
4163 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4164 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004166 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004167 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004168 sc.c_symtable = NULL;
4169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004170 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 return co;
4172}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004173
4174int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004175PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004176{
4177 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004178 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004179 int line = co->co_firstlineno;
4180 int addr = 0;
4181 while (--size >= 0) {
4182 addr += *p++;
4183 if (addr > addrq)
4184 break;
4185 line += *p++;
4186 }
4187 return line;
4188}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004189
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004190/* The test for LOCAL must come before the test for FREE in order to
4191 handle classes where name is both local and free. The local var is
4192 a method and the free var is a free var referenced within a method.
4193*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004194
4195static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004196get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004197{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004198 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004199 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004200
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004201 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4202 return CELL;
4203 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4204 return LOCAL;
4205 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4206 return FREE;
4207 v = PyDict_GetItemString(c->c_globals, name);
4208 if (v) {
4209 if (v == Py_None)
4210 return GLOBAL_EXPLICIT;
4211 else {
4212 return GLOBAL_IMPLICIT;
4213 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004214 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004215 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004216 "unknown scope for %.100s in %.100s(%s) "
4217 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4218 name, c->c_name,
4219 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4220 c->c_filename,
4221 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4222 PyObject_REPR(c->c_locals),
4223 PyObject_REPR(c->c_globals)
4224 );
4225
4226 Py_FatalError(buf);
4227 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004228}
4229
Guido van Rossum207fda62001-03-02 03:30:41 +00004230/* Helper functions to issue warnings */
4231
4232static int
4233issue_warning(char *msg, char *filename, int lineno)
4234{
4235 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4236 lineno, NULL, NULL) < 0) {
4237 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4238 PyErr_SetString(PyExc_SyntaxError, msg);
4239 PyErr_SyntaxLocation(filename, lineno);
4240 }
4241 return -1;
4242 }
4243 return 0;
4244}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004245
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004246static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004247symtable_warn(struct symtable *st, char *msg)
4248{
Guido van Rossum207fda62001-03-02 03:30:41 +00004249 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004250 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004251 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004252 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004253 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004254}
4255
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004256/* Helper function for setting lineno and filename */
4257
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004258static int
4259symtable_build(struct compiling *c, node *n)
4260{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004261 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004262 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004263 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004264 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004265 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4266 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004267 return -1;
4268 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004269 if (c->c_symtable->st_errors > 0)
4270 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004271 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004272 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004273 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004274 return 0;
4275}
4276
4277static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004278symtable_init_compiling_symbols(struct compiling *c)
4279{
4280 PyObject *varnames;
4281
4282 varnames = c->c_symtable->st_cur->ste_varnames;
4283 if (varnames == NULL) {
4284 varnames = PyList_New(0);
4285 if (varnames == NULL)
4286 return -1;
4287 c->c_symtable->st_cur->ste_varnames = varnames;
4288 Py_INCREF(varnames);
4289 } else
4290 Py_INCREF(varnames);
4291 c->c_varnames = varnames;
4292
4293 c->c_globals = PyDict_New();
4294 if (c->c_globals == NULL)
4295 return -1;
4296 c->c_freevars = PyDict_New();
4297 if (c->c_freevars == NULL)
4298 return -1;
4299 c->c_cellvars = PyDict_New();
4300 if (c->c_cellvars == NULL)
4301 return -1;
4302 return 0;
4303}
4304
4305struct symbol_info {
4306 int si_nlocals;
4307 int si_ncells;
4308 int si_nfrees;
4309 int si_nimplicit;
4310};
4311
4312static void
4313symtable_init_info(struct symbol_info *si)
4314{
4315 si->si_nlocals = 0;
4316 si->si_ncells = 0;
4317 si->si_nfrees = 0;
4318 si->si_nimplicit = 0;
4319}
4320
4321static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004322symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004323 struct symbol_info *si)
4324{
4325 PyObject *dict, *v;
4326
4327 /* Seperate logic for DEF_FREE. If it occurs in a function,
4328 it indicates a local that we must allocate storage for (a
4329 cell var). If it occurs in a class, then the class has a
4330 method and a free variable with the same name.
4331 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004332 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004333 /* If it isn't declared locally, it can't be a cell. */
4334 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4335 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004336 v = PyInt_FromLong(si->si_ncells++);
4337 dict = c->c_cellvars;
4338 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004339 /* If it is free anyway, then there is no need to do
4340 anything here.
4341 */
4342 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004343 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004344 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004345 v = PyInt_FromLong(si->si_nfrees++);
4346 dict = c->c_freevars;
4347 }
4348 if (v == NULL)
4349 return -1;
4350 if (PyDict_SetItem(dict, name, v) < 0) {
4351 Py_DECREF(v);
4352 return -1;
4353 }
4354 Py_DECREF(v);
4355 return 0;
4356}
4357
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004358/* If a variable is a cell and an argument, make sure that appears in
4359 co_cellvars before any variable to its right in varnames.
4360*/
4361
4362
4363static int
4364symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4365 PyObject *varnames, int flags)
4366{
4367 PyObject *v, *w, *d, *list = NULL;
4368 int i, pos;
4369
4370 if (flags & CO_VARARGS)
4371 argcount++;
4372 if (flags & CO_VARKEYWORDS)
4373 argcount++;
4374 for (i = argcount; --i >= 0; ) {
4375 v = PyList_GET_ITEM(varnames, i);
4376 if (PyDict_GetItem(*cellvars, v)) {
4377 if (list == NULL) {
4378 list = PyList_New(1);
4379 if (list == NULL)
4380 return -1;
4381 PyList_SET_ITEM(list, 0, v);
4382 Py_INCREF(v);
4383 } else
4384 PyList_Insert(list, 0, v);
4385 }
4386 }
4387 if (list == NULL || PyList_GET_SIZE(list) == 0)
4388 return 0;
4389 /* There are cellvars that are also arguments. Create a dict
4390 to replace cellvars and put the args at the front.
4391 */
4392 d = PyDict_New();
4393 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4394 v = PyInt_FromLong(i);
4395 if (v == NULL)
4396 goto fail;
4397 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4398 goto fail;
4399 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4400 goto fail;
4401 }
4402 pos = 0;
4403 i = PyList_GET_SIZE(list);
4404 Py_DECREF(list);
4405 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4406 w = PyInt_FromLong(i++); /* don't care about the old key */
4407 if (PyDict_SetItem(d, v, w) < 0) {
4408 Py_DECREF(w);
4409 goto fail;
4410 }
4411 Py_DECREF(w);
4412 }
4413 Py_DECREF(*cellvars);
4414 *cellvars = d;
4415 return 1;
4416 fail:
4417 Py_DECREF(d);
4418 return -1;
4419}
4420
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004421static int
4422symtable_freevar_offsets(PyObject *freevars, int offset)
4423{
4424 PyObject *name, *v;
4425 int pos;
4426
4427 /* The cell vars are the first elements of the closure,
4428 followed by the free vars. Update the offsets in
4429 c_freevars to account for number of cellvars. */
4430 pos = 0;
4431 while (PyDict_Next(freevars, &pos, &name, &v)) {
4432 int i = PyInt_AS_LONG(v) + offset;
4433 PyObject *o = PyInt_FromLong(i);
4434 if (o == NULL)
4435 return -1;
4436 if (PyDict_SetItem(freevars, name, o) < 0) {
4437 Py_DECREF(o);
4438 return -1;
4439 }
4440 Py_DECREF(o);
4441 }
4442 return 0;
4443}
4444
4445static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004446symtable_check_unoptimized(struct compiling *c,
4447 PySymtableEntryObject *ste,
4448 struct symbol_info *si)
4449{
4450 char buf[300];
4451
4452 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4453 || (ste->ste_nested && si->si_nimplicit)))
4454 return 0;
4455
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004456#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4457
4458#define ILLEGAL_IS "is a nested function"
4459
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004460#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004461"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004462
4463#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004464"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004465
4466#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004467"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004468"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004469
4470 /* XXX perhaps the linenos for these opt-breaking statements
4471 should be stored so the exception can point to them. */
4472
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004473 if (ste->ste_child_free) {
4474 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004475 PyOS_snprintf(buf, sizeof(buf),
4476 ILLEGAL_IMPORT_STAR,
4477 PyString_AS_STRING(ste->ste_name),
4478 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004479 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004480 PyOS_snprintf(buf, sizeof(buf),
4481 ILLEGAL_BARE_EXEC,
4482 PyString_AS_STRING(ste->ste_name),
4483 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004484 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004485 PyOS_snprintf(buf, sizeof(buf),
4486 ILLEGAL_EXEC_AND_IMPORT_STAR,
4487 PyString_AS_STRING(ste->ste_name),
4488 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004489 }
4490 } else {
4491 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004492 PyOS_snprintf(buf, sizeof(buf),
4493 ILLEGAL_IMPORT_STAR,
4494 PyString_AS_STRING(ste->ste_name),
4495 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004496 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004497 PyOS_snprintf(buf, sizeof(buf),
4498 ILLEGAL_BARE_EXEC,
4499 PyString_AS_STRING(ste->ste_name),
4500 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004501 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004502 PyOS_snprintf(buf, sizeof(buf),
4503 ILLEGAL_EXEC_AND_IMPORT_STAR,
4504 PyString_AS_STRING(ste->ste_name),
4505 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004506 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004507 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004508
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004509 PyErr_SetString(PyExc_SyntaxError, buf);
4510 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4511 ste->ste_opt_lineno);
4512 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004513}
4514
4515static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004516symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4517 struct symbol_info *si)
4518{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004519 if (c->c_future)
4520 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004521 if (ste->ste_generator)
4522 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004523 if (ste->ste_type != TYPE_MODULE)
4524 c->c_flags |= CO_NEWLOCALS;
4525 if (ste->ste_type == TYPE_FUNCTION) {
4526 c->c_nlocals = si->si_nlocals;
4527 if (ste->ste_optimized == 0)
4528 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004529 else if (ste->ste_optimized != OPT_EXEC)
4530 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004531 }
4532 return 0;
4533}
4534
4535static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004536symtable_load_symbols(struct compiling *c)
4537{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004538 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004539 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004540 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004541 PyObject *name, *varnames, *v;
4542 int i, flags, pos;
4543 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545 if (implicit == NULL) {
4546 implicit = PyInt_FromLong(1);
4547 if (implicit == NULL)
4548 return -1;
4549 }
4550 v = NULL;
4551
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004552 if (symtable_init_compiling_symbols(c) < 0)
4553 goto fail;
4554 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004555 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004556 si.si_nlocals = PyList_GET_SIZE(varnames);
4557 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004558
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004559 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560 v = PyInt_FromLong(i);
4561 if (PyDict_SetItem(c->c_locals,
4562 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004563 goto fail;
4564 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004565 }
4566
4567 /* XXX The cases below define the rules for whether a name is
4568 local or global. The logic could probably be clearer. */
4569 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004570 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4571 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004572
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004573 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004574 /* undo the original DEF_FREE */
4575 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004576
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004577 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004578 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004579 2. Free variables in methods that are also class
4580 variables or declared global.
4581 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004582 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004583 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004584
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004586 c->c_argcount--;
4587 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004588 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004589 c->c_argcount--;
4590 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004591 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004592 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004593 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004594 if (flags & DEF_PARAM) {
4595 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004596 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004597 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004598 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004599 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004602 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4603 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004604 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004605 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004606 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4607 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004608 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004609 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004610 if (v == NULL)
4611 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004612 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004613 goto fail;
4614 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004615 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004616 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004617 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004618 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004619 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004620 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004621 if (v == NULL)
4622 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004623 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004624 goto fail;
4625 Py_DECREF(v);
4626 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004627 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004628 if (PyDict_SetItem(c->c_globals, name,
4629 implicit) < 0)
4630 goto fail;
4631 if (st->st_nscopes != 1) {
4632 v = PyInt_FromLong(flags);
4633 if (PyDict_SetItem(st->st_global,
4634 name, v))
4635 goto fail;
4636 Py_DECREF(v);
4637 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 }
4640 }
4641
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004642 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4643
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004644 if (si.si_ncells > 1) { /* one cell is always in order */
4645 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4646 c->c_varnames, c->c_flags) < 0)
4647 return -1;
4648 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004649 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4650 return -1;
4651 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004652 fail:
4653 /* is this always the right thing to do? */
4654 Py_XDECREF(v);
4655 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004656}
4657
4658static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004659symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004660{
4661 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662
4663 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4664 if (st == NULL)
4665 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004667
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004668 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004669 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 goto fail;
4671 if ((st->st_symbols = PyDict_New()) == NULL)
4672 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004674 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004675 st->st_errors = 0;
4676 st->st_tmpname = 0;
4677 st->st_private = NULL;
4678 return st;
4679 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004680 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004681 return NULL;
4682}
4683
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004684void
4685PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004686{
4687 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004688 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004689 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004690 PyMem_Free((void *)st);
4691}
4692
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004693/* When the compiler exits a scope, it must should update the scope's
4694 free variable information with the list of free variables in its
4695 children.
4696
4697 Variables that are free in children and defined in the current
4698 scope are cellvars.
4699
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004700 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004701 false), free variables in children that are not defined here are
4702 implicit globals.
4703
4704*/
4705
4706static int
4707symtable_update_free_vars(struct symtable *st)
4708{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004709 int i, j, def;
4710 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004711 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004712
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004713 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714 def = DEF_FREE_CLASS;
4715 else
4716 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004717 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004718 int pos = 0;
4719
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004720 if (list)
4721 PyList_SetSlice(list, 0,
4722 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004723 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004724 PyList_GET_ITEM(ste->ste_children, i);
4725 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004726 int flags = PyInt_AS_LONG(o);
4727 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004729 if (list == NULL) {
4730 list = PyList_New(0);
4731 if (list == NULL)
4732 return -1;
4733 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004734 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004735 if (PyList_Append(list, name) < 0) {
4736 Py_DECREF(list);
4737 return -1;
4738 }
4739 }
4740 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004741 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004742 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004743 v = PyDict_GetItem(ste->ste_symbols, name);
4744 /* If a name N is declared global in scope A and
4745 referenced in scope B contained (perhaps
4746 indirectly) in A and there are no scopes
4747 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004748 is global in B. Unless A is a class scope,
4749 because class scopes are not considered for
4750 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004751 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004752 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004753 int flags = PyInt_AS_LONG(v);
4754 if (flags & DEF_GLOBAL) {
4755 symtable_undo_free(st, child->ste_id,
4756 name);
4757 continue;
4758 }
4759 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004760 if (ste->ste_nested) {
4761 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004762 name, def) < 0) {
4763 Py_DECREF(list);
4764 return -1;
4765 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004766 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004767 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004768 name) < 0) {
4769 Py_DECREF(list);
4770 return -1;
4771 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004772 }
4773 }
4774 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004775
4776 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004777 return 0;
4778}
4779
4780/* If the current scope is a non-nested class or if name is not
4781 defined in the current, non-nested scope, then it is an implicit
4782 global in all nested scopes.
4783*/
4784
4785static int
4786symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4787{
4788 PyObject *o;
4789 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004790 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004791
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004792 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004794 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 if (o == NULL)
4796 return symtable_undo_free(st, child, name);
4797 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004798
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004799 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 return symtable_undo_free(st, child, name);
4801 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004802 return symtable_add_def_o(st, ste->ste_symbols,
4803 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004804}
4805
4806static int
4807symtable_undo_free(struct symtable *st, PyObject *id,
4808 PyObject *name)
4809{
4810 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004811 PyObject *info;
4812 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004813
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004814 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4815 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004817
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004818 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004819 if (info == NULL)
4820 return 0;
4821 v = PyInt_AS_LONG(info);
4822 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004824 DEF_FREE_GLOBAL) < 0)
4825 return -1;
4826 } else
4827 /* If the name is defined here or declared global,
4828 then the recursion stops. */
4829 return 0;
4830
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004831 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4832 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004833 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004834 PyList_GET_ITEM(ste->ste_children, i);
4835 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004836 if (x < 0)
4837 return x;
4838 }
4839 return 0;
4840}
4841
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004842/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4843 This reference is released when the scope is exited, via the DECREF
4844 in symtable_exit_scope().
4845*/
4846
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847static int
4848symtable_exit_scope(struct symtable *st)
4849{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 int end;
4851
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004852 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004853 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004855 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004856 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4857 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858 if (PySequence_DelItem(st->st_stack, end) < 0)
4859 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004860 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004862
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004863static void
4864symtable_enter_scope(struct symtable *st, char *name, int type,
4865 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004867 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004868
4869 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004870 prev = st->st_cur;
4871 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4872 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004873 st->st_errors++;
4874 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875 }
4876 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004877 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 PySymtableEntry_New(st, name, type, lineno);
4879 if (strcmp(name, TOP) == 0)
4880 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004881 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882 if (PyList_Append(prev->ste_children,
4883 (PyObject *)st->st_cur) < 0)
4884 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004885 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004886}
4887
4888static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004889symtable_lookup(struct symtable *st, char *name)
4890{
4891 char buffer[MANGLE_LEN];
4892 PyObject *v;
4893 int flags;
4894
4895 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4896 name = buffer;
4897 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4898 if (v == NULL) {
4899 if (PyErr_Occurred())
4900 return -1;
4901 else
4902 return 0;
4903 }
4904
4905 flags = PyInt_AS_LONG(v);
4906 return flags;
4907}
4908
4909static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004910symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004911{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004912 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004913 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004914 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004916 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004917 name = buffer;
4918 if ((s = PyString_InternFromString(name)) == NULL)
4919 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004920 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4921 Py_DECREF(s);
4922 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923}
4924
4925/* Must only be called with mangled names */
4926
4927static int
4928symtable_add_def_o(struct symtable *st, PyObject *dict,
4929 PyObject *name, int flag)
4930{
4931 PyObject *o;
4932 int val;
4933
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004934 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004935 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004936 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004937 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004938 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004939 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941 return -1;
4942 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004943 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004944 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004945 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004946 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004947 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 Py_DECREF(o);
4949 return -1;
4950 }
4951 Py_DECREF(o);
4952
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004954 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004955 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004956 } else if (flag & DEF_GLOBAL) {
4957 /* XXX need to update DEF_GLOBAL for other flags too;
4958 perhaps only DEF_FREE_GLOBAL */
4959 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004960 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004961 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004962 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004964 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004965 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004966 Py_DECREF(o);
4967 return -1;
4968 }
4969 Py_DECREF(o);
4970 }
4971 return 0;
4972}
4973
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004974#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975
Tim Peters08a898f2001-06-28 01:52:22 +00004976/* Look for a yield stmt under n. Return 1 if found, else 0.
4977 This hack is used to look inside "if 0:" blocks (which are normally
4978 ignored) in case those are the only places a yield occurs (so that this
4979 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004980static int
4981look_for_yield(node *n)
4982{
4983 int i;
4984
4985 for (i = 0; i < NCH(n); ++i) {
4986 node *kid = CHILD(n, i);
4987
4988 switch (TYPE(kid)) {
4989
4990 case classdef:
4991 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004992 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004993 /* Stuff in nested functions and classes can't make
4994 the parent a generator. */
4995 return 0;
4996
4997 case yield_stmt:
4998 return 1;
4999
5000 default:
5001 if (look_for_yield(kid))
5002 return 1;
5003 }
5004 }
5005 return 0;
5006}
5007
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005008static void
5009symtable_node(struct symtable *st, node *n)
5010{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005011 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012
5013 loop:
5014 switch (TYPE(n)) {
5015 case funcdef: {
5016 char *func_name = STR(CHILD(n, 1));
5017 symtable_add_def(st, func_name, DEF_LOCAL);
5018 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005019 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005020 symtable_funcdef(st, n);
5021 symtable_exit_scope(st);
5022 break;
5023 }
5024 case lambdef:
5025 if (NCH(n) == 4)
5026 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005027 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 symtable_funcdef(st, n);
5029 symtable_exit_scope(st);
5030 break;
5031 case classdef: {
5032 char *tmp, *class_name = STR(CHILD(n, 1));
5033 symtable_add_def(st, class_name, DEF_LOCAL);
5034 if (TYPE(CHILD(n, 2)) == LPAR) {
5035 node *bases = CHILD(n, 3);
5036 int i;
5037 for (i = 0; i < NCH(bases); i += 2) {
5038 symtable_node(st, CHILD(bases, i));
5039 }
5040 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005041 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005042 tmp = st->st_private;
5043 st->st_private = class_name;
5044 symtable_node(st, CHILD(n, NCH(n) - 1));
5045 st->st_private = tmp;
5046 symtable_exit_scope(st);
5047 break;
5048 }
5049 case if_stmt:
5050 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005051 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5052 if (st->st_cur->ste_generator == 0)
5053 st->st_cur->ste_generator =
5054 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005056 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005057 symtable_node(st, CHILD(n, i + 1));
5058 symtable_node(st, CHILD(n, i + 3));
5059 }
5060 if (i + 2 < NCH(n))
5061 symtable_node(st, CHILD(n, i + 2));
5062 break;
5063 case global_stmt:
5064 symtable_global(st, n);
5065 break;
5066 case import_stmt:
5067 symtable_import(st, n);
5068 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005069 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005070 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071 symtable_node(st, CHILD(n, 1));
5072 if (NCH(n) > 2)
5073 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005074 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005075 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005076 st->st_cur->ste_opt_lineno = n->n_lineno;
5077 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 if (NCH(n) > 4)
5079 symtable_node(st, CHILD(n, 5));
5080 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005081
5082 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005083 case assert_stmt:
5084 if (Py_OptimizeFlag)
5085 return;
5086 if (NCH(n) == 2) {
5087 n = CHILD(n, 1);
5088 goto loop;
5089 } else {
5090 symtable_node(st, CHILD(n, 1));
5091 n = CHILD(n, 3);
5092 goto loop;
5093 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 case except_clause:
5095 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005096 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 if (NCH(n) > 1) {
5098 n = CHILD(n, 1);
5099 goto loop;
5100 }
5101 break;
5102 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005103 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005105 case yield_stmt:
5106 st->st_cur->ste_generator = 1;
5107 n = CHILD(n, 1);
5108 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109 case expr_stmt:
5110 if (NCH(n) == 1)
5111 n = CHILD(n, 0);
5112 else {
5113 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005114 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005115 symtable_node(st, CHILD(n, 2));
5116 break;
5117 } else {
5118 int i;
5119 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005120 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005121 n = CHILD(n, NCH(n) - 1);
5122 }
5123 }
5124 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005125 case list_iter:
5126 n = CHILD(n, 0);
5127 if (TYPE(n) == list_for) {
5128 st->st_tmpname++;
5129 symtable_list_comprehension(st, n);
5130 st->st_tmpname--;
5131 } else {
5132 REQ(n, list_if);
5133 symtable_node(st, CHILD(n, 1));
5134 if (NCH(n) == 3) {
5135 n = CHILD(n, 2);
5136 goto loop;
5137 }
5138 }
5139 break;
5140 case for_stmt:
5141 symtable_assign(st, CHILD(n, 1), 0);
5142 for (i = 3; i < NCH(n); ++i)
5143 if (TYPE(CHILD(n, i)) >= single_input)
5144 symtable_node(st, CHILD(n, i));
5145 break;
5146 /* The remaining cases fall through to default except in
5147 special circumstances. This requires the individual cases
5148 to be coded with great care, even though they look like
5149 rather innocuous. Each case must double-check TYPE(n).
5150 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005152 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005153 n = CHILD(n, 2);
5154 goto loop;
5155 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005156 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005157 case listmaker:
5158 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005159 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005160 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005161 symtable_node(st, CHILD(n, 0));
5162 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005163 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005164 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005165 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 case atom:
5167 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5168 symtable_add_use(st, STR(CHILD(n, 0)));
5169 break;
5170 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005171 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005172 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005173 /* Walk over every non-token child with a special case
5174 for one child.
5175 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 if (NCH(n) == 1) {
5177 n = CHILD(n, 0);
5178 goto loop;
5179 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005180 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 if (TYPE(CHILD(n, i)) >= single_input)
5182 symtable_node(st, CHILD(n, i));
5183 }
5184}
5185
5186static void
5187symtable_funcdef(struct symtable *st, node *n)
5188{
5189 node *body;
5190
5191 if (TYPE(n) == lambdef) {
5192 if (NCH(n) == 4)
5193 symtable_params(st, CHILD(n, 1));
5194 } else
5195 symtable_params(st, CHILD(n, 2));
5196 body = CHILD(n, NCH(n) - 1);
5197 symtable_node(st, body);
5198}
5199
5200/* The next two functions parse the argument tuple.
5201 symtable_default_arg() checks for names in the default arguments,
5202 which are references in the defining scope. symtable_params()
5203 parses the parameter names, which are defined in the function's
5204 body.
5205
5206 varargslist:
5207 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5208 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5209*/
5210
5211static void
5212symtable_default_args(struct symtable *st, node *n)
5213{
5214 node *c;
5215 int i;
5216
5217 if (TYPE(n) == parameters) {
5218 n = CHILD(n, 1);
5219 if (TYPE(n) == RPAR)
5220 return;
5221 }
5222 REQ(n, varargslist);
5223 for (i = 0; i < NCH(n); i += 2) {
5224 c = CHILD(n, i);
5225 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5226 break;
5227 }
5228 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5229 symtable_node(st, CHILD(n, i));
5230 }
5231}
5232
5233static void
5234symtable_params(struct symtable *st, node *n)
5235{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005236 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005237 node *c = NULL;
5238
5239 if (TYPE(n) == parameters) {
5240 n = CHILD(n, 1);
5241 if (TYPE(n) == RPAR)
5242 return;
5243 }
5244 REQ(n, varargslist);
5245 for (i = 0; i < NCH(n); i += 2) {
5246 c = CHILD(n, i);
5247 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5248 ext = 1;
5249 break;
5250 }
5251 if (TYPE(c) == test) {
5252 continue;
5253 }
5254 if (TYPE(CHILD(c, 0)) == NAME)
5255 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5256 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005257 char nbuf[30];
5258 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005259 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005260 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261 }
5262 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 if (ext) {
5264 c = CHILD(n, i);
5265 if (TYPE(c) == STAR) {
5266 i++;
5267 symtable_add_def(st, STR(CHILD(n, i)),
5268 DEF_PARAM | DEF_STAR);
5269 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005270 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005271 c = NULL;
5272 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005275 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005276 i++;
5277 symtable_add_def(st, STR(CHILD(n, i)),
5278 DEF_PARAM | DEF_DOUBLESTAR);
5279 }
5280 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005281 if (complex >= 0) {
5282 int j;
5283 for (j = 0; j <= complex; j++) {
5284 c = CHILD(n, j);
5285 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005286 c = CHILD(n, ++j);
5287 else if (TYPE(c) == EQUAL)
5288 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005289 if (TYPE(CHILD(c, 0)) == LPAR)
5290 symtable_params_fplist(st, CHILD(c, 1));
5291 }
5292 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005293}
5294
5295static void
5296symtable_params_fplist(struct symtable *st, node *n)
5297{
5298 int i;
5299 node *c;
5300
5301 REQ(n, fplist);
5302 for (i = 0; i < NCH(n); i += 2) {
5303 c = CHILD(n, i);
5304 REQ(c, fpdef);
5305 if (NCH(c) == 1)
5306 symtable_add_def(st, STR(CHILD(c, 0)),
5307 DEF_PARAM | DEF_INTUPLE);
5308 else
5309 symtable_params_fplist(st, CHILD(c, 1));
5310 }
5311
5312}
5313
5314static void
5315symtable_global(struct symtable *st, node *n)
5316{
5317 int i;
5318
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005319 /* XXX It might be helpful to warn about module-level global
5320 statements, but it's hard to tell the difference between
5321 module-level and a string passed to exec.
5322 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005323
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005324 for (i = 1; i < NCH(n); i += 2) {
5325 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005326 int flags;
5327
5328 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005329 if (flags < 0)
5330 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005331 if (flags && flags != DEF_GLOBAL) {
5332 char buf[500];
5333 if (flags & DEF_PARAM) {
5334 PyErr_Format(PyExc_SyntaxError,
5335 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005336 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005337 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005338 st->st_cur->ste_lineno);
5339 st->st_errors++;
5340 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005341 }
5342 else {
5343 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005344 PyOS_snprintf(buf, sizeof(buf),
5345 GLOBAL_AFTER_ASSIGN,
5346 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005347 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005348 PyOS_snprintf(buf, sizeof(buf),
5349 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005350 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005351 }
5352 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005353 symtable_add_def(st, name, DEF_GLOBAL);
5354 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355}
5356
5357static void
5358symtable_list_comprehension(struct symtable *st, node *n)
5359{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005360 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005361
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005362 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005363 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005364 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365 symtable_node(st, CHILD(n, 3));
5366 if (NCH(n) == 5)
5367 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368}
5369
5370static void
5371symtable_import(struct symtable *st, node *n)
5372{
5373 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005374 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005375 | 'from' dotted_name 'import'
5376 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005377 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005378 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005380 node *dotname = CHILD(n, 1);
5381 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5382 /* check for bogus imports */
5383 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5384 PyErr_SetString(PyExc_SyntaxError,
5385 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005386 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005387 n->n_lineno);
5388 st->st_errors++;
5389 return;
5390 }
5391 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005393 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005394 if (symtable_warn(st,
5395 "import * only allowed at module level") < 0)
5396 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005397 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005398 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005399 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005400 } else {
5401 for (i = 3; i < NCH(n); i += 2) {
5402 node *c = CHILD(n, i);
5403 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005404 symtable_assign(st, CHILD(c, 2),
5405 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005407 symtable_assign(st, CHILD(c, 0),
5408 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 }
5410 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005411 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005413 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005414 }
5415 }
5416}
5417
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005418/* The third argument to symatble_assign() is a flag to be passed to
5419 symtable_add_def() if it is eventually called. The flag is useful
5420 to specify the particular type of assignment that should be
5421 recorded, e.g. an assignment caused by import.
5422 */
5423
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005424static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005425symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005426{
5427 node *tmp;
5428 int i;
5429
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005430 loop:
5431 switch (TYPE(n)) {
5432 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005433 /* invalid assignment, e.g. lambda x:x=2. The next
5434 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005435 return;
5436 case power:
5437 if (NCH(n) > 2) {
5438 for (i = 2; i < NCH(n); ++i)
5439 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5440 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005441 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005442 if (NCH(n) > 1) {
5443 symtable_node(st, CHILD(n, 0));
5444 symtable_node(st, CHILD(n, 1));
5445 } else {
5446 n = CHILD(n, 0);
5447 goto loop;
5448 }
5449 return;
5450 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005451 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5452 /* XXX This is an error, but the next pass
5453 will catch it. */
5454 return;
5455 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005456 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005457 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005458 }
5459 return;
5460 case exprlist:
5461 case testlist:
5462 if (NCH(n) == 1) {
5463 n = CHILD(n, 0);
5464 goto loop;
5465 }
5466 else {
5467 int i;
5468 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005469 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005470 return;
5471 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472 case atom:
5473 tmp = CHILD(n, 0);
5474 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5475 n = CHILD(n, 1);
5476 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005477 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005478 if (strcmp(STR(tmp), "__debug__") == 0) {
5479 PyErr_SetString(PyExc_SyntaxError,
5480 ASSIGN_DEBUG);
5481 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005482 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005483 st->st_errors++;
5484 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005485 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005486 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005487 return;
5488 case dotted_as_name:
5489 if (NCH(n) == 3)
5490 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005491 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492 else
5493 symtable_add_def(st,
5494 STR(CHILD(CHILD(n,
5495 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005496 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 return;
5498 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005499 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005500 return;
5501 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005502 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 return;
5504 default:
5505 if (NCH(n) == 0)
5506 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005507 if (NCH(n) == 1) {
5508 n = CHILD(n, 0);
5509 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005510 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005511 /* Should only occur for errors like x + 1 = 1,
5512 which will be caught in the next pass. */
5513 for (i = 0; i < NCH(n); ++i)
5514 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005515 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005516 }
5517}