blob: d41867f7cf8f63720652db1184bbee754ed57e04 [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;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001133#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001134 int unicode = 0;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001135#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001136 if (isalpha(quote) || quote == '_') {
1137 if (quote == 'u' || quote == 'U') {
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001138#ifdef Py_USING_UNICODE
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001139 quote = *++s;
1140 unicode = 1;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001141#else
1142 com_error(com, PyExc_SyntaxError,
1143 "Unicode literals not supported in this Python");
1144 return NULL;
1145#endif
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001146 }
1147 if (quote == 'r' || quote == 'R') {
1148 quote = *++s;
1149 rawmode = 1;
1150 }
1151 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001152 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 return NULL;
1155 }
1156 s++;
1157 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001158 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001159 com_error(com, PyExc_OverflowError,
1160 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001161 return NULL;
1162 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001163 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 return NULL;
1166 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001167 if (len >= 4 && s[0] == quote && s[1] == quote) {
1168 s += 2;
1169 len -= 2;
1170 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001172 return NULL;
1173 }
1174 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001175#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001176 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001177 if (rawmode)
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001178 v = PyUnicode_DecodeRawUnicodeEscape(
1179 s, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001180 else
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001181 v = PyUnicode_DecodeUnicodeEscape(
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001182 s, len, NULL);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001183 if (v == NULL)
1184 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1185 return v;
1186
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001187 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001188#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001189 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 return PyString_FromStringAndSize(s, len);
1191 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001192 if (v == NULL)
1193 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001195 end = s + len;
1196 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001197 if (*s != '\\') {
1198 *p++ = *s++;
1199 continue;
1200 }
1201 s++;
1202 switch (*s++) {
1203 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001204 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205 case '\\': *p++ = '\\'; break;
1206 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001207 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001208 case 'b': *p++ = '\b'; break;
1209 case 'f': *p++ = '\014'; break; /* FF */
1210 case 't': *p++ = '\t'; break;
1211 case 'n': *p++ = '\n'; break;
1212 case 'r': *p++ = '\r'; break;
1213 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1215 case '0': case '1': case '2': case '3':
1216 case '4': case '5': case '6': case '7':
1217 c = s[-1] - '0';
1218 if ('0' <= *s && *s <= '7') {
1219 c = (c<<3) + *s++ - '0';
1220 if ('0' <= *s && *s <= '7')
1221 c = (c<<3) + *s++ - '0';
1222 }
1223 *p++ = c;
1224 break;
1225 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001226 if (isxdigit(Py_CHARMASK(s[0]))
1227 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001228 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001229 c = Py_CHARMASK(*s);
1230 s++;
1231 if (isdigit(c))
1232 x = c - '0';
1233 else if (islower(c))
1234 x = 10 + c - 'a';
1235 else
1236 x = 10 + c - 'A';
1237 x = x << 4;
1238 c = Py_CHARMASK(*s);
1239 s++;
1240 if (isdigit(c))
1241 x += c - '0';
1242 else if (islower(c))
1243 x += 10 + c - 'a';
1244 else
1245 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001246 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 break;
1248 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001249 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001250 com_error(com, PyExc_ValueError,
1251 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001252 return NULL;
1253 default:
1254 *p++ = '\\';
1255 *p++ = s[-1];
1256 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001257 }
1258 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001260 return v;
1261}
1262
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001264parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001265{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001267 int i;
1268 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001269 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001270 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001271 for (i = 1; i < NCH(n); i++) {
1272 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001273 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001274 if (s == NULL)
1275 goto onError;
1276 if (PyString_Check(v) && PyString_Check(s)) {
1277 PyString_ConcatAndDel(&v, s);
1278 if (v == NULL)
1279 goto onError;
1280 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001281#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001282 else {
1283 PyObject *temp;
1284 temp = PyUnicode_Concat(v, s);
1285 Py_DECREF(s);
1286 if (temp == NULL)
1287 goto onError;
1288 Py_DECREF(v);
1289 v = temp;
1290 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001291#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001292 }
1293 }
1294 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001295
1296 onError:
1297 Py_XDECREF(v);
1298 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001299}
1300
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001302com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001304 int anchor = 0;
1305 int save_begin = c->c_begin;
1306
1307 /* list_iter: for v in expr [list_iter] */
1308 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001309 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001310 c->c_begin = c->c_nexti;
1311 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001312 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001313 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001314 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001315 c->c_loops++;
1316 com_list_iter(c, n, e, t);
1317 c->c_loops--;
1318 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1319 c->c_begin = save_begin;
1320 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001321 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001322}
1323
1324static void
1325com_list_if(struct compiling *c, node *n, node *e, char *t)
1326{
1327 int anchor = 0;
1328 int a = 0;
1329 /* list_iter: 'if' test [list_iter] */
1330 com_addoparg(c, SET_LINENO, n->n_lineno);
1331 com_node(c, CHILD(n, 1));
1332 com_addfwref(c, JUMP_IF_FALSE, &a);
1333 com_addbyte(c, POP_TOP);
1334 com_pop(c, 1);
1335 com_list_iter(c, n, e, t);
1336 com_addfwref(c, JUMP_FORWARD, &anchor);
1337 com_backpatch(c, a);
1338 /* We jump here with an extra entry which we now pop */
1339 com_addbyte(c, POP_TOP);
1340 com_backpatch(c, anchor);
1341}
1342
1343static void
1344com_list_iter(struct compiling *c,
1345 node *p, /* parent of list_iter node */
1346 node *e, /* element expression node */
1347 char *t /* name of result list temp local */)
1348{
1349 /* list_iter is the last child in a listmaker, list_for, or list_if */
1350 node *n = CHILD(p, NCH(p)-1);
1351 if (TYPE(n) == list_iter) {
1352 n = CHILD(n, 0);
1353 switch (TYPE(n)) {
1354 case list_for:
1355 com_list_for(c, n, e, t);
1356 break;
1357 case list_if:
1358 com_list_if(c, n, e, t);
1359 break;
1360 default:
1361 com_error(c, PyExc_SystemError,
1362 "invalid list_iter node type");
1363 }
1364 }
1365 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001366 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001367 com_push(c, 1);
1368 com_node(c, e);
1369 com_addoparg(c, CALL_FUNCTION, 1);
1370 com_addbyte(c, POP_TOP);
1371 com_pop(c, 2);
1372 }
1373}
1374
1375static void
1376com_list_comprehension(struct compiling *c, node *n)
1377{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001378 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001379 char tmpname[30];
1380 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001381 com_addoparg(c, BUILD_LIST, 0);
1382 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1383 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001384 com_addop_name(c, LOAD_ATTR, "append");
1385 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001386 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001387 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001388 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001389 --c->c_tmpname;
1390}
1391
1392static void
1393com_listmaker(struct compiling *c, node *n)
1394{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001395 /* listmaker: test ( list_for | (',' test)* [','] ) */
1396 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001397 com_list_comprehension(c, n);
1398 else {
1399 int len = 0;
1400 int i;
1401 for (i = 0; i < NCH(n); i += 2, len++)
1402 com_node(c, CHILD(n, i));
1403 com_addoparg(c, BUILD_LIST, len);
1404 com_pop(c, len-1);
1405 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406}
1407
1408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001410{
1411 int i;
1412 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1413 for (i = 0; i+2 < NCH(n); i += 4) {
1414 /* We must arrange things just right for STORE_SUBSCR.
1415 It wants the stack to look like (value) (dict) (key) */
1416 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001417 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001418 com_node(c, CHILD(n, i+2)); /* value */
1419 com_addbyte(c, ROT_TWO);
1420 com_node(c, CHILD(n, i)); /* key */
1421 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001422 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001423 }
1424}
1425
1426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001427com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
1429 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431 int i;
1432 REQ(n, atom);
1433 ch = CHILD(n, 0);
1434 switch (TYPE(ch)) {
1435 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001436 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001438 com_push(c, 1);
1439 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 else
1441 com_node(c, CHILD(n, 1));
1442 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001443 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001444 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001446 com_push(c, 1);
1447 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001449 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001451 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001453 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001454 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001455 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 break;
1457 case BACKQUOTE:
1458 com_node(c, CHILD(n, 1));
1459 com_addbyte(c, UNARY_CONVERT);
1460 break;
1461 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001462 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 i = 255;
1464 }
1465 else {
1466 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001468 }
1469 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001470 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001471 break;
1472 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001473 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001474 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 c->c_errors++;
1476 i = 255;
1477 }
1478 else {
1479 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001481 }
1482 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001483 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001484 break;
1485 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001486 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001487 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488 break;
1489 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 com_error(c, PyExc_SystemError,
1491 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 }
1493}
1494
1495static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001496com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497{
1498 if (NCH(n) == 1) {
1499 com_addbyte(c, op);
1500 }
1501 else if (NCH(n) == 2) {
1502 if (TYPE(CHILD(n, 0)) != COLON) {
1503 com_node(c, CHILD(n, 0));
1504 com_addbyte(c, op+1);
1505 }
1506 else {
1507 com_node(c, CHILD(n, 1));
1508 com_addbyte(c, op+2);
1509 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001510 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 }
1512 else {
1513 com_node(c, CHILD(n, 0));
1514 com_node(c, CHILD(n, 2));
1515 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001516 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 }
1518}
1519
Guido van Rossum635abd21997-01-06 22:56:52 +00001520static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001521com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1522{
1523 if (NCH(n) == 1) {
1524 com_addbyte(c, DUP_TOP);
1525 com_push(c, 1);
1526 com_addbyte(c, SLICE);
1527 com_node(c, augn);
1528 com_addbyte(c, opcode);
1529 com_pop(c, 1);
1530 com_addbyte(c, ROT_TWO);
1531 com_addbyte(c, STORE_SLICE);
1532 com_pop(c, 2);
1533 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1534 com_node(c, CHILD(n, 0));
1535 com_addoparg(c, DUP_TOPX, 2);
1536 com_push(c, 2);
1537 com_addbyte(c, SLICE+1);
1538 com_pop(c, 1);
1539 com_node(c, augn);
1540 com_addbyte(c, opcode);
1541 com_pop(c, 1);
1542 com_addbyte(c, ROT_THREE);
1543 com_addbyte(c, STORE_SLICE+1);
1544 com_pop(c, 3);
1545 } else if (NCH(n) == 2) {
1546 com_node(c, CHILD(n, 1));
1547 com_addoparg(c, DUP_TOPX, 2);
1548 com_push(c, 2);
1549 com_addbyte(c, SLICE+2);
1550 com_pop(c, 1);
1551 com_node(c, augn);
1552 com_addbyte(c, opcode);
1553 com_pop(c, 1);
1554 com_addbyte(c, ROT_THREE);
1555 com_addbyte(c, STORE_SLICE+2);
1556 com_pop(c, 3);
1557 } else {
1558 com_node(c, CHILD(n, 0));
1559 com_node(c, CHILD(n, 2));
1560 com_addoparg(c, DUP_TOPX, 3);
1561 com_push(c, 3);
1562 com_addbyte(c, SLICE+3);
1563 com_pop(c, 2);
1564 com_node(c, augn);
1565 com_addbyte(c, opcode);
1566 com_pop(c, 1);
1567 com_addbyte(c, ROT_FOUR);
1568 com_addbyte(c, STORE_SLICE+3);
1569 com_pop(c, 4);
1570 }
1571}
1572
1573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001574com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001575{
1576 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001577 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001578 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001579 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001581 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001582 }
1583 else {
1584 com_node(c, CHILD(n, 0));
1585 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001586 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001587 }
1588 m = n;
1589 do {
1590 m = CHILD(m, 0);
1591 } while (NCH(m) == 1);
1592 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001593 /* f(lambda x: x[0] = 3) ends up getting parsed with
1594 * LHS test = lambda x: x[0], and RHS test = 3.
1595 * SF bug 132313 points out that complaining about a keyword
1596 * then is very confusing.
1597 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001599 TYPE(m) == lambdef ?
1600 "lambda cannot contain assignment" :
1601 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001602 }
1603 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001605 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001607 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001608 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001609 else if (*pkeywords == NULL) {
1610 c->c_errors++;
1611 Py_DECREF(v);
1612 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 if (PyDict_GetItem(*pkeywords, v) != NULL)
1614 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001615 "duplicate keyword argument");
1616 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001618 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001619 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001620 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001622 }
1623 }
1624 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001625}
1626
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001628com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629{
1630 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001631 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 }
1633 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001635 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001636 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001637 int star_flag = 0;
1638 int starstar_flag = 0;
1639 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001640 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001641 na = 0;
1642 nk = 0;
1643 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001644 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001645 if (TYPE(ch) == STAR ||
1646 TYPE(ch) == DOUBLESTAR)
1647 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001648 if (ch->n_lineno != lineno) {
1649 lineno = ch->n_lineno;
1650 com_addoparg(c, SET_LINENO, lineno);
1651 }
1652 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001653 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001654 na++;
1655 else
1656 nk++;
1657 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001659 while (i < NCH(n)) {
1660 node *tok = CHILD(n, i);
1661 node *ch = CHILD(n, i+1);
1662 i += 3;
1663 switch (TYPE(tok)) {
1664 case STAR: star_flag = 1; break;
1665 case DOUBLESTAR: starstar_flag = 1; break;
1666 }
1667 com_node(c, ch);
1668 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001669 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670 com_error(c, PyExc_SyntaxError,
1671 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001672 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001673 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001674 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001675 star_flag + (starstar_flag << 1);
1676 else
1677 opcode = CALL_FUNCTION;
1678 com_addoparg(c, opcode, na | (nk << 8));
1679 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001680 }
1681}
1682
1683static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001684com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001685{
1686 com_addopname(c, LOAD_ATTR, n);
1687}
1688
1689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001690com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001691{
1692 int i=0;
1693 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001694 node *ch;
1695
1696 /* first argument */
1697 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001699 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001700 i++;
1701 }
1702 else {
1703 com_node(c, CHILD(n,i));
1704 i++;
1705 REQ(CHILD(n,i),COLON);
1706 i++;
1707 }
1708 /* second argument */
1709 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1710 com_node(c, CHILD(n,i));
1711 i++;
1712 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001713 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001715 com_push(c, 1);
1716 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001717 /* remaining arguments */
1718 for (; i < NCH(n); i++) {
1719 ns++;
1720 ch=CHILD(n,i);
1721 REQ(ch, sliceop);
1722 if (NCH(ch) == 1) {
1723 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001725 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001726 }
1727 else
1728 com_node(c, CHILD(ch,1));
1729 }
1730 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001731 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001732}
1733
1734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001735com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001736{
1737 node *ch;
1738 REQ(n, subscript);
1739 ch = CHILD(n,0);
1740 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001741 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001742 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001743 com_push(c, 1);
1744 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001745 else {
1746 /* check for slice */
1747 if ((TYPE(ch) == COLON || NCH(n) > 1))
1748 com_sliceobj(c, n);
1749 else {
1750 REQ(ch, test);
1751 com_node(c, ch);
1752 }
1753 }
1754}
1755
1756static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001757com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001758{
1759 int i, op;
1760 REQ(n, subscriptlist);
1761 /* Check to make backward compatible slice behavior for '[i:j]' */
1762 if (NCH(n) == 1) {
1763 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001764 /* 'Basic' slice, should have exactly one colon. */
1765 if ((TYPE(CHILD(sub, 0)) == COLON
1766 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1767 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1768 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001769 switch (assigning) {
1770 case OP_DELETE:
1771 op = DELETE_SLICE;
1772 break;
1773 case OP_ASSIGN:
1774 op = STORE_SLICE;
1775 break;
1776 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001777 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001778 break;
1779 default:
1780 com_augassign_slice(c, sub, assigning, augn);
1781 return;
1782 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001783 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001784 if (op == STORE_SLICE)
1785 com_pop(c, 2);
1786 else if (op == DELETE_SLICE)
1787 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001788 return;
1789 }
1790 }
1791 /* Else normal subscriptlist. Compile each subscript. */
1792 for (i = 0; i < NCH(n); i += 2)
1793 com_subscript(c, CHILD(n, i));
1794 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001795 if (NCH(n) > 1) {
1796 i = (NCH(n)+1) / 2;
1797 com_addoparg(c, BUILD_TUPLE, i);
1798 com_pop(c, i-1);
1799 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001800 switch (assigning) {
1801 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001802 op = DELETE_SUBSCR;
1803 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001804 break;
1805 default:
1806 case OP_ASSIGN:
1807 op = STORE_SUBSCR;
1808 i = 3;
1809 break;
1810 case OP_APPLY:
1811 op = BINARY_SUBSCR;
1812 i = 1;
1813 break;
1814 }
1815 if (assigning > OP_APPLY) {
1816 com_addoparg(c, DUP_TOPX, 2);
1817 com_push(c, 2);
1818 com_addbyte(c, BINARY_SUBSCR);
1819 com_pop(c, 1);
1820 com_node(c, augn);
1821 com_addbyte(c, assigning);
1822 com_pop(c, 1);
1823 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001824 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001825 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001826 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001827}
1828
1829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001830com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001831{
1832 REQ(n, trailer);
1833 switch (TYPE(CHILD(n, 0))) {
1834 case LPAR:
1835 com_call_function(c, CHILD(n, 1));
1836 break;
1837 case DOT:
1838 com_select_member(c, CHILD(n, 1));
1839 break;
1840 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001841 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842 break;
1843 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001845 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846 }
1847}
1848
1849static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001850com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001851{
1852 int i;
1853 REQ(n, power);
1854 com_atom(c, CHILD(n, 0));
1855 for (i = 1; i < NCH(n); i++) {
1856 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1857 com_factor(c, CHILD(n, i+1));
1858 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001859 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001860 break;
1861 }
1862 else
1863 com_apply_trailer(c, CHILD(n, i));
1864 }
1865}
1866
1867static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001868com_invert_constant(struct compiling *c, node *n)
1869{
1870 /* Compute the inverse of int and longs and use them directly,
1871 but be prepared to generate code for all other
1872 possibilities (invalid numbers, floats, complex).
1873 */
1874 PyObject *num, *inv = NULL;
1875 int i;
1876
1877 REQ(n, NUMBER);
1878 num = parsenumber(c, STR(n));
1879 if (num == NULL)
1880 i = 255;
1881 else {
1882 inv = PyNumber_Invert(num);
1883 if (inv == NULL) {
1884 PyErr_Clear();
1885 i = com_addconst(c, num);
1886 } else {
1887 i = com_addconst(c, inv);
1888 Py_DECREF(inv);
1889 }
1890 Py_DECREF(num);
1891 }
1892 com_addoparg(c, LOAD_CONST, i);
1893 com_push(c, 1);
1894 if (num != NULL && inv == NULL)
1895 com_addbyte(c, UNARY_INVERT);
1896}
1897
Tim Peters51e26512001-09-07 08:45:55 +00001898static int
1899is_float_zero(const char *p)
1900{
1901 int found_radix_point = 0;
1902 int ch;
1903 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1904 switch (ch) {
1905 case '0':
1906 /* no reason to believe it's not 0 -- continue */
1907 break;
1908
1909 case 'e': case 'E': case 'j': case 'J':
1910 /* If this was a hex constant, we already would have
1911 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1912 must be an exponent marker, and we haven't yet
1913 seen a non-zero digit, and it doesn't matter what
1914 the exponent is then. For 'j' or 'J' similarly,
1915 except that this is an imaginary 0 then. */
1916 return 1;
1917
1918 case '.':
1919 found_radix_point = 1;
1920 break;
1921
1922 default:
1923 return 0;
1924 }
1925 }
1926 return found_radix_point;
1927}
1928
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001929static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001930com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001931{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001932 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001933 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001934 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001935 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00001936 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001937 approriate value as a constant. If the value is negative,
1938 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00001939 negative in the 0th position -- unless we're doing unary minus
1940 of a floating zero! In that case the sign is significant, but
1941 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001942 */
1943 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00001944 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00001945 && TYPE((pfactor = CHILD(n, 1))) == factor
1946 && NCH(pfactor) == 1
1947 && TYPE((ppower = CHILD(pfactor, 0))) == power
1948 && NCH(ppower) == 1
1949 && TYPE((patom = CHILD(ppower, 0))) == atom
1950 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
1951 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001952 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00001953 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001954 return;
1955 }
1956 if (childtype == MINUS) {
Tim Peters51e7f5c2002-04-22 02:33:27 +00001957 char *s = PyMem_Malloc(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001958 if (s == NULL) {
1959 com_error(c, PyExc_MemoryError, "");
1960 com_addbyte(c, 255);
1961 return;
1962 }
1963 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00001964 strcpy(s + 1, STR(pnum));
Tim Peters51e7f5c2002-04-22 02:33:27 +00001965 PyMem_Free(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00001966 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001967 }
Tim Peters51e26512001-09-07 08:45:55 +00001968 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001969 }
1970 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001971 com_factor(c, CHILD(n, 1));
1972 com_addbyte(c, UNARY_POSITIVE);
1973 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001974 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 com_factor(c, CHILD(n, 1));
1976 com_addbyte(c, UNARY_NEGATIVE);
1977 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001978 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00001979 com_factor(c, CHILD(n, 1));
1980 com_addbyte(c, UNARY_INVERT);
1981 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001982 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00001983 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 }
1985}
1986
1987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001988com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989{
1990 int i;
1991 int op;
1992 REQ(n, term);
1993 com_factor(c, CHILD(n, 0));
1994 for (i = 2; i < NCH(n); i += 2) {
1995 com_factor(c, CHILD(n, i));
1996 switch (TYPE(CHILD(n, i-1))) {
1997 case STAR:
1998 op = BINARY_MULTIPLY;
1999 break;
2000 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002001 if (c->c_flags & CO_FUTURE_DIVISION)
2002 op = BINARY_TRUE_DIVIDE;
2003 else
2004 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005 break;
2006 case PERCENT:
2007 op = BINARY_MODULO;
2008 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002009 case DOUBLESLASH:
2010 op = BINARY_FLOOR_DIVIDE;
2011 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002012 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002014 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002015 op = 255;
2016 }
2017 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002018 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002019 }
2020}
2021
2022static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002023com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002024{
2025 int i;
2026 int op;
2027 REQ(n, arith_expr);
2028 com_term(c, CHILD(n, 0));
2029 for (i = 2; i < NCH(n); i += 2) {
2030 com_term(c, CHILD(n, i));
2031 switch (TYPE(CHILD(n, i-1))) {
2032 case PLUS:
2033 op = BINARY_ADD;
2034 break;
2035 case MINUS:
2036 op = BINARY_SUBTRACT;
2037 break;
2038 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002039 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002040 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002041 op = 255;
2042 }
2043 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002045 }
2046}
2047
2048static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002049com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002050{
2051 int i;
2052 int op;
2053 REQ(n, shift_expr);
2054 com_arith_expr(c, CHILD(n, 0));
2055 for (i = 2; i < NCH(n); i += 2) {
2056 com_arith_expr(c, CHILD(n, i));
2057 switch (TYPE(CHILD(n, i-1))) {
2058 case LEFTSHIFT:
2059 op = BINARY_LSHIFT;
2060 break;
2061 case RIGHTSHIFT:
2062 op = BINARY_RSHIFT;
2063 break;
2064 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002065 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002066 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002067 op = 255;
2068 }
2069 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002070 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002071 }
2072}
2073
2074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002075com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002076{
2077 int i;
2078 int op;
2079 REQ(n, and_expr);
2080 com_shift_expr(c, CHILD(n, 0));
2081 for (i = 2; i < NCH(n); i += 2) {
2082 com_shift_expr(c, CHILD(n, i));
2083 if (TYPE(CHILD(n, i-1)) == AMPER) {
2084 op = BINARY_AND;
2085 }
2086 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002087 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002088 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002089 op = 255;
2090 }
2091 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002092 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002093 }
2094}
2095
2096static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002097com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002098{
2099 int i;
2100 int op;
2101 REQ(n, xor_expr);
2102 com_and_expr(c, CHILD(n, 0));
2103 for (i = 2; i < NCH(n); i += 2) {
2104 com_and_expr(c, CHILD(n, i));
2105 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2106 op = BINARY_XOR;
2107 }
2108 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002110 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 op = 255;
2112 }
2113 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002114 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116}
2117
2118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002120{
2121 int i;
2122 int op;
2123 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002124 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002125 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002126 com_xor_expr(c, CHILD(n, i));
2127 if (TYPE(CHILD(n, i-1)) == VBAR) {
2128 op = BINARY_OR;
2129 }
2130 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002132 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002133 op = 255;
2134 }
2135 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002137 }
2138}
2139
2140static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002141cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142{
2143 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002144 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2146 if (NCH(n) == 1) {
2147 n = CHILD(n, 0);
2148 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002149 case LESS: return PyCmp_LT;
2150 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002151 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002152 case EQUAL: return PyCmp_EQ;
2153 case LESSEQUAL: return PyCmp_LE;
2154 case GREATEREQUAL: return PyCmp_GE;
2155 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2156 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2157 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 }
2159 }
2160 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002163 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002165 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 }
2167 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002168 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169}
2170
2171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173{
2174 int i;
2175 enum cmp_op op;
2176 int anchor;
2177 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2178 com_expr(c, CHILD(n, 0));
2179 if (NCH(n) == 1)
2180 return;
2181
2182 /****************************************************************
2183 The following code is generated for all but the last
2184 comparison in a chain:
2185
2186 label: on stack: opcode: jump to:
2187
2188 a <code to load b>
2189 a, b DUP_TOP
2190 a, b, b ROT_THREE
2191 b, a, b COMPARE_OP
2192 b, 0-or-1 JUMP_IF_FALSE L1
2193 b, 1 POP_TOP
2194 b
2195
2196 We are now ready to repeat this sequence for the next
2197 comparison in the chain.
2198
2199 For the last we generate:
2200
2201 b <code to load c>
2202 b, c COMPARE_OP
2203 0-or-1
2204
2205 If there were any jumps to L1 (i.e., there was more than one
2206 comparison), we generate:
2207
2208 0-or-1 JUMP_FORWARD L2
2209 L1: b, 0 ROT_TWO
2210 0, b POP_TOP
2211 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002212 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002213 ****************************************************************/
2214
2215 anchor = 0;
2216
2217 for (i = 2; i < NCH(n); i += 2) {
2218 com_expr(c, CHILD(n, i));
2219 if (i+2 < NCH(n)) {
2220 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002221 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222 com_addbyte(c, ROT_THREE);
2223 }
2224 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002225 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002226 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002227 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 }
2229 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002230 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 if (i+2 < NCH(n)) {
2232 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2233 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002234 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235 }
2236 }
2237
2238 if (anchor) {
2239 int anchor2 = 0;
2240 com_addfwref(c, JUMP_FORWARD, &anchor2);
2241 com_backpatch(c, anchor);
2242 com_addbyte(c, ROT_TWO);
2243 com_addbyte(c, POP_TOP);
2244 com_backpatch(c, anchor2);
2245 }
2246}
2247
2248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002249com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002250{
2251 REQ(n, not_test); /* 'not' not_test | comparison */
2252 if (NCH(n) == 1) {
2253 com_comparison(c, CHILD(n, 0));
2254 }
2255 else {
2256 com_not_test(c, CHILD(n, 1));
2257 com_addbyte(c, UNARY_NOT);
2258 }
2259}
2260
2261static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263{
2264 int i;
2265 int anchor;
2266 REQ(n, and_test); /* not_test ('and' not_test)* */
2267 anchor = 0;
2268 i = 0;
2269 for (;;) {
2270 com_not_test(c, CHILD(n, i));
2271 if ((i += 2) >= NCH(n))
2272 break;
2273 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2274 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002276 }
2277 if (anchor)
2278 com_backpatch(c, anchor);
2279}
2280
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002281static int
2282com_make_closure(struct compiling *c, PyCodeObject *co)
2283{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002284 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002285 if (free == 0)
2286 return 0;
2287 for (i = 0; i < free; ++i) {
2288 /* Bypass com_addop_varname because it will generate
2289 LOAD_DEREF but LOAD_CLOSURE is needed.
2290 */
2291 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2292 int arg, reftype;
2293
2294 /* Special case: If a class contains a method with a
2295 free variable that has the same name as a method,
2296 the name will be considered free *and* local in the
2297 class. It should be handled by the closure, as
2298 well as by the normal name loookup logic.
2299 */
2300 reftype = get_ref_type(c, PyString_AS_STRING(name));
2301 if (reftype == CELL)
2302 arg = com_lookup_arg(c->c_cellvars, name);
2303 else /* (reftype == FREE) */
2304 arg = com_lookup_arg(c->c_freevars, name);
2305 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002306 fprintf(stderr, "lookup %s in %s %d %d\n"
2307 "freevars of %s: %s\n",
2308 PyObject_REPR(name),
2309 c->c_name,
2310 reftype, arg,
2311 PyString_AS_STRING(co->co_name),
2312 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002313 Py_FatalError("com_make_closure()");
2314 }
2315 com_addoparg(c, LOAD_CLOSURE, arg);
2316
2317 }
2318 com_push(c, free);
2319 return 1;
2320}
2321
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002323com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002324{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002326 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002327 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002328 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002329 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002330 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2331 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002332 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002333 if (co == NULL) {
2334 c->c_errors++;
2335 return;
2336 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002337 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002338 i = com_addconst(c, (PyObject *)co);
2339 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002340 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002341 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002342 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002343 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002344 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002345 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002346 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002347 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002350 else {
2351 int anchor = 0;
2352 int i = 0;
2353 for (;;) {
2354 com_and_test(c, CHILD(n, i));
2355 if ((i += 2) >= NCH(n))
2356 break;
2357 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2358 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002359 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002360 }
2361 if (anchor)
2362 com_backpatch(c, anchor);
2363 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002364}
2365
2366static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002367com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368{
2369 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002370 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 com_node(c, CHILD(n, 0));
2372 }
2373 else {
2374 int i;
2375 int len;
2376 len = (NCH(n) + 1) / 2;
2377 for (i = 0; i < NCH(n); i += 2)
2378 com_node(c, CHILD(n, i));
2379 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 }
2382}
2383
2384
2385/* Begin of assignment compilation */
2386
Thomas Wouters434d0822000-08-24 20:11:32 +00002387
2388static void
2389com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2390{
2391 com_addbyte(c, DUP_TOP);
2392 com_push(c, 1);
2393 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002394 com_node(c, augn);
2395 com_addbyte(c, opcode);
2396 com_pop(c, 1);
2397 com_addbyte(c, ROT_TWO);
2398 com_addopname(c, STORE_ATTR, n);
2399 com_pop(c, 2);
2400}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401
2402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002403com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404{
2405 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002406 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407}
2408
2409static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002410com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 REQ(n, trailer);
2413 switch (TYPE(CHILD(n, 0))) {
2414 case LPAR: /* '(' [exprlist] ')' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002415 com_error(c, PyExc_SyntaxError,
2416 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417 break;
2418 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002419 if (assigning > OP_APPLY)
2420 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2421 else
2422 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002424 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002425 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002426 break;
2427 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002428 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002429 }
2430}
2431
2432static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002433com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434{
2435 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002436 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 if (assigning) {
2439 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002440 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 com_push(c, i-1);
2442 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002444 com_assign(c, CHILD(n, i), assigning, NULL);
2445}
2446
2447static void
2448com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2449{
2450 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002451 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002452 com_push(c, 1);
2453 com_node(c, augn);
2454 com_addbyte(c, opcode);
2455 com_pop(c, 1);
2456 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002457}
2458
2459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002460com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002461{
2462 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002463 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 if (assigning)
2465 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466}
2467
2468static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002469com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470{
2471 /* Loop to avoid trivial recursion */
2472 for (;;) {
2473 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002474
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475 case exprlist:
2476 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002477 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002479 if (assigning > OP_APPLY) {
2480 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002481 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002482 return;
2483 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002484 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002485 return;
2486 }
2487 n = CHILD(n, 0);
2488 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002489
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002490 case test:
2491 case and_test:
2492 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002494 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002495 case xor_expr:
2496 case and_expr:
2497 case shift_expr:
2498 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002500 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002501 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002502 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002503 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504 return;
2505 }
2506 n = CHILD(n, 0);
2507 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002508
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002509 case power: /* atom trailer* ('**' power)*
2510 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002511 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002512 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002513 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002514 return;
2515 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002516 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 int i;
2518 com_node(c, CHILD(n, 0));
2519 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002520 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002521 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002522 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002523 return;
2524 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002525 com_apply_trailer(c, CHILD(n, i));
2526 } /* NB i is still alive */
2527 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002528 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 return;
2530 }
2531 n = CHILD(n, 0);
2532 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002533
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534 case atom:
2535 switch (TYPE(CHILD(n, 0))) {
2536 case LPAR:
2537 n = CHILD(n, 1);
2538 if (TYPE(n) == RPAR) {
2539 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002540 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002541 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 return;
2543 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002544 if (assigning > OP_APPLY) {
2545 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002546 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002547 return;
2548 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549 break;
2550 case LSQB:
2551 n = CHILD(n, 1);
2552 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002553 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002554 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 return;
2556 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002557 if (assigning > OP_APPLY) {
2558 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002559 "augmented assign to list not possible");
2560 return;
2561 }
2562 if (NCH(n) > 1
2563 && TYPE(CHILD(n, 1)) == list_for) {
2564 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002565 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002566 return;
2567 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002568 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 return;
2570 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002571 if (assigning > OP_APPLY)
2572 com_augassign_name(c, CHILD(n, 0),
2573 assigning, augn);
2574 else
2575 com_assign_name(c, CHILD(n, 0),
2576 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002577 return;
2578 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002579 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002580 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002581 return;
2582 }
2583 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002584
2585 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 com_error(c, PyExc_SyntaxError,
2587 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002588 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002589
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SystemError,
2592 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002593 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002594
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 }
2596 }
2597}
Guido van Rossum7c531111997-03-11 18:42:21 +00002598
Thomas Wouters434d0822000-08-24 20:11:32 +00002599static void
2600com_augassign(struct compiling *c, node *n)
2601{
2602 int opcode;
2603
2604 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2605 case '+': opcode = INPLACE_ADD; break;
2606 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002607 case '/':
2608 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2609 opcode = INPLACE_FLOOR_DIVIDE;
2610 else if (c->c_flags & CO_FUTURE_DIVISION)
2611 opcode = INPLACE_TRUE_DIVIDE;
2612 else
2613 opcode = INPLACE_DIVIDE;
2614 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002615 case '%': opcode = INPLACE_MODULO; break;
2616 case '<': opcode = INPLACE_LSHIFT; break;
2617 case '>': opcode = INPLACE_RSHIFT; break;
2618 case '&': opcode = INPLACE_AND; break;
2619 case '^': opcode = INPLACE_XOR; break;
2620 case '|': opcode = INPLACE_OR; break;
2621 case '*':
2622 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2623 opcode = INPLACE_POWER;
2624 else
2625 opcode = INPLACE_MULTIPLY;
2626 break;
2627 default:
2628 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2629 return;
2630 }
2631 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2632}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002633
2634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002635com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002636{
Thomas Wouters434d0822000-08-24 20:11:32 +00002637 REQ(n, expr_stmt);
2638 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002640 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 if (NCH(n) == 1) {
2643 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002644 if (c->c_interactive)
2645 com_addbyte(c, PRINT_EXPR);
2646 else
2647 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002650 else if (TYPE(CHILD(n,1)) == augassign)
2651 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 else {
2653 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002654 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002655 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002656 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002658 com_push(c, 1);
2659 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002660 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662 }
2663}
2664
2665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002666com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002667{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002668 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002669 int i;
2670 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002671 if (Py_OptimizeFlag)
2672 return;
2673 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002674
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002675 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002676 raise AssertionError [, <message>]
2677
2678 where <message> is the second test, if present.
2679 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002680 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002681 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002682 com_addbyte(c, POP_TOP);
2683 com_pop(c, 1);
2684 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002685 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002686 com_push(c, 1);
2687 i = NCH(n)/2; /* Either 2 or 4 */
2688 if (i > 1)
2689 com_node(c, CHILD(n, 3));
2690 com_addoparg(c, RAISE_VARARGS, i);
2691 com_pop(c, i);
2692 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002693 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002694 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002695 com_addbyte(c, POP_TOP);
2696}
2697
2698static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002699com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002701 int i = 1;
2702 node* stream = NULL;
2703
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002704 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002705
2706 /* are we using the extended print form? */
2707 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2708 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002709 com_node(c, stream);
2710 /* stack: [...] => [... stream] */
2711 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002712 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2713 i = 4;
2714 else
2715 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002717 for (; i < NCH(n); i += 2) {
2718 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002719 com_addbyte(c, DUP_TOP);
2720 /* stack: [stream] => [stream stream] */
2721 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002722 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002723 /* stack: [stream stream] => [stream stream obj] */
2724 com_addbyte(c, ROT_TWO);
2725 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002726 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002727 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002728 com_pop(c, 2);
2729 }
2730 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002731 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002732 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002733 com_addbyte(c, PRINT_ITEM);
2734 com_pop(c, 1);
2735 }
2736 }
2737 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002738 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002739 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002740 /* must pop the extra stream object off the stack */
2741 com_addbyte(c, POP_TOP);
2742 /* stack: [... stream] => [...] */
2743 com_pop(c, 1);
2744 }
2745 }
2746 else {
2747 if (stream != NULL) {
2748 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002749 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002750 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002751 com_pop(c, 1);
2752 }
2753 else
2754 com_addbyte(c, PRINT_NEWLINE);
2755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756}
2757
2758static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002759com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002760{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002761 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002762 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002763 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002764 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002765 if (c->c_flags & CO_GENERATOR) {
2766 if (NCH(n) > 1) {
2767 com_error(c, PyExc_SyntaxError,
2768 "'return' with argument inside generator");
2769 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002770 }
2771 if (NCH(n) < 2) {
2772 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 com_push(c, 1);
2774 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002775 else
2776 com_node(c, CHILD(n, 1));
2777 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002778 com_pop(c, 1);
2779}
2780
2781static void
2782com_yield_stmt(struct compiling *c, node *n)
2783{
Tim Peters95c80f82001-06-23 02:07:08 +00002784 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002785 REQ(n, yield_stmt); /* 'yield' testlist */
2786 if (!c->c_infunction) {
2787 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2788 }
Tim Peters95c80f82001-06-23 02:07:08 +00002789
2790 for (i = 0; i < c->c_nblocks; ++i) {
2791 if (c->c_block[i] == SETUP_FINALLY) {
2792 com_error(c, PyExc_SyntaxError,
2793 "'yield' not allowed in a 'try' block "
2794 "with a 'finally' clause");
2795 return;
2796 }
2797 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002798 com_node(c, CHILD(n, 1));
2799 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002800 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801}
2802
2803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002804com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002806 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002807 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2808 if (NCH(n) > 1) {
2809 com_node(c, CHILD(n, 1));
2810 if (NCH(n) > 3) {
2811 com_node(c, CHILD(n, 3));
2812 if (NCH(n) > 5)
2813 com_node(c, CHILD(n, 5));
2814 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002815 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002816 i = NCH(n)/2;
2817 com_addoparg(c, RAISE_VARARGS, i);
2818 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819}
2820
2821static void
Thomas Wouters52152252000-08-17 22:55:00 +00002822com_from_import(struct compiling *c, node *n)
2823{
2824 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2825 com_push(c, 1);
2826 if (NCH(n) > 1) {
2827 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2828 com_error(c, PyExc_SyntaxError, "invalid syntax");
2829 return;
2830 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002831 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002832 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002833 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002834 com_pop(c, 1);
2835}
2836
2837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
2840 int i;
2841 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002842 /* 'import' dotted_name (',' dotted_name)* |
2843 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002845 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002846 /* 'from' dotted_name 'import' ... */
2847 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002848
2849 if (TYPE(CHILD(n, 3)) == STAR) {
2850 tup = Py_BuildValue("(s)", "*");
2851 } else {
2852 tup = PyTuple_New((NCH(n) - 2)/2);
2853 for (i = 3; i < NCH(n); i += 2) {
2854 PyTuple_SET_ITEM(tup, (i-3)/2,
2855 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002856 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002857 }
2858 }
2859 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002860 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002862 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002863 if (TYPE(CHILD(n, 3)) == STAR)
2864 com_addbyte(c, IMPORT_STAR);
2865 else {
2866 for (i = 3; i < NCH(n); i += 2)
2867 com_from_import(c, CHILD(n, i));
2868 com_addbyte(c, POP_TOP);
2869 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 }
2872 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002873 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002875 node *subn = CHILD(n, i);
2876 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002877 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002878 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002879 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002880 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002881 int j;
2882 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002883 com_error(c, PyExc_SyntaxError,
2884 "invalid syntax");
2885 return;
2886 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002887 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2888 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002889 CHILD(CHILD(subn, 0),
2890 j));
2891 com_addop_varname(c, VAR_STORE,
2892 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002893 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002894 com_addop_varname(c, VAR_STORE,
2895 STR(CHILD(CHILD(subn, 0),
2896 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002897 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 }
2899 }
2900}
2901
2902static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002903com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002904{
2905 REQ(n, exec_stmt);
2906 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2907 com_node(c, CHILD(n, 1));
2908 if (NCH(n) >= 4)
2909 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002910 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002911 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002912 com_push(c, 1);
2913 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002914 if (NCH(n) >= 6)
2915 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002916 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002917 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 com_push(c, 1);
2919 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002920 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002922}
2923
Guido van Rossum7c531111997-03-11 18:42:21 +00002924static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002926{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002927 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002928 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002929 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00002930
2931 /* Label to avoid tail recursion */
2932 next:
2933 switch (TYPE(n)) {
2934
2935 case suite:
2936 if (NCH(n) == 1) {
2937 n = CHILD(n, 0);
2938 goto next;
2939 }
2940 /* Fall through */
2941 case file_input:
2942 for (i = 0; i < NCH(n); i++) {
2943 node *ch = CHILD(n, i);
2944 if (TYPE(ch) == stmt) {
2945 n = ch;
2946 goto next;
2947 }
2948 }
2949 break;
2950
2951 case stmt:
2952 case simple_stmt:
2953 case small_stmt:
2954 n = CHILD(n, 0);
2955 goto next;
2956
2957 case expr_stmt:
2958 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002959 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00002960 case test:
2961 case and_test:
2962 case not_test:
2963 case comparison:
2964 case expr:
2965 case xor_expr:
2966 case and_expr:
2967 case shift_expr:
2968 case arith_expr:
2969 case term:
2970 case factor:
2971 case power:
2972 case atom:
2973 if (NCH(n) == 1) {
2974 n = CHILD(n, 0);
2975 goto next;
2976 }
2977 break;
2978
2979 case NAME:
2980 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
2981 return 1;
2982 break;
2983
2984 case NUMBER:
2985 v = parsenumber(c, STR(n));
2986 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002987 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002988 break;
2989 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002990 i = PyObject_IsTrue(v);
2991 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00002992 return i == 0;
2993
2994 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002995 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00002996 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00002998 break;
2999 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003000 i = PyObject_IsTrue(v);
3001 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003002 return i == 0;
3003
3004 }
3005 return 0;
3006}
3007
Tim Peters08a898f2001-06-28 01:52:22 +00003008
3009/* Look under n for a return stmt with an expression.
3010 * This hack is used to find illegal returns under "if 0:" blocks in
3011 * functions already known to be generators (as determined by the symtable
3012 * pass).
3013 * Return the offending return node if found, else NULL.
3014 */
3015static node *
3016look_for_offending_return(node *n)
3017{
3018 int i;
3019
3020 for (i = 0; i < NCH(n); ++i) {
3021 node *kid = CHILD(n, i);
3022
3023 switch (TYPE(kid)) {
3024 case classdef:
3025 case funcdef:
3026 case lambdef:
3027 /* Stuff in nested functions & classes doesn't
3028 affect the code block we started in. */
3029 return NULL;
3030
3031 case return_stmt:
3032 if (NCH(kid) > 1)
3033 return kid;
3034 break;
3035
3036 default: {
3037 node *bad = look_for_offending_return(kid);
3038 if (bad != NULL)
3039 return bad;
3040 }
3041 }
3042 }
3043
3044 return NULL;
3045}
3046
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003047static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003048com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049{
3050 int i;
3051 int anchor = 0;
3052 REQ(n, if_stmt);
3053 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3054 for (i = 0; i+3 < NCH(n); i+=4) {
3055 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003056 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003057 if (is_constant_false(c, ch)) {
3058 /* We're going to skip this block. However, if this
3059 is a generator, we have to check the dead code
3060 anyway to make sure there aren't any return stmts
3061 with expressions, in the same scope. */
3062 if (c->c_flags & CO_GENERATOR) {
3063 node *p = look_for_offending_return(n);
3064 if (p != NULL) {
3065 int savelineno = c->c_lineno;
3066 c->c_lineno = p->n_lineno;
3067 com_error(c, PyExc_SyntaxError,
3068 "'return' with argument "
3069 "inside generator");
3070 c->c_lineno = savelineno;
3071 }
3072 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003073 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003074 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003075 if (i > 0)
3076 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003077 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078 com_addfwref(c, JUMP_IF_FALSE, &a);
3079 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 com_node(c, CHILD(n, i+3));
3082 com_addfwref(c, JUMP_FORWARD, &anchor);
3083 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 com_addbyte(c, POP_TOP);
3086 }
3087 if (i+2 < NCH(n))
3088 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003089 if (anchor)
3090 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091}
3092
3093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003094com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095{
3096 int break_anchor = 0;
3097 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003098 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3100 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003101 block_push(c, SETUP_LOOP);
3102 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003103 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 com_node(c, CHILD(n, 1));
3105 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3106 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003108 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003110 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003111 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3112 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003114 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115 com_addbyte(c, POP_TOP);
3116 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003117 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 if (NCH(n) > 4)
3119 com_node(c, CHILD(n, 6));
3120 com_backpatch(c, break_anchor);
3121}
3122
3123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003124com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 int break_anchor = 0;
3127 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003128 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 REQ(n, for_stmt);
3130 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3131 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003132 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003134 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003135 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003136 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003137 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003139 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003140 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003142 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003143 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3144 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003146 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003148 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 if (NCH(n) > 8)
3150 com_node(c, CHILD(n, 8));
3151 com_backpatch(c, break_anchor);
3152}
3153
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003154/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003155
3156 SETUP_FINALLY L
3157 <code for S>
3158 POP_BLOCK
3159 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003160 L: <code for Sf>
3161 END_FINALLY
3162
3163 The special instructions use the block stack. Each block
3164 stack entry contains the instruction that created it (here
3165 SETUP_FINALLY), the level of the value stack at the time the
3166 block stack entry was created, and a label (here L).
3167
3168 SETUP_FINALLY:
3169 Pushes the current value stack level and the label
3170 onto the block stack.
3171 POP_BLOCK:
3172 Pops en entry from the block stack, and pops the value
3173 stack until its level is the same as indicated on the
3174 block stack. (The label is ignored.)
3175 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003176 Pops a variable number of entries from the *value* stack
3177 and re-raises the exception they specify. The number of
3178 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003179
3180 The block stack is unwound when an exception is raised:
3181 when a SETUP_FINALLY entry is found, the exception is pushed
3182 onto the value stack (and the exception condition is cleared),
3183 and the interpreter jumps to the label gotten from the block
3184 stack.
3185
3186 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003187 (The contents of the value stack is shown in [], with the top
3188 at the right; 'tb' is trace-back info, 'val' the exception's
3189 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003190
3191 Value stack Label Instruction Argument
3192 [] SETUP_EXCEPT L1
3193 [] <code for S>
3194 [] POP_BLOCK
3195 [] JUMP_FORWARD L0
3196
Guido van Rossum3f5da241990-12-20 15:06:42 +00003197 [tb, val, exc] L1: DUP )
3198 [tb, val, exc, exc] <evaluate E1> )
3199 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3200 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3201 [tb, val, exc, 1] POP )
3202 [tb, val, exc] POP
3203 [tb, val] <assign to V1> (or POP if no V1)
3204 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003205 [] <code for S1>
3206 JUMP_FORWARD L0
3207
Guido van Rossum3f5da241990-12-20 15:06:42 +00003208 [tb, val, exc, 0] L2: POP
3209 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003210 .............................etc.......................
3211
Guido van Rossum3f5da241990-12-20 15:06:42 +00003212 [tb, val, exc, 0] Ln+1: POP
3213 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003214
3215 [] L0: <next statement>
3216
3217 Of course, parts are not generated if Vi or Ei is not present.
3218*/
3219
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003221com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003222{
3223 int except_anchor = 0;
3224 int end_anchor = 0;
3225 int else_anchor = 0;
3226 int i;
3227 node *ch;
3228
3229 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3230 block_push(c, SETUP_EXCEPT);
3231 com_node(c, CHILD(n, 2));
3232 com_addbyte(c, POP_BLOCK);
3233 block_pop(c, SETUP_EXCEPT);
3234 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3235 com_backpatch(c, except_anchor);
3236 for (i = 3;
3237 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3238 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003239 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003240 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003241 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003242 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003243 break;
3244 }
3245 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003246 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003247 com_addoparg(c, SET_LINENO, ch->n_lineno);
3248 if (NCH(ch) > 1) {
3249 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003250 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003251 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003252 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003253 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003254 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3255 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003256 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003257 }
3258 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003259 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003260 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003261 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003263 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 com_pop(c, 1);
3265 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003266 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003268 com_node(c, CHILD(n, i+2));
3269 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3270 if (except_anchor) {
3271 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003272 /* We come in with [tb, val, exc, 0] on the
3273 stack; one pop and it's the same as
3274 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003275 com_addbyte(c, POP_TOP);
3276 }
3277 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003278 /* We actually come in here with [tb, val, exc] but the
3279 END_FINALLY will zap those and jump around.
3280 The c_stacklevel does not reflect them so we need not pop
3281 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003282 com_addbyte(c, END_FINALLY);
3283 com_backpatch(c, else_anchor);
3284 if (i < NCH(n))
3285 com_node(c, CHILD(n, i+2));
3286 com_backpatch(c, end_anchor);
3287}
3288
3289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003290com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291{
3292 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003293 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003294
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003295 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3296 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003298 com_addbyte(c, POP_BLOCK);
3299 block_pop(c, SETUP_FINALLY);
3300 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003301 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 /* While the generated code pushes only one item,
3303 the try-finally handling can enter here with
3304 up to three items. OK, here are the details:
3305 3 for an exception, 2 for RETURN, 1 for BREAK. */
3306 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003307 com_backpatch(c, finally_anchor);
3308 ch = CHILD(n, NCH(n)-1);
3309 com_addoparg(c, SET_LINENO, ch->n_lineno);
3310 com_node(c, ch);
3311 com_addbyte(c, END_FINALLY);
3312 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003313 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003314}
3315
3316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003318{
3319 REQ(n, try_stmt);
3320 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3321 | 'try' ':' suite 'finally' ':' suite */
3322 if (TYPE(CHILD(n, 3)) != except_clause)
3323 com_try_finally(c, n);
3324 else
3325 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326}
3327
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003330{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003331 int i;
3332
Guido van Rossum8b993a91997-01-17 21:04:03 +00003333 /* Label to avoid tail recursion */
3334 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003335 switch (TYPE(n)) {
3336
3337 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003338 if (NCH(n) == 1) {
3339 n = CHILD(n, 0);
3340 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003341 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003343 case file_input:
3344 for (i = 0; i < NCH(n); i++) {
3345 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003346 if (TYPE(ch) == stmt) {
3347 n = ch;
3348 goto next;
3349 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003350 }
3351 break;
3352
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003353 case stmt:
3354 case simple_stmt:
3355 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003356 n = CHILD(n, 0);
3357 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003358
3359 case expr_stmt:
3360 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003361 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003362 case test:
3363 case and_test:
3364 case not_test:
3365 case comparison:
3366 case expr:
3367 case xor_expr:
3368 case and_expr:
3369 case shift_expr:
3370 case arith_expr:
3371 case term:
3372 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003373 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 if (NCH(n) == 1) {
3375 n = CHILD(n, 0);
3376 goto next;
3377 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003378 break;
3379
3380 case atom:
3381 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003383 break;
3384
3385 }
3386 return NULL;
3387}
3388
Guido van Rossum79f25d91997-04-29 20:08:16 +00003389static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003390get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391{
Guido van Rossum541563e1999-01-28 15:08:09 +00003392 /* Don't generate doc-strings if run with -OO */
3393 if (Py_OptimizeFlag > 1)
3394 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003395 n = get_rawdocstring(n);
3396 if (n == NULL)
3397 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003398 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399}
3400
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003402com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403{
3404 REQ(n, suite);
3405 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3406 if (NCH(n) == 1) {
3407 com_node(c, CHILD(n, 0));
3408 }
3409 else {
3410 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003411 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 node *ch = CHILD(n, i);
3413 if (TYPE(ch) == stmt)
3414 com_node(c, ch);
3415 }
3416 }
3417}
3418
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003419/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003420static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003421com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003422{
3423 int i = c->c_nblocks;
3424 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3425 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3426 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003427 else if (i <= 0) {
3428 /* at the outer level */
3429 com_error(c, PyExc_SyntaxError,
3430 "'continue' not properly in loop");
3431 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003432 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003433 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003434 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003435 if (c->c_block[j] == SETUP_LOOP)
3436 break;
3437 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003438 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003439 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003440 for (; i > j; --i) {
3441 if (c->c_block[i] == SETUP_EXCEPT ||
3442 c->c_block[i] == SETUP_FINALLY) {
3443 com_addoparg(c, CONTINUE_LOOP,
3444 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003445 return;
3446 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003447 if (c->c_block[i] == END_FINALLY) {
3448 com_error(c, PyExc_SyntaxError,
3449 "'continue' not supported inside 'finally' clause");
3450 return;
3451 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003452 }
3453 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003454 com_error(c, PyExc_SyntaxError,
3455 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003456 }
3457 /* XXX Could allow it inside a 'finally' clause
3458 XXX if we could pop the exception still on the stack */
3459}
3460
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003461static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003462com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003463{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003464 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003465 if (TYPE(n) == lambdef) {
3466 /* lambdef: 'lambda' [varargslist] ':' test */
3467 n = CHILD(n, 1);
3468 }
3469 else {
3470 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3471 n = CHILD(n, 2);
3472 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3473 n = CHILD(n, 1);
3474 }
3475 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003476 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003477 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003478 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003479 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3480 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003481 nargs = 0;
3482 ndefs = 0;
3483 for (i = 0; i < nch; i++) {
3484 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003485 if (TYPE(CHILD(n, i)) == STAR ||
3486 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003487 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003488 nargs++;
3489 i++;
3490 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003491 t = RPAR; /* Anything except EQUAL or COMMA */
3492 else
3493 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003494 if (t == EQUAL) {
3495 i++;
3496 ndefs++;
3497 com_node(c, CHILD(n, i));
3498 i++;
3499 if (i >= nch)
3500 break;
3501 t = TYPE(CHILD(n, i));
3502 }
3503 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003504 /* Treat "(a=1, b)" as an error */
3505 if (ndefs)
3506 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003507 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003508 }
3509 if (t != COMMA)
3510 break;
3511 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003512 return ndefs;
3513}
3514
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003516com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003518 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003519 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003521 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003522 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3523 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003524 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003525 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003526 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 c->c_errors++;
3528 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003529 int closure = com_make_closure(c, (PyCodeObject *)co);
3530 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003532 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003533 if (closure)
3534 com_addoparg(c, MAKE_CLOSURE, ndefs);
3535 else
3536 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003538 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003539 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003540 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003541 }
3542}
3543
3544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003546{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003547 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003548 REQ(n, testlist);
3549 /* testlist: test (',' test)* [','] */
3550 for (i = 0; i < NCH(n); i += 2)
3551 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003552 i = (NCH(n)+1) / 2;
3553 com_addoparg(c, BUILD_TUPLE, i);
3554 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003555}
3556
3557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003558com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559{
Guido van Rossum25831651993-05-19 14:50:45 +00003560 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003561 PyObject *v;
3562 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003563 char *name;
3564
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003566 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003567 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003568 c->c_errors++;
3569 return;
3570 }
3571 /* Push the class name on the stack */
3572 i = com_addconst(c, v);
3573 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003575 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003576 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003578 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 com_push(c, 1);
3580 }
Guido van Rossum25831651993-05-19 14:50:45 +00003581 else
3582 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003583 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003584 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003585 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003586 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003587 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003588 c->c_errors++;
3589 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003590 int closure = com_make_closure(c, co);
3591 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003592 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003593 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003594 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003595 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003596 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003597 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003598 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003599 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003600 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003601 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003602 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003603 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003604 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003605 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606}
3607
3608static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003609com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003611 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003612 if (c->c_errors)
3613 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003614 switch (TYPE(n)) {
3615
3616 /* Definition nodes */
3617
3618 case funcdef:
3619 com_funcdef(c, n);
3620 break;
3621 case classdef:
3622 com_classdef(c, n);
3623 break;
3624
3625 /* Trivial parse tree nodes */
3626
3627 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003628 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003630 n = CHILD(n, 0);
3631 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632
3633 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003634 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3635 com_addoparg(c, SET_LINENO, n->n_lineno);
3636 {
3637 int i;
3638 for (i = 0; i < NCH(n)-1; i += 2)
3639 com_node(c, CHILD(n, i));
3640 }
3641 break;
3642
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003644 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003645 n = CHILD(n, 0);
3646 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003647
3648 /* Statement nodes */
3649
3650 case expr_stmt:
3651 com_expr_stmt(c, n);
3652 break;
3653 case print_stmt:
3654 com_print_stmt(c, n);
3655 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003656 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003657 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003658 break;
3659 case pass_stmt:
3660 break;
3661 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003662 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003663 com_error(c, PyExc_SyntaxError,
3664 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003665 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666 com_addbyte(c, BREAK_LOOP);
3667 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003668 case continue_stmt:
3669 com_continue_stmt(c, n);
3670 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003671 case return_stmt:
3672 com_return_stmt(c, n);
3673 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003674 case yield_stmt:
3675 com_yield_stmt(c, n);
3676 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003677 case raise_stmt:
3678 com_raise_stmt(c, n);
3679 break;
3680 case import_stmt:
3681 com_import_stmt(c, n);
3682 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003683 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003684 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003685 case exec_stmt:
3686 com_exec_stmt(c, n);
3687 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003688 case assert_stmt:
3689 com_assert_stmt(c, n);
3690 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 case if_stmt:
3692 com_if_stmt(c, n);
3693 break;
3694 case while_stmt:
3695 com_while_stmt(c, n);
3696 break;
3697 case for_stmt:
3698 com_for_stmt(c, n);
3699 break;
3700 case try_stmt:
3701 com_try_stmt(c, n);
3702 break;
3703 case suite:
3704 com_suite(c, n);
3705 break;
3706
3707 /* Expression nodes */
3708
3709 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003710 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003711 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003712 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713 break;
3714 case test:
3715 com_test(c, n);
3716 break;
3717 case and_test:
3718 com_and_test(c, n);
3719 break;
3720 case not_test:
3721 com_not_test(c, n);
3722 break;
3723 case comparison:
3724 com_comparison(c, n);
3725 break;
3726 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003727 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 break;
3729 case expr:
3730 com_expr(c, n);
3731 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003732 case xor_expr:
3733 com_xor_expr(c, n);
3734 break;
3735 case and_expr:
3736 com_and_expr(c, n);
3737 break;
3738 case shift_expr:
3739 com_shift_expr(c, n);
3740 break;
3741 case arith_expr:
3742 com_arith_expr(c, n);
3743 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744 case term:
3745 com_term(c, n);
3746 break;
3747 case factor:
3748 com_factor(c, n);
3749 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003750 case power:
3751 com_power(c, n);
3752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 case atom:
3754 com_atom(c, n);
3755 break;
3756
3757 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003758 com_error(c, PyExc_SystemError,
3759 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760 }
3761}
3762
Tim Petersdbd9ba62000-07-09 03:09:57 +00003763static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764
3765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003766com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767{
3768 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3769 if (TYPE(CHILD(n, 0)) == LPAR)
3770 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003772 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003773 com_pop(c, 1);
3774 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775}
3776
3777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003780 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781 if (NCH(n) == 1) {
3782 com_fpdef(c, CHILD(n, 0));
3783 }
3784 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003785 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003786 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788 for (i = 0; i < NCH(n); i += 2)
3789 com_fpdef(c, CHILD(n, i));
3790 }
3791}
3792
3793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003794com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003795{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003796 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003797 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003798 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003799 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003800 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003801 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003802 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003803 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003804 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003805 node *ch = CHILD(n, i);
3806 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003807 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003808 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003809 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3810 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003811 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003812 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003813 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003814 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003815 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003816 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003817 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003818 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003819 ch = CHILD(n, i);
3820 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003821 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003822 else
3823 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003824 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003825 if (complex) {
3826 /* Generate code for complex arguments only after
3827 having counted the simple arguments */
3828 int ilocal = 0;
3829 for (i = 0; i < nch; i++) {
3830 node *ch = CHILD(n, i);
3831 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003832 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003833 break;
3834 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3835 fp = CHILD(ch, 0);
3836 if (TYPE(fp) != NAME) {
3837 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003838 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003839 com_fpdef(c, ch);
3840 }
3841 ilocal++;
3842 if (++i >= nch)
3843 break;
3844 ch = CHILD(n, i);
3845 if (TYPE(ch) == EQUAL)
3846 i += 2;
3847 else
3848 REQ(ch, COMMA);
3849 }
3850 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003851}
3852
3853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003854com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855{
3856 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003857 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003859 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003860 if (doc != NULL) {
3861 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003862 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003863 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003864 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003867 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 for (i = 0; i < NCH(n); i++) {
3869 node *ch = CHILD(n, i);
3870 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3871 com_node(c, ch);
3872 }
3873}
3874
3875/* Top-level compile-node interface */
3876
3877static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003878compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003879{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003880 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 node *ch;
3882 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003883 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003884 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003885 if (doc != NULL) {
3886 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003888 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003889 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003890 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003891 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3892 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003893 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003894 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003895 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003898 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3899 com_push(c, 1);
3900 com_addbyte(c, RETURN_VALUE);
3901 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902}
3903
3904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003905compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003906{
Guido van Rossum590baa41993-11-30 13:40:46 +00003907 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003908 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003909 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003910
3911 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003912 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003913 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003914 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003915 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003916 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003917 else
3918 ch = CHILD(n, 2);
3919 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003920 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003921 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003922}
3923
3924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003925compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003926{
3927 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003928 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003929 REQ(n, classdef);
3930 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
3931 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00003932 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00003933 /* Initialize local __module__ from global __name__ */
3934 com_addop_name(c, LOAD_GLOBAL, "__name__");
3935 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003936 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003937 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003938 if (doc != NULL) {
3939 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003940 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003941 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003942 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003943 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003944 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003945 }
3946 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003947 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003948 com_node(c, ch);
3949 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003950 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003951 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003952 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003953}
3954
3955static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003956compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003957{
Guido van Rossum3f5da241990-12-20 15:06:42 +00003958 com_addoparg(c, SET_LINENO, n->n_lineno);
3959
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003960 switch (TYPE(n)) {
3961
Guido van Rossum4c417781991-01-21 16:09:22 +00003962 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003963 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965 n = CHILD(n, 0);
3966 if (TYPE(n) != NEWLINE)
3967 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003969 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003970 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003971 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003972 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003973 break;
3974
Guido van Rossum4c417781991-01-21 16:09:22 +00003975 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 com_file_input(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 Rossum10dc2e81990-11-18 17:27:39 +00003981 break;
3982
Guido van Rossum590baa41993-11-30 13:40:46 +00003983 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00003984 com_node(c, CHILD(n, 0));
3985 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00003987 break;
3988
Guido van Rossum590baa41993-11-30 13:40:46 +00003989 case lambdef: /* anonymous function definition */
3990 compile_lambdef(c, n);
3991 break;
3992
Guido van Rossum4c417781991-01-21 16:09:22 +00003993 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003994 compile_funcdef(c, n);
3995 break;
3996
Guido van Rossum4c417781991-01-21 16:09:22 +00003997 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003998 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003999 break;
4000
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004001 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004002 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004003 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004004 }
4005}
4006
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004007static PyObject *
4008dict_keys_inorder(PyObject *dict, int offset)
4009{
4010 PyObject *tuple, *k, *v;
4011 int i, pos = 0, size = PyDict_Size(dict);
4012
4013 tuple = PyTuple_New(size);
4014 if (tuple == NULL)
4015 return NULL;
4016 while (PyDict_Next(dict, &pos, &k, &v)) {
4017 i = PyInt_AS_LONG(v);
4018 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004019 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004020 PyTuple_SET_ITEM(tuple, i - offset, k);
4021 }
4022 return tuple;
4023}
4024
Guido van Rossum79f25d91997-04-29 20:08:16 +00004025PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004027{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004028 return PyNode_CompileFlags(n, filename, NULL);
4029}
4030
4031PyCodeObject *
4032PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4033{
4034 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004035}
4036
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004037struct symtable *
4038PyNode_CompileSymtable(node *n, char *filename)
4039{
4040 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004041 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004042
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004043 ff = PyNode_Future(n, filename);
4044 if (ff == NULL)
4045 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004046
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004047 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004048 if (st == NULL) {
4049 PyMem_Free((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004050 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004051 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004052 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004053 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004054 if (st->st_errors > 0)
4055 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004056 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004057 if (st->st_errors > 0)
4058 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004059
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004060 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004061 fail:
4062 PyMem_Free((void *)ff);
4063 st->st_future = NULL;
4064 PySymtable_Free(st);
4065 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004066}
4067
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004069icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004070{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004071 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004072}
4073
Guido van Rossum79f25d91997-04-29 20:08:16 +00004074static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004075jcompile(node *n, char *filename, struct compiling *base,
4076 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004077{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004079 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004080 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004081 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004082 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004083 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004084 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004085 /* c_symtable still points to parent's symbols */
4086 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004087 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004088 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004089 sc.c_flags |= base->c_flags & PyCF_MASK;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004090 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004091 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004092 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004093 if (sc.c_future == NULL) {
4094 com_free(&sc);
4095 return NULL;
4096 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004097 if (flags) {
4098 int merged = sc.c_future->ff_features |
4099 flags->cf_flags;
4100 sc.c_future->ff_features = merged;
4101 flags->cf_flags = merged;
4102 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004103 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004104 com_free(&sc);
4105 return NULL;
4106 }
4107 }
4108 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004109 if (symtable_load_symbols(&sc) < 0) {
4110 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004111 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004112 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004113 compile_node(&sc, n);
4114 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004115 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004116 PyObject *consts, *names, *varnames, *filename, *name,
4117 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004118 consts = PyList_AsTuple(sc.c_consts);
4119 names = PyList_AsTuple(sc.c_names);
4120 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004121 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4122 freevars = dict_keys_inorder(sc.c_freevars,
4123 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004124 filename = PyString_InternFromString(sc.c_filename);
4125 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004126 if (!PyErr_Occurred())
4127 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004128 sc.c_nlocals,
4129 sc.c_maxstacklevel,
4130 sc.c_flags,
4131 sc.c_code,
4132 consts,
4133 names,
4134 varnames,
4135 freevars,
4136 cellvars,
4137 filename,
4138 name,
4139 sc.c_firstlineno,
4140 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004141 Py_XDECREF(consts);
4142 Py_XDECREF(names);
4143 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004144 Py_XDECREF(freevars);
4145 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004146 Py_XDECREF(filename);
4147 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004148 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004149 else if (!PyErr_Occurred()) {
4150 /* This could happen if someone called PyErr_Clear() after an
4151 error was reported above. That's not supposed to happen,
4152 but I just plugged one case and I'm not sure there can't be
4153 others. In that case, raise SystemError so that at least
4154 it gets reported instead dumping core. */
4155 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4156 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004157 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004158 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004159 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004160 sc.c_symtable = NULL;
4161 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004162 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004163 return co;
4164}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004165
4166int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004167PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004168{
4169 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004170 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004171 int line = co->co_firstlineno;
4172 int addr = 0;
4173 while (--size >= 0) {
4174 addr += *p++;
4175 if (addr > addrq)
4176 break;
4177 line += *p++;
4178 }
4179 return line;
4180}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004182/* The test for LOCAL must come before the test for FREE in order to
4183 handle classes where name is both local and free. The local var is
4184 a method and the free var is a free var referenced within a method.
4185*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004186
4187static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004188get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004189{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004190 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004191 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004192
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004193 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4194 return CELL;
4195 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4196 return LOCAL;
4197 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4198 return FREE;
4199 v = PyDict_GetItemString(c->c_globals, name);
4200 if (v) {
4201 if (v == Py_None)
4202 return GLOBAL_EXPLICIT;
4203 else {
4204 return GLOBAL_IMPLICIT;
4205 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004206 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004207 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004208 "unknown scope for %.100s in %.100s(%s) "
4209 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4210 name, c->c_name,
4211 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4212 c->c_filename,
4213 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4214 PyObject_REPR(c->c_locals),
4215 PyObject_REPR(c->c_globals)
4216 );
4217
4218 Py_FatalError(buf);
4219 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004220}
4221
Guido van Rossum207fda62001-03-02 03:30:41 +00004222/* Helper functions to issue warnings */
4223
4224static int
4225issue_warning(char *msg, char *filename, int lineno)
4226{
4227 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4228 lineno, NULL, NULL) < 0) {
4229 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4230 PyErr_SetString(PyExc_SyntaxError, msg);
4231 PyErr_SyntaxLocation(filename, lineno);
4232 }
4233 return -1;
4234 }
4235 return 0;
4236}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004237
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004238static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004239symtable_warn(struct symtable *st, char *msg)
4240{
Guido van Rossum207fda62001-03-02 03:30:41 +00004241 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004242 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004243 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004244 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004245 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004246}
4247
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004248/* Helper function for setting lineno and filename */
4249
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250static int
4251symtable_build(struct compiling *c, node *n)
4252{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004253 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004254 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004255 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004256 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004257 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4258 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004259 return -1;
4260 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004261 if (c->c_symtable->st_errors > 0)
4262 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004263 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004264 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004265 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004266 return 0;
4267}
4268
4269static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004270symtable_init_compiling_symbols(struct compiling *c)
4271{
4272 PyObject *varnames;
4273
4274 varnames = c->c_symtable->st_cur->ste_varnames;
4275 if (varnames == NULL) {
4276 varnames = PyList_New(0);
4277 if (varnames == NULL)
4278 return -1;
4279 c->c_symtable->st_cur->ste_varnames = varnames;
4280 Py_INCREF(varnames);
4281 } else
4282 Py_INCREF(varnames);
4283 c->c_varnames = varnames;
4284
4285 c->c_globals = PyDict_New();
4286 if (c->c_globals == NULL)
4287 return -1;
4288 c->c_freevars = PyDict_New();
4289 if (c->c_freevars == NULL)
4290 return -1;
4291 c->c_cellvars = PyDict_New();
4292 if (c->c_cellvars == NULL)
4293 return -1;
4294 return 0;
4295}
4296
4297struct symbol_info {
4298 int si_nlocals;
4299 int si_ncells;
4300 int si_nfrees;
4301 int si_nimplicit;
4302};
4303
4304static void
4305symtable_init_info(struct symbol_info *si)
4306{
4307 si->si_nlocals = 0;
4308 si->si_ncells = 0;
4309 si->si_nfrees = 0;
4310 si->si_nimplicit = 0;
4311}
4312
4313static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004314symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004315 struct symbol_info *si)
4316{
4317 PyObject *dict, *v;
4318
4319 /* Seperate logic for DEF_FREE. If it occurs in a function,
4320 it indicates a local that we must allocate storage for (a
4321 cell var). If it occurs in a class, then the class has a
4322 method and a free variable with the same name.
4323 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004324 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004325 /* If it isn't declared locally, it can't be a cell. */
4326 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4327 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004328 v = PyInt_FromLong(si->si_ncells++);
4329 dict = c->c_cellvars;
4330 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004331 /* If it is free anyway, then there is no need to do
4332 anything here.
4333 */
4334 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004335 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004336 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004337 v = PyInt_FromLong(si->si_nfrees++);
4338 dict = c->c_freevars;
4339 }
4340 if (v == NULL)
4341 return -1;
4342 if (PyDict_SetItem(dict, name, v) < 0) {
4343 Py_DECREF(v);
4344 return -1;
4345 }
4346 Py_DECREF(v);
4347 return 0;
4348}
4349
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004350/* If a variable is a cell and an argument, make sure that appears in
4351 co_cellvars before any variable to its right in varnames.
4352*/
4353
4354
4355static int
4356symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4357 PyObject *varnames, int flags)
4358{
4359 PyObject *v, *w, *d, *list = NULL;
4360 int i, pos;
4361
4362 if (flags & CO_VARARGS)
4363 argcount++;
4364 if (flags & CO_VARKEYWORDS)
4365 argcount++;
4366 for (i = argcount; --i >= 0; ) {
4367 v = PyList_GET_ITEM(varnames, i);
4368 if (PyDict_GetItem(*cellvars, v)) {
4369 if (list == NULL) {
4370 list = PyList_New(1);
4371 if (list == NULL)
4372 return -1;
4373 PyList_SET_ITEM(list, 0, v);
4374 Py_INCREF(v);
4375 } else
4376 PyList_Insert(list, 0, v);
4377 }
4378 }
4379 if (list == NULL || PyList_GET_SIZE(list) == 0)
4380 return 0;
4381 /* There are cellvars that are also arguments. Create a dict
4382 to replace cellvars and put the args at the front.
4383 */
4384 d = PyDict_New();
4385 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4386 v = PyInt_FromLong(i);
4387 if (v == NULL)
4388 goto fail;
4389 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4390 goto fail;
4391 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4392 goto fail;
4393 }
4394 pos = 0;
4395 i = PyList_GET_SIZE(list);
4396 Py_DECREF(list);
4397 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4398 w = PyInt_FromLong(i++); /* don't care about the old key */
4399 if (PyDict_SetItem(d, v, w) < 0) {
4400 Py_DECREF(w);
4401 goto fail;
4402 }
4403 Py_DECREF(w);
4404 }
4405 Py_DECREF(*cellvars);
4406 *cellvars = d;
4407 return 1;
4408 fail:
4409 Py_DECREF(d);
4410 return -1;
4411}
4412
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004413static int
4414symtable_freevar_offsets(PyObject *freevars, int offset)
4415{
4416 PyObject *name, *v;
4417 int pos;
4418
4419 /* The cell vars are the first elements of the closure,
4420 followed by the free vars. Update the offsets in
4421 c_freevars to account for number of cellvars. */
4422 pos = 0;
4423 while (PyDict_Next(freevars, &pos, &name, &v)) {
4424 int i = PyInt_AS_LONG(v) + offset;
4425 PyObject *o = PyInt_FromLong(i);
4426 if (o == NULL)
4427 return -1;
4428 if (PyDict_SetItem(freevars, name, o) < 0) {
4429 Py_DECREF(o);
4430 return -1;
4431 }
4432 Py_DECREF(o);
4433 }
4434 return 0;
4435}
4436
4437static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004438symtable_check_unoptimized(struct compiling *c,
4439 PySymtableEntryObject *ste,
4440 struct symbol_info *si)
4441{
4442 char buf[300];
4443
4444 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4445 || (ste->ste_nested && si->si_nimplicit)))
4446 return 0;
4447
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004448#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4449
4450#define ILLEGAL_IS "is a nested function"
4451
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004452#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004453"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004454
4455#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004456"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004457
4458#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004459"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004460"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004461
4462 /* XXX perhaps the linenos for these opt-breaking statements
4463 should be stored so the exception can point to them. */
4464
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004465 if (ste->ste_child_free) {
4466 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004467 PyOS_snprintf(buf, sizeof(buf),
4468 ILLEGAL_IMPORT_STAR,
4469 PyString_AS_STRING(ste->ste_name),
4470 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004471 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004472 PyOS_snprintf(buf, sizeof(buf),
4473 ILLEGAL_BARE_EXEC,
4474 PyString_AS_STRING(ste->ste_name),
4475 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004476 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004477 PyOS_snprintf(buf, sizeof(buf),
4478 ILLEGAL_EXEC_AND_IMPORT_STAR,
4479 PyString_AS_STRING(ste->ste_name),
4480 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004481 }
4482 } else {
4483 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004484 PyOS_snprintf(buf, sizeof(buf),
4485 ILLEGAL_IMPORT_STAR,
4486 PyString_AS_STRING(ste->ste_name),
4487 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004488 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004489 PyOS_snprintf(buf, sizeof(buf),
4490 ILLEGAL_BARE_EXEC,
4491 PyString_AS_STRING(ste->ste_name),
4492 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004493 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004494 PyOS_snprintf(buf, sizeof(buf),
4495 ILLEGAL_EXEC_AND_IMPORT_STAR,
4496 PyString_AS_STRING(ste->ste_name),
4497 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004498 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004499 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004500
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004501 PyErr_SetString(PyExc_SyntaxError, buf);
4502 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4503 ste->ste_opt_lineno);
4504 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004505}
4506
4507static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004508symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4509 struct symbol_info *si)
4510{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004511 if (c->c_future)
4512 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004513 if (ste->ste_generator)
4514 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004515 if (ste->ste_type != TYPE_MODULE)
4516 c->c_flags |= CO_NEWLOCALS;
4517 if (ste->ste_type == TYPE_FUNCTION) {
4518 c->c_nlocals = si->si_nlocals;
4519 if (ste->ste_optimized == 0)
4520 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004521 else if (ste->ste_optimized != OPT_EXEC)
4522 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004523 }
4524 return 0;
4525}
4526
4527static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004528symtable_load_symbols(struct compiling *c)
4529{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004530 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004531 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004532 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004533 PyObject *name, *varnames, *v;
4534 int i, flags, pos;
4535 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004536
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004537 if (implicit == NULL) {
4538 implicit = PyInt_FromLong(1);
4539 if (implicit == NULL)
4540 return -1;
4541 }
4542 v = NULL;
4543
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004544 if (symtable_init_compiling_symbols(c) < 0)
4545 goto fail;
4546 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004547 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004548 si.si_nlocals = PyList_GET_SIZE(varnames);
4549 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004551 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004552 v = PyInt_FromLong(i);
4553 if (PyDict_SetItem(c->c_locals,
4554 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004555 goto fail;
4556 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557 }
4558
4559 /* XXX The cases below define the rules for whether a name is
4560 local or global. The logic could probably be clearer. */
4561 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004562 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4563 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004564
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004565 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004566 /* undo the original DEF_FREE */
4567 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004569 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004570 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004571 2. Free variables in methods that are also class
4572 variables or declared global.
4573 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004574 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004575 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004576
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004577 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004578 c->c_argcount--;
4579 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004580 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004581 c->c_argcount--;
4582 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004583 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004584 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004585 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004586 if (flags & DEF_PARAM) {
4587 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004588 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004589 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004590 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004591 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004594 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4595 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004596 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004597 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004598 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4599 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004600 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004601 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004602 if (v == NULL)
4603 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004605 goto fail;
4606 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004607 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004608 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004609 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004610 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004611 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004612 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004613 if (v == NULL)
4614 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004615 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004616 goto fail;
4617 Py_DECREF(v);
4618 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004619 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004620 if (PyDict_SetItem(c->c_globals, name,
4621 implicit) < 0)
4622 goto fail;
4623 if (st->st_nscopes != 1) {
4624 v = PyInt_FromLong(flags);
4625 if (PyDict_SetItem(st->st_global,
4626 name, v))
4627 goto fail;
4628 Py_DECREF(v);
4629 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004630 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004631 }
4632 }
4633
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004634 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4635
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004636 if (si.si_ncells > 1) { /* one cell is always in order */
4637 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4638 c->c_varnames, c->c_flags) < 0)
4639 return -1;
4640 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004641 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4642 return -1;
4643 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 fail:
4645 /* is this always the right thing to do? */
4646 Py_XDECREF(v);
4647 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648}
4649
4650static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004651symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652{
4653 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004654
4655 st = (struct symtable *)PyMem_Malloc(sizeof(struct symtable));
4656 if (st == NULL)
4657 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004658 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004659
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004660 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004661 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 goto fail;
4663 if ((st->st_symbols = PyDict_New()) == NULL)
4664 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004665 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004666 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004667 st->st_errors = 0;
4668 st->st_tmpname = 0;
4669 st->st_private = NULL;
4670 return st;
4671 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004672 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 return NULL;
4674}
4675
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004676void
4677PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004678{
4679 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004680 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004681 Py_XDECREF(st->st_cur);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004682 PyMem_Free((void *)st);
4683}
4684
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004685/* When the compiler exits a scope, it must should update the scope's
4686 free variable information with the list of free variables in its
4687 children.
4688
4689 Variables that are free in children and defined in the current
4690 scope are cellvars.
4691
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004692 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004693 false), free variables in children that are not defined here are
4694 implicit globals.
4695
4696*/
4697
4698static int
4699symtable_update_free_vars(struct symtable *st)
4700{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004701 int i, j, def;
4702 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004703 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004704
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004705 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004706 def = DEF_FREE_CLASS;
4707 else
4708 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004709 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004710 int pos = 0;
4711
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004712 if (list)
4713 PyList_SetSlice(list, 0,
4714 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004715 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004716 PyList_GET_ITEM(ste->ste_children, i);
4717 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004718 int flags = PyInt_AS_LONG(o);
4719 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004720 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004721 if (list == NULL) {
4722 list = PyList_New(0);
4723 if (list == NULL)
4724 return -1;
4725 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004726 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004727 if (PyList_Append(list, name) < 0) {
4728 Py_DECREF(list);
4729 return -1;
4730 }
4731 }
4732 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004733 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004734 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004735 v = PyDict_GetItem(ste->ste_symbols, name);
4736 /* If a name N is declared global in scope A and
4737 referenced in scope B contained (perhaps
4738 indirectly) in A and there are no scopes
4739 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004740 is global in B. Unless A is a class scope,
4741 because class scopes are not considered for
4742 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004743 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004744 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004745 int flags = PyInt_AS_LONG(v);
4746 if (flags & DEF_GLOBAL) {
4747 symtable_undo_free(st, child->ste_id,
4748 name);
4749 continue;
4750 }
4751 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004752 if (ste->ste_nested) {
4753 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004754 name, def) < 0) {
4755 Py_DECREF(list);
4756 return -1;
4757 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004758 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004759 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004760 name) < 0) {
4761 Py_DECREF(list);
4762 return -1;
4763 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004764 }
4765 }
4766 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004767
4768 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004769 return 0;
4770}
4771
4772/* If the current scope is a non-nested class or if name is not
4773 defined in the current, non-nested scope, then it is an implicit
4774 global in all nested scopes.
4775*/
4776
4777static int
4778symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4779{
4780 PyObject *o;
4781 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004782 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004783
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004784 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004785 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004786 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 if (o == NULL)
4788 return symtable_undo_free(st, child, name);
4789 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004790
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004791 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 return symtable_undo_free(st, child, name);
4793 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004794 return symtable_add_def_o(st, ste->ste_symbols,
4795 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004796}
4797
4798static int
4799symtable_undo_free(struct symtable *st, PyObject *id,
4800 PyObject *name)
4801{
4802 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004803 PyObject *info;
4804 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004805
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004806 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4807 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004808 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004809
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004810 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 if (info == NULL)
4812 return 0;
4813 v = PyInt_AS_LONG(info);
4814 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004815 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004816 DEF_FREE_GLOBAL) < 0)
4817 return -1;
4818 } else
4819 /* If the name is defined here or declared global,
4820 then the recursion stops. */
4821 return 0;
4822
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004823 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4824 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004825 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004826 PyList_GET_ITEM(ste->ste_children, i);
4827 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004828 if (x < 0)
4829 return x;
4830 }
4831 return 0;
4832}
4833
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004834/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4835 This reference is released when the scope is exited, via the DECREF
4836 in symtable_exit_scope().
4837*/
4838
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839static int
4840symtable_exit_scope(struct symtable *st)
4841{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004842 int end;
4843
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004844 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004846 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004847 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004848 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4849 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 if (PySequence_DelItem(st->st_stack, end) < 0)
4851 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004852 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004853}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004854
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004855static void
4856symtable_enter_scope(struct symtable *st, char *name, int type,
4857 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004859 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004860
4861 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004862 prev = st->st_cur;
4863 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4864 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004865 st->st_errors++;
4866 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867 }
4868 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004869 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004870 PySymtableEntry_New(st, name, type, lineno);
4871 if (strcmp(name, TOP) == 0)
4872 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004873 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004874 if (PyList_Append(prev->ste_children,
4875 (PyObject *)st->st_cur) < 0)
4876 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004877 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004878}
4879
4880static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004881symtable_lookup(struct symtable *st, char *name)
4882{
4883 char buffer[MANGLE_LEN];
4884 PyObject *v;
4885 int flags;
4886
4887 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
4888 name = buffer;
4889 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4890 if (v == NULL) {
4891 if (PyErr_Occurred())
4892 return -1;
4893 else
4894 return 0;
4895 }
4896
4897 flags = PyInt_AS_LONG(v);
4898 return flags;
4899}
4900
4901static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004903{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004904 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004906 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004907
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004908 if (mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004909 name = buffer;
4910 if ((s = PyString_InternFromString(name)) == NULL)
4911 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004912 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4913 Py_DECREF(s);
4914 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004915}
4916
4917/* Must only be called with mangled names */
4918
4919static int
4920symtable_add_def_o(struct symtable *st, PyObject *dict,
4921 PyObject *name, int flag)
4922{
4923 PyObject *o;
4924 int val;
4925
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004926 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004928 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004929 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00004930 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004931 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004932 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004933 return -1;
4934 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004940 Py_DECREF(o);
4941 return -1;
4942 }
4943 Py_DECREF(o);
4944
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004945 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004946 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004947 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004948 } else if (flag & DEF_GLOBAL) {
4949 /* XXX need to update DEF_GLOBAL for other flags too;
4950 perhaps only DEF_FREE_GLOBAL */
4951 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004952 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004954 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004955 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004958 Py_DECREF(o);
4959 return -1;
4960 }
4961 Py_DECREF(o);
4962 }
4963 return 0;
4964}
4965
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004966#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967
Tim Peters08a898f2001-06-28 01:52:22 +00004968/* Look for a yield stmt under n. Return 1 if found, else 0.
4969 This hack is used to look inside "if 0:" blocks (which are normally
4970 ignored) in case those are the only places a yield occurs (so that this
4971 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00004972static int
4973look_for_yield(node *n)
4974{
4975 int i;
4976
4977 for (i = 0; i < NCH(n); ++i) {
4978 node *kid = CHILD(n, i);
4979
4980 switch (TYPE(kid)) {
4981
4982 case classdef:
4983 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00004984 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00004985 /* Stuff in nested functions and classes can't make
4986 the parent a generator. */
4987 return 0;
4988
4989 case yield_stmt:
4990 return 1;
4991
4992 default:
4993 if (look_for_yield(kid))
4994 return 1;
4995 }
4996 }
4997 return 0;
4998}
4999
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005000static void
5001symtable_node(struct symtable *st, node *n)
5002{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005003 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005004
5005 loop:
5006 switch (TYPE(n)) {
5007 case funcdef: {
5008 char *func_name = STR(CHILD(n, 1));
5009 symtable_add_def(st, func_name, DEF_LOCAL);
5010 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005011 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005012 symtable_funcdef(st, n);
5013 symtable_exit_scope(st);
5014 break;
5015 }
5016 case lambdef:
5017 if (NCH(n) == 4)
5018 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005019 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005020 symtable_funcdef(st, n);
5021 symtable_exit_scope(st);
5022 break;
5023 case classdef: {
5024 char *tmp, *class_name = STR(CHILD(n, 1));
5025 symtable_add_def(st, class_name, DEF_LOCAL);
5026 if (TYPE(CHILD(n, 2)) == LPAR) {
5027 node *bases = CHILD(n, 3);
5028 int i;
5029 for (i = 0; i < NCH(bases); i += 2) {
5030 symtable_node(st, CHILD(bases, i));
5031 }
5032 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005033 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005034 tmp = st->st_private;
5035 st->st_private = class_name;
5036 symtable_node(st, CHILD(n, NCH(n) - 1));
5037 st->st_private = tmp;
5038 symtable_exit_scope(st);
5039 break;
5040 }
5041 case if_stmt:
5042 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005043 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5044 if (st->st_cur->ste_generator == 0)
5045 st->st_cur->ste_generator =
5046 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005048 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005049 symtable_node(st, CHILD(n, i + 1));
5050 symtable_node(st, CHILD(n, i + 3));
5051 }
5052 if (i + 2 < NCH(n))
5053 symtable_node(st, CHILD(n, i + 2));
5054 break;
5055 case global_stmt:
5056 symtable_global(st, n);
5057 break;
5058 case import_stmt:
5059 symtable_import(st, n);
5060 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005061 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005062 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005063 symtable_node(st, CHILD(n, 1));
5064 if (NCH(n) > 2)
5065 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005066 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005067 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005068 st->st_cur->ste_opt_lineno = n->n_lineno;
5069 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005070 if (NCH(n) > 4)
5071 symtable_node(st, CHILD(n, 5));
5072 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005073
5074 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005075 case assert_stmt:
5076 if (Py_OptimizeFlag)
5077 return;
5078 if (NCH(n) == 2) {
5079 n = CHILD(n, 1);
5080 goto loop;
5081 } else {
5082 symtable_node(st, CHILD(n, 1));
5083 n = CHILD(n, 3);
5084 goto loop;
5085 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086 case except_clause:
5087 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005088 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005089 if (NCH(n) > 1) {
5090 n = CHILD(n, 1);
5091 goto loop;
5092 }
5093 break;
5094 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005095 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005096 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005097 case yield_stmt:
5098 st->st_cur->ste_generator = 1;
5099 n = CHILD(n, 1);
5100 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005101 case expr_stmt:
5102 if (NCH(n) == 1)
5103 n = CHILD(n, 0);
5104 else {
5105 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005106 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005107 symtable_node(st, CHILD(n, 2));
5108 break;
5109 } else {
5110 int i;
5111 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005112 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005113 n = CHILD(n, NCH(n) - 1);
5114 }
5115 }
5116 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005117 case list_iter:
5118 n = CHILD(n, 0);
5119 if (TYPE(n) == list_for) {
5120 st->st_tmpname++;
5121 symtable_list_comprehension(st, n);
5122 st->st_tmpname--;
5123 } else {
5124 REQ(n, list_if);
5125 symtable_node(st, CHILD(n, 1));
5126 if (NCH(n) == 3) {
5127 n = CHILD(n, 2);
5128 goto loop;
5129 }
5130 }
5131 break;
5132 case for_stmt:
5133 symtable_assign(st, CHILD(n, 1), 0);
5134 for (i = 3; i < NCH(n); ++i)
5135 if (TYPE(CHILD(n, i)) >= single_input)
5136 symtable_node(st, CHILD(n, i));
5137 break;
5138 /* The remaining cases fall through to default except in
5139 special circumstances. This requires the individual cases
5140 to be coded with great care, even though they look like
5141 rather innocuous. Each case must double-check TYPE(n).
5142 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005143 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005144 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005145 n = CHILD(n, 2);
5146 goto loop;
5147 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005148 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005149 case listmaker:
5150 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005151 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005152 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005153 symtable_node(st, CHILD(n, 0));
5154 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005155 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005157 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005158 case atom:
5159 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5160 symtable_add_use(st, STR(CHILD(n, 0)));
5161 break;
5162 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005163 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005164 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005165 /* Walk over every non-token child with a special case
5166 for one child.
5167 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 if (NCH(n) == 1) {
5169 n = CHILD(n, 0);
5170 goto loop;
5171 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005172 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005173 if (TYPE(CHILD(n, i)) >= single_input)
5174 symtable_node(st, CHILD(n, i));
5175 }
5176}
5177
5178static void
5179symtable_funcdef(struct symtable *st, node *n)
5180{
5181 node *body;
5182
5183 if (TYPE(n) == lambdef) {
5184 if (NCH(n) == 4)
5185 symtable_params(st, CHILD(n, 1));
5186 } else
5187 symtable_params(st, CHILD(n, 2));
5188 body = CHILD(n, NCH(n) - 1);
5189 symtable_node(st, body);
5190}
5191
5192/* The next two functions parse the argument tuple.
5193 symtable_default_arg() checks for names in the default arguments,
5194 which are references in the defining scope. symtable_params()
5195 parses the parameter names, which are defined in the function's
5196 body.
5197
5198 varargslist:
5199 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5200 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5201*/
5202
5203static void
5204symtable_default_args(struct symtable *st, node *n)
5205{
5206 node *c;
5207 int i;
5208
5209 if (TYPE(n) == parameters) {
5210 n = CHILD(n, 1);
5211 if (TYPE(n) == RPAR)
5212 return;
5213 }
5214 REQ(n, varargslist);
5215 for (i = 0; i < NCH(n); i += 2) {
5216 c = CHILD(n, i);
5217 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5218 break;
5219 }
5220 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5221 symtable_node(st, CHILD(n, i));
5222 }
5223}
5224
5225static void
5226symtable_params(struct symtable *st, node *n)
5227{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005228 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005229 node *c = NULL;
5230
5231 if (TYPE(n) == parameters) {
5232 n = CHILD(n, 1);
5233 if (TYPE(n) == RPAR)
5234 return;
5235 }
5236 REQ(n, varargslist);
5237 for (i = 0; i < NCH(n); i += 2) {
5238 c = CHILD(n, i);
5239 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5240 ext = 1;
5241 break;
5242 }
5243 if (TYPE(c) == test) {
5244 continue;
5245 }
5246 if (TYPE(CHILD(c, 0)) == NAME)
5247 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5248 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005249 char nbuf[30];
5250 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005252 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253 }
5254 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255 if (ext) {
5256 c = CHILD(n, i);
5257 if (TYPE(c) == STAR) {
5258 i++;
5259 symtable_add_def(st, STR(CHILD(n, i)),
5260 DEF_PARAM | DEF_STAR);
5261 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005262 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005263 c = NULL;
5264 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005265 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005266 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005267 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 i++;
5269 symtable_add_def(st, STR(CHILD(n, i)),
5270 DEF_PARAM | DEF_DOUBLESTAR);
5271 }
5272 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005273 if (complex >= 0) {
5274 int j;
5275 for (j = 0; j <= complex; j++) {
5276 c = CHILD(n, j);
5277 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005278 c = CHILD(n, ++j);
5279 else if (TYPE(c) == EQUAL)
5280 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005281 if (TYPE(CHILD(c, 0)) == LPAR)
5282 symtable_params_fplist(st, CHILD(c, 1));
5283 }
5284 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285}
5286
5287static void
5288symtable_params_fplist(struct symtable *st, node *n)
5289{
5290 int i;
5291 node *c;
5292
5293 REQ(n, fplist);
5294 for (i = 0; i < NCH(n); i += 2) {
5295 c = CHILD(n, i);
5296 REQ(c, fpdef);
5297 if (NCH(c) == 1)
5298 symtable_add_def(st, STR(CHILD(c, 0)),
5299 DEF_PARAM | DEF_INTUPLE);
5300 else
5301 symtable_params_fplist(st, CHILD(c, 1));
5302 }
5303
5304}
5305
5306static void
5307symtable_global(struct symtable *st, node *n)
5308{
5309 int i;
5310
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005311 /* XXX It might be helpful to warn about module-level global
5312 statements, but it's hard to tell the difference between
5313 module-level and a string passed to exec.
5314 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005315
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005316 for (i = 1; i < NCH(n); i += 2) {
5317 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005318 int flags;
5319
5320 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005321 if (flags < 0)
5322 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005323 if (flags && flags != DEF_GLOBAL) {
5324 char buf[500];
5325 if (flags & DEF_PARAM) {
5326 PyErr_Format(PyExc_SyntaxError,
5327 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005328 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005329 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005330 st->st_cur->ste_lineno);
5331 st->st_errors++;
5332 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005333 }
5334 else {
5335 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005336 PyOS_snprintf(buf, sizeof(buf),
5337 GLOBAL_AFTER_ASSIGN,
5338 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005339 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005340 PyOS_snprintf(buf, sizeof(buf),
5341 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005342 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005343 }
5344 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005345 symtable_add_def(st, name, DEF_GLOBAL);
5346 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347}
5348
5349static void
5350symtable_list_comprehension(struct symtable *st, node *n)
5351{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005352 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005353
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005354 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005356 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005357 symtable_node(st, CHILD(n, 3));
5358 if (NCH(n) == 5)
5359 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005360}
5361
5362static void
5363symtable_import(struct symtable *st, node *n)
5364{
5365 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005366 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 | 'from' dotted_name 'import'
5368 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005369 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005372 node *dotname = CHILD(n, 1);
5373 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5374 /* check for bogus imports */
5375 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5376 PyErr_SetString(PyExc_SyntaxError,
5377 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005378 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005379 n->n_lineno);
5380 st->st_errors++;
5381 return;
5382 }
5383 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005384 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005385 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005386 if (symtable_warn(st,
5387 "import * only allowed at module level") < 0)
5388 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005389 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005390 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005391 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005392 } else {
5393 for (i = 3; i < NCH(n); i += 2) {
5394 node *c = CHILD(n, i);
5395 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005396 symtable_assign(st, CHILD(c, 2),
5397 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005398 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005399 symtable_assign(st, CHILD(c, 0),
5400 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005401 }
5402 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005403 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005405 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 }
5407 }
5408}
5409
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005410/* The third argument to symatble_assign() is a flag to be passed to
5411 symtable_add_def() if it is eventually called. The flag is useful
5412 to specify the particular type of assignment that should be
5413 recorded, e.g. an assignment caused by import.
5414 */
5415
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005416static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005417symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005418{
5419 node *tmp;
5420 int i;
5421
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005422 loop:
5423 switch (TYPE(n)) {
5424 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005425 /* invalid assignment, e.g. lambda x:x=2. The next
5426 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005427 return;
5428 case power:
5429 if (NCH(n) > 2) {
5430 for (i = 2; i < NCH(n); ++i)
5431 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5432 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005433 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005434 if (NCH(n) > 1) {
5435 symtable_node(st, CHILD(n, 0));
5436 symtable_node(st, CHILD(n, 1));
5437 } else {
5438 n = CHILD(n, 0);
5439 goto loop;
5440 }
5441 return;
5442 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005443 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5444 /* XXX This is an error, but the next pass
5445 will catch it. */
5446 return;
5447 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005448 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005449 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005450 }
5451 return;
5452 case exprlist:
5453 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005454 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005455 if (NCH(n) == 1) {
5456 n = CHILD(n, 0);
5457 goto loop;
5458 }
5459 else {
5460 int i;
5461 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005462 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005463 return;
5464 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005465 case atom:
5466 tmp = CHILD(n, 0);
5467 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5468 n = CHILD(n, 1);
5469 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005470 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005471 if (strcmp(STR(tmp), "__debug__") == 0) {
5472 PyErr_SetString(PyExc_SyntaxError,
5473 ASSIGN_DEBUG);
5474 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005475 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005476 st->st_errors++;
5477 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005478 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005479 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005480 return;
5481 case dotted_as_name:
5482 if (NCH(n) == 3)
5483 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005484 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005485 else
5486 symtable_add_def(st,
5487 STR(CHILD(CHILD(n,
5488 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005489 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005490 return;
5491 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005492 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005493 return;
5494 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005495 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496 return;
5497 default:
5498 if (NCH(n) == 0)
5499 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005500 if (NCH(n) == 1) {
5501 n = CHILD(n, 0);
5502 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005504 /* Should only occur for errors like x + 1 = 1,
5505 which will be caught in the next pass. */
5506 for (i = 0; i < NCH(n); ++i)
5507 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005508 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 }
5510}