blob: 4bbe44f7c981725a59eea060f1a775bdd9ecc881 [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);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000289 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000290 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000291 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 for (i = PyTuple_Size(consts); --i >= 0; ) {
293 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000294 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000295 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000296 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000297 continue;
298 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000299 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000301 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000302 co->co_argcount = argcount;
303 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000304 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000305 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000307 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000313 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000314 Py_INCREF(freevars);
315 co->co_freevars = freevars;
316 Py_INCREF(cellvars);
317 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000319 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000321 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000322 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000324 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000325 }
326 return co;
327}
328
329
330/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000331
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000332/* The compiler uses two passes to generate bytecodes. The first pass
333 builds the symbol table. The second pass generates the bytecode.
334
335 The first pass uses a single symtable struct. The second pass uses
336 a compiling struct for each code block. The compiling structs
337 share a reference to the symtable.
338
339 The two passes communicate via symtable_load_symbols() and via
340 is_local() and is_global(). The former initializes several slots
341 in the compiling struct: c_varnames, c_locals, c_nlocals,
342 c_argcount, c_globals, and c_flags.
343*/
344
Tim Peters2a7f3842001-06-09 09:26:21 +0000345/* All about c_lnotab.
346
347c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
348mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
349to source code line #s (when needed for tracebacks) via c_lnotab instead.
350The array is conceptually a list of
351 (bytecode offset increment, line number increment)
352pairs. The details are important and delicate, best illustrated by example:
353
354 byte code offset source code line number
355 0 1
356 6 2
357 50 7
358 350 307
359 361 308
360
361The first trick is that these numbers aren't stored, only the increments
362from one row to the next (this doesn't really work, but it's a start):
363
364 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
365
366The second trick is that an unsigned byte can't hold negative values, or
367values larger than 255, so (a) there's a deep assumption that byte code
368offsets and their corresponding line #s both increase monotonically, and (b)
369if at least one column jumps by more than 255 from one row to the next, more
370than one pair is written to the table. In case #b, there's no way to know
371from looking at the table later how many were written. That's the delicate
372part. A user of c_lnotab desiring to find the source line number
373corresponding to a bytecode address A should do something like this
374
375 lineno = addr = 0
376 for addr_incr, line_incr in c_lnotab:
377 addr += addr_incr
378 if addr > A:
379 return lineno
380 lineno += line_incr
381
382In order for this to work, when the addr field increments by more than 255,
383the line # increment in each pair generated must be 0 until the remaining addr
384increment is < 256. So, in the example above, com_set_lineno should not (as
385was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
386255, 0, 45, 255, 0, 45.
387*/
388
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000389struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000390 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000392 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000394 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyObject *c_globals; /* dictionary (value=None) */
396 PyObject *c_locals; /* dictionary (value=localID) */
397 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000398 PyObject *c_freevars; /* dictionary (value=None) */
399 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000400 int c_nlocals; /* index of next local */
401 int c_argcount; /* number of top-level arguments */
402 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000403 int c_nexti; /* index into c_code */
404 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000406 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000407 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000408 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000409 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000410 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000411 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000412 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000413 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000414 int c_stacklevel; /* Current stack level */
415 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000416 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000417 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000418 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000419 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000420 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000421 int c_nested; /* Is block nested funcdef or lamdef? */
422 int c_closure; /* Is nested w/freevars? */
423 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000424 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000425};
426
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000427static int
428is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000429{
430 if ((v & (USE | DEF_FREE))
431 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
432 return 1;
433 if (v & DEF_FREE_CLASS)
434 return 1;
435 return 0;
436}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000437
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000439com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000440{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000441 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
442
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000443 if (c == NULL) {
444 /* Error occurred via symtable call to
445 is_constant_false */
446 PyErr_SetString(exc, msg);
447 return;
448 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000449 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000450 if (c->c_lineno < 1 || c->c_interactive) {
451 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000453 return;
454 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000455 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000456 if (v == NULL)
457 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000458
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000459 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000460 if (line == NULL) {
461 Py_INCREF(Py_None);
462 line = Py_None;
463 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000464 if (exc == PyExc_SyntaxError) {
465 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
466 Py_None, line);
467 if (t == NULL)
468 goto exit;
469 w = Py_BuildValue("(OO)", v, t);
470 if (w == NULL)
471 goto exit;
472 PyErr_SetObject(exc, w);
473 } else {
474 /* Make sure additional exceptions are printed with
475 file and line, also. */
476 PyErr_SetObject(exc, v);
477 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
478 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000479 exit:
480 Py_XDECREF(t);
481 Py_XDECREF(v);
482 Py_XDECREF(w);
483 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000484}
485
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000486/* Interface to the block stack */
487
488static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000489block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000490{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000491 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 com_error(c, PyExc_SystemError,
493 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000494 }
495 else {
496 c->c_block[c->c_nblocks++] = type;
497 }
498}
499
500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000501block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000502{
503 if (c->c_nblocks > 0)
504 c->c_nblocks--;
505 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000507 }
508}
509
Guido van Rossum681d79a1995-07-18 14:51:37 +0000510/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000511
Tim Petersdbd9ba62000-07-09 03:09:57 +0000512static int com_init(struct compiling *, char *);
513static void com_free(struct compiling *);
514static void com_push(struct compiling *, int);
515static void com_pop(struct compiling *, int);
516static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000517static void com_node(struct compiling *, node *);
518static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000519static void com_addbyte(struct compiling *, int);
520static void com_addint(struct compiling *, int);
521static void com_addoparg(struct compiling *, int, int);
522static void com_addfwref(struct compiling *, int, int *);
523static void com_backpatch(struct compiling *, int);
524static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
525static int com_addconst(struct compiling *, PyObject *);
526static int com_addname(struct compiling *, PyObject *);
527static void com_addopname(struct compiling *, int, node *);
528static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000529static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000530static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000531static void com_assign(struct compiling *, node *, int, node *);
532static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000533static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000534static PyCodeObject *jcompile(node *, char *, struct compiling *,
535 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000536static PyObject *parsestrplus(struct compiling*, node *);
537static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000538static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000539
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000540static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000541
542/* symtable operations */
543static int symtable_build(struct compiling *, node *);
544static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000545static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000546static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000547static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000548static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000549static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000550
551static void symtable_node(struct symtable *, node *);
552static void symtable_funcdef(struct symtable *, node *);
553static void symtable_default_args(struct symtable *, node *);
554static void symtable_params(struct symtable *, node *);
555static void symtable_params_fplist(struct symtable *, node *n);
556static void symtable_global(struct symtable *, node *);
557static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000558static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000559static void symtable_list_comprehension(struct symtable *, node *);
560
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000561static int symtable_update_free_vars(struct symtable *);
562static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
563static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
564
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000565/* helper */
566static void
567do_pad(int pad)
568{
569 int i;
570 for (i = 0; i < pad; ++i)
571 fprintf(stderr, " ");
572}
573
574static void
575dump(node *n, int pad, int depth)
576{
577 int i;
578 if (depth == 0)
579 return;
580 do_pad(pad);
581 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
582 if (depth > 0)
583 depth--;
584 for (i = 0; i < NCH(n); ++i)
585 dump(CHILD(n, i), pad + 1, depth);
586}
587
588#define DUMP(N) dump(N, 0, -1)
589
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000590static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000591com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000592{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000593 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
595 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000596 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000598 goto fail;
599 if ((c->c_const_dict = PyDict_New()) == NULL)
600 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000602 goto fail;
603 if ((c->c_name_dict = PyDict_New()) == NULL)
604 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000606 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
608 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000609 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000610 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612 c->c_freevars = NULL;
613 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000614 c->c_nlocals = 0;
615 c->c_argcount = 0;
616 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000617 c->c_nexti = 0;
618 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000619 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000620 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000621 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000622 c->c_begin = 0;
623 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000624 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000625 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000626 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000627 c->c_stacklevel = 0;
628 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000629 c->c_firstlineno = 0;
630 c->c_last_addr = 0;
631 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000632 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000633 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000634 c->c_nested = 0;
635 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000636 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000637 return 1;
638
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000639 fail:
640 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000641 return 0;
642}
643
644static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000646{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 Py_XDECREF(c->c_code);
648 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000649 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000651 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 Py_XDECREF(c->c_globals);
653 Py_XDECREF(c->c_locals);
654 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000655 Py_XDECREF(c->c_freevars);
656 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000658 if (c->c_future)
659 PyMem_Free((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660}
661
662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000664{
665 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000666 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000667 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000668 /*
669 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
670 c->c_filename, c->c_name, c->c_lineno,
671 c->c_nexti, c->c_stacklevel, n);
672 */
673 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000674}
675
676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000678{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000679 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000680 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000681 else
682 c->c_stacklevel -= n;
683}
684
685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000686com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000687{
688 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000690 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000691 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000692}
693
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000694static int
695com_check_size(PyObject **s, int offset)
696{
697 int len = PyString_GET_SIZE(*s);
698 if (offset >= len)
699 return _PyString_Resize(s, len * 2);
700 return 0;
701}
702
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000704com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000705{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000706 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000707 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000708 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000709 if (com_check_size(&c->c_code, c->c_nexti)) {
710 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000713 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714}
715
716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000717com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000719 com_addbyte(c, x & 0xff);
720 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721}
722
723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000724com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000725{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000726 char *p;
727 if (c->c_lnotab == NULL)
728 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000729 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
730 c->c_errors++;
731 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000732 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000733 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000734 *p++ = addr;
735 *p++ = line;
736 c->c_lnotab_next += 2;
737}
738
739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000740com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000741{
742 c->c_lineno = lineno;
743 if (c->c_firstlineno == 0) {
744 c->c_firstlineno = c->c_last_line = lineno;
745 }
746 else {
747 int incr_addr = c->c_nexti - c->c_last_addr;
748 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000749 while (incr_addr > 255) {
750 com_add_lnotab(c, 255, 0);
751 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000752 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000753 while (incr_line > 255) {
754 com_add_lnotab(c, incr_addr, 255);
755 incr_line -=255;
756 incr_addr = 0;
757 }
758 if (incr_addr > 0 || incr_line > 0)
759 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000760 c->c_last_addr = c->c_nexti;
761 c->c_last_line = lineno;
762 }
763}
764
765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000766com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000767{
Fred Drakeef8ace32000-08-24 00:32:09 +0000768 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000769 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000770 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000771 if (Py_OptimizeFlag)
772 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000773 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000774 if (extended_arg){
775 com_addbyte(c, EXTENDED_ARG);
776 com_addint(c, extended_arg);
777 arg &= 0xffff;
778 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000779 com_addbyte(c, op);
780 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781}
782
783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000784com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000785{
786 /* Compile a forward reference for backpatching */
787 int here;
788 int anchor;
789 com_addbyte(c, op);
790 here = c->c_nexti;
791 anchor = *p_anchor;
792 *p_anchor = here;
793 com_addint(c, anchor == 0 ? 0 : here - anchor);
794}
795
796static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000797com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000799 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000800 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000801 int dist;
802 int prev;
803 for (;;) {
804 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000805 prev = code[anchor] + (code[anchor+1] << 8);
806 dist = target - (anchor+2);
807 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000808 dist >>= 8;
809 code[anchor+1] = dist;
810 dist >>= 8;
811 if (dist) {
812 com_error(c, PyExc_SystemError,
813 "com_backpatch: offset too large");
814 break;
815 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 if (!prev)
817 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000818 anchor -= prev;
819 }
820}
821
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000822/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823
824static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000825com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000826{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000827 PyObject *w, *t, *np=NULL;
828 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000829
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000830 t = Py_BuildValue("(OO)", v, v->ob_type);
831 if (t == NULL)
832 goto fail;
833 w = PyDict_GetItem(dict, t);
834 if (w != NULL) {
835 n = PyInt_AsLong(w);
836 } else {
837 n = PyList_Size(list);
838 np = PyInt_FromLong(n);
839 if (np == NULL)
840 goto fail;
841 if (PyList_Append(list, v) != 0)
842 goto fail;
843 if (PyDict_SetItem(dict, t, np) != 0)
844 goto fail;
845 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000846 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000847 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000848 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000849 fail:
850 Py_XDECREF(np);
851 Py_XDECREF(t);
852 c->c_errors++;
853 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000854}
855
856static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000857com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000858{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000859 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000860}
861
862static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000863com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000865 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000866}
867
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000868static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000869mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000870{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000871 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000872 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000873 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000874 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
875 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000876 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000877 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000878 return 0; /* Don't mangle __extremely_long_names */
879 if (name[nlen-1] == '_' && name[nlen-2] == '_')
880 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000881 /* Strip leading underscores from class name */
882 while (*p == '_')
883 p++;
884 if (*p == '\0')
885 return 0; /* Don't mangle if class is just underscores */
886 plen = strlen(p);
887 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000888 plen = maxlen-nlen-2; /* Truncate class name if too long */
889 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000890 buffer[0] = '_';
891 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000892 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000893 return 1;
894}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000895
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000897com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000900 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000901 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000902
903 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000904 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000905 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906 c->c_errors++;
907 i = 255;
908 }
909 else {
910 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000913 com_addoparg(c, op, i);
914}
915
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000916#define NAME_LOCAL 0
917#define NAME_GLOBAL 1
918#define NAME_DEFAULT 2
919#define NAME_CLOSURE 3
920
921static int
922com_lookup_arg(PyObject *dict, PyObject *name)
923{
924 PyObject *v = PyDict_GetItem(dict, name);
925 if (v == NULL)
926 return -1;
927 else
928 return PyInt_AS_LONG(v);
929}
930
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000931static void
932com_addop_varname(struct compiling *c, int kind, char *name)
933{
934 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000935 int i, reftype;
936 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 int op = STOP_CODE;
938 char buffer[MANGLE_LEN];
939
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000940 if (mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000941 name = buffer;
942 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
943 c->c_errors++;
944 i = 255;
945 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +0000946 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000947
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 reftype = get_ref_type(c, name);
949 switch (reftype) {
950 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000951 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000952 scope = NAME_LOCAL;
953 break;
954 case GLOBAL_EXPLICIT:
955 scope = NAME_GLOBAL;
956 break;
957 case GLOBAL_IMPLICIT:
958 if (c->c_flags & CO_OPTIMIZED)
959 scope = NAME_GLOBAL;
960 break;
961 case FREE:
962 case CELL:
963 scope = NAME_CLOSURE;
964 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000965 }
966
967 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000968 if (scope == NAME_LOCAL)
969 i = com_lookup_arg(c->c_locals, v);
970 else if (reftype == FREE)
971 i = com_lookup_arg(c->c_freevars, v);
972 else if (reftype == CELL)
973 i = com_lookup_arg(c->c_cellvars, v);
974 if (i == -1) {
975 c->c_errors++; /* XXX no exception set */
976 i = 255;
977 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000978 }
979 Py_DECREF(v);
980
981 switch (kind) {
982 case VAR_LOAD:
983 switch (scope) {
984 case NAME_LOCAL:
985 op = LOAD_FAST;
986 break;
987 case NAME_GLOBAL:
988 op = LOAD_GLOBAL;
989 break;
990 case NAME_DEFAULT:
991 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 break;
993 case NAME_CLOSURE:
994 op = LOAD_DEREF;
995 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996 }
997 break;
998 case VAR_STORE:
999 switch (scope) {
1000 case NAME_LOCAL:
1001 op = STORE_FAST;
1002 break;
1003 case NAME_GLOBAL:
1004 op = STORE_GLOBAL;
1005 break;
1006 case NAME_DEFAULT:
1007 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001008 break;
1009 case NAME_CLOSURE:
1010 op = STORE_DEREF;
1011 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001012 }
1013 break;
1014 case VAR_DELETE:
1015 switch (scope) {
1016 case NAME_LOCAL:
1017 op = DELETE_FAST;
1018 break;
1019 case NAME_GLOBAL:
1020 op = DELETE_GLOBAL;
1021 break;
1022 case NAME_DEFAULT:
1023 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001024 break;
1025 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001026 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001027 PyOS_snprintf(buf, sizeof(buf),
1028 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001029 com_error(c, PyExc_SyntaxError, buf);
1030 i = 255;
1031 break;
1032 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001033 }
1034 break;
1035 }
1036done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001037 com_addoparg(c, op, i);
1038}
1039
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001041com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001042{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001043 char *name;
1044 char buffer[1000];
1045 /* XXX it is possible to write this code without the 1000
1046 chars on the total length of dotted names, I just can't be
1047 bothered right now */
1048 if (TYPE(n) == STAR)
1049 name = "*";
1050 else if (TYPE(n) == dotted_name) {
1051 char *p = buffer;
1052 int i;
1053 name = buffer;
1054 for (i = 0; i < NCH(n); i += 2) {
1055 char *s = STR(CHILD(n, i));
1056 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001058 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001059 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001060 break;
1061 }
1062 if (p != buffer)
1063 *p++ = '.';
1064 strcpy(p, s);
1065 p = strchr(p, '\0');
1066 }
1067 }
1068 else {
1069 REQ(n, NAME);
1070 name = STR(n);
1071 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001072 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001073}
1074
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001076parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001078 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001079 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001080 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001081#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001082 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001083 int imflag;
1084#endif
1085
Guido van Rossum282914b1991-04-04 10:42:56 +00001086 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001087 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001088#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001089 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001090#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001091 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001093 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001095 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001097 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001098 if (errno != 0)
1099 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001101 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001102 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001103#ifndef WITHOUT_COMPLEX
1104 if (imflag) {
1105 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001106 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001107 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001108 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001110 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001111 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001112#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001113 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001114 PyFPE_START_PROTECT("atof", return 0)
1115 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001116 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001118 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119}
1120
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001122parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001125 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126 char *buf;
1127 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001128 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001130 int first = *s;
1131 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001132 int rawmode = 0;
1133 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001134
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001135 if (isalpha(quote) || quote == '_') {
1136 if (quote == 'u' || quote == 'U') {
1137 quote = *++s;
1138 unicode = 1;
1139 }
1140 if (quote == 'r' || quote == 'R') {
1141 quote = *++s;
1142 rawmode = 1;
1143 }
1144 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001145 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 return NULL;
1148 }
1149 s++;
1150 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001151 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001152 com_error(com, PyExc_OverflowError,
1153 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001154 return NULL;
1155 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001156 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 return NULL;
1159 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001160 if (len >= 4 && s[0] == quote && s[1] == quote) {
1161 s += 2;
1162 len -= 2;
1163 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001165 return NULL;
1166 }
1167 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001168#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001169 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001170 if (rawmode)
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001171 v = PyUnicode_DecodeRawUnicodeEscape(
1172 s, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001173 else
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001174 v = PyUnicode_DecodeUnicodeEscape(
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001175 s, len, NULL);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001176 if (v == NULL)
1177 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1178 return v;
1179
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001180 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001181#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001182 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 return PyString_FromStringAndSize(s, len);
1184 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001185 if (v == NULL)
1186 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001188 end = s + len;
1189 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001190 if (*s != '\\') {
1191 *p++ = *s++;
1192 continue;
1193 }
1194 s++;
1195 switch (*s++) {
1196 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001197 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001198 case '\\': *p++ = '\\'; break;
1199 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001200 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001201 case 'b': *p++ = '\b'; break;
1202 case 'f': *p++ = '\014'; break; /* FF */
1203 case 't': *p++ = '\t'; break;
1204 case 'n': *p++ = '\n'; break;
1205 case 'r': *p++ = '\r'; break;
1206 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1208 case '0': case '1': case '2': case '3':
1209 case '4': case '5': case '6': case '7':
1210 c = s[-1] - '0';
1211 if ('0' <= *s && *s <= '7') {
1212 c = (c<<3) + *s++ - '0';
1213 if ('0' <= *s && *s <= '7')
1214 c = (c<<3) + *s++ - '0';
1215 }
1216 *p++ = c;
1217 break;
1218 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001219 if (isxdigit(Py_CHARMASK(s[0]))
1220 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001221 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001222 c = Py_CHARMASK(*s);
1223 s++;
1224 if (isdigit(c))
1225 x = c - '0';
1226 else if (islower(c))
1227 x = 10 + c - 'a';
1228 else
1229 x = 10 + c - 'A';
1230 x = x << 4;
1231 c = Py_CHARMASK(*s);
1232 s++;
1233 if (isdigit(c))
1234 x += c - '0';
1235 else if (islower(c))
1236 x += 10 + c - 'a';
1237 else
1238 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001239 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001240 break;
1241 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001242 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001243 com_error(com, PyExc_ValueError,
1244 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001245 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001246#ifndef Py_USING_UNICODE
1247 case 'u':
1248 case 'U':
1249 case 'N':
1250 if (unicode) {
1251 Py_DECREF(v);
1252 com_error(com, PyExc_ValueError,
1253 "Unicode escapes not legal "
1254 "when Unicode disabled");
1255 return NULL;
1256 }
1257#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001258 default:
1259 *p++ = '\\';
1260 *p++ = s[-1];
1261 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 }
1263 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 return v;
1266}
1267
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001269parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001270{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001272 int i;
1273 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001274 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001275 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001276 for (i = 1; i < NCH(n); i++) {
1277 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001278 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001279 if (s == NULL)
1280 goto onError;
1281 if (PyString_Check(v) && PyString_Check(s)) {
1282 PyString_ConcatAndDel(&v, s);
1283 if (v == NULL)
1284 goto onError;
1285 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001286#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001287 else {
1288 PyObject *temp;
1289 temp = PyUnicode_Concat(v, s);
1290 Py_DECREF(s);
1291 if (temp == NULL)
1292 goto onError;
1293 Py_DECREF(v);
1294 v = temp;
1295 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001296#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001297 }
1298 }
1299 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001300
1301 onError:
1302 Py_XDECREF(v);
1303 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001304}
1305
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001307com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001309 int anchor = 0;
1310 int save_begin = c->c_begin;
1311
1312 /* list_iter: for v in expr [list_iter] */
1313 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001314 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001315 c->c_begin = c->c_nexti;
1316 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001317 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001318 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001319 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001320 c->c_loops++;
1321 com_list_iter(c, n, e, t);
1322 c->c_loops--;
1323 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1324 c->c_begin = save_begin;
1325 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001326 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001327}
1328
1329static void
1330com_list_if(struct compiling *c, node *n, node *e, char *t)
1331{
1332 int anchor = 0;
1333 int a = 0;
1334 /* list_iter: 'if' test [list_iter] */
1335 com_addoparg(c, SET_LINENO, n->n_lineno);
1336 com_node(c, CHILD(n, 1));
1337 com_addfwref(c, JUMP_IF_FALSE, &a);
1338 com_addbyte(c, POP_TOP);
1339 com_pop(c, 1);
1340 com_list_iter(c, n, e, t);
1341 com_addfwref(c, JUMP_FORWARD, &anchor);
1342 com_backpatch(c, a);
1343 /* We jump here with an extra entry which we now pop */
1344 com_addbyte(c, POP_TOP);
1345 com_backpatch(c, anchor);
1346}
1347
1348static void
1349com_list_iter(struct compiling *c,
1350 node *p, /* parent of list_iter node */
1351 node *e, /* element expression node */
1352 char *t /* name of result list temp local */)
1353{
1354 /* list_iter is the last child in a listmaker, list_for, or list_if */
1355 node *n = CHILD(p, NCH(p)-1);
1356 if (TYPE(n) == list_iter) {
1357 n = CHILD(n, 0);
1358 switch (TYPE(n)) {
1359 case list_for:
1360 com_list_for(c, n, e, t);
1361 break;
1362 case list_if:
1363 com_list_if(c, n, e, t);
1364 break;
1365 default:
1366 com_error(c, PyExc_SystemError,
1367 "invalid list_iter node type");
1368 }
1369 }
1370 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001371 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 com_push(c, 1);
1373 com_node(c, e);
1374 com_addoparg(c, CALL_FUNCTION, 1);
1375 com_addbyte(c, POP_TOP);
1376 com_pop(c, 2);
1377 }
1378}
1379
1380static void
1381com_list_comprehension(struct compiling *c, node *n)
1382{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001383 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001384 char tmpname[30];
1385 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001386 com_addoparg(c, BUILD_LIST, 0);
1387 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1388 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001389 com_addop_name(c, LOAD_ATTR, "append");
1390 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001391 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001392 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001393 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001394 --c->c_tmpname;
1395}
1396
1397static void
1398com_listmaker(struct compiling *c, node *n)
1399{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001400 /* listmaker: test ( list_for | (',' test)* [','] ) */
1401 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001402 com_list_comprehension(c, n);
1403 else {
1404 int len = 0;
1405 int i;
1406 for (i = 0; i < NCH(n); i += 2, len++)
1407 com_node(c, CHILD(n, i));
1408 com_addoparg(c, BUILD_LIST, len);
1409 com_pop(c, len-1);
1410 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411}
1412
1413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001414com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001415{
1416 int i;
1417 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1418 for (i = 0; i+2 < NCH(n); i += 4) {
1419 /* We must arrange things just right for STORE_SUBSCR.
1420 It wants the stack to look like (value) (dict) (key) */
1421 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001423 com_node(c, CHILD(n, i+2)); /* value */
1424 com_addbyte(c, ROT_TWO);
1425 com_node(c, CHILD(n, i)); /* key */
1426 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001427 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001428 }
1429}
1430
1431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001432com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433{
1434 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 int i;
1437 REQ(n, atom);
1438 ch = CHILD(n, 0);
1439 switch (TYPE(ch)) {
1440 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001441 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001443 com_push(c, 1);
1444 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 else
1446 com_node(c, CHILD(n, 1));
1447 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001448 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001449 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001451 com_push(c, 1);
1452 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001454 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001456 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001458 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001459 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001460 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461 break;
1462 case BACKQUOTE:
1463 com_node(c, CHILD(n, 1));
1464 com_addbyte(c, UNARY_CONVERT);
1465 break;
1466 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001467 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 i = 255;
1469 }
1470 else {
1471 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001472 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001473 }
1474 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001475 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 break;
1477 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001478 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001479 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 c->c_errors++;
1481 i = 255;
1482 }
1483 else {
1484 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001486 }
1487 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001488 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001489 break;
1490 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001491 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001492 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001493 break;
1494 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 com_error(c, PyExc_SystemError,
1496 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 }
1498}
1499
1500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001501com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502{
1503 if (NCH(n) == 1) {
1504 com_addbyte(c, op);
1505 }
1506 else if (NCH(n) == 2) {
1507 if (TYPE(CHILD(n, 0)) != COLON) {
1508 com_node(c, CHILD(n, 0));
1509 com_addbyte(c, op+1);
1510 }
1511 else {
1512 com_node(c, CHILD(n, 1));
1513 com_addbyte(c, op+2);
1514 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001515 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 }
1517 else {
1518 com_node(c, CHILD(n, 0));
1519 com_node(c, CHILD(n, 2));
1520 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001521 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 }
1523}
1524
Guido van Rossum635abd21997-01-06 22:56:52 +00001525static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001526com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1527{
1528 if (NCH(n) == 1) {
1529 com_addbyte(c, DUP_TOP);
1530 com_push(c, 1);
1531 com_addbyte(c, SLICE);
1532 com_node(c, augn);
1533 com_addbyte(c, opcode);
1534 com_pop(c, 1);
1535 com_addbyte(c, ROT_TWO);
1536 com_addbyte(c, STORE_SLICE);
1537 com_pop(c, 2);
1538 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1539 com_node(c, CHILD(n, 0));
1540 com_addoparg(c, DUP_TOPX, 2);
1541 com_push(c, 2);
1542 com_addbyte(c, SLICE+1);
1543 com_pop(c, 1);
1544 com_node(c, augn);
1545 com_addbyte(c, opcode);
1546 com_pop(c, 1);
1547 com_addbyte(c, ROT_THREE);
1548 com_addbyte(c, STORE_SLICE+1);
1549 com_pop(c, 3);
1550 } else if (NCH(n) == 2) {
1551 com_node(c, CHILD(n, 1));
1552 com_addoparg(c, DUP_TOPX, 2);
1553 com_push(c, 2);
1554 com_addbyte(c, SLICE+2);
1555 com_pop(c, 1);
1556 com_node(c, augn);
1557 com_addbyte(c, opcode);
1558 com_pop(c, 1);
1559 com_addbyte(c, ROT_THREE);
1560 com_addbyte(c, STORE_SLICE+2);
1561 com_pop(c, 3);
1562 } else {
1563 com_node(c, CHILD(n, 0));
1564 com_node(c, CHILD(n, 2));
1565 com_addoparg(c, DUP_TOPX, 3);
1566 com_push(c, 3);
1567 com_addbyte(c, SLICE+3);
1568 com_pop(c, 2);
1569 com_node(c, augn);
1570 com_addbyte(c, opcode);
1571 com_pop(c, 1);
1572 com_addbyte(c, ROT_FOUR);
1573 com_addbyte(c, STORE_SLICE+3);
1574 com_pop(c, 4);
1575 }
1576}
1577
1578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001579com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001580{
1581 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001583 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001584 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001586 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001587 }
1588 else {
1589 com_node(c, CHILD(n, 0));
1590 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001591 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001592 }
1593 m = n;
1594 do {
1595 m = CHILD(m, 0);
1596 } while (NCH(m) == 1);
1597 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001598 /* f(lambda x: x[0] = 3) ends up getting parsed with
1599 * LHS test = lambda x: x[0], and RHS test = 3.
1600 * SF bug 132313 points out that complaining about a keyword
1601 * then is very confusing.
1602 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001604 TYPE(m) == lambdef ?
1605 "lambda cannot contain assignment" :
1606 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001607 }
1608 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001610 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001612 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001613 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001614 else if (*pkeywords == NULL) {
1615 c->c_errors++;
1616 Py_DECREF(v);
1617 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 if (PyDict_GetItem(*pkeywords, v) != NULL)
1619 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001620 "duplicate keyword argument");
1621 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001623 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001624 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001625 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001627 }
1628 }
1629 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001630}
1631
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001633com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634{
1635 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001636 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001637 }
1638 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001640 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001641 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001642 int star_flag = 0;
1643 int starstar_flag = 0;
1644 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001645 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001646 na = 0;
1647 nk = 0;
1648 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001649 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001650 if (TYPE(ch) == STAR ||
1651 TYPE(ch) == DOUBLESTAR)
1652 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001653 if (ch->n_lineno != lineno) {
1654 lineno = ch->n_lineno;
1655 com_addoparg(c, SET_LINENO, lineno);
1656 }
1657 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001658 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001659 na++;
1660 else
1661 nk++;
1662 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001664 while (i < NCH(n)) {
1665 node *tok = CHILD(n, i);
1666 node *ch = CHILD(n, i+1);
1667 i += 3;
1668 switch (TYPE(tok)) {
1669 case STAR: star_flag = 1; break;
1670 case DOUBLESTAR: starstar_flag = 1; break;
1671 }
1672 com_node(c, ch);
1673 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001674 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001675 com_error(c, PyExc_SyntaxError,
1676 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001677 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001678 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001679 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001680 star_flag + (starstar_flag << 1);
1681 else
1682 opcode = CALL_FUNCTION;
1683 com_addoparg(c, opcode, na | (nk << 8));
1684 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685 }
1686}
1687
1688static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001689com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001690{
1691 com_addopname(c, LOAD_ATTR, n);
1692}
1693
1694static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001695com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001696{
1697 int i=0;
1698 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001699 node *ch;
1700
1701 /* first argument */
1702 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001704 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001705 i++;
1706 }
1707 else {
1708 com_node(c, CHILD(n,i));
1709 i++;
1710 REQ(CHILD(n,i),COLON);
1711 i++;
1712 }
1713 /* second argument */
1714 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1715 com_node(c, CHILD(n,i));
1716 i++;
1717 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001718 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001720 com_push(c, 1);
1721 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001722 /* remaining arguments */
1723 for (; i < NCH(n); i++) {
1724 ns++;
1725 ch=CHILD(n,i);
1726 REQ(ch, sliceop);
1727 if (NCH(ch) == 1) {
1728 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001729 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001730 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001731 }
1732 else
1733 com_node(c, CHILD(ch,1));
1734 }
1735 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001736 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001737}
1738
1739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001740com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001741{
1742 node *ch;
1743 REQ(n, subscript);
1744 ch = CHILD(n,0);
1745 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001746 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001747 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001748 com_push(c, 1);
1749 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001750 else {
1751 /* check for slice */
1752 if ((TYPE(ch) == COLON || NCH(n) > 1))
1753 com_sliceobj(c, n);
1754 else {
1755 REQ(ch, test);
1756 com_node(c, ch);
1757 }
1758 }
1759}
1760
1761static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001762com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001763{
1764 int i, op;
1765 REQ(n, subscriptlist);
1766 /* Check to make backward compatible slice behavior for '[i:j]' */
1767 if (NCH(n) == 1) {
1768 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001769 /* 'Basic' slice, should have exactly one colon. */
1770 if ((TYPE(CHILD(sub, 0)) == COLON
1771 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1772 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1773 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001774 switch (assigning) {
1775 case OP_DELETE:
1776 op = DELETE_SLICE;
1777 break;
1778 case OP_ASSIGN:
1779 op = STORE_SLICE;
1780 break;
1781 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001782 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001783 break;
1784 default:
1785 com_augassign_slice(c, sub, assigning, augn);
1786 return;
1787 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001788 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001789 if (op == STORE_SLICE)
1790 com_pop(c, 2);
1791 else if (op == DELETE_SLICE)
1792 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001793 return;
1794 }
1795 }
1796 /* Else normal subscriptlist. Compile each subscript. */
1797 for (i = 0; i < NCH(n); i += 2)
1798 com_subscript(c, CHILD(n, i));
1799 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001800 if (NCH(n) > 1) {
1801 i = (NCH(n)+1) / 2;
1802 com_addoparg(c, BUILD_TUPLE, i);
1803 com_pop(c, i-1);
1804 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001805 switch (assigning) {
1806 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001807 op = DELETE_SUBSCR;
1808 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001809 break;
1810 default:
1811 case OP_ASSIGN:
1812 op = STORE_SUBSCR;
1813 i = 3;
1814 break;
1815 case OP_APPLY:
1816 op = BINARY_SUBSCR;
1817 i = 1;
1818 break;
1819 }
1820 if (assigning > OP_APPLY) {
1821 com_addoparg(c, DUP_TOPX, 2);
1822 com_push(c, 2);
1823 com_addbyte(c, BINARY_SUBSCR);
1824 com_pop(c, 1);
1825 com_node(c, augn);
1826 com_addbyte(c, assigning);
1827 com_pop(c, 1);
1828 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001829 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001830 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001831 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001832}
1833
1834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001835com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836{
1837 REQ(n, trailer);
1838 switch (TYPE(CHILD(n, 0))) {
1839 case LPAR:
1840 com_call_function(c, CHILD(n, 1));
1841 break;
1842 case DOT:
1843 com_select_member(c, CHILD(n, 1));
1844 break;
1845 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001846 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847 break;
1848 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001850 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 }
1852}
1853
1854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001855com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001856{
1857 int i;
1858 REQ(n, power);
1859 com_atom(c, CHILD(n, 0));
1860 for (i = 1; i < NCH(n); i++) {
1861 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1862 com_factor(c, CHILD(n, i+1));
1863 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001864 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001865 break;
1866 }
1867 else
1868 com_apply_trailer(c, CHILD(n, i));
1869 }
1870}
1871
1872static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001873com_invert_constant(struct compiling *c, node *n)
1874{
1875 /* Compute the inverse of int and longs and use them directly,
1876 but be prepared to generate code for all other
1877 possibilities (invalid numbers, floats, complex).
1878 */
1879 PyObject *num, *inv = NULL;
1880 int i;
1881
1882 REQ(n, NUMBER);
1883 num = parsenumber(c, STR(n));
1884 if (num == NULL)
1885 i = 255;
1886 else {
1887 inv = PyNumber_Invert(num);
1888 if (inv == NULL) {
1889 PyErr_Clear();
1890 i = com_addconst(c, num);
1891 } else {
1892 i = com_addconst(c, inv);
1893 Py_DECREF(inv);
1894 }
1895 Py_DECREF(num);
1896 }
1897 com_addoparg(c, LOAD_CONST, i);
1898 com_push(c, 1);
1899 if (num != NULL && inv == NULL)
1900 com_addbyte(c, UNARY_INVERT);
1901}
1902
Tim Peters51e26512001-09-07 08:45:55 +00001903static int
1904is_float_zero(const char *p)
1905{
1906 int found_radix_point = 0;
1907 int ch;
1908 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1909 switch (ch) {
1910 case '0':
1911 /* no reason to believe it's not 0 -- continue */
1912 break;
1913
1914 case 'e': case 'E': case 'j': case 'J':
1915 /* If this was a hex constant, we already would have
1916 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1917 must be an exponent marker, and we haven't yet
1918 seen a non-zero digit, and it doesn't matter what
1919 the exponent is then. For 'j' or 'J' similarly,
1920 except that this is an imaginary 0 then. */
1921 return 1;
1922
1923 case '.':
1924 found_radix_point = 1;
1925 break;
1926
1927 default:
1928 return 0;
1929 }
1930 }
1931 return found_radix_point;
1932}
1933
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001935com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001936{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001937 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001938 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001939 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001940 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001941 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001942 approriate value as a constant. If the value is negative,
1943 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001944 negative in the 0th position -- unless we're doing unary minus
1945 of a floating zero! In that case the sign is significant, but
1946 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001947 */
1948 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001949 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001950 && TYPE((pfactor = CHILD(n, 1))) == factor
1951 && NCH(pfactor) == 1
1952 && TYPE((ppower = CHILD(pfactor, 0))) == power
1953 && NCH(ppower) == 1
1954 && TYPE((patom = CHILD(ppower, 0))) == atom
1955 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1956 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001957 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001958 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001959 return;
1960 }
1961 if (childtype == MINUS) {
Tim Peters51e7f5c2002-04-22 02:33:27 +00001962 char *s = PyMem_Malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001963 if (s == NULL) {
1964 com_error(c, PyExc_MemoryError, "");
1965 com_addbyte(c, 255);
1966 return;
1967 }
1968 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001969 strcpy(s + 1, STR(pnum));
Tim Peters51e7f5c2002-04-22 02:33:27 +00001970 PyMem_Free(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00001971 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001972 }
Tim Peters51e26512001-09-07 08:45:55 +00001973 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001974 }
1975 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 com_factor(c, CHILD(n, 1));
1977 com_addbyte(c, UNARY_POSITIVE);
1978 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001979 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 com_factor(c, CHILD(n, 1));
1981 com_addbyte(c, UNARY_NEGATIVE);
1982 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001983 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001984 com_factor(c, CHILD(n, 1));
1985 com_addbyte(c, UNARY_INVERT);
1986 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001988 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 }
1990}
1991
1992static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001993com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994{
1995 int i;
1996 int op;
1997 REQ(n, term);
1998 com_factor(c, CHILD(n, 0));
1999 for (i = 2; i < NCH(n); i += 2) {
2000 com_factor(c, CHILD(n, i));
2001 switch (TYPE(CHILD(n, i-1))) {
2002 case STAR:
2003 op = BINARY_MULTIPLY;
2004 break;
2005 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002006 if (c->c_flags & CO_FUTURE_DIVISION)
2007 op = BINARY_TRUE_DIVIDE;
2008 else
2009 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 break;
2011 case PERCENT:
2012 op = BINARY_MODULO;
2013 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002014 case DOUBLESLASH:
2015 op = BINARY_FLOOR_DIVIDE;
2016 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002017 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002019 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002020 op = 255;
2021 }
2022 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002023 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024 }
2025}
2026
2027static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002028com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002029{
2030 int i;
2031 int op;
2032 REQ(n, arith_expr);
2033 com_term(c, CHILD(n, 0));
2034 for (i = 2; i < NCH(n); i += 2) {
2035 com_term(c, CHILD(n, i));
2036 switch (TYPE(CHILD(n, i-1))) {
2037 case PLUS:
2038 op = BINARY_ADD;
2039 break;
2040 case MINUS:
2041 op = BINARY_SUBTRACT;
2042 break;
2043 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002045 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002046 op = 255;
2047 }
2048 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002049 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002050 }
2051}
2052
2053static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002054com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002055{
2056 int i;
2057 int op;
2058 REQ(n, shift_expr);
2059 com_arith_expr(c, CHILD(n, 0));
2060 for (i = 2; i < NCH(n); i += 2) {
2061 com_arith_expr(c, CHILD(n, i));
2062 switch (TYPE(CHILD(n, i-1))) {
2063 case LEFTSHIFT:
2064 op = BINARY_LSHIFT;
2065 break;
2066 case RIGHTSHIFT:
2067 op = BINARY_RSHIFT;
2068 break;
2069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002070 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002071 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002072 op = 255;
2073 }
2074 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002076 }
2077}
2078
2079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002080com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002081{
2082 int i;
2083 int op;
2084 REQ(n, and_expr);
2085 com_shift_expr(c, CHILD(n, 0));
2086 for (i = 2; i < NCH(n); i += 2) {
2087 com_shift_expr(c, CHILD(n, i));
2088 if (TYPE(CHILD(n, i-1)) == AMPER) {
2089 op = BINARY_AND;
2090 }
2091 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002092 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002093 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002094 op = 255;
2095 }
2096 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002097 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002098 }
2099}
2100
2101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002102com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002103{
2104 int i;
2105 int op;
2106 REQ(n, xor_expr);
2107 com_and_expr(c, CHILD(n, 0));
2108 for (i = 2; i < NCH(n); i += 2) {
2109 com_and_expr(c, CHILD(n, i));
2110 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2111 op = BINARY_XOR;
2112 }
2113 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002115 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002116 op = 255;
2117 }
2118 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002119 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120 }
2121}
2122
2123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002124com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125{
2126 int i;
2127 int op;
2128 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002129 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002130 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002131 com_xor_expr(c, CHILD(n, i));
2132 if (TYPE(CHILD(n, i-1)) == VBAR) {
2133 op = BINARY_OR;
2134 }
2135 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002136 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002137 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002138 op = 255;
2139 }
2140 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002141 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142 }
2143}
2144
2145static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002146cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147{
2148 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002149 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2151 if (NCH(n) == 1) {
2152 n = CHILD(n, 0);
2153 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002154 case LESS: return PyCmp_LT;
2155 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002156 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002157 case EQUAL: return PyCmp_EQ;
2158 case LESSEQUAL: return PyCmp_LE;
2159 case GREATEREQUAL: return PyCmp_GE;
2160 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2161 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2162 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002163 }
2164 }
2165 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002168 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002170 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171 }
2172 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002173 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174}
2175
2176static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002177com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178{
2179 int i;
2180 enum cmp_op op;
2181 int anchor;
2182 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2183 com_expr(c, CHILD(n, 0));
2184 if (NCH(n) == 1)
2185 return;
2186
2187 /****************************************************************
2188 The following code is generated for all but the last
2189 comparison in a chain:
2190
2191 label: on stack: opcode: jump to:
2192
2193 a <code to load b>
2194 a, b DUP_TOP
2195 a, b, b ROT_THREE
2196 b, a, b COMPARE_OP
2197 b, 0-or-1 JUMP_IF_FALSE L1
2198 b, 1 POP_TOP
2199 b
2200
2201 We are now ready to repeat this sequence for the next
2202 comparison in the chain.
2203
2204 For the last we generate:
2205
2206 b <code to load c>
2207 b, c COMPARE_OP
2208 0-or-1
2209
2210 If there were any jumps to L1 (i.e., there was more than one
2211 comparison), we generate:
2212
2213 0-or-1 JUMP_FORWARD L2
2214 L1: b, 0 ROT_TWO
2215 0, b POP_TOP
2216 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002217 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 ****************************************************************/
2219
2220 anchor = 0;
2221
2222 for (i = 2; i < NCH(n); i += 2) {
2223 com_expr(c, CHILD(n, i));
2224 if (i+2 < NCH(n)) {
2225 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002226 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 com_addbyte(c, ROT_THREE);
2228 }
2229 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002230 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002231 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002232 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 }
2234 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002235 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002236 if (i+2 < NCH(n)) {
2237 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2238 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002239 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002240 }
2241 }
2242
2243 if (anchor) {
2244 int anchor2 = 0;
2245 com_addfwref(c, JUMP_FORWARD, &anchor2);
2246 com_backpatch(c, anchor);
2247 com_addbyte(c, ROT_TWO);
2248 com_addbyte(c, POP_TOP);
2249 com_backpatch(c, anchor2);
2250 }
2251}
2252
2253static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002254com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002255{
2256 REQ(n, not_test); /* 'not' not_test | comparison */
2257 if (NCH(n) == 1) {
2258 com_comparison(c, CHILD(n, 0));
2259 }
2260 else {
2261 com_not_test(c, CHILD(n, 1));
2262 com_addbyte(c, UNARY_NOT);
2263 }
2264}
2265
2266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268{
2269 int i;
2270 int anchor;
2271 REQ(n, and_test); /* not_test ('and' not_test)* */
2272 anchor = 0;
2273 i = 0;
2274 for (;;) {
2275 com_not_test(c, CHILD(n, i));
2276 if ((i += 2) >= NCH(n))
2277 break;
2278 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2279 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002280 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 }
2282 if (anchor)
2283 com_backpatch(c, anchor);
2284}
2285
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002286static int
2287com_make_closure(struct compiling *c, PyCodeObject *co)
2288{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002289 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002290 if (free == 0)
2291 return 0;
2292 for (i = 0; i < free; ++i) {
2293 /* Bypass com_addop_varname because it will generate
2294 LOAD_DEREF but LOAD_CLOSURE is needed.
2295 */
2296 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2297 int arg, reftype;
2298
2299 /* Special case: If a class contains a method with a
2300 free variable that has the same name as a method,
2301 the name will be considered free *and* local in the
2302 class. It should be handled by the closure, as
2303 well as by the normal name loookup logic.
2304 */
2305 reftype = get_ref_type(c, PyString_AS_STRING(name));
2306 if (reftype == CELL)
2307 arg = com_lookup_arg(c->c_cellvars, name);
2308 else /* (reftype == FREE) */
2309 arg = com_lookup_arg(c->c_freevars, name);
2310 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002311 fprintf(stderr, "lookup %s in %s %d %d\n"
2312 "freevars of %s: %s\n",
2313 PyObject_REPR(name),
2314 c->c_name,
2315 reftype, arg,
2316 PyString_AS_STRING(co->co_name),
2317 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002318 Py_FatalError("com_make_closure()");
2319 }
2320 com_addoparg(c, LOAD_CLOSURE, arg);
2321
2322 }
2323 com_push(c, free);
2324 return 1;
2325}
2326
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002327static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002328com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002330 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002331 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002332 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002333 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002334 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002335 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2336 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002337 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002338 if (co == NULL) {
2339 c->c_errors++;
2340 return;
2341 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002342 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002343 i = com_addconst(c, (PyObject *)co);
2344 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002345 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002347 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002348 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002349 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002350 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002351 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002352 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002355 else {
2356 int anchor = 0;
2357 int i = 0;
2358 for (;;) {
2359 com_and_test(c, CHILD(n, i));
2360 if ((i += 2) >= NCH(n))
2361 break;
2362 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2363 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002364 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002365 }
2366 if (anchor)
2367 com_backpatch(c, anchor);
2368 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369}
2370
2371static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002372com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373{
2374 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002375 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 com_node(c, CHILD(n, 0));
2377 }
2378 else {
2379 int i;
2380 int len;
2381 len = (NCH(n) + 1) / 2;
2382 for (i = 0; i < NCH(n); i += 2)
2383 com_node(c, CHILD(n, i));
2384 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 }
2387}
2388
2389
2390/* Begin of assignment compilation */
2391
Thomas Wouters434d0822000-08-24 20:11:32 +00002392
2393static void
2394com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2395{
2396 com_addbyte(c, DUP_TOP);
2397 com_push(c, 1);
2398 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002399 com_node(c, augn);
2400 com_addbyte(c, opcode);
2401 com_pop(c, 1);
2402 com_addbyte(c, ROT_TWO);
2403 com_addopname(c, STORE_ATTR, n);
2404 com_pop(c, 2);
2405}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406
2407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409{
2410 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002411 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412}
2413
2414static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002415com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 REQ(n, trailer);
2418 switch (TYPE(CHILD(n, 0))) {
2419 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002420 if (assigning == OP_DELETE)
2421 com_error(c, PyExc_SyntaxError,
2422 "can't delete function call");
2423 else
2424 com_error(c, PyExc_SyntaxError,
2425 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 break;
2427 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002428 if (assigning > OP_APPLY)
2429 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2430 else
2431 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002432 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002433 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002434 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002435 break;
2436 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002437 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002438 }
2439}
2440
2441static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002442com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443{
2444 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002445 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002446 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 if (assigning) {
2448 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002449 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002450 com_push(c, i-1);
2451 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002452 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002453 com_assign(c, CHILD(n, i), assigning, NULL);
2454}
2455
2456static void
2457com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2458{
2459 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002460 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002461 com_push(c, 1);
2462 com_node(c, augn);
2463 com_addbyte(c, opcode);
2464 com_pop(c, 1);
2465 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466}
2467
2468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470{
2471 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002472 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002473 if (assigning)
2474 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475}
2476
2477static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002478com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479{
2480 /* Loop to avoid trivial recursion */
2481 for (;;) {
2482 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002483
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484 case exprlist:
2485 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002486 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002488 if (assigning > OP_APPLY) {
2489 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002490 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002491 return;
2492 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002493 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 return;
2495 }
2496 n = CHILD(n, 0);
2497 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002498
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 case test:
2500 case and_test:
2501 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002502 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002503 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002504 case xor_expr:
2505 case and_expr:
2506 case shift_expr:
2507 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002508 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002509 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002510 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002511 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002512 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 return;
2514 }
2515 n = CHILD(n, 0);
2516 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002517
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002518 case power: /* atom trailer* ('**' power)*
2519 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002520 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002521 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002522 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002523 return;
2524 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002525 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002526 int i;
2527 com_node(c, CHILD(n, 0));
2528 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002529 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002530 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002531 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002532 return;
2533 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 com_apply_trailer(c, CHILD(n, i));
2535 } /* NB i is still alive */
2536 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002537 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002538 return;
2539 }
2540 n = CHILD(n, 0);
2541 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002542
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543 case atom:
2544 switch (TYPE(CHILD(n, 0))) {
2545 case LPAR:
2546 n = CHILD(n, 1);
2547 if (TYPE(n) == RPAR) {
2548 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002550 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 return;
2552 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002553 if (assigning > OP_APPLY) {
2554 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002555 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002556 return;
2557 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 break;
2559 case LSQB:
2560 n = CHILD(n, 1);
2561 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002562 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002563 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 return;
2565 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002566 if (assigning > OP_APPLY) {
2567 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002568 "augmented assign to list not possible");
2569 return;
2570 }
2571 if (NCH(n) > 1
2572 && TYPE(CHILD(n, 1)) == list_for) {
2573 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002574 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002575 return;
2576 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002577 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 return;
2579 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002580 if (assigning > OP_APPLY)
2581 com_augassign_name(c, CHILD(n, 0),
2582 assigning, augn);
2583 else
2584 com_assign_name(c, CHILD(n, 0),
2585 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002586 return;
2587 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002588 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002589 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 return;
2591 }
2592 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002593
2594 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002595 com_error(c, PyExc_SyntaxError,
2596 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002597 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002598
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002600 com_error(c, PyExc_SystemError,
2601 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002603
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 }
2605 }
2606}
Guido van Rossum7c531111997-03-11 18:42:21 +00002607
Thomas Wouters434d0822000-08-24 20:11:32 +00002608static void
2609com_augassign(struct compiling *c, node *n)
2610{
2611 int opcode;
2612
2613 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2614 case '+': opcode = INPLACE_ADD; break;
2615 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002616 case '/':
2617 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2618 opcode = INPLACE_FLOOR_DIVIDE;
2619 else if (c->c_flags & CO_FUTURE_DIVISION)
2620 opcode = INPLACE_TRUE_DIVIDE;
2621 else
2622 opcode = INPLACE_DIVIDE;
2623 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002624 case '%': opcode = INPLACE_MODULO; break;
2625 case '<': opcode = INPLACE_LSHIFT; break;
2626 case '>': opcode = INPLACE_RSHIFT; break;
2627 case '&': opcode = INPLACE_AND; break;
2628 case '^': opcode = INPLACE_XOR; break;
2629 case '|': opcode = INPLACE_OR; break;
2630 case '*':
2631 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2632 opcode = INPLACE_POWER;
2633 else
2634 opcode = INPLACE_MULTIPLY;
2635 break;
2636 default:
2637 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2638 return;
2639 }
2640 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2641}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642
2643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002644com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002645{
Thomas Wouters434d0822000-08-24 20:11:32 +00002646 REQ(n, expr_stmt);
2647 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002649 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002650 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002651 if (NCH(n) == 1) {
2652 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002653 if (c->c_interactive)
2654 com_addbyte(c, PRINT_EXPR);
2655 else
2656 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002658 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002659 else if (TYPE(CHILD(n,1)) == augassign)
2660 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 else {
2662 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002663 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002664 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002665 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_push(c, 1);
2668 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002669 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 }
2671 }
2672}
2673
2674static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002675com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002676{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002677 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002678 int i;
2679 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002680 if (Py_OptimizeFlag)
2681 return;
2682 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002683
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002684 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002685 raise AssertionError [, <message>]
2686
2687 where <message> is the second test, if present.
2688 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002689 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002690 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002691 com_addbyte(c, POP_TOP);
2692 com_pop(c, 1);
2693 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002694 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002695 com_push(c, 1);
2696 i = NCH(n)/2; /* Either 2 or 4 */
2697 if (i > 1)
2698 com_node(c, CHILD(n, 3));
2699 com_addoparg(c, RAISE_VARARGS, i);
2700 com_pop(c, i);
2701 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002702 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002703 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002704 com_addbyte(c, POP_TOP);
2705}
2706
2707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002708com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002710 int i = 1;
2711 node* stream = NULL;
2712
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002713 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002714
2715 /* are we using the extended print form? */
2716 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2717 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002718 com_node(c, stream);
2719 /* stack: [...] => [... stream] */
2720 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002721 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2722 i = 4;
2723 else
2724 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002725 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002726 for (; i < NCH(n); i += 2) {
2727 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002728 com_addbyte(c, DUP_TOP);
2729 /* stack: [stream] => [stream stream] */
2730 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002731 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002732 /* stack: [stream stream] => [stream stream obj] */
2733 com_addbyte(c, ROT_TWO);
2734 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002735 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002736 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002737 com_pop(c, 2);
2738 }
2739 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002740 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002741 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002742 com_addbyte(c, PRINT_ITEM);
2743 com_pop(c, 1);
2744 }
2745 }
2746 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002747 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002748 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002749 /* must pop the extra stream object off the stack */
2750 com_addbyte(c, POP_TOP);
2751 /* stack: [... stream] => [...] */
2752 com_pop(c, 1);
2753 }
2754 }
2755 else {
2756 if (stream != NULL) {
2757 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002758 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002759 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002760 com_pop(c, 1);
2761 }
2762 else
2763 com_addbyte(c, PRINT_NEWLINE);
2764 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002765}
2766
2767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002768com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002770 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002771 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002773 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002774 if (c->c_flags & CO_GENERATOR) {
2775 if (NCH(n) > 1) {
2776 com_error(c, PyExc_SyntaxError,
2777 "'return' with argument inside generator");
2778 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002779 }
2780 if (NCH(n) < 2) {
2781 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002782 com_push(c, 1);
2783 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002784 else
2785 com_node(c, CHILD(n, 1));
2786 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002787 com_pop(c, 1);
2788}
2789
2790static void
2791com_yield_stmt(struct compiling *c, node *n)
2792{
Tim Peters95c80f82001-06-23 02:07:08 +00002793 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002794 REQ(n, yield_stmt); /* 'yield' testlist */
2795 if (!c->c_infunction) {
2796 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2797 }
Tim Peters95c80f82001-06-23 02:07:08 +00002798
2799 for (i = 0; i < c->c_nblocks; ++i) {
2800 if (c->c_block[i] == SETUP_FINALLY) {
2801 com_error(c, PyExc_SyntaxError,
2802 "'yield' not allowed in a 'try' block "
2803 "with a 'finally' clause");
2804 return;
2805 }
2806 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002807 com_node(c, CHILD(n, 1));
2808 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002809 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002810}
2811
2812static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002813com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002814{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002815 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002816 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2817 if (NCH(n) > 1) {
2818 com_node(c, CHILD(n, 1));
2819 if (NCH(n) > 3) {
2820 com_node(c, CHILD(n, 3));
2821 if (NCH(n) > 5)
2822 com_node(c, CHILD(n, 5));
2823 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002824 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002825 i = NCH(n)/2;
2826 com_addoparg(c, RAISE_VARARGS, i);
2827 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002828}
2829
2830static void
Thomas Wouters52152252000-08-17 22:55:00 +00002831com_from_import(struct compiling *c, node *n)
2832{
2833 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2834 com_push(c, 1);
2835 if (NCH(n) > 1) {
2836 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2837 com_error(c, PyExc_SyntaxError, "invalid syntax");
2838 return;
2839 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002840 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002841 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002842 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002843 com_pop(c, 1);
2844}
2845
2846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002847com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848{
2849 int i;
2850 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002851 /* 'import' dotted_name (',' dotted_name)* |
2852 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002854 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002855 /* 'from' dotted_name 'import' ... */
2856 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002857
2858 if (TYPE(CHILD(n, 3)) == STAR) {
2859 tup = Py_BuildValue("(s)", "*");
2860 } else {
2861 tup = PyTuple_New((NCH(n) - 2)/2);
2862 for (i = 3; i < NCH(n); i += 2) {
2863 PyTuple_SET_ITEM(tup, (i-3)/2,
2864 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002865 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002866 }
2867 }
2868 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002869 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002871 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002872 if (TYPE(CHILD(n, 3)) == STAR)
2873 com_addbyte(c, IMPORT_STAR);
2874 else {
2875 for (i = 3; i < NCH(n); i += 2)
2876 com_from_import(c, CHILD(n, i));
2877 com_addbyte(c, POP_TOP);
2878 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002879 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 }
2881 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002882 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002883 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002884 node *subn = CHILD(n, i);
2885 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002886 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002888 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002889 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002890 int j;
2891 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002892 com_error(c, PyExc_SyntaxError,
2893 "invalid syntax");
2894 return;
2895 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002896 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2897 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002898 CHILD(CHILD(subn, 0),
2899 j));
2900 com_addop_varname(c, VAR_STORE,
2901 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002902 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002903 com_addop_varname(c, VAR_STORE,
2904 STR(CHILD(CHILD(subn, 0),
2905 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002906 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002907 }
2908 }
2909}
2910
2911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002912com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002913{
2914 REQ(n, exec_stmt);
2915 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2916 com_node(c, CHILD(n, 1));
2917 if (NCH(n) >= 4)
2918 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002919 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002920 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 com_push(c, 1);
2922 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002923 if (NCH(n) >= 6)
2924 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002926 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002927 com_push(c, 1);
2928 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002929 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002930 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002931}
2932
Guido van Rossum7c531111997-03-11 18:42:21 +00002933static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002934is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002935{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002936 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002937 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002938 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002939
2940 /* Label to avoid tail recursion */
2941 next:
2942 switch (TYPE(n)) {
2943
2944 case suite:
2945 if (NCH(n) == 1) {
2946 n = CHILD(n, 0);
2947 goto next;
2948 }
2949 /* Fall through */
2950 case file_input:
2951 for (i = 0; i < NCH(n); i++) {
2952 node *ch = CHILD(n, i);
2953 if (TYPE(ch) == stmt) {
2954 n = ch;
2955 goto next;
2956 }
2957 }
2958 break;
2959
2960 case stmt:
2961 case simple_stmt:
2962 case small_stmt:
2963 n = CHILD(n, 0);
2964 goto next;
2965
2966 case expr_stmt:
2967 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002968 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00002969 case test:
2970 case and_test:
2971 case not_test:
2972 case comparison:
2973 case expr:
2974 case xor_expr:
2975 case and_expr:
2976 case shift_expr:
2977 case arith_expr:
2978 case term:
2979 case factor:
2980 case power:
2981 case atom:
2982 if (NCH(n) == 1) {
2983 n = CHILD(n, 0);
2984 goto next;
2985 }
2986 break;
2987
2988 case NAME:
2989 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2990 return 1;
2991 break;
2992
2993 case NUMBER:
2994 v = parsenumber(c, STR(n));
2995 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002997 break;
2998 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002999 i = PyObject_IsTrue(v);
3000 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003001 return i == 0;
3002
3003 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003004 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003005 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003006 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003007 break;
3008 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003009 i = PyObject_IsTrue(v);
3010 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003011 return i == 0;
3012
3013 }
3014 return 0;
3015}
3016
Tim Peters08a898f2001-06-28 01:52:22 +00003017
3018/* Look under n for a return stmt with an expression.
3019 * This hack is used to find illegal returns under "if 0:" blocks in
3020 * functions already known to be generators (as determined by the symtable
3021 * pass).
3022 * Return the offending return node if found, else NULL.
3023 */
3024static node *
3025look_for_offending_return(node *n)
3026{
3027 int i;
3028
3029 for (i = 0; i < NCH(n); ++i) {
3030 node *kid = CHILD(n, i);
3031
3032 switch (TYPE(kid)) {
3033 case classdef:
3034 case funcdef:
3035 case lambdef:
3036 /* Stuff in nested functions & classes doesn't
3037 affect the code block we started in. */
3038 return NULL;
3039
3040 case return_stmt:
3041 if (NCH(kid) > 1)
3042 return kid;
3043 break;
3044
3045 default: {
3046 node *bad = look_for_offending_return(kid);
3047 if (bad != NULL)
3048 return bad;
3049 }
3050 }
3051 }
3052
3053 return NULL;
3054}
3055
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003057com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058{
3059 int i;
3060 int anchor = 0;
3061 REQ(n, if_stmt);
3062 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3063 for (i = 0; i+3 < NCH(n); i+=4) {
3064 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003065 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003066 if (is_constant_false(c, ch)) {
3067 /* We're going to skip this block. However, if this
3068 is a generator, we have to check the dead code
3069 anyway to make sure there aren't any return stmts
3070 with expressions, in the same scope. */
3071 if (c->c_flags & CO_GENERATOR) {
3072 node *p = look_for_offending_return(n);
3073 if (p != NULL) {
3074 int savelineno = c->c_lineno;
3075 c->c_lineno = p->n_lineno;
3076 com_error(c, PyExc_SyntaxError,
3077 "'return' with argument "
3078 "inside generator");
3079 c->c_lineno = savelineno;
3080 }
3081 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003082 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003084 if (i > 0)
3085 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003086 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 com_addfwref(c, JUMP_IF_FALSE, &a);
3088 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003089 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090 com_node(c, CHILD(n, i+3));
3091 com_addfwref(c, JUMP_FORWARD, &anchor);
3092 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003093 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 com_addbyte(c, POP_TOP);
3095 }
3096 if (i+2 < NCH(n))
3097 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003098 if (anchor)
3099 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100}
3101
3102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003103com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104{
3105 int break_anchor = 0;
3106 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003107 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3109 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003110 block_push(c, SETUP_LOOP);
3111 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003112 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113 com_node(c, CHILD(n, 1));
3114 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3115 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003117 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003119 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003120 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3121 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003123 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 com_addbyte(c, POP_TOP);
3125 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003126 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127 if (NCH(n) > 4)
3128 com_node(c, CHILD(n, 6));
3129 com_backpatch(c, break_anchor);
3130}
3131
3132static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003133com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 int break_anchor = 0;
3136 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003137 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 REQ(n, for_stmt);
3139 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3140 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003141 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003143 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003144 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003145 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003146 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003148 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003149 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003151 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003152 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3153 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003155 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003157 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158 if (NCH(n) > 8)
3159 com_node(c, CHILD(n, 8));
3160 com_backpatch(c, break_anchor);
3161}
3162
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003163/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003164
3165 SETUP_FINALLY L
3166 <code for S>
3167 POP_BLOCK
3168 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003169 L: <code for Sf>
3170 END_FINALLY
3171
3172 The special instructions use the block stack. Each block
3173 stack entry contains the instruction that created it (here
3174 SETUP_FINALLY), the level of the value stack at the time the
3175 block stack entry was created, and a label (here L).
3176
3177 SETUP_FINALLY:
3178 Pushes the current value stack level and the label
3179 onto the block stack.
3180 POP_BLOCK:
3181 Pops en entry from the block stack, and pops the value
3182 stack until its level is the same as indicated on the
3183 block stack. (The label is ignored.)
3184 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003185 Pops a variable number of entries from the *value* stack
3186 and re-raises the exception they specify. The number of
3187 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003188
3189 The block stack is unwound when an exception is raised:
3190 when a SETUP_FINALLY entry is found, the exception is pushed
3191 onto the value stack (and the exception condition is cleared),
3192 and the interpreter jumps to the label gotten from the block
3193 stack.
3194
3195 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003196 (The contents of the value stack is shown in [], with the top
3197 at the right; 'tb' is trace-back info, 'val' the exception's
3198 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003199
3200 Value stack Label Instruction Argument
3201 [] SETUP_EXCEPT L1
3202 [] <code for S>
3203 [] POP_BLOCK
3204 [] JUMP_FORWARD L0
3205
Guido van Rossum3f5da241990-12-20 15:06:42 +00003206 [tb, val, exc] L1: DUP )
3207 [tb, val, exc, exc] <evaluate E1> )
3208 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3209 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3210 [tb, val, exc, 1] POP )
3211 [tb, val, exc] POP
3212 [tb, val] <assign to V1> (or POP if no V1)
3213 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003214 [] <code for S1>
3215 JUMP_FORWARD L0
3216
Guido van Rossum3f5da241990-12-20 15:06:42 +00003217 [tb, val, exc, 0] L2: POP
3218 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003219 .............................etc.......................
3220
Guido van Rossum3f5da241990-12-20 15:06:42 +00003221 [tb, val, exc, 0] Ln+1: POP
3222 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003223
3224 [] L0: <next statement>
3225
3226 Of course, parts are not generated if Vi or Ei is not present.
3227*/
3228
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003230com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003231{
3232 int except_anchor = 0;
3233 int end_anchor = 0;
3234 int else_anchor = 0;
3235 int i;
3236 node *ch;
3237
3238 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3239 block_push(c, SETUP_EXCEPT);
3240 com_node(c, CHILD(n, 2));
3241 com_addbyte(c, POP_BLOCK);
3242 block_pop(c, SETUP_EXCEPT);
3243 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3244 com_backpatch(c, except_anchor);
3245 for (i = 3;
3246 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3247 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003248 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003249 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003250 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003251 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003252 break;
3253 }
3254 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003255 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003256 com_addoparg(c, SET_LINENO, ch->n_lineno);
3257 if (NCH(ch) > 1) {
3258 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003259 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003260 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003261 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3264 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003266 }
3267 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003268 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003269 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003270 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003271 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003272 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
3274 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003276 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003277 com_node(c, CHILD(n, i+2));
3278 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3279 if (except_anchor) {
3280 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 /* We come in with [tb, val, exc, 0] on the
3282 stack; one pop and it's the same as
3283 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003284 com_addbyte(c, POP_TOP);
3285 }
3286 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 /* We actually come in here with [tb, val, exc] but the
3288 END_FINALLY will zap those and jump around.
3289 The c_stacklevel does not reflect them so we need not pop
3290 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003291 com_addbyte(c, END_FINALLY);
3292 com_backpatch(c, else_anchor);
3293 if (i < NCH(n))
3294 com_node(c, CHILD(n, i+2));
3295 com_backpatch(c, end_anchor);
3296}
3297
3298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003299com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300{
3301 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003302 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003303
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003304 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3305 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003307 com_addbyte(c, POP_BLOCK);
3308 block_pop(c, SETUP_FINALLY);
3309 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003310 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 /* While the generated code pushes only one item,
3312 the try-finally handling can enter here with
3313 up to three items. OK, here are the details:
3314 3 for an exception, 2 for RETURN, 1 for BREAK. */
3315 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003316 com_backpatch(c, finally_anchor);
3317 ch = CHILD(n, NCH(n)-1);
3318 com_addoparg(c, SET_LINENO, ch->n_lineno);
3319 com_node(c, ch);
3320 com_addbyte(c, END_FINALLY);
3321 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003322 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003323}
3324
3325static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003326com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003327{
3328 REQ(n, try_stmt);
3329 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3330 | 'try' ':' suite 'finally' ':' suite */
3331 if (TYPE(CHILD(n, 3)) != except_clause)
3332 com_try_finally(c, n);
3333 else
3334 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335}
3336
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003338get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003339{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003340 int i;
3341
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 /* Label to avoid tail recursion */
3343 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003344 switch (TYPE(n)) {
3345
3346 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003347 if (NCH(n) == 1) {
3348 n = CHILD(n, 0);
3349 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003350 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003351 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003352 case file_input:
3353 for (i = 0; i < NCH(n); i++) {
3354 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003355 if (TYPE(ch) == stmt) {
3356 n = ch;
3357 goto next;
3358 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003359 }
3360 break;
3361
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003362 case stmt:
3363 case simple_stmt:
3364 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003365 n = CHILD(n, 0);
3366 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003367
3368 case expr_stmt:
3369 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003370 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003371 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 Rossum2d3b9862002-05-24 15:47:06 +00003719 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003720 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003721 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722 break;
3723 case test:
3724 com_test(c, n);
3725 break;
3726 case and_test:
3727 com_and_test(c, n);
3728 break;
3729 case not_test:
3730 com_not_test(c, n);
3731 break;
3732 case comparison:
3733 com_comparison(c, n);
3734 break;
3735 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003736 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003737 break;
3738 case expr:
3739 com_expr(c, n);
3740 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003741 case xor_expr:
3742 com_xor_expr(c, n);
3743 break;
3744 case and_expr:
3745 com_and_expr(c, n);
3746 break;
3747 case shift_expr:
3748 com_shift_expr(c, n);
3749 break;
3750 case arith_expr:
3751 com_arith_expr(c, n);
3752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 case term:
3754 com_term(c, n);
3755 break;
3756 case factor:
3757 com_factor(c, n);
3758 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003759 case power:
3760 com_power(c, n);
3761 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 case atom:
3763 com_atom(c, n);
3764 break;
3765
3766 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003767 com_error(c, PyExc_SystemError,
3768 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769 }
3770}
3771
Tim Petersdbd9ba62000-07-09 03:09:57 +00003772static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773
3774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003775com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003776{
3777 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3778 if (TYPE(CHILD(n, 0)) == LPAR)
3779 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003780 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003781 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003782 com_pop(c, 1);
3783 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003784}
3785
3786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003787com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003789 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 if (NCH(n) == 1) {
3791 com_fpdef(c, CHILD(n, 0));
3792 }
3793 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003795 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 for (i = 0; i < NCH(n); i += 2)
3798 com_fpdef(c, CHILD(n, i));
3799 }
3800}
3801
3802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003803com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003804{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003805 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003806 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003807 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003808 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003809 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003810 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003811 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003812 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003813 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003814 node *ch = CHILD(n, i);
3815 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003816 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003817 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003818 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3819 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003820 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003821 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003822 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003823 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003824 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003825 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003826 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003827 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003828 ch = CHILD(n, i);
3829 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003830 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003831 else
3832 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003833 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003834 if (complex) {
3835 /* Generate code for complex arguments only after
3836 having counted the simple arguments */
3837 int ilocal = 0;
3838 for (i = 0; i < nch; i++) {
3839 node *ch = CHILD(n, i);
3840 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003841 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003842 break;
3843 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3844 fp = CHILD(ch, 0);
3845 if (TYPE(fp) != NAME) {
3846 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003847 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003848 com_fpdef(c, ch);
3849 }
3850 ilocal++;
3851 if (++i >= nch)
3852 break;
3853 ch = CHILD(n, i);
3854 if (TYPE(ch) == EQUAL)
3855 i += 2;
3856 else
3857 REQ(ch, COMMA);
3858 }
3859 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003860}
3861
3862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003863com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864{
3865 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003866 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003867 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003868 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003869 if (doc != NULL) {
3870 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003872 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003873 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003874 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003875 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003876 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 for (i = 0; i < NCH(n); i++) {
3878 node *ch = CHILD(n, i);
3879 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3880 com_node(c, ch);
3881 }
3882}
3883
3884/* Top-level compile-node interface */
3885
3886static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003887compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003888{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003889 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 node *ch;
3891 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003892 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003893 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003894 if (doc != NULL) {
3895 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003896 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003897 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003898 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003899 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003900 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3901 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003902 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003903 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003904 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003906 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003907 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3908 com_push(c, 1);
3909 com_addbyte(c, RETURN_VALUE);
3910 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003911}
3912
3913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003914compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003915{
Guido van Rossum590baa41993-11-30 13:40:46 +00003916 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003917 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003918 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003919
3920 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003921 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003922 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003923 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003924 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003925 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003926 else
3927 ch = CHILD(n, 2);
3928 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003929 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003930 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003931}
3932
3933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003934compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003935{
3936 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003937 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003938 REQ(n, classdef);
3939 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3940 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003941 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00003942 /* Initialize local __module__ from global __name__ */
3943 com_addop_name(c, LOAD_GLOBAL, "__name__");
3944 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003945 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003946 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003947 if (doc != NULL) {
3948 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003949 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003950 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003951 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003952 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003953 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003954 }
3955 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003956 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003957 com_node(c, ch);
3958 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003959 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003960 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003961 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003962}
3963
3964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003965compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003967 com_addoparg(c, SET_LINENO, n->n_lineno);
3968
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 switch (TYPE(n)) {
3970
Guido van Rossum4c417781991-01-21 16:09:22 +00003971 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003973 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974 n = CHILD(n, 0);
3975 if (TYPE(n) != NEWLINE)
3976 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003977 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003978 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003979 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003980 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003981 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982 break;
3983
Guido van Rossum4c417781991-01-21 16:09:22 +00003984 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003986 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003987 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003988 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003989 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990 break;
3991
Guido van Rossum590baa41993-11-30 13:40:46 +00003992 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003993 com_node(c, CHILD(n, 0));
3994 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003996 break;
3997
Guido van Rossum590baa41993-11-30 13:40:46 +00003998 case lambdef: /* anonymous function definition */
3999 compile_lambdef(c, n);
4000 break;
4001
Guido van Rossum4c417781991-01-21 16:09:22 +00004002 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004003 compile_funcdef(c, n);
4004 break;
4005
Guido van Rossum4c417781991-01-21 16:09:22 +00004006 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004007 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004008 break;
4009
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004010 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004011 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004012 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004013 }
4014}
4015
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004016static PyObject *
4017dict_keys_inorder(PyObject *dict, int offset)
4018{
4019 PyObject *tuple, *k, *v;
4020 int i, pos = 0, size = PyDict_Size(dict);
4021
4022 tuple = PyTuple_New(size);
4023 if (tuple == NULL)
4024 return NULL;
4025 while (PyDict_Next(dict, &pos, &k, &v)) {
4026 i = PyInt_AS_LONG(v);
4027 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004028 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004029 PyTuple_SET_ITEM(tuple, i - offset, k);
4030 }
4031 return tuple;
4032}
4033
Guido van Rossum79f25d91997-04-29 20:08:16 +00004034PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004035PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004036{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004037 return PyNode_CompileFlags(n, filename, NULL);
4038}
4039
4040PyCodeObject *
4041PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4042{
4043 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004044}
4045
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004046struct symtable *
4047PyNode_CompileSymtable(node *n, char *filename)
4048{
4049 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004050 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004051
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004052 ff = PyNode_Future(n, filename);
4053 if (ff == NULL)
4054 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004055
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004056 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004057 if (st == NULL) {
4058 PyMem_Free((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004059 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004060 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004061 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004062 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004063 if (st->st_errors > 0)
4064 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004065 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004066 if (st->st_errors > 0)
4067 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004068
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004069 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004070 fail:
4071 PyMem_Free((void *)ff);
4072 st->st_future = NULL;
4073 PySymtable_Free(st);
4074 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004075}
4076
Guido van Rossum79f25d91997-04-29 20:08:16 +00004077static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004078icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004079{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004080 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004081}
4082
Guido van Rossum79f25d91997-04-29 20:08:16 +00004083static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004084jcompile(node *n, char *filename, struct compiling *base,
4085 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004086{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004088 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004089 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004090 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004091 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004092 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004093 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004094 /* c_symtable still points to parent's symbols */
4095 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004096 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004097 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004098 sc.c_flags |= base->c_flags & PyCF_MASK;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004099 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004100 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004101 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004102 if (sc.c_future == NULL) {
4103 com_free(&sc);
4104 return NULL;
4105 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004106 if (flags) {
4107 int merged = sc.c_future->ff_features |
4108 flags->cf_flags;
4109 sc.c_future->ff_features = merged;
4110 flags->cf_flags = merged;
4111 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004112 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004113 com_free(&sc);
4114 return NULL;
4115 }
4116 }
4117 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004118 if (symtable_load_symbols(&sc) < 0) {
4119 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004120 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004121 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004122 compile_node(&sc, n);
4123 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004124 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004125 PyObject *consts, *names, *varnames, *filename, *name,
4126 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004127 consts = PyList_AsTuple(sc.c_consts);
4128 names = PyList_AsTuple(sc.c_names);
4129 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004130 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4131 freevars = dict_keys_inorder(sc.c_freevars,
4132 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004133 filename = PyString_InternFromString(sc.c_filename);
4134 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004135 if (!PyErr_Occurred())
4136 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004137 sc.c_nlocals,
4138 sc.c_maxstacklevel,
4139 sc.c_flags,
4140 sc.c_code,
4141 consts,
4142 names,
4143 varnames,
4144 freevars,
4145 cellvars,
4146 filename,
4147 name,
4148 sc.c_firstlineno,
4149 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004150 Py_XDECREF(consts);
4151 Py_XDECREF(names);
4152 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004153 Py_XDECREF(freevars);
4154 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004155 Py_XDECREF(filename);
4156 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004157 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004158 else if (!PyErr_Occurred()) {
4159 /* This could happen if someone called PyErr_Clear() after an
4160 error was reported above. That's not supposed to happen,
4161 but I just plugged one case and I'm not sure there can't be
4162 others. In that case, raise SystemError so that at least
4163 it gets reported instead dumping core. */
4164 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4165 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004166 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004167 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004168 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004169 sc.c_symtable = NULL;
4170 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172 return co;
4173}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004174
4175int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004176PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004177{
4178 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004179 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004180 int line = co->co_firstlineno;
4181 int addr = 0;
4182 while (--size >= 0) {
4183 addr += *p++;
4184 if (addr > addrq)
4185 break;
4186 line += *p++;
4187 }
4188 return line;
4189}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004190
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004191/* The test for LOCAL must come before the test for FREE in order to
4192 handle classes where name is both local and free. The local var is
4193 a method and the free var is a free var referenced within a method.
4194*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004195
4196static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004197get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004198{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004199 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004200 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004201
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004202 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4203 return CELL;
4204 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4205 return LOCAL;
4206 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4207 return FREE;
4208 v = PyDict_GetItemString(c->c_globals, name);
4209 if (v) {
4210 if (v == Py_None)
4211 return GLOBAL_EXPLICIT;
4212 else {
4213 return GLOBAL_IMPLICIT;
4214 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004216 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004217 "unknown scope for %.100s in %.100s(%s) "
4218 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4219 name, c->c_name,
4220 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4221 c->c_filename,
4222 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4223 PyObject_REPR(c->c_locals),
4224 PyObject_REPR(c->c_globals)
4225 );
4226
4227 Py_FatalError(buf);
4228 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004229}
4230
Guido van Rossum207fda62001-03-02 03:30:41 +00004231/* Helper functions to issue warnings */
4232
4233static int
4234issue_warning(char *msg, char *filename, int lineno)
4235{
4236 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4237 lineno, NULL, NULL) < 0) {
4238 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4239 PyErr_SetString(PyExc_SyntaxError, msg);
4240 PyErr_SyntaxLocation(filename, lineno);
4241 }
4242 return -1;
4243 }
4244 return 0;
4245}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004246
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004247static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004248symtable_warn(struct symtable *st, char *msg)
4249{
Guido van Rossum207fda62001-03-02 03:30:41 +00004250 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004251 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004252 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004253 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004254 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004255}
4256
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004257/* Helper function for setting lineno and filename */
4258
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004259static int
4260symtable_build(struct compiling *c, node *n)
4261{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004262 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004264 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004265 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004266 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4267 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004268 return -1;
4269 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004270 if (c->c_symtable->st_errors > 0)
4271 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004272 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004273 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004274 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004275 return 0;
4276}
4277
4278static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004279symtable_init_compiling_symbols(struct compiling *c)
4280{
4281 PyObject *varnames;
4282
4283 varnames = c->c_symtable->st_cur->ste_varnames;
4284 if (varnames == NULL) {
4285 varnames = PyList_New(0);
4286 if (varnames == NULL)
4287 return -1;
4288 c->c_symtable->st_cur->ste_varnames = varnames;
4289 Py_INCREF(varnames);
4290 } else
4291 Py_INCREF(varnames);
4292 c->c_varnames = varnames;
4293
4294 c->c_globals = PyDict_New();
4295 if (c->c_globals == NULL)
4296 return -1;
4297 c->c_freevars = PyDict_New();
4298 if (c->c_freevars == NULL)
4299 return -1;
4300 c->c_cellvars = PyDict_New();
4301 if (c->c_cellvars == NULL)
4302 return -1;
4303 return 0;
4304}
4305
4306struct symbol_info {
4307 int si_nlocals;
4308 int si_ncells;
4309 int si_nfrees;
4310 int si_nimplicit;
4311};
4312
4313static void
4314symtable_init_info(struct symbol_info *si)
4315{
4316 si->si_nlocals = 0;
4317 si->si_ncells = 0;
4318 si->si_nfrees = 0;
4319 si->si_nimplicit = 0;
4320}
4321
4322static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004323symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004324 struct symbol_info *si)
4325{
4326 PyObject *dict, *v;
4327
4328 /* Seperate logic for DEF_FREE. If it occurs in a function,
4329 it indicates a local that we must allocate storage for (a
4330 cell var). If it occurs in a class, then the class has a
4331 method and a free variable with the same name.
4332 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004333 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004334 /* If it isn't declared locally, it can't be a cell. */
4335 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4336 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004337 v = PyInt_FromLong(si->si_ncells++);
4338 dict = c->c_cellvars;
4339 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004340 /* If it is free anyway, then there is no need to do
4341 anything here.
4342 */
4343 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004344 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004345 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004346 v = PyInt_FromLong(si->si_nfrees++);
4347 dict = c->c_freevars;
4348 }
4349 if (v == NULL)
4350 return -1;
4351 if (PyDict_SetItem(dict, name, v) < 0) {
4352 Py_DECREF(v);
4353 return -1;
4354 }
4355 Py_DECREF(v);
4356 return 0;
4357}
4358
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004359/* If a variable is a cell and an argument, make sure that appears in
4360 co_cellvars before any variable to its right in varnames.
4361*/
4362
4363
4364static int
4365symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4366 PyObject *varnames, int flags)
4367{
4368 PyObject *v, *w, *d, *list = NULL;
4369 int i, pos;
4370
4371 if (flags & CO_VARARGS)
4372 argcount++;
4373 if (flags & CO_VARKEYWORDS)
4374 argcount++;
4375 for (i = argcount; --i >= 0; ) {
4376 v = PyList_GET_ITEM(varnames, i);
4377 if (PyDict_GetItem(*cellvars, v)) {
4378 if (list == NULL) {
4379 list = PyList_New(1);
4380 if (list == NULL)
4381 return -1;
4382 PyList_SET_ITEM(list, 0, v);
4383 Py_INCREF(v);
4384 } else
4385 PyList_Insert(list, 0, v);
4386 }
4387 }
4388 if (list == NULL || PyList_GET_SIZE(list) == 0)
4389 return 0;
4390 /* There are cellvars that are also arguments. Create a dict
4391 to replace cellvars and put the args at the front.
4392 */
4393 d = PyDict_New();
4394 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4395 v = PyInt_FromLong(i);
4396 if (v == NULL)
4397 goto fail;
4398 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4399 goto fail;
4400 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4401 goto fail;
4402 }
4403 pos = 0;
4404 i = PyList_GET_SIZE(list);
4405 Py_DECREF(list);
4406 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4407 w = PyInt_FromLong(i++); /* don't care about the old key */
4408 if (PyDict_SetItem(d, v, w) < 0) {
4409 Py_DECREF(w);
4410 goto fail;
4411 }
4412 Py_DECREF(w);
4413 }
4414 Py_DECREF(*cellvars);
4415 *cellvars = d;
4416 return 1;
4417 fail:
4418 Py_DECREF(d);
4419 return -1;
4420}
4421
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004422static int
4423symtable_freevar_offsets(PyObject *freevars, int offset)
4424{
4425 PyObject *name, *v;
4426 int pos;
4427
4428 /* The cell vars are the first elements of the closure,
4429 followed by the free vars. Update the offsets in
4430 c_freevars to account for number of cellvars. */
4431 pos = 0;
4432 while (PyDict_Next(freevars, &pos, &name, &v)) {
4433 int i = PyInt_AS_LONG(v) + offset;
4434 PyObject *o = PyInt_FromLong(i);
4435 if (o == NULL)
4436 return -1;
4437 if (PyDict_SetItem(freevars, name, o) < 0) {
4438 Py_DECREF(o);
4439 return -1;
4440 }
4441 Py_DECREF(o);
4442 }
4443 return 0;
4444}
4445
4446static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004447symtable_check_unoptimized(struct compiling *c,
4448 PySymtableEntryObject *ste,
4449 struct symbol_info *si)
4450{
4451 char buf[300];
4452
4453 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4454 || (ste->ste_nested && si->si_nimplicit)))
4455 return 0;
4456
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004457#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4458
4459#define ILLEGAL_IS "is a nested function"
4460
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004461#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004462"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004463
4464#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004465"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004466
4467#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004468"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004469"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004470
4471 /* XXX perhaps the linenos for these opt-breaking statements
4472 should be stored so the exception can point to them. */
4473
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004474 if (ste->ste_child_free) {
4475 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004476 PyOS_snprintf(buf, sizeof(buf),
4477 ILLEGAL_IMPORT_STAR,
4478 PyString_AS_STRING(ste->ste_name),
4479 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004480 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004481 PyOS_snprintf(buf, sizeof(buf),
4482 ILLEGAL_BARE_EXEC,
4483 PyString_AS_STRING(ste->ste_name),
4484 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004485 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004486 PyOS_snprintf(buf, sizeof(buf),
4487 ILLEGAL_EXEC_AND_IMPORT_STAR,
4488 PyString_AS_STRING(ste->ste_name),
4489 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004490 }
4491 } else {
4492 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004493 PyOS_snprintf(buf, sizeof(buf),
4494 ILLEGAL_IMPORT_STAR,
4495 PyString_AS_STRING(ste->ste_name),
4496 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004497 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004498 PyOS_snprintf(buf, sizeof(buf),
4499 ILLEGAL_BARE_EXEC,
4500 PyString_AS_STRING(ste->ste_name),
4501 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004502 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004503 PyOS_snprintf(buf, sizeof(buf),
4504 ILLEGAL_EXEC_AND_IMPORT_STAR,
4505 PyString_AS_STRING(ste->ste_name),
4506 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004507 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004508 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004509
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004510 PyErr_SetString(PyExc_SyntaxError, buf);
4511 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4512 ste->ste_opt_lineno);
4513 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004514}
4515
4516static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004517symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4518 struct symbol_info *si)
4519{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004520 if (c->c_future)
4521 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004522 if (ste->ste_generator)
4523 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004524 if (ste->ste_type != TYPE_MODULE)
4525 c->c_flags |= CO_NEWLOCALS;
4526 if (ste->ste_type == TYPE_FUNCTION) {
4527 c->c_nlocals = si->si_nlocals;
4528 if (ste->ste_optimized == 0)
4529 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004530 else if (ste->ste_optimized != OPT_EXEC)
4531 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004532 }
4533 return 0;
4534}
4535
4536static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004537symtable_load_symbols(struct compiling *c)
4538{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004539 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004541 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004542 PyObject *name, *varnames, *v;
4543 int i, flags, pos;
4544 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004545
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004546 if (implicit == NULL) {
4547 implicit = PyInt_FromLong(1);
4548 if (implicit == NULL)
4549 return -1;
4550 }
4551 v = NULL;
4552
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004553 if (symtable_init_compiling_symbols(c) < 0)
4554 goto fail;
4555 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004556 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004557 si.si_nlocals = PyList_GET_SIZE(varnames);
4558 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004560 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004561 v = PyInt_FromLong(i);
4562 if (PyDict_SetItem(c->c_locals,
4563 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004564 goto fail;
4565 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004566 }
4567
4568 /* XXX The cases below define the rules for whether a name is
4569 local or global. The logic could probably be clearer. */
4570 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004571 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4572 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004573
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004574 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004575 /* undo the original DEF_FREE */
4576 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004577
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004578 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004579 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004580 2. Free variables in methods that are also class
4581 variables or declared global.
4582 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004583 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004584 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004586 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004587 c->c_argcount--;
4588 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004589 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004590 c->c_argcount--;
4591 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004592 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004594 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004595 if (flags & DEF_PARAM) {
4596 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004597 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004598 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004599 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004600 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004602 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004603 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4604 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004605 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004606 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4608 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004609 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004610 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004611 if (v == NULL)
4612 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004613 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004614 goto fail;
4615 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004616 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004618 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004619 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004620 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004621 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004622 if (v == NULL)
4623 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004624 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004625 goto fail;
4626 Py_DECREF(v);
4627 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004628 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004629 if (PyDict_SetItem(c->c_globals, name,
4630 implicit) < 0)
4631 goto fail;
4632 if (st->st_nscopes != 1) {
4633 v = PyInt_FromLong(flags);
4634 if (PyDict_SetItem(st->st_global,
4635 name, v))
4636 goto fail;
4637 Py_DECREF(v);
4638 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004639 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004640 }
4641 }
4642
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004643 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4644
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004645 if (si.si_ncells > 1) { /* one cell is always in order */
4646 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4647 c->c_varnames, c->c_flags) < 0)
4648 return -1;
4649 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004650 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4651 return -1;
4652 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004653 fail:
4654 /* is this always the right thing to do? */
4655 Py_XDECREF(v);
4656 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004657}
4658
4659static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004660symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661{
4662 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004663
4664 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4665 if (st == NULL)
4666 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004667 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004668
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004669 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004670 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 goto fail;
4672 if ((st->st_symbols = PyDict_New()) == NULL)
4673 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004675 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004676 st->st_errors = 0;
4677 st->st_tmpname = 0;
4678 st->st_private = NULL;
4679 return st;
4680 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004681 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004682 return NULL;
4683}
4684
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004685void
4686PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004687{
4688 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004689 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004690 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004691 PyMem_Free((void *)st);
4692}
4693
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694/* When the compiler exits a scope, it must should update the scope's
4695 free variable information with the list of free variables in its
4696 children.
4697
4698 Variables that are free in children and defined in the current
4699 scope are cellvars.
4700
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004701 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004702 false), free variables in children that are not defined here are
4703 implicit globals.
4704
4705*/
4706
4707static int
4708symtable_update_free_vars(struct symtable *st)
4709{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004710 int i, j, def;
4711 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004712 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004713
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004714 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004715 def = DEF_FREE_CLASS;
4716 else
4717 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004718 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004719 int pos = 0;
4720
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004721 if (list)
4722 PyList_SetSlice(list, 0,
4723 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004724 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004725 PyList_GET_ITEM(ste->ste_children, i);
4726 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004727 int flags = PyInt_AS_LONG(o);
4728 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004729 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004730 if (list == NULL) {
4731 list = PyList_New(0);
4732 if (list == NULL)
4733 return -1;
4734 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004735 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004736 if (PyList_Append(list, name) < 0) {
4737 Py_DECREF(list);
4738 return -1;
4739 }
4740 }
4741 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004742 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004743 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004744 v = PyDict_GetItem(ste->ste_symbols, name);
4745 /* If a name N is declared global in scope A and
4746 referenced in scope B contained (perhaps
4747 indirectly) in A and there are no scopes
4748 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004749 is global in B. Unless A is a class scope,
4750 because class scopes are not considered for
4751 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004752 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004753 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004754 int flags = PyInt_AS_LONG(v);
4755 if (flags & DEF_GLOBAL) {
4756 symtable_undo_free(st, child->ste_id,
4757 name);
4758 continue;
4759 }
4760 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004761 if (ste->ste_nested) {
4762 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004763 name, def) < 0) {
4764 Py_DECREF(list);
4765 return -1;
4766 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004767 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004768 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004769 name) < 0) {
4770 Py_DECREF(list);
4771 return -1;
4772 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004773 }
4774 }
4775 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004776
4777 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778 return 0;
4779}
4780
4781/* If the current scope is a non-nested class or if name is not
4782 defined in the current, non-nested scope, then it is an implicit
4783 global in all nested scopes.
4784*/
4785
4786static int
4787symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4788{
4789 PyObject *o;
4790 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004792
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004793 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004794 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004795 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796 if (o == NULL)
4797 return symtable_undo_free(st, child, name);
4798 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004799
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004800 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004801 return symtable_undo_free(st, child, name);
4802 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004803 return symtable_add_def_o(st, ste->ste_symbols,
4804 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004805}
4806
4807static int
4808symtable_undo_free(struct symtable *st, PyObject *id,
4809 PyObject *name)
4810{
4811 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004812 PyObject *info;
4813 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004814
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004815 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4816 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004817 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004818
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004819 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004820 if (info == NULL)
4821 return 0;
4822 v = PyInt_AS_LONG(info);
4823 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 DEF_FREE_GLOBAL) < 0)
4826 return -1;
4827 } else
4828 /* If the name is defined here or declared global,
4829 then the recursion stops. */
4830 return 0;
4831
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004832 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4833 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004834 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004835 PyList_GET_ITEM(ste->ste_children, i);
4836 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004837 if (x < 0)
4838 return x;
4839 }
4840 return 0;
4841}
4842
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004843/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4844 This reference is released when the scope is exited, via the DECREF
4845 in symtable_exit_scope().
4846*/
4847
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848static int
4849symtable_exit_scope(struct symtable *st)
4850{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004851 int end;
4852
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004853 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004854 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004855 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004856 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4858 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859 if (PySequence_DelItem(st->st_stack, end) < 0)
4860 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004861 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004864static void
4865symtable_enter_scope(struct symtable *st, char *name, int type,
4866 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004867{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004868 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004869
4870 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004871 prev = st->st_cur;
4872 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4873 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004874 st->st_errors++;
4875 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004876 }
4877 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004878 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004879 PySymtableEntry_New(st, name, type, lineno);
4880 if (strcmp(name, TOP) == 0)
4881 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004882 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004883 if (PyList_Append(prev->ste_children,
4884 (PyObject *)st->st_cur) < 0)
4885 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004886 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004887}
4888
4889static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004890symtable_lookup(struct symtable *st, char *name)
4891{
4892 char buffer[MANGLE_LEN];
4893 PyObject *v;
4894 int flags;
4895
4896 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4897 name = buffer;
4898 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4899 if (v == NULL) {
4900 if (PyErr_Occurred())
4901 return -1;
4902 else
4903 return 0;
4904 }
4905
4906 flags = PyInt_AS_LONG(v);
4907 return flags;
4908}
4909
4910static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004911symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004912{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004914 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004915 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004916
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004917 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004918 name = buffer;
4919 if ((s = PyString_InternFromString(name)) == NULL)
4920 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004921 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4922 Py_DECREF(s);
4923 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004924}
4925
4926/* Must only be called with mangled names */
4927
4928static int
4929symtable_add_def_o(struct symtable *st, PyObject *dict,
4930 PyObject *name, int flag)
4931{
4932 PyObject *o;
4933 int val;
4934
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004938 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004939 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004940 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004941 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004942 return -1;
4943 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004945 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004946 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004947 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004948 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004949 Py_DECREF(o);
4950 return -1;
4951 }
4952 Py_DECREF(o);
4953
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004954 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004955 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 } else if (flag & DEF_GLOBAL) {
4958 /* XXX need to update DEF_GLOBAL for other flags too;
4959 perhaps only DEF_FREE_GLOBAL */
4960 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004962 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004964 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004965 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004966 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967 Py_DECREF(o);
4968 return -1;
4969 }
4970 Py_DECREF(o);
4971 }
4972 return 0;
4973}
4974
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004975#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004976
Tim Peters08a898f2001-06-28 01:52:22 +00004977/* Look for a yield stmt under n. Return 1 if found, else 0.
4978 This hack is used to look inside "if 0:" blocks (which are normally
4979 ignored) in case those are the only places a yield occurs (so that this
4980 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004981static int
4982look_for_yield(node *n)
4983{
4984 int i;
4985
4986 for (i = 0; i < NCH(n); ++i) {
4987 node *kid = CHILD(n, i);
4988
4989 switch (TYPE(kid)) {
4990
4991 case classdef:
4992 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004993 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004994 /* Stuff in nested functions and classes can't make
4995 the parent a generator. */
4996 return 0;
4997
4998 case yield_stmt:
4999 return 1;
5000
5001 default:
5002 if (look_for_yield(kid))
5003 return 1;
5004 }
5005 }
5006 return 0;
5007}
5008
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005009static void
5010symtable_node(struct symtable *st, node *n)
5011{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005012 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005013
5014 loop:
5015 switch (TYPE(n)) {
5016 case funcdef: {
5017 char *func_name = STR(CHILD(n, 1));
5018 symtable_add_def(st, func_name, DEF_LOCAL);
5019 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005020 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005021 symtable_funcdef(st, n);
5022 symtable_exit_scope(st);
5023 break;
5024 }
5025 case lambdef:
5026 if (NCH(n) == 4)
5027 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005028 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005029 symtable_funcdef(st, n);
5030 symtable_exit_scope(st);
5031 break;
5032 case classdef: {
5033 char *tmp, *class_name = STR(CHILD(n, 1));
5034 symtable_add_def(st, class_name, DEF_LOCAL);
5035 if (TYPE(CHILD(n, 2)) == LPAR) {
5036 node *bases = CHILD(n, 3);
5037 int i;
5038 for (i = 0; i < NCH(bases); i += 2) {
5039 symtable_node(st, CHILD(bases, i));
5040 }
5041 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005042 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005043 tmp = st->st_private;
5044 st->st_private = class_name;
5045 symtable_node(st, CHILD(n, NCH(n) - 1));
5046 st->st_private = tmp;
5047 symtable_exit_scope(st);
5048 break;
5049 }
5050 case if_stmt:
5051 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005052 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5053 if (st->st_cur->ste_generator == 0)
5054 st->st_cur->ste_generator =
5055 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005056 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005057 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005058 symtable_node(st, CHILD(n, i + 1));
5059 symtable_node(st, CHILD(n, i + 3));
5060 }
5061 if (i + 2 < NCH(n))
5062 symtable_node(st, CHILD(n, i + 2));
5063 break;
5064 case global_stmt:
5065 symtable_global(st, n);
5066 break;
5067 case import_stmt:
5068 symtable_import(st, n);
5069 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005070 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005071 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005072 symtable_node(st, CHILD(n, 1));
5073 if (NCH(n) > 2)
5074 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005075 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005076 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005077 st->st_cur->ste_opt_lineno = n->n_lineno;
5078 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005079 if (NCH(n) > 4)
5080 symtable_node(st, CHILD(n, 5));
5081 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005082
5083 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005084 case assert_stmt:
5085 if (Py_OptimizeFlag)
5086 return;
5087 if (NCH(n) == 2) {
5088 n = CHILD(n, 1);
5089 goto loop;
5090 } else {
5091 symtable_node(st, CHILD(n, 1));
5092 n = CHILD(n, 3);
5093 goto loop;
5094 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005095 case except_clause:
5096 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005097 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005098 if (NCH(n) > 1) {
5099 n = CHILD(n, 1);
5100 goto loop;
5101 }
5102 break;
5103 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005104 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005106 case yield_stmt:
5107 st->st_cur->ste_generator = 1;
5108 n = CHILD(n, 1);
5109 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005110 case expr_stmt:
5111 if (NCH(n) == 1)
5112 n = CHILD(n, 0);
5113 else {
5114 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005115 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005116 symtable_node(st, CHILD(n, 2));
5117 break;
5118 } else {
5119 int i;
5120 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005121 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005122 n = CHILD(n, NCH(n) - 1);
5123 }
5124 }
5125 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005126 case list_iter:
5127 n = CHILD(n, 0);
5128 if (TYPE(n) == list_for) {
5129 st->st_tmpname++;
5130 symtable_list_comprehension(st, n);
5131 st->st_tmpname--;
5132 } else {
5133 REQ(n, list_if);
5134 symtable_node(st, CHILD(n, 1));
5135 if (NCH(n) == 3) {
5136 n = CHILD(n, 2);
5137 goto loop;
5138 }
5139 }
5140 break;
5141 case for_stmt:
5142 symtable_assign(st, CHILD(n, 1), 0);
5143 for (i = 3; i < NCH(n); ++i)
5144 if (TYPE(CHILD(n, i)) >= single_input)
5145 symtable_node(st, CHILD(n, i));
5146 break;
5147 /* The remaining cases fall through to default except in
5148 special circumstances. This requires the individual cases
5149 to be coded with great care, even though they look like
5150 rather innocuous. Each case must double-check TYPE(n).
5151 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005152 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005153 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005154 n = CHILD(n, 2);
5155 goto loop;
5156 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005157 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005158 case listmaker:
5159 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005160 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005161 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005162 symtable_node(st, CHILD(n, 0));
5163 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005164 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005166 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005167 case atom:
5168 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5169 symtable_add_use(st, STR(CHILD(n, 0)));
5170 break;
5171 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005172 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005174 /* Walk over every non-token child with a special case
5175 for one child.
5176 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 if (NCH(n) == 1) {
5178 n = CHILD(n, 0);
5179 goto loop;
5180 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005181 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005182 if (TYPE(CHILD(n, i)) >= single_input)
5183 symtable_node(st, CHILD(n, i));
5184 }
5185}
5186
5187static void
5188symtable_funcdef(struct symtable *st, node *n)
5189{
5190 node *body;
5191
5192 if (TYPE(n) == lambdef) {
5193 if (NCH(n) == 4)
5194 symtable_params(st, CHILD(n, 1));
5195 } else
5196 symtable_params(st, CHILD(n, 2));
5197 body = CHILD(n, NCH(n) - 1);
5198 symtable_node(st, body);
5199}
5200
5201/* The next two functions parse the argument tuple.
5202 symtable_default_arg() checks for names in the default arguments,
5203 which are references in the defining scope. symtable_params()
5204 parses the parameter names, which are defined in the function's
5205 body.
5206
5207 varargslist:
5208 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5209 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5210*/
5211
5212static void
5213symtable_default_args(struct symtable *st, node *n)
5214{
5215 node *c;
5216 int i;
5217
5218 if (TYPE(n) == parameters) {
5219 n = CHILD(n, 1);
5220 if (TYPE(n) == RPAR)
5221 return;
5222 }
5223 REQ(n, varargslist);
5224 for (i = 0; i < NCH(n); i += 2) {
5225 c = CHILD(n, i);
5226 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5227 break;
5228 }
5229 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5230 symtable_node(st, CHILD(n, i));
5231 }
5232}
5233
5234static void
5235symtable_params(struct symtable *st, node *n)
5236{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005237 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 node *c = NULL;
5239
5240 if (TYPE(n) == parameters) {
5241 n = CHILD(n, 1);
5242 if (TYPE(n) == RPAR)
5243 return;
5244 }
5245 REQ(n, varargslist);
5246 for (i = 0; i < NCH(n); i += 2) {
5247 c = CHILD(n, i);
5248 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5249 ext = 1;
5250 break;
5251 }
5252 if (TYPE(c) == test) {
5253 continue;
5254 }
5255 if (TYPE(CHILD(c, 0)) == NAME)
5256 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5257 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005258 char nbuf[30];
5259 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005260 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005261 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005262 }
5263 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005264 if (ext) {
5265 c = CHILD(n, i);
5266 if (TYPE(c) == STAR) {
5267 i++;
5268 symtable_add_def(st, STR(CHILD(n, i)),
5269 DEF_PARAM | DEF_STAR);
5270 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005271 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005272 c = NULL;
5273 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005276 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005277 i++;
5278 symtable_add_def(st, STR(CHILD(n, i)),
5279 DEF_PARAM | DEF_DOUBLESTAR);
5280 }
5281 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005282 if (complex >= 0) {
5283 int j;
5284 for (j = 0; j <= complex; j++) {
5285 c = CHILD(n, j);
5286 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005287 c = CHILD(n, ++j);
5288 else if (TYPE(c) == EQUAL)
5289 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005290 if (TYPE(CHILD(c, 0)) == LPAR)
5291 symtable_params_fplist(st, CHILD(c, 1));
5292 }
5293 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005294}
5295
5296static void
5297symtable_params_fplist(struct symtable *st, node *n)
5298{
5299 int i;
5300 node *c;
5301
5302 REQ(n, fplist);
5303 for (i = 0; i < NCH(n); i += 2) {
5304 c = CHILD(n, i);
5305 REQ(c, fpdef);
5306 if (NCH(c) == 1)
5307 symtable_add_def(st, STR(CHILD(c, 0)),
5308 DEF_PARAM | DEF_INTUPLE);
5309 else
5310 symtable_params_fplist(st, CHILD(c, 1));
5311 }
5312
5313}
5314
5315static void
5316symtable_global(struct symtable *st, node *n)
5317{
5318 int i;
5319
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005320 /* XXX It might be helpful to warn about module-level global
5321 statements, but it's hard to tell the difference between
5322 module-level and a string passed to exec.
5323 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005324
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005325 for (i = 1; i < NCH(n); i += 2) {
5326 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005327 int flags;
5328
5329 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005330 if (flags < 0)
5331 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005332 if (flags && flags != DEF_GLOBAL) {
5333 char buf[500];
5334 if (flags & DEF_PARAM) {
5335 PyErr_Format(PyExc_SyntaxError,
5336 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005337 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005338 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005339 st->st_cur->ste_lineno);
5340 st->st_errors++;
5341 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005342 }
5343 else {
5344 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005345 PyOS_snprintf(buf, sizeof(buf),
5346 GLOBAL_AFTER_ASSIGN,
5347 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005348 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005349 PyOS_snprintf(buf, sizeof(buf),
5350 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005351 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005352 }
5353 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005354 symtable_add_def(st, name, DEF_GLOBAL);
5355 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356}
5357
5358static void
5359symtable_list_comprehension(struct symtable *st, node *n)
5360{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005361 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005363 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005364 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005365 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366 symtable_node(st, CHILD(n, 3));
5367 if (NCH(n) == 5)
5368 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369}
5370
5371static void
5372symtable_import(struct symtable *st, node *n)
5373{
5374 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005375 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005376 | 'from' dotted_name 'import'
5377 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005378 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005379 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005380 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005381 node *dotname = CHILD(n, 1);
5382 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5383 /* check for bogus imports */
5384 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5385 PyErr_SetString(PyExc_SyntaxError,
5386 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005387 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005388 n->n_lineno);
5389 st->st_errors++;
5390 return;
5391 }
5392 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005394 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005395 if (symtable_warn(st,
5396 "import * only allowed at module level") < 0)
5397 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005398 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005399 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005400 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005401 } else {
5402 for (i = 3; i < NCH(n); i += 2) {
5403 node *c = CHILD(n, i);
5404 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005405 symtable_assign(st, CHILD(c, 2),
5406 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005407 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005408 symtable_assign(st, CHILD(c, 0),
5409 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005410 }
5411 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005412 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005413 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005414 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005415 }
5416 }
5417}
5418
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005419/* The third argument to symatble_assign() is a flag to be passed to
5420 symtable_add_def() if it is eventually called. The flag is useful
5421 to specify the particular type of assignment that should be
5422 recorded, e.g. an assignment caused by import.
5423 */
5424
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005426symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427{
5428 node *tmp;
5429 int i;
5430
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 loop:
5432 switch (TYPE(n)) {
5433 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005434 /* invalid assignment, e.g. lambda x:x=2. The next
5435 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005436 return;
5437 case power:
5438 if (NCH(n) > 2) {
5439 for (i = 2; i < NCH(n); ++i)
5440 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5441 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005442 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005443 if (NCH(n) > 1) {
5444 symtable_node(st, CHILD(n, 0));
5445 symtable_node(st, CHILD(n, 1));
5446 } else {
5447 n = CHILD(n, 0);
5448 goto loop;
5449 }
5450 return;
5451 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005452 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5453 /* XXX This is an error, but the next pass
5454 will catch it. */
5455 return;
5456 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005457 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005458 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005459 }
5460 return;
5461 case exprlist:
5462 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005463 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464 if (NCH(n) == 1) {
5465 n = CHILD(n, 0);
5466 goto loop;
5467 }
5468 else {
5469 int i;
5470 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005471 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472 return;
5473 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474 case atom:
5475 tmp = CHILD(n, 0);
5476 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5477 n = CHILD(n, 1);
5478 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005479 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005480 if (strcmp(STR(tmp), "__debug__") == 0) {
5481 PyErr_SetString(PyExc_SyntaxError,
5482 ASSIGN_DEBUG);
5483 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005484 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005485 st->st_errors++;
5486 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005487 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005488 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005489 return;
5490 case dotted_as_name:
5491 if (NCH(n) == 3)
5492 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005493 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005494 else
5495 symtable_add_def(st,
5496 STR(CHILD(CHILD(n,
5497 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005498 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005499 return;
5500 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005501 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005502 return;
5503 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005504 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005505 return;
5506 default:
5507 if (NCH(n) == 0)
5508 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005509 if (NCH(n) == 1) {
5510 n = CHILD(n, 0);
5511 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005512 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005513 /* Should only occur for errors like x + 1 = 1,
5514 which will be caught in the next pass. */
5515 for (i = 0; i < NCH(n); ++i)
5516 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005517 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005518 }
5519}