blob: 3a0948e0c4ecbd6ea0034bad7a0c5fe48ccd7474 [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 Rossumbea18cc2002-06-14 20:41:17 +000094PyDoc_STRVAR(code_doc,
95"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
96 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
97\n\
98Create a code object. Not for the faint of heart.");
99
100static PyObject *
101code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
102{
103 int argcount;
104 int nlocals;
105 int stacksize;
106 int flags;
107 PyObject *code;
108 PyObject *consts;
109 PyObject *names;
110 PyObject *varnames;
111 PyObject *freevars = NULL;
112 PyObject *cellvars = NULL;
113 PyObject *filename;
114 PyObject *name;
115 int firstlineno;
116 PyObject *lnotab;
117
118 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
119 &argcount, &nlocals, &stacksize, &flags,
120 &code,
121 &PyTuple_Type, &consts,
122 &PyTuple_Type, &names,
123 &PyTuple_Type, &varnames,
124 &filename, &name,
125 &firstlineno, &lnotab,
126 &PyTuple_Type, &freevars,
127 &PyTuple_Type, &cellvars))
128 return NULL;
129
130 if (freevars == NULL || cellvars == NULL) {
131 PyObject *empty = PyTuple_New(0);
132 if (empty == NULL)
133 return NULL;
134 if (freevars == NULL) {
135 freevars = empty;
136 Py_INCREF(freevars);
137 }
138 if (cellvars == NULL) {
139 cellvars = empty;
140 Py_INCREF(cellvars);
141 }
142 Py_DECREF(empty);
143 }
144
145 if (!PyObject_CheckReadBuffer(code)) {
146 PyErr_SetString(PyExc_TypeError,
147 "bytecode object must be a single-segment read-only buffer");
148 return NULL;
149 }
150
151 return (PyObject *)PyCode_New(argcount, nlocals, stacksize, flags,
152 code, consts, names, varnames,
153 freevars, cellvars, filename, name,
154 firstlineno, lnotab);
155}
156
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000158code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000159{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 Py_XDECREF(co->co_code);
161 Py_XDECREF(co->co_consts);
162 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000163 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000164 Py_XDECREF(co->co_freevars);
165 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 Py_XDECREF(co->co_filename);
167 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000168 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000169 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000170}
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000174{
175 char buf[500];
176 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000177 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000178 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000179
Guido van Rossuma396a882000-04-07 01:21:36 +0000180 if (co->co_firstlineno != 0)
181 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000183 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000185 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000186 PyOS_snprintf(buf, sizeof(buf),
187 "<code object %.100s at %p, file \"%.300s\", line %d>",
188 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000189 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000190}
191
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000192static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000193code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000194{
195 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000196 cmp = PyObject_Compare(co->co_name, cp->co_name);
197 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000198 cmp = co->co_argcount - cp->co_argcount;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000199 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000200 cmp = co->co_nlocals - cp->co_nlocals;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000201 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000202 cmp = co->co_flags - cp->co_flags;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000203 if (cmp) return cmp;
Guido van Rossumd076c731998-10-07 19:42:25 +0000204 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000205 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000207 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000209 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000211 if (cmp) return cmp;
212 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
213 if (cmp) return cmp;
214 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000215 return cmp;
216}
217
218static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000219code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000220{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000221 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000222 h0 = PyObject_Hash(co->co_name);
223 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000224 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000225 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000227 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000229 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000231 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000232 h5 = PyObject_Hash(co->co_freevars);
233 if (h5 == -1) return -1;
234 h6 = PyObject_Hash(co->co_cellvars);
235 if (h6 == -1) return -1;
236 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000237 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000238 if (h == -1) h = -2;
239 return h;
240}
241
Jeremy Hylton78891072001-03-01 06:09:34 +0000242/* XXX code objects need to participate in GC? */
243
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244PyTypeObject PyCode_Type = {
245 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000246 0,
247 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000249 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000250 (destructor)code_dealloc, /* tp_dealloc */
251 0, /* tp_print */
252 0, /* tp_getattr */
253 0, /* tp_setattr */
254 (cmpfunc)code_compare, /* tp_compare */
255 (reprfunc)code_repr, /* tp_repr */
256 0, /* tp_as_number */
257 0, /* tp_as_sequence */
258 0, /* tp_as_mapping */
259 (hashfunc)code_hash, /* tp_hash */
260 0, /* tp_call */
261 0, /* tp_str */
262 PyObject_GenericGetAttr, /* tp_getattro */
263 0, /* tp_setattro */
264 0, /* tp_as_buffer */
265 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000266 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000267 0, /* tp_traverse */
268 0, /* tp_clear */
269 0, /* tp_richcompare */
270 0, /* tp_weaklistoffset */
271 0, /* tp_iter */
272 0, /* tp_iternext */
273 0, /* tp_methods */
274 code_memberlist, /* tp_members */
275 0, /* tp_getset */
276 0, /* tp_base */
277 0, /* tp_dict */
278 0, /* tp_descr_get */
279 0, /* tp_descr_set */
280 0, /* tp_dictoffset */
281 0, /* tp_init */
282 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000283 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000284};
285
Guido van Rossum644a12b1997-04-09 19:24:53 +0000286#define NAME_CHARS \
287 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
288
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000289/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
290
291static int
292all_name_chars(unsigned char *s)
293{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000294 static char ok_name_char[256];
295 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000296
Guido van Rossumcd90c202001-02-09 15:06:42 +0000297 if (ok_name_char[*name_chars] == 0) {
298 unsigned char *p;
299 for (p = name_chars; *p; p++)
300 ok_name_char[*p] = 1;
301 }
302 while (*s) {
303 if (ok_name_char[*s++] == 0)
304 return 0;
305 }
306 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000307}
308
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000309static int
310intern_strings(PyObject *tuple)
311{
312 int i;
313
314 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
315 PyObject *v = PyTuple_GET_ITEM(tuple, i);
316 if (v == NULL || !PyString_Check(v)) {
317 Py_FatalError("non-string found in code slot");
318 PyErr_BadInternalCall();
319 return -1;
320 }
321 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
322 }
323 return 0;
324}
325
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000327PyCode_New(int argcount, int nlocals, int stacksize, int flags,
328 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000329 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
330 PyObject *filename, PyObject *name, int firstlineno,
331 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000334 int i;
335 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000336 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000337 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 consts == NULL || !PyTuple_Check(consts) ||
339 names == NULL || !PyTuple_Check(names) ||
340 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000341 freevars == NULL || !PyTuple_Check(freevars) ||
342 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 name == NULL || !PyString_Check(name) ||
344 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000345 lnotab == NULL || !PyString_Check(lnotab) ||
346 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000347 PyErr_BadInternalCall();
348 return NULL;
349 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000350 intern_strings(names);
351 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000352 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000353 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000354 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 for (i = PyTuple_Size(consts); --i >= 0; ) {
356 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000358 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000359 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000360 continue;
361 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000364 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000365 co->co_argcount = argcount;
366 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000367 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000368 co->co_flags = flags;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000369 Py_INCREF(code);
Guido van Rossumd076c731998-10-07 19:42:25 +0000370 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000372 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000374 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000375 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000376 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_INCREF(freevars);
378 co->co_freevars = freevars;
379 Py_INCREF(cellvars);
380 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000382 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000384 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000385 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000387 co->co_lnotab = lnotab;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000388 }
389 return co;
390}
391
392
393/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000394
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000395/* The compiler uses two passes to generate bytecodes. The first pass
396 builds the symbol table. The second pass generates the bytecode.
397
398 The first pass uses a single symtable struct. The second pass uses
399 a compiling struct for each code block. The compiling structs
400 share a reference to the symtable.
401
402 The two passes communicate via symtable_load_symbols() and via
403 is_local() and is_global(). The former initializes several slots
404 in the compiling struct: c_varnames, c_locals, c_nlocals,
405 c_argcount, c_globals, and c_flags.
406*/
407
Tim Peters2a7f3842001-06-09 09:26:21 +0000408/* All about c_lnotab.
409
410c_lnotab is an array of unsigned bytes disguised as a Python string. In -O
411mode, SET_LINENO opcodes aren't generated, and bytecode offsets are mapped
412to source code line #s (when needed for tracebacks) via c_lnotab instead.
413The array is conceptually a list of
414 (bytecode offset increment, line number increment)
415pairs. The details are important and delicate, best illustrated by example:
416
417 byte code offset source code line number
418 0 1
419 6 2
420 50 7
421 350 307
422 361 308
423
424The first trick is that these numbers aren't stored, only the increments
425from one row to the next (this doesn't really work, but it's a start):
426
427 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
428
429The second trick is that an unsigned byte can't hold negative values, or
430values larger than 255, so (a) there's a deep assumption that byte code
431offsets and their corresponding line #s both increase monotonically, and (b)
432if at least one column jumps by more than 255 from one row to the next, more
433than one pair is written to the table. In case #b, there's no way to know
434from looking at the table later how many were written. That's the delicate
435part. A user of c_lnotab desiring to find the source line number
436corresponding to a bytecode address A should do something like this
437
438 lineno = addr = 0
439 for addr_incr, line_incr in c_lnotab:
440 addr += addr_incr
441 if addr > A:
442 return lineno
443 lineno += line_incr
444
445In order for this to work, when the addr field increments by more than 255,
446the line # increment in each pair generated must be 0 until the remaining addr
447increment is < 256. So, in the example above, com_set_lineno should not (as
448was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
449255, 0, 45, 255, 0, 45.
450*/
451
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000452struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000453 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000455 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000457 PyObject *c_name_dict; /* inverse of c_names */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *c_globals; /* dictionary (value=None) */
459 PyObject *c_locals; /* dictionary (value=localID) */
460 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000461 PyObject *c_freevars; /* dictionary (value=None) */
462 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000463 int c_nlocals; /* index of next local */
464 int c_argcount; /* number of top-level arguments */
465 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000466 int c_nexti; /* index into c_code */
467 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000468 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000469 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000471 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000472 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000473 int c_nblocks; /* current block stack level */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474 char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000475 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000476 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000477 int c_stacklevel; /* Current stack level */
478 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000479 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 PyObject *c_lnotab; /* Table mapping address to line number */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000481 int c_last_addr, c_last_line, c_lnotab_next;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000482 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000483 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000484 int c_nested; /* Is block nested funcdef or lamdef? */
485 int c_closure; /* Is nested w/freevars? */
486 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000487 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000488};
489
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000490static int
491is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000492{
493 if ((v & (USE | DEF_FREE))
494 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
495 return 1;
496 if (v & DEF_FREE_CLASS)
497 return 1;
498 return 0;
499}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000500
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000502com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000503{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000504 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
505
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000506 if (c == NULL) {
507 /* Error occurred via symtable call to
508 is_constant_false */
509 PyErr_SetString(exc, msg);
510 return;
511 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000512 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000513 if (c->c_lineno < 1 || c->c_interactive) {
514 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000516 return;
517 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000518 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000519 if (v == NULL)
520 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000521
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000522 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000523 if (line == NULL) {
524 Py_INCREF(Py_None);
525 line = Py_None;
526 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000527 if (exc == PyExc_SyntaxError) {
528 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
529 Py_None, line);
530 if (t == NULL)
531 goto exit;
532 w = Py_BuildValue("(OO)", v, t);
533 if (w == NULL)
534 goto exit;
535 PyErr_SetObject(exc, w);
536 } else {
537 /* Make sure additional exceptions are printed with
538 file and line, also. */
539 PyErr_SetObject(exc, v);
540 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
541 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000542 exit:
543 Py_XDECREF(t);
544 Py_XDECREF(v);
545 Py_XDECREF(w);
546 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000547}
548
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000549/* Interface to the block stack */
550
551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000552block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000553{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000554 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 com_error(c, PyExc_SystemError,
556 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000557 }
558 else {
559 c->c_block[c->c_nblocks++] = type;
560 }
561}
562
563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000564block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000565{
566 if (c->c_nblocks > 0)
567 c->c_nblocks--;
568 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000570 }
571}
572
Guido van Rossum681d79a1995-07-18 14:51:37 +0000573/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000574
Tim Petersdbd9ba62000-07-09 03:09:57 +0000575static int com_init(struct compiling *, char *);
576static void com_free(struct compiling *);
577static void com_push(struct compiling *, int);
578static void com_pop(struct compiling *, int);
579static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000580static void com_node(struct compiling *, node *);
581static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000582static void com_addbyte(struct compiling *, int);
583static void com_addint(struct compiling *, int);
584static void com_addoparg(struct compiling *, int, int);
585static void com_addfwref(struct compiling *, int, int *);
586static void com_backpatch(struct compiling *, int);
587static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
588static int com_addconst(struct compiling *, PyObject *);
589static int com_addname(struct compiling *, PyObject *);
590static void com_addopname(struct compiling *, int, node *);
591static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000592static void com_list_iter(struct compiling *, node *, node *, char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000593static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000594static void com_assign(struct compiling *, node *, int, node *);
595static void com_assign_name(struct compiling *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000596static PyCodeObject *icompile(node *, struct compiling *);
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000597static PyCodeObject *jcompile(node *, char *, struct compiling *,
598 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000599static PyObject *parsestrplus(struct compiling*, node *);
600static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000601static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000602
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000603static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000604
605/* symtable operations */
606static int symtable_build(struct compiling *, node *);
607static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000608static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000609static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000610static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000611static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000613
614static void symtable_node(struct symtable *, node *);
615static void symtable_funcdef(struct symtable *, node *);
616static void symtable_default_args(struct symtable *, node *);
617static void symtable_params(struct symtable *, node *);
618static void symtable_params_fplist(struct symtable *, node *n);
619static void symtable_global(struct symtable *, node *);
620static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000621static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000622static void symtable_list_comprehension(struct symtable *, node *);
623
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000624static int symtable_update_free_vars(struct symtable *);
625static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
626static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
627
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000628/* helper */
629static void
630do_pad(int pad)
631{
632 int i;
633 for (i = 0; i < pad; ++i)
634 fprintf(stderr, " ");
635}
636
637static void
638dump(node *n, int pad, int depth)
639{
640 int i;
641 if (depth == 0)
642 return;
643 do_pad(pad);
644 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
645 if (depth > 0)
646 depth--;
647 for (i = 0; i < NCH(n); ++i)
648 dump(CHILD(n, i), pad + 1, depth);
649}
650
651#define DUMP(N) dump(N, 0, -1)
652
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000653static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000654com_init(struct compiling *c, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000655{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000656 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
658 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000659 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000661 goto fail;
662 if ((c->c_const_dict = PyDict_New()) == NULL)
663 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000665 goto fail;
666 if ((c->c_name_dict = PyDict_New()) == NULL)
667 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000669 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
671 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000672 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000673 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000674 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000675 c->c_freevars = NULL;
676 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000677 c->c_nlocals = 0;
678 c->c_argcount = 0;
679 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000680 c->c_nexti = 0;
681 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000682 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000683 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000684 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000685 c->c_begin = 0;
686 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000687 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000688 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000689 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000690 c->c_stacklevel = 0;
691 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000692 c->c_firstlineno = 0;
693 c->c_last_addr = 0;
694 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000695 c->c_lnotab_next = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000696 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000697 c->c_nested = 0;
698 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000699 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700 return 1;
701
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000702 fail:
703 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000704 return 0;
705}
706
707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000708com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000709{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000710 Py_XDECREF(c->c_code);
711 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000712 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000714 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 Py_XDECREF(c->c_globals);
716 Py_XDECREF(c->c_locals);
717 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000718 Py_XDECREF(c->c_freevars);
719 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000721 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000722 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723}
724
725static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000727{
728 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000729 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +0000730 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000731 /*
732 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
733 c->c_filename, c->c_name, c->c_lineno,
734 c->c_nexti, c->c_stacklevel, n);
735 */
736 }
Guido van Rossum8b993a91997-01-17 21:04:03 +0000737}
738
739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000740com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000741{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000742 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +0000743 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000744 else
745 c->c_stacklevel -= n;
746}
747
748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000749com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000750{
751 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000753 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755}
756
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000757static int
758com_check_size(PyObject **s, int offset)
759{
760 int len = PyString_GET_SIZE(*s);
761 if (offset >= len)
762 return _PyString_Resize(s, len * 2);
763 return 0;
764}
765
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000767com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768{
Guido van Rossum681d79a1995-07-18 14:51:37 +0000769 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000770 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +0000771 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000772 if (com_check_size(&c->c_code, c->c_nexti)) {
773 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000775 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000776 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000777}
778
779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000780com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000782 com_addbyte(c, x & 0xff);
783 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784}
785
786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000788{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000789 char *p;
790 if (c->c_lnotab == NULL)
791 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000792 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
793 c->c_errors++;
794 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000795 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000796 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000797 *p++ = addr;
798 *p++ = line;
799 c->c_lnotab_next += 2;
800}
801
802static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000803com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000804{
805 c->c_lineno = lineno;
806 if (c->c_firstlineno == 0) {
807 c->c_firstlineno = c->c_last_line = lineno;
808 }
809 else {
810 int incr_addr = c->c_nexti - c->c_last_addr;
811 int incr_line = lineno - c->c_last_line;
Tim Peters2a7f3842001-06-09 09:26:21 +0000812 while (incr_addr > 255) {
813 com_add_lnotab(c, 255, 0);
814 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000815 }
Tim Peters2a7f3842001-06-09 09:26:21 +0000816 while (incr_line > 255) {
817 com_add_lnotab(c, incr_addr, 255);
818 incr_line -=255;
819 incr_addr = 0;
820 }
821 if (incr_addr > 0 || incr_line > 0)
822 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000823 c->c_last_addr = c->c_nexti;
824 c->c_last_line = lineno;
825 }
826}
827
828static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000829com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000830{
Fred Drakeef8ace32000-08-24 00:32:09 +0000831 int extended_arg = arg >> 16;
Guido van Rossum8e793d91997-03-03 19:13:14 +0000832 if (op == SET_LINENO) {
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000833 com_set_lineno(c, arg);
Guido van Rossum8e793d91997-03-03 19:13:14 +0000834 if (Py_OptimizeFlag)
835 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000836 }
Fred Drakeef8ace32000-08-24 00:32:09 +0000837 if (extended_arg){
838 com_addbyte(c, EXTENDED_ARG);
839 com_addint(c, extended_arg);
840 arg &= 0xffff;
841 }
Guido van Rossum8e793d91997-03-03 19:13:14 +0000842 com_addbyte(c, op);
843 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000844}
845
846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000848{
849 /* Compile a forward reference for backpatching */
850 int here;
851 int anchor;
852 com_addbyte(c, op);
853 here = c->c_nexti;
854 anchor = *p_anchor;
855 *p_anchor = here;
856 com_addint(c, anchor == 0 ? 0 : here - anchor);
857}
858
859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000860com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000861{
Jeremy Hylton93a569d2001-10-17 13:22:22 +0000862 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000863 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000864 int dist;
865 int prev;
866 for (;;) {
867 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000868 prev = code[anchor] + (code[anchor+1] << 8);
869 dist = target - (anchor+2);
870 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +0000871 dist >>= 8;
872 code[anchor+1] = dist;
873 dist >>= 8;
874 if (dist) {
875 com_error(c, PyExc_SystemError,
876 "com_backpatch: offset too large");
877 break;
878 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000879 if (!prev)
880 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000881 anchor -= prev;
882 }
883}
884
Guido van Rossuma9df32a1991-12-31 13:13:35 +0000885/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000886
887static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000888com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000889{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000890 PyObject *w, *t, *np=NULL;
891 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000892
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000893 t = Py_BuildValue("(OO)", v, v->ob_type);
894 if (t == NULL)
895 goto fail;
896 w = PyDict_GetItem(dict, t);
897 if (w != NULL) {
898 n = PyInt_AsLong(w);
899 } else {
900 n = PyList_Size(list);
901 np = PyInt_FromLong(n);
902 if (np == NULL)
903 goto fail;
904 if (PyList_Append(list, v) != 0)
905 goto fail;
906 if (PyDict_SetItem(dict, t, np) != 0)
907 goto fail;
908 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000909 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000910 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +0000911 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000912 fail:
913 Py_XDECREF(np);
914 Py_XDECREF(t);
915 c->c_errors++;
916 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917}
918
919static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000920com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000921{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000922 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923}
924
925static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000927{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000928 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929}
930
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000931int
932_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000933{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000934 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000935 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +0000936 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000937 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
938 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000939 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000940 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000941 return 0; /* Don't mangle __extremely_long_names */
942 if (name[nlen-1] == '_' && name[nlen-2] == '_')
943 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000944 /* Strip leading underscores from class name */
945 while (*p == '_')
946 p++;
947 if (*p == '\0')
948 return 0; /* Don't mangle if class is just underscores */
949 plen = strlen(p);
950 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000951 plen = maxlen-nlen-2; /* Truncate class name if too long */
952 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000953 buffer[0] = '_';
954 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +0000955 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000956 return 1;
957}
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000959static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000960com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000961{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000963 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000964 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000965
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000966 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000967 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000968 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 c->c_errors++;
970 i = 255;
971 }
972 else {
973 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000975 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976 com_addoparg(c, op, i);
977}
978
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000979#define NAME_LOCAL 0
980#define NAME_GLOBAL 1
981#define NAME_DEFAULT 2
982#define NAME_CLOSURE 3
983
984static int
985com_lookup_arg(PyObject *dict, PyObject *name)
986{
987 PyObject *v = PyDict_GetItem(dict, name);
988 if (v == NULL)
989 return -1;
990 else
991 return PyInt_AS_LONG(v);
992}
993
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000994static void
995com_addop_varname(struct compiling *c, int kind, char *name)
996{
997 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000998 int i, reftype;
999 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001000 int op = STOP_CODE;
1001 char buffer[MANGLE_LEN];
1002
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001003 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001004 name = buffer;
1005 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1006 c->c_errors++;
1007 i = 255;
1008 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001009 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001010
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001011 reftype = get_ref_type(c, name);
1012 switch (reftype) {
1013 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001014 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001015 scope = NAME_LOCAL;
1016 break;
1017 case GLOBAL_EXPLICIT:
1018 scope = NAME_GLOBAL;
1019 break;
1020 case GLOBAL_IMPLICIT:
1021 if (c->c_flags & CO_OPTIMIZED)
1022 scope = NAME_GLOBAL;
1023 break;
1024 case FREE:
1025 case CELL:
1026 scope = NAME_CLOSURE;
1027 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001028 }
1029
1030 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001031 if (scope == NAME_LOCAL)
1032 i = com_lookup_arg(c->c_locals, v);
1033 else if (reftype == FREE)
1034 i = com_lookup_arg(c->c_freevars, v);
1035 else if (reftype == CELL)
1036 i = com_lookup_arg(c->c_cellvars, v);
1037 if (i == -1) {
1038 c->c_errors++; /* XXX no exception set */
1039 i = 255;
1040 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001041 }
1042 Py_DECREF(v);
1043
1044 switch (kind) {
1045 case VAR_LOAD:
1046 switch (scope) {
1047 case NAME_LOCAL:
1048 op = LOAD_FAST;
1049 break;
1050 case NAME_GLOBAL:
1051 op = LOAD_GLOBAL;
1052 break;
1053 case NAME_DEFAULT:
1054 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001055 break;
1056 case NAME_CLOSURE:
1057 op = LOAD_DEREF;
1058 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001059 }
1060 break;
1061 case VAR_STORE:
1062 switch (scope) {
1063 case NAME_LOCAL:
1064 op = STORE_FAST;
1065 break;
1066 case NAME_GLOBAL:
1067 op = STORE_GLOBAL;
1068 break;
1069 case NAME_DEFAULT:
1070 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001071 break;
1072 case NAME_CLOSURE:
1073 op = STORE_DEREF;
1074 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001075 }
1076 break;
1077 case VAR_DELETE:
1078 switch (scope) {
1079 case NAME_LOCAL:
1080 op = DELETE_FAST;
1081 break;
1082 case NAME_GLOBAL:
1083 op = DELETE_GLOBAL;
1084 break;
1085 case NAME_DEFAULT:
1086 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001087 break;
1088 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001089 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001090 PyOS_snprintf(buf, sizeof(buf),
1091 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001092 com_error(c, PyExc_SyntaxError, buf);
1093 i = 255;
1094 break;
1095 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001096 }
1097 break;
1098 }
1099done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 com_addoparg(c, op, i);
1101}
1102
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001103static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001104com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001105{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001106 char *name;
1107 char buffer[1000];
1108 /* XXX it is possible to write this code without the 1000
1109 chars on the total length of dotted names, I just can't be
1110 bothered right now */
1111 if (TYPE(n) == STAR)
1112 name = "*";
1113 else if (TYPE(n) == dotted_name) {
1114 char *p = buffer;
1115 int i;
1116 name = buffer;
1117 for (i = 0; i < NCH(n); i += 2) {
1118 char *s = STR(CHILD(n, i));
1119 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001121 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001122 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001123 break;
1124 }
1125 if (p != buffer)
1126 *p++ = '.';
1127 strcpy(p, s);
1128 p = strchr(p, '\0');
1129 }
1130 }
1131 else {
1132 REQ(n, NAME);
1133 name = STR(n);
1134 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001135 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001136}
1137
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001139parsenumber(struct compiling *co, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001141 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001143 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001144#ifndef WITHOUT_COMPLEX
Guido van Rossum530956d1996-07-21 02:27:43 +00001145 Py_complex c;
Guido van Rossum50564e81996-01-12 01:13:16 +00001146 int imflag;
1147#endif
1148
Guido van Rossum282914b1991-04-04 10:42:56 +00001149 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001150 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001151#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001152 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001153#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001154 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001156 if (s[0] == '0')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossumacbefef1992-01-19 16:33:51 +00001158 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001160 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001161 if (errno != 0)
1162 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001164 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001165 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001166#ifndef WITHOUT_COMPLEX
1167 if (imflag) {
1168 c.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001169 PyFPE_START_PROTECT("atof", return 0)
Guido van Rossum50564e81996-01-12 01:13:16 +00001170 c.imag = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001171 PyFPE_END_PROTECT(c)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 return PyComplex_FromCComplex(c);
Guido van Rossum50564e81996-01-12 01:13:16 +00001173 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001174 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001175#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001176 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001177 PyFPE_START_PROTECT("atof", return 0)
1178 dx = atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001179 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001181 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182}
1183
Guido van Rossum79f25d91997-04-29 20:08:16 +00001184static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001185parsestr(struct compiling *com, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001188 size_t len;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001189 char *buf;
1190 char *p;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001191 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001192 int c;
Guido van Rossum5f5e8171997-04-06 03:41:40 +00001193 int first = *s;
1194 int quote = first;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001195 int rawmode = 0;
1196 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001197
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001198 if (isalpha(quote) || quote == '_') {
1199 if (quote == 'u' || quote == 'U') {
1200 quote = *++s;
1201 unicode = 1;
1202 }
1203 if (quote == 'r' || quote == 'R') {
1204 quote = *++s;
1205 rawmode = 1;
1206 }
1207 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001208 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210 return NULL;
1211 }
1212 s++;
1213 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001214 if (len > INT_MAX) {
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001215 com_error(com, PyExc_OverflowError,
1216 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001217 return NULL;
1218 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001219 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221 return NULL;
1222 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001223 if (len >= 4 && s[0] == quote && s[1] == quote) {
1224 s += 2;
1225 len -= 2;
1226 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001228 return NULL;
1229 }
1230 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001231#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001232 if (unicode || Py_UnicodeFlag) {
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001233 if (rawmode)
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001234 v = PyUnicode_DecodeRawUnicodeEscape(
1235 s, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001236 else
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001237 v = PyUnicode_DecodeUnicodeEscape(
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001238 s, len, NULL);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001239 if (v == NULL)
1240 PyErr_SyntaxLocation(com->c_filename, com->c_lineno);
1241 return v;
1242
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001243 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001244#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001245 if (rawmode || strchr(s, '\\') == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 return PyString_FromStringAndSize(s, len);
1247 v = PyString_FromStringAndSize((char *)NULL, len);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001248 if (v == NULL)
1249 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 p = buf = PyString_AsString(v);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001251 end = s + len;
1252 while (s < end) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 if (*s != '\\') {
1254 *p++ = *s++;
1255 continue;
1256 }
1257 s++;
1258 switch (*s++) {
1259 /* XXX This assumes ASCII! */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001260 case '\n': break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 case '\\': *p++ = '\\'; break;
1262 case '\'': *p++ = '\''; break;
Guido van Rossum8054fad1993-10-26 15:19:44 +00001263 case '\"': *p++ = '\"'; break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001264 case 'b': *p++ = '\b'; break;
1265 case 'f': *p++ = '\014'; break; /* FF */
1266 case 't': *p++ = '\t'; break;
1267 case 'n': *p++ = '\n'; break;
1268 case 'r': *p++ = '\r'; break;
1269 case 'v': *p++ = '\013'; break; /* VT */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 case 'a': *p++ = '\007'; break; /* BEL, not classic C */
1271 case '0': case '1': case '2': case '3':
1272 case '4': case '5': case '6': case '7':
1273 c = s[-1] - '0';
1274 if ('0' <= *s && *s <= '7') {
1275 c = (c<<3) + *s++ - '0';
1276 if ('0' <= *s && *s <= '7')
1277 c = (c<<3) + *s++ - '0';
1278 }
1279 *p++ = c;
1280 break;
1281 case 'x':
Jeremy Hylton4419ac12001-02-28 22:54:51 +00001282 if (isxdigit(Py_CHARMASK(s[0]))
1283 && isxdigit(Py_CHARMASK(s[1]))) {
Guido van Rossumed1100f1997-10-20 23:24:07 +00001284 unsigned int x = 0;
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001285 c = Py_CHARMASK(*s);
1286 s++;
1287 if (isdigit(c))
1288 x = c - '0';
1289 else if (islower(c))
1290 x = 10 + c - 'a';
1291 else
1292 x = 10 + c - 'A';
1293 x = x << 4;
1294 c = Py_CHARMASK(*s);
1295 s++;
1296 if (isdigit(c))
1297 x += c - '0';
1298 else if (islower(c))
1299 x += 10 + c - 'a';
1300 else
1301 x += 10 + c - 'A';
Guido van Rossumed1100f1997-10-20 23:24:07 +00001302 *p++ = x;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001303 break;
1304 }
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001305 Py_DECREF(v);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001306 com_error(com, PyExc_ValueError,
1307 "invalid \\x escape");
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001308 return NULL;
Guido van Rossum05459c52002-05-28 18:47:29 +00001309#ifndef Py_USING_UNICODE
1310 case 'u':
1311 case 'U':
1312 case 'N':
1313 if (unicode) {
1314 Py_DECREF(v);
1315 com_error(com, PyExc_ValueError,
1316 "Unicode escapes not legal "
1317 "when Unicode disabled");
1318 return NULL;
1319 }
1320#endif
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001321 default:
1322 *p++ = '\\';
1323 *p++ = s[-1];
1324 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001325 }
1326 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 _PyString_Resize(&v, (int)(p - buf));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328 return v;
1329}
1330
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001332parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001333{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001335 int i;
1336 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001337 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001338 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001339 for (i = 1; i < NCH(n); i++) {
1340 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001341 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001342 if (s == NULL)
1343 goto onError;
1344 if (PyString_Check(v) && PyString_Check(s)) {
1345 PyString_ConcatAndDel(&v, s);
1346 if (v == NULL)
1347 goto onError;
1348 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001349#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001350 else {
1351 PyObject *temp;
1352 temp = PyUnicode_Concat(v, s);
1353 Py_DECREF(s);
1354 if (temp == NULL)
1355 goto onError;
1356 Py_DECREF(v);
1357 v = temp;
1358 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001359#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001360 }
1361 }
1362 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001363
1364 onError:
1365 Py_XDECREF(v);
1366 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001367}
1368
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001369static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001370com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001372 int anchor = 0;
1373 int save_begin = c->c_begin;
1374
1375 /* list_iter: for v in expr [list_iter] */
1376 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001377 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001378 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001379 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001380 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001381 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001382 c->c_loops++;
1383 com_list_iter(c, n, e, t);
1384 c->c_loops--;
1385 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1386 c->c_begin = save_begin;
1387 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001388 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001389}
1390
1391static void
1392com_list_if(struct compiling *c, node *n, node *e, char *t)
1393{
1394 int anchor = 0;
1395 int a = 0;
1396 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001397 com_node(c, CHILD(n, 1));
1398 com_addfwref(c, JUMP_IF_FALSE, &a);
1399 com_addbyte(c, POP_TOP);
1400 com_pop(c, 1);
1401 com_list_iter(c, n, e, t);
1402 com_addfwref(c, JUMP_FORWARD, &anchor);
1403 com_backpatch(c, a);
1404 /* We jump here with an extra entry which we now pop */
1405 com_addbyte(c, POP_TOP);
1406 com_backpatch(c, anchor);
1407}
1408
1409static void
1410com_list_iter(struct compiling *c,
1411 node *p, /* parent of list_iter node */
1412 node *e, /* element expression node */
1413 char *t /* name of result list temp local */)
1414{
1415 /* list_iter is the last child in a listmaker, list_for, or list_if */
1416 node *n = CHILD(p, NCH(p)-1);
1417 if (TYPE(n) == list_iter) {
1418 n = CHILD(n, 0);
1419 switch (TYPE(n)) {
1420 case list_for:
1421 com_list_for(c, n, e, t);
1422 break;
1423 case list_if:
1424 com_list_if(c, n, e, t);
1425 break;
1426 default:
1427 com_error(c, PyExc_SystemError,
1428 "invalid list_iter node type");
1429 }
1430 }
1431 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001432 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001433 com_push(c, 1);
1434 com_node(c, e);
1435 com_addoparg(c, CALL_FUNCTION, 1);
1436 com_addbyte(c, POP_TOP);
1437 com_pop(c, 2);
1438 }
1439}
1440
1441static void
1442com_list_comprehension(struct compiling *c, node *n)
1443{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001444 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001445 char tmpname[30];
1446 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001447 com_addoparg(c, BUILD_LIST, 0);
1448 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1449 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001450 com_addop_name(c, LOAD_ATTR, "append");
1451 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001452 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001453 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001454 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001455 --c->c_tmpname;
1456}
1457
1458static void
1459com_listmaker(struct compiling *c, node *n)
1460{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001461 /* listmaker: test ( list_for | (',' test)* [','] ) */
1462 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001463 com_list_comprehension(c, n);
1464 else {
1465 int len = 0;
1466 int i;
1467 for (i = 0; i < NCH(n); i += 2, len++)
1468 com_node(c, CHILD(n, i));
1469 com_addoparg(c, BUILD_LIST, len);
1470 com_pop(c, len-1);
1471 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001472}
1473
1474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001475com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001476{
1477 int i;
1478 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1479 for (i = 0; i+2 < NCH(n); i += 4) {
1480 /* We must arrange things just right for STORE_SUBSCR.
1481 It wants the stack to look like (value) (dict) (key) */
1482 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001483 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001484 com_node(c, CHILD(n, i+2)); /* value */
1485 com_addbyte(c, ROT_TWO);
1486 com_node(c, CHILD(n, i)); /* key */
1487 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001488 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001489 }
1490}
1491
1492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001493com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494{
1495 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497 int i;
1498 REQ(n, atom);
1499 ch = CHILD(n, 0);
1500 switch (TYPE(ch)) {
1501 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001502 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001504 com_push(c, 1);
1505 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001506 else
1507 com_node(c, CHILD(n, 1));
1508 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001509 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001510 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001511 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001512 com_push(c, 1);
1513 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001515 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001517 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001518 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001519 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001520 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001521 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 break;
1523 case BACKQUOTE:
1524 com_node(c, CHILD(n, 1));
1525 com_addbyte(c, UNARY_CONVERT);
1526 break;
1527 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00001528 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 i = 255;
1530 }
1531 else {
1532 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534 }
1535 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001536 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001537 break;
1538 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001539 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001540 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001541 c->c_errors++;
1542 i = 255;
1543 }
1544 else {
1545 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 }
1548 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001549 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 break;
1551 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001552 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001553 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 break;
1555 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 com_error(c, PyExc_SystemError,
1557 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558 }
1559}
1560
1561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001562com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001563{
1564 if (NCH(n) == 1) {
1565 com_addbyte(c, op);
1566 }
1567 else if (NCH(n) == 2) {
1568 if (TYPE(CHILD(n, 0)) != COLON) {
1569 com_node(c, CHILD(n, 0));
1570 com_addbyte(c, op+1);
1571 }
1572 else {
1573 com_node(c, CHILD(n, 1));
1574 com_addbyte(c, op+2);
1575 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001576 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001577 }
1578 else {
1579 com_node(c, CHILD(n, 0));
1580 com_node(c, CHILD(n, 2));
1581 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001582 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001583 }
1584}
1585
Guido van Rossum635abd21997-01-06 22:56:52 +00001586static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001587com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
1588{
1589 if (NCH(n) == 1) {
1590 com_addbyte(c, DUP_TOP);
1591 com_push(c, 1);
1592 com_addbyte(c, SLICE);
1593 com_node(c, augn);
1594 com_addbyte(c, opcode);
1595 com_pop(c, 1);
1596 com_addbyte(c, ROT_TWO);
1597 com_addbyte(c, STORE_SLICE);
1598 com_pop(c, 2);
1599 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
1600 com_node(c, CHILD(n, 0));
1601 com_addoparg(c, DUP_TOPX, 2);
1602 com_push(c, 2);
1603 com_addbyte(c, SLICE+1);
1604 com_pop(c, 1);
1605 com_node(c, augn);
1606 com_addbyte(c, opcode);
1607 com_pop(c, 1);
1608 com_addbyte(c, ROT_THREE);
1609 com_addbyte(c, STORE_SLICE+1);
1610 com_pop(c, 3);
1611 } else if (NCH(n) == 2) {
1612 com_node(c, CHILD(n, 1));
1613 com_addoparg(c, DUP_TOPX, 2);
1614 com_push(c, 2);
1615 com_addbyte(c, SLICE+2);
1616 com_pop(c, 1);
1617 com_node(c, augn);
1618 com_addbyte(c, opcode);
1619 com_pop(c, 1);
1620 com_addbyte(c, ROT_THREE);
1621 com_addbyte(c, STORE_SLICE+2);
1622 com_pop(c, 3);
1623 } else {
1624 com_node(c, CHILD(n, 0));
1625 com_node(c, CHILD(n, 2));
1626 com_addoparg(c, DUP_TOPX, 3);
1627 com_push(c, 3);
1628 com_addbyte(c, SLICE+3);
1629 com_pop(c, 2);
1630 com_node(c, augn);
1631 com_addbyte(c, opcode);
1632 com_pop(c, 1);
1633 com_addbyte(c, ROT_FOUR);
1634 com_addbyte(c, STORE_SLICE+3);
1635 com_pop(c, 4);
1636 }
1637}
1638
1639static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001640com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001641{
1642 node *m;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001643 REQ(n, argument); /* [test '='] test; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00001644 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00001645 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00001647 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001648 }
1649 else {
1650 com_node(c, CHILD(n, 0));
1651 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001652 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001653 }
1654 m = n;
1655 do {
1656 m = CHILD(m, 0);
1657 } while (NCH(m) == 1);
1658 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00001659 /* f(lambda x: x[0] = 3) ends up getting parsed with
1660 * LHS test = lambda x: x[0], and RHS test = 3.
1661 * SF bug 132313 points out that complaining about a keyword
1662 * then is very confusing.
1663 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00001665 TYPE(m) == lambdef ?
1666 "lambda cannot contain assignment" :
1667 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001668 }
1669 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum635abd21997-01-06 22:56:52 +00001671 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001673 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001674 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001675 else if (*pkeywords == NULL) {
1676 c->c_errors++;
1677 Py_DECREF(v);
1678 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 if (PyDict_GetItem(*pkeywords, v) != NULL)
1680 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00001681 "duplicate keyword argument");
1682 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001683 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00001684 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001685 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001686 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001688 }
1689 }
1690 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00001691}
1692
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001695{
1696 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00001697 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001698 }
1699 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00001701 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00001702 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00001703 int star_flag = 0;
1704 int starstar_flag = 0;
1705 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00001706 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00001707 na = 0;
1708 nk = 0;
1709 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00001710 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00001711 if (TYPE(ch) == STAR ||
1712 TYPE(ch) == DOUBLESTAR)
1713 break;
Guido van Rossumca906051998-12-10 16:56:22 +00001714 if (ch->n_lineno != lineno) {
1715 lineno = ch->n_lineno;
1716 com_addoparg(c, SET_LINENO, lineno);
1717 }
1718 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00001719 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00001720 na++;
1721 else
1722 nk++;
1723 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00001725 while (i < NCH(n)) {
1726 node *tok = CHILD(n, i);
1727 node *ch = CHILD(n, i+1);
1728 i += 3;
1729 switch (TYPE(tok)) {
1730 case STAR: star_flag = 1; break;
1731 case DOUBLESTAR: starstar_flag = 1; break;
1732 }
1733 com_node(c, ch);
1734 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00001735 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 com_error(c, PyExc_SyntaxError,
1737 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00001738 }
Jeremy Hylton76901512000-03-28 23:49:17 +00001739 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00001740 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00001741 star_flag + (starstar_flag << 1);
1742 else
1743 opcode = CALL_FUNCTION;
1744 com_addoparg(c, opcode, na | (nk << 8));
1745 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001746 }
1747}
1748
1749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001750com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751{
1752 com_addopname(c, LOAD_ATTR, n);
1753}
1754
1755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001756com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001757{
1758 int i=0;
1759 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00001760 node *ch;
1761
1762 /* first argument */
1763 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001765 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001766 i++;
1767 }
1768 else {
1769 com_node(c, CHILD(n,i));
1770 i++;
1771 REQ(CHILD(n,i),COLON);
1772 i++;
1773 }
1774 /* second argument */
1775 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
1776 com_node(c, CHILD(n,i));
1777 i++;
1778 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001779 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001781 com_push(c, 1);
1782 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001783 /* remaining arguments */
1784 for (; i < NCH(n); i++) {
1785 ns++;
1786 ch=CHILD(n,i);
1787 REQ(ch, sliceop);
1788 if (NCH(ch) == 1) {
1789 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001791 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001792 }
1793 else
1794 com_node(c, CHILD(ch,1));
1795 }
1796 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001797 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00001798}
1799
1800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001801com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00001802{
1803 node *ch;
1804 REQ(n, subscript);
1805 ch = CHILD(n,0);
1806 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001807 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00001808 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00001809 com_push(c, 1);
1810 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001811 else {
1812 /* check for slice */
1813 if ((TYPE(ch) == COLON || NCH(n) > 1))
1814 com_sliceobj(c, n);
1815 else {
1816 REQ(ch, test);
1817 com_node(c, ch);
1818 }
1819 }
1820}
1821
1822static void
Thomas Wouters434d0822000-08-24 20:11:32 +00001823com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00001824{
1825 int i, op;
1826 REQ(n, subscriptlist);
1827 /* Check to make backward compatible slice behavior for '[i:j]' */
1828 if (NCH(n) == 1) {
1829 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00001830 /* 'Basic' slice, should have exactly one colon. */
1831 if ((TYPE(CHILD(sub, 0)) == COLON
1832 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
1833 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
1834 {
Thomas Wouters434d0822000-08-24 20:11:32 +00001835 switch (assigning) {
1836 case OP_DELETE:
1837 op = DELETE_SLICE;
1838 break;
1839 case OP_ASSIGN:
1840 op = STORE_SLICE;
1841 break;
1842 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00001843 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00001844 break;
1845 default:
1846 com_augassign_slice(c, sub, assigning, augn);
1847 return;
1848 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001849 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001850 if (op == STORE_SLICE)
1851 com_pop(c, 2);
1852 else if (op == DELETE_SLICE)
1853 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00001854 return;
1855 }
1856 }
1857 /* Else normal subscriptlist. Compile each subscript. */
1858 for (i = 0; i < NCH(n); i += 2)
1859 com_subscript(c, CHILD(n, i));
1860 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001861 if (NCH(n) > 1) {
1862 i = (NCH(n)+1) / 2;
1863 com_addoparg(c, BUILD_TUPLE, i);
1864 com_pop(c, i-1);
1865 }
Thomas Wouters434d0822000-08-24 20:11:32 +00001866 switch (assigning) {
1867 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001868 op = DELETE_SUBSCR;
1869 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00001870 break;
1871 default:
1872 case OP_ASSIGN:
1873 op = STORE_SUBSCR;
1874 i = 3;
1875 break;
1876 case OP_APPLY:
1877 op = BINARY_SUBSCR;
1878 i = 1;
1879 break;
1880 }
1881 if (assigning > OP_APPLY) {
1882 com_addoparg(c, DUP_TOPX, 2);
1883 com_push(c, 2);
1884 com_addbyte(c, BINARY_SUBSCR);
1885 com_pop(c, 1);
1886 com_node(c, augn);
1887 com_addbyte(c, assigning);
1888 com_pop(c, 1);
1889 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001890 }
Guido van Rossum8861b741996-07-30 16:49:37 +00001891 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001892 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00001893}
1894
1895static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001896com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897{
1898 REQ(n, trailer);
1899 switch (TYPE(CHILD(n, 0))) {
1900 case LPAR:
1901 com_call_function(c, CHILD(n, 1));
1902 break;
1903 case DOT:
1904 com_select_member(c, CHILD(n, 1));
1905 break;
1906 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00001907 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001908 break;
1909 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001911 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001912 }
1913}
1914
1915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001916com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00001917{
1918 int i;
1919 REQ(n, power);
1920 com_atom(c, CHILD(n, 0));
1921 for (i = 1; i < NCH(n); i++) {
1922 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
1923 com_factor(c, CHILD(n, i+1));
1924 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001925 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00001926 break;
1927 }
1928 else
1929 com_apply_trailer(c, CHILD(n, i));
1930 }
1931}
1932
1933static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001934com_invert_constant(struct compiling *c, node *n)
1935{
1936 /* Compute the inverse of int and longs and use them directly,
1937 but be prepared to generate code for all other
1938 possibilities (invalid numbers, floats, complex).
1939 */
1940 PyObject *num, *inv = NULL;
1941 int i;
1942
1943 REQ(n, NUMBER);
1944 num = parsenumber(c, STR(n));
1945 if (num == NULL)
1946 i = 255;
1947 else {
1948 inv = PyNumber_Invert(num);
1949 if (inv == NULL) {
1950 PyErr_Clear();
1951 i = com_addconst(c, num);
1952 } else {
1953 i = com_addconst(c, inv);
1954 Py_DECREF(inv);
1955 }
1956 Py_DECREF(num);
1957 }
1958 com_addoparg(c, LOAD_CONST, i);
1959 com_push(c, 1);
1960 if (num != NULL && inv == NULL)
1961 com_addbyte(c, UNARY_INVERT);
1962}
1963
Tim Peters51e26512001-09-07 08:45:55 +00001964static int
1965is_float_zero(const char *p)
1966{
1967 int found_radix_point = 0;
1968 int ch;
1969 while ((ch = Py_CHARMASK(*p++)) != '\0') {
1970 switch (ch) {
1971 case '0':
1972 /* no reason to believe it's not 0 -- continue */
1973 break;
1974
1975 case 'e': case 'E': case 'j': case 'J':
1976 /* If this was a hex constant, we already would have
1977 returned 0 due to the 'x' or 'X', so 'e' or 'E'
1978 must be an exponent marker, and we haven't yet
1979 seen a non-zero digit, and it doesn't matter what
1980 the exponent is then. For 'j' or 'J' similarly,
1981 except that this is an imaginary 0 then. */
1982 return 1;
1983
1984 case '.':
1985 found_radix_point = 1;
1986 break;
1987
1988 default:
1989 return 0;
1990 }
1991 }
1992 return found_radix_point;
1993}
1994
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001995static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001996com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001997{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00001998 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00001999 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002000 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002001 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002002 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002003 approriate value as a constant. If the value is negative,
2004 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002005 negative in the 0th position -- unless we're doing unary minus
2006 of a floating zero! In that case the sign is significant, but
2007 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002008 */
2009 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002010 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002011 && TYPE((pfactor = CHILD(n, 1))) == factor
2012 && NCH(pfactor) == 1
2013 && TYPE((ppower = CHILD(pfactor, 0))) == power
2014 && NCH(ppower) == 1
2015 && TYPE((patom = CHILD(ppower, 0))) == atom
2016 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
2017 && !(childtype == MINUS && is_float_zero(STR(pnum)))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002018 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002019 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002020 return;
2021 }
2022 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002023 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002024 if (s == NULL) {
2025 com_error(c, PyExc_MemoryError, "");
2026 com_addbyte(c, 255);
2027 return;
2028 }
2029 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002030 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002031 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002032 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002033 }
Tim Peters51e26512001-09-07 08:45:55 +00002034 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002035 }
2036 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 com_factor(c, CHILD(n, 1));
2038 com_addbyte(c, UNARY_POSITIVE);
2039 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002040 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 com_factor(c, CHILD(n, 1));
2042 com_addbyte(c, UNARY_NEGATIVE);
2043 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002044 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002045 com_factor(c, CHILD(n, 1));
2046 com_addbyte(c, UNARY_INVERT);
2047 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002049 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 }
2051}
2052
2053static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002054com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055{
2056 int i;
2057 int op;
2058 REQ(n, term);
2059 com_factor(c, CHILD(n, 0));
2060 for (i = 2; i < NCH(n); i += 2) {
2061 com_factor(c, CHILD(n, i));
2062 switch (TYPE(CHILD(n, i-1))) {
2063 case STAR:
2064 op = BINARY_MULTIPLY;
2065 break;
2066 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002067 if (c->c_flags & CO_FUTURE_DIVISION)
2068 op = BINARY_TRUE_DIVIDE;
2069 else
2070 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 break;
2072 case PERCENT:
2073 op = BINARY_MODULO;
2074 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002075 case DOUBLESLASH:
2076 op = BINARY_FLOOR_DIVIDE;
2077 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002079 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002080 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002081 op = 255;
2082 }
2083 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002084 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002085 }
2086}
2087
2088static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002089com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002090{
2091 int i;
2092 int op;
2093 REQ(n, arith_expr);
2094 com_term(c, CHILD(n, 0));
2095 for (i = 2; i < NCH(n); i += 2) {
2096 com_term(c, CHILD(n, i));
2097 switch (TYPE(CHILD(n, i-1))) {
2098 case PLUS:
2099 op = BINARY_ADD;
2100 break;
2101 case MINUS:
2102 op = BINARY_SUBTRACT;
2103 break;
2104 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002105 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002106 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002107 op = 255;
2108 }
2109 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002110 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002111 }
2112}
2113
2114static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002115com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002116{
2117 int i;
2118 int op;
2119 REQ(n, shift_expr);
2120 com_arith_expr(c, CHILD(n, 0));
2121 for (i = 2; i < NCH(n); i += 2) {
2122 com_arith_expr(c, CHILD(n, i));
2123 switch (TYPE(CHILD(n, i-1))) {
2124 case LEFTSHIFT:
2125 op = BINARY_LSHIFT;
2126 break;
2127 case RIGHTSHIFT:
2128 op = BINARY_RSHIFT;
2129 break;
2130 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002131 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002132 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002133 op = 255;
2134 }
2135 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002137 }
2138}
2139
2140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002141com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002142{
2143 int i;
2144 int op;
2145 REQ(n, and_expr);
2146 com_shift_expr(c, CHILD(n, 0));
2147 for (i = 2; i < NCH(n); i += 2) {
2148 com_shift_expr(c, CHILD(n, i));
2149 if (TYPE(CHILD(n, i-1)) == AMPER) {
2150 op = BINARY_AND;
2151 }
2152 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002153 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002154 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002155 op = 255;
2156 }
2157 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002159 }
2160}
2161
2162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002163com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002164{
2165 int i;
2166 int op;
2167 REQ(n, xor_expr);
2168 com_and_expr(c, CHILD(n, 0));
2169 for (i = 2; i < NCH(n); i += 2) {
2170 com_and_expr(c, CHILD(n, i));
2171 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2172 op = BINARY_XOR;
2173 }
2174 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002175 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002176 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 op = 255;
2178 }
2179 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002181 }
2182}
2183
2184static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002185com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186{
2187 int i;
2188 int op;
2189 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002190 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002191 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002192 com_xor_expr(c, CHILD(n, i));
2193 if (TYPE(CHILD(n, i-1)) == VBAR) {
2194 op = BINARY_OR;
2195 }
2196 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002198 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002199 op = 255;
2200 }
2201 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002202 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 }
2204}
2205
2206static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002207cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208{
2209 REQ(n, comp_op);
Guido van Rossum01cfd441991-10-20 20:12:38 +00002210 /* comp_op: '<' | '>' | '=' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2212 if (NCH(n) == 1) {
2213 n = CHILD(n, 0);
2214 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002215 case LESS: return PyCmp_LT;
2216 case GREATER: return PyCmp_GT;
Guido van Rossum01cfd441991-10-20 20:12:38 +00002217 case EQEQUAL: /* == */
Martin v. Löwis7198a522002-01-01 19:59:11 +00002218 case EQUAL: return PyCmp_EQ;
2219 case LESSEQUAL: return PyCmp_LE;
2220 case GREATEREQUAL: return PyCmp_GE;
2221 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2222 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2223 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 }
2225 }
2226 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002228 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002229 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002231 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002232 }
2233 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002234 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002235}
2236
2237static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002238com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239{
2240 int i;
2241 enum cmp_op op;
2242 int anchor;
2243 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2244 com_expr(c, CHILD(n, 0));
2245 if (NCH(n) == 1)
2246 return;
2247
2248 /****************************************************************
2249 The following code is generated for all but the last
2250 comparison in a chain:
2251
2252 label: on stack: opcode: jump to:
2253
2254 a <code to load b>
2255 a, b DUP_TOP
2256 a, b, b ROT_THREE
2257 b, a, b COMPARE_OP
2258 b, 0-or-1 JUMP_IF_FALSE L1
2259 b, 1 POP_TOP
2260 b
2261
2262 We are now ready to repeat this sequence for the next
2263 comparison in the chain.
2264
2265 For the last we generate:
2266
2267 b <code to load c>
2268 b, c COMPARE_OP
2269 0-or-1
2270
2271 If there were any jumps to L1 (i.e., there was more than one
2272 comparison), we generate:
2273
2274 0-or-1 JUMP_FORWARD L2
2275 L1: b, 0 ROT_TWO
2276 0, b POP_TOP
2277 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002278 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279 ****************************************************************/
2280
2281 anchor = 0;
2282
2283 for (i = 2; i < NCH(n); i += 2) {
2284 com_expr(c, CHILD(n, i));
2285 if (i+2 < NCH(n)) {
2286 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 com_addbyte(c, ROT_THREE);
2289 }
2290 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002291 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002293 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 }
2295 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002296 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 if (i+2 < NCH(n)) {
2298 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2299 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002300 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 }
2302 }
2303
2304 if (anchor) {
2305 int anchor2 = 0;
2306 com_addfwref(c, JUMP_FORWARD, &anchor2);
2307 com_backpatch(c, anchor);
2308 com_addbyte(c, ROT_TWO);
2309 com_addbyte(c, POP_TOP);
2310 com_backpatch(c, anchor2);
2311 }
2312}
2313
2314static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002315com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316{
2317 REQ(n, not_test); /* 'not' not_test | comparison */
2318 if (NCH(n) == 1) {
2319 com_comparison(c, CHILD(n, 0));
2320 }
2321 else {
2322 com_not_test(c, CHILD(n, 1));
2323 com_addbyte(c, UNARY_NOT);
2324 }
2325}
2326
2327static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002328com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329{
2330 int i;
2331 int anchor;
2332 REQ(n, and_test); /* not_test ('and' not_test)* */
2333 anchor = 0;
2334 i = 0;
2335 for (;;) {
2336 com_not_test(c, CHILD(n, i));
2337 if ((i += 2) >= NCH(n))
2338 break;
2339 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2340 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002341 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 }
2343 if (anchor)
2344 com_backpatch(c, anchor);
2345}
2346
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002347static int
2348com_make_closure(struct compiling *c, PyCodeObject *co)
2349{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002350 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002351 if (free == 0)
2352 return 0;
2353 for (i = 0; i < free; ++i) {
2354 /* Bypass com_addop_varname because it will generate
2355 LOAD_DEREF but LOAD_CLOSURE is needed.
2356 */
2357 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2358 int arg, reftype;
2359
2360 /* Special case: If a class contains a method with a
2361 free variable that has the same name as a method,
2362 the name will be considered free *and* local in the
2363 class. It should be handled by the closure, as
2364 well as by the normal name loookup logic.
2365 */
2366 reftype = get_ref_type(c, PyString_AS_STRING(name));
2367 if (reftype == CELL)
2368 arg = com_lookup_arg(c->c_cellvars, name);
2369 else /* (reftype == FREE) */
2370 arg = com_lookup_arg(c->c_freevars, name);
2371 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002372 fprintf(stderr, "lookup %s in %s %d %d\n"
2373 "freevars of %s: %s\n",
2374 PyObject_REPR(name),
2375 c->c_name,
2376 reftype, arg,
2377 PyString_AS_STRING(co->co_name),
2378 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002379 Py_FatalError("com_make_closure()");
2380 }
2381 com_addoparg(c, LOAD_CLOSURE, arg);
2382
2383 }
2384 com_push(c, free);
2385 return 1;
2386}
2387
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002389com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002392 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002393 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002394 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002395 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002396 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2397 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002398 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002399 if (co == NULL) {
2400 c->c_errors++;
2401 return;
2402 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002403 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002404 i = com_addconst(c, (PyObject *)co);
2405 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002406 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002408 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002409 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002410 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002411 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002412 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002413 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002416 else {
2417 int anchor = 0;
2418 int i = 0;
2419 for (;;) {
2420 com_and_test(c, CHILD(n, i));
2421 if ((i += 2) >= NCH(n))
2422 break;
2423 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2424 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002425 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002426 }
2427 if (anchor)
2428 com_backpatch(c, anchor);
2429 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002430}
2431
2432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002433com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002434{
2435 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002436 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 com_node(c, CHILD(n, 0));
2438 }
2439 else {
2440 int i;
2441 int len;
2442 len = (NCH(n) + 1) / 2;
2443 for (i = 0; i < NCH(n); i += 2)
2444 com_node(c, CHILD(n, i));
2445 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 }
2448}
2449
2450
2451/* Begin of assignment compilation */
2452
Thomas Wouters434d0822000-08-24 20:11:32 +00002453
2454static void
2455com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2456{
2457 com_addbyte(c, DUP_TOP);
2458 com_push(c, 1);
2459 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002460 com_node(c, augn);
2461 com_addbyte(c, opcode);
2462 com_pop(c, 1);
2463 com_addbyte(c, ROT_TWO);
2464 com_addopname(c, STORE_ATTR, n);
2465 com_pop(c, 2);
2466}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467
2468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002469com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002470{
2471 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002472 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002473}
2474
2475static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002476com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 REQ(n, trailer);
2479 switch (TYPE(CHILD(n, 0))) {
2480 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002481 if (assigning == OP_DELETE)
2482 com_error(c, PyExc_SyntaxError,
2483 "can't delete function call");
2484 else
2485 com_error(c, PyExc_SyntaxError,
2486 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002487 break;
2488 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002489 if (assigning > OP_APPLY)
2490 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2491 else
2492 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002494 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002495 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 break;
2497 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002498 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002499 }
2500}
2501
2502static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002503com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002504{
2505 int i;
Thomas Woutersb59290f2000-08-25 05:41:11 +00002506 if (TYPE(n) != testlist && TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002507 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002508 if (assigning) {
2509 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002510 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002511 com_push(c, i-1);
2512 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002513 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 com_assign(c, CHILD(n, i), assigning, NULL);
2515}
2516
2517static void
2518com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
2519{
2520 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002521 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00002522 com_push(c, 1);
2523 com_node(c, augn);
2524 com_addbyte(c, opcode);
2525 com_pop(c, 1);
2526 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527}
2528
2529static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002530com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531{
2532 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002533 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002534 if (assigning)
2535 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536}
2537
2538static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002539com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002540{
2541 /* Loop to avoid trivial recursion */
2542 for (;;) {
2543 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002544
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545 case exprlist:
2546 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00002547 case testlist1:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 if (NCH(n) > 1) {
Thomas Wouters434d0822000-08-24 20:11:32 +00002549 if (assigning > OP_APPLY) {
2550 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00002551 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002552 return;
2553 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002554 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555 return;
2556 }
2557 n = CHILD(n, 0);
2558 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002559
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 case test:
2561 case and_test:
2562 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00002565 case xor_expr:
2566 case and_expr:
2567 case shift_expr:
2568 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00002570 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002572 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002573 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 return;
2575 }
2576 n = CHILD(n, 0);
2577 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002578
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002579 case power: /* atom trailer* ('**' power)*
2580 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00002581 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002582 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002583 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 return;
2585 }
Guido van Rossum50564e81996-01-12 01:13:16 +00002586 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002587 int i;
2588 com_node(c, CHILD(n, 0));
2589 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00002590 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002591 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002592 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00002593 return;
2594 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 com_apply_trailer(c, CHILD(n, i));
2596 } /* NB i is still alive */
2597 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00002598 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002599 return;
2600 }
2601 n = CHILD(n, 0);
2602 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002603
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002604 case atom:
2605 switch (TYPE(CHILD(n, 0))) {
2606 case LPAR:
2607 n = CHILD(n, 1);
2608 if (TYPE(n) == RPAR) {
2609 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002610 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002611 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 return;
2613 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002614 if (assigning > OP_APPLY) {
2615 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002616 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00002617 return;
2618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 break;
2620 case LSQB:
2621 n = CHILD(n, 1);
2622 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002623 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002624 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 return;
2626 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002627 if (assigning > OP_APPLY) {
2628 com_error(c, PyExc_SyntaxError,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002629 "augmented assign to list not possible");
2630 return;
2631 }
2632 if (NCH(n) > 1
2633 && TYPE(CHILD(n, 1)) == list_for) {
2634 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002635 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00002636 return;
2637 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002638 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002639 return;
2640 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00002641 if (assigning > OP_APPLY)
2642 com_augassign_name(c, CHILD(n, 0),
2643 assigning, augn);
2644 else
2645 com_assign_name(c, CHILD(n, 0),
2646 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002647 return;
2648 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002649 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002650 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651 return;
2652 }
2653 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002654
2655 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002656 com_error(c, PyExc_SyntaxError,
2657 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00002658 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002659
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_error(c, PyExc_SystemError,
2662 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002663 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002664
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665 }
2666 }
2667}
Guido van Rossum7c531111997-03-11 18:42:21 +00002668
Thomas Wouters434d0822000-08-24 20:11:32 +00002669static void
2670com_augassign(struct compiling *c, node *n)
2671{
2672 int opcode;
2673
2674 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
2675 case '+': opcode = INPLACE_ADD; break;
2676 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002677 case '/':
2678 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
2679 opcode = INPLACE_FLOOR_DIVIDE;
2680 else if (c->c_flags & CO_FUTURE_DIVISION)
2681 opcode = INPLACE_TRUE_DIVIDE;
2682 else
2683 opcode = INPLACE_DIVIDE;
2684 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00002685 case '%': opcode = INPLACE_MODULO; break;
2686 case '<': opcode = INPLACE_LSHIFT; break;
2687 case '>': opcode = INPLACE_RSHIFT; break;
2688 case '&': opcode = INPLACE_AND; break;
2689 case '^': opcode = INPLACE_XOR; break;
2690 case '|': opcode = INPLACE_OR; break;
2691 case '*':
2692 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
2693 opcode = INPLACE_POWER;
2694 else
2695 opcode = INPLACE_MULTIPLY;
2696 break;
2697 default:
2698 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
2699 return;
2700 }
2701 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
2702}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703
2704static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002705com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706{
Thomas Wouters434d0822000-08-24 20:11:32 +00002707 REQ(n, expr_stmt);
2708 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00002710 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00002712 if (NCH(n) == 1) {
2713 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002714 if (c->c_interactive)
2715 com_addbyte(c, PRINT_EXPR);
2716 else
2717 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002720 else if (TYPE(CHILD(n,1)) == augassign)
2721 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002722 else {
2723 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00002724 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002725 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00002726 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002727 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 com_push(c, 1);
2729 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002730 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 }
2732 }
2733}
2734
2735static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002736com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00002737{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002738 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00002739 int i;
2740 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002741 if (Py_OptimizeFlag)
2742 return;
2743 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00002744
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002745 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00002746 raise AssertionError [, <message>]
2747
2748 where <message> is the second test, if present.
2749 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002750 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002751 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002752 com_addbyte(c, POP_TOP);
2753 com_pop(c, 1);
2754 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002755 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00002756 com_push(c, 1);
2757 i = NCH(n)/2; /* Either 2 or 4 */
2758 if (i > 1)
2759 com_node(c, CHILD(n, 3));
2760 com_addoparg(c, RAISE_VARARGS, i);
2761 com_pop(c, i);
2762 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00002763 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00002764 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00002765 com_addbyte(c, POP_TOP);
2766}
2767
2768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002769com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770{
Barry Warsaw29c574e2000-08-21 15:38:56 +00002771 int i = 1;
2772 node* stream = NULL;
2773
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002774 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002775
2776 /* are we using the extended print form? */
2777 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
2778 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00002779 com_node(c, stream);
2780 /* stack: [...] => [... stream] */
2781 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002782 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
2783 i = 4;
2784 else
2785 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00002787 for (; i < NCH(n); i += 2) {
2788 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002789 com_addbyte(c, DUP_TOP);
2790 /* stack: [stream] => [stream stream] */
2791 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00002792 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002793 /* stack: [stream stream] => [stream stream obj] */
2794 com_addbyte(c, ROT_TWO);
2795 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002796 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002797 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002798 com_pop(c, 2);
2799 }
2800 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002801 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00002802 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002803 com_addbyte(c, PRINT_ITEM);
2804 com_pop(c, 1);
2805 }
2806 }
2807 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00002808 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00002809 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00002810 /* must pop the extra stream object off the stack */
2811 com_addbyte(c, POP_TOP);
2812 /* stack: [... stream] => [...] */
2813 com_pop(c, 1);
2814 }
2815 }
2816 else {
2817 if (stream != NULL) {
2818 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002819 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00002820 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00002821 com_pop(c, 1);
2822 }
2823 else
2824 com_addbyte(c, PRINT_NEWLINE);
2825 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826}
2827
2828static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002829com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002831 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00002832 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002833 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00002834 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002835 if (c->c_flags & CO_GENERATOR) {
2836 if (NCH(n) > 1) {
2837 com_error(c, PyExc_SyntaxError,
2838 "'return' with argument inside generator");
2839 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002840 }
2841 if (NCH(n) < 2) {
2842 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_push(c, 1);
2844 }
Tim Petersad1a18b2001-06-23 06:19:16 +00002845 else
2846 com_node(c, CHILD(n, 1));
2847 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00002848 com_pop(c, 1);
2849}
2850
2851static void
2852com_yield_stmt(struct compiling *c, node *n)
2853{
Tim Peters95c80f82001-06-23 02:07:08 +00002854 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00002855 REQ(n, yield_stmt); /* 'yield' testlist */
2856 if (!c->c_infunction) {
2857 com_error(c, PyExc_SyntaxError, "'yield' outside function");
2858 }
Tim Peters95c80f82001-06-23 02:07:08 +00002859
2860 for (i = 0; i < c->c_nblocks; ++i) {
2861 if (c->c_block[i] == SETUP_FINALLY) {
2862 com_error(c, PyExc_SyntaxError,
2863 "'yield' not allowed in a 'try' block "
2864 "with a 'finally' clause");
2865 return;
2866 }
2867 }
Tim Peters5ca576e2001-06-18 22:08:13 +00002868 com_node(c, CHILD(n, 1));
2869 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871}
2872
2873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00002877 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
2878 if (NCH(n) > 1) {
2879 com_node(c, CHILD(n, 1));
2880 if (NCH(n) > 3) {
2881 com_node(c, CHILD(n, 3));
2882 if (NCH(n) > 5)
2883 com_node(c, CHILD(n, 5));
2884 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002885 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 i = NCH(n)/2;
2887 com_addoparg(c, RAISE_VARARGS, i);
2888 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889}
2890
2891static void
Thomas Wouters52152252000-08-17 22:55:00 +00002892com_from_import(struct compiling *c, node *n)
2893{
2894 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
2895 com_push(c, 1);
2896 if (NCH(n) > 1) {
2897 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
2898 com_error(c, PyExc_SyntaxError, "invalid syntax");
2899 return;
2900 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002901 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002902 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002903 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00002904 com_pop(c, 1);
2905}
2906
2907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909{
2910 int i;
2911 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002912 /* 'import' dotted_name (',' dotted_name)* |
2913 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002914 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00002915 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002916 /* 'from' dotted_name 'import' ... */
2917 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002918
2919 if (TYPE(CHILD(n, 3)) == STAR) {
2920 tup = Py_BuildValue("(s)", "*");
2921 } else {
2922 tup = PyTuple_New((NCH(n) - 2)/2);
2923 for (i = 3; i < NCH(n); i += 2) {
2924 PyTuple_SET_ITEM(tup, (i-3)/2,
2925 PyString_FromString(STR(
Jeremy Hylton4419ac12001-02-28 22:54:51 +00002926 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002927 }
2928 }
2929 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00002930 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002931 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002932 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00002933 if (TYPE(CHILD(n, 3)) == STAR)
2934 com_addbyte(c, IMPORT_STAR);
2935 else {
2936 for (i = 3; i < NCH(n); i += 2)
2937 com_from_import(c, CHILD(n, i));
2938 com_addbyte(c, POP_TOP);
2939 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002940 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 }
2942 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00002943 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002944 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00002945 node *subn = CHILD(n, i);
2946 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002947 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00002949 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00002950 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00002951 int j;
2952 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00002953 com_error(c, PyExc_SyntaxError,
2954 "invalid syntax");
2955 return;
2956 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00002957 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
2958 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002959 CHILD(CHILD(subn, 0),
2960 j));
2961 com_addop_varname(c, VAR_STORE,
2962 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00002963 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002964 com_addop_varname(c, VAR_STORE,
2965 STR(CHILD(CHILD(subn, 0),
2966 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002967 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 }
2969 }
2970}
2971
2972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002973com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002974{
2975 REQ(n, exec_stmt);
2976 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
2977 com_node(c, CHILD(n, 1));
2978 if (NCH(n) >= 4)
2979 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002980 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002981 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002982 com_push(c, 1);
2983 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002984 if (NCH(n) >= 6)
2985 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002986 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002987 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_push(c, 1);
2989 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002990 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002991 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00002992}
2993
Guido van Rossum7c531111997-03-11 18:42:21 +00002994static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002995is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00002996{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002997 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00002998 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002999 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003000
3001 /* Label to avoid tail recursion */
3002 next:
3003 switch (TYPE(n)) {
3004
3005 case suite:
3006 if (NCH(n) == 1) {
3007 n = CHILD(n, 0);
3008 goto next;
3009 }
3010 /* Fall through */
3011 case file_input:
3012 for (i = 0; i < NCH(n); i++) {
3013 node *ch = CHILD(n, i);
3014 if (TYPE(ch) == stmt) {
3015 n = ch;
3016 goto next;
3017 }
3018 }
3019 break;
3020
3021 case stmt:
3022 case simple_stmt:
3023 case small_stmt:
3024 n = CHILD(n, 0);
3025 goto next;
3026
3027 case expr_stmt:
3028 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003029 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003030 case test:
3031 case and_test:
3032 case not_test:
3033 case comparison:
3034 case expr:
3035 case xor_expr:
3036 case and_expr:
3037 case shift_expr:
3038 case arith_expr:
3039 case term:
3040 case factor:
3041 case power:
3042 case atom:
3043 if (NCH(n) == 1) {
3044 n = CHILD(n, 0);
3045 goto next;
3046 }
3047 break;
3048
3049 case NAME:
3050 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3051 return 1;
3052 break;
3053
3054 case NUMBER:
3055 v = parsenumber(c, STR(n));
3056 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003057 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003058 break;
3059 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003060 i = PyObject_IsTrue(v);
3061 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003062 return i == 0;
3063
3064 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003065 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003066 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003067 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003068 break;
3069 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070 i = PyObject_IsTrue(v);
3071 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003072 return i == 0;
3073
3074 }
3075 return 0;
3076}
3077
Tim Peters08a898f2001-06-28 01:52:22 +00003078
3079/* Look under n for a return stmt with an expression.
3080 * This hack is used to find illegal returns under "if 0:" blocks in
3081 * functions already known to be generators (as determined by the symtable
3082 * pass).
3083 * Return the offending return node if found, else NULL.
3084 */
3085static node *
3086look_for_offending_return(node *n)
3087{
3088 int i;
3089
3090 for (i = 0; i < NCH(n); ++i) {
3091 node *kid = CHILD(n, i);
3092
3093 switch (TYPE(kid)) {
3094 case classdef:
3095 case funcdef:
3096 case lambdef:
3097 /* Stuff in nested functions & classes doesn't
3098 affect the code block we started in. */
3099 return NULL;
3100
3101 case return_stmt:
3102 if (NCH(kid) > 1)
3103 return kid;
3104 break;
3105
3106 default: {
3107 node *bad = look_for_offending_return(kid);
3108 if (bad != NULL)
3109 return bad;
3110 }
3111 }
3112 }
3113
3114 return NULL;
3115}
3116
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003117static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003118com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119{
3120 int i;
3121 int anchor = 0;
3122 REQ(n, if_stmt);
3123 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3124 for (i = 0; i+3 < NCH(n); i+=4) {
3125 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003126 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003127 if (is_constant_false(c, ch)) {
3128 /* We're going to skip this block. However, if this
3129 is a generator, we have to check the dead code
3130 anyway to make sure there aren't any return stmts
3131 with expressions, in the same scope. */
3132 if (c->c_flags & CO_GENERATOR) {
3133 node *p = look_for_offending_return(n);
3134 if (p != NULL) {
3135 int savelineno = c->c_lineno;
3136 c->c_lineno = p->n_lineno;
3137 com_error(c, PyExc_SyntaxError,
3138 "'return' with argument "
3139 "inside generator");
3140 c->c_lineno = savelineno;
3141 }
3142 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003143 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003144 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003145 if (i > 0)
3146 com_addoparg(c, SET_LINENO, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003147 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 com_addfwref(c, JUMP_IF_FALSE, &a);
3149 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 com_node(c, CHILD(n, i+3));
3152 com_addfwref(c, JUMP_FORWARD, &anchor);
3153 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003154 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 com_addbyte(c, POP_TOP);
3156 }
3157 if (i+2 < NCH(n))
3158 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003159 if (anchor)
3160 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161}
3162
3163static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003164com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165{
3166 int break_anchor = 0;
3167 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003168 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3170 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003171 block_push(c, SETUP_LOOP);
3172 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003173 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 com_node(c, CHILD(n, 1));
3175 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3176 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003177 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003178 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003180 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003181 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3182 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003184 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003185 com_addbyte(c, POP_TOP);
3186 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003187 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188 if (NCH(n) > 4)
3189 com_node(c, CHILD(n, 6));
3190 com_backpatch(c, break_anchor);
3191}
3192
3193static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003194com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 int break_anchor = 0;
3197 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003198 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 REQ(n, for_stmt);
3200 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3201 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003202 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003204 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003205 c->c_begin = c->c_nexti;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003206 com_addoparg(c, SET_LINENO, n->n_lineno);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003207 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003208 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003209 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003210 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003212 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003213 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3214 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003216 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003218 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219 if (NCH(n) > 8)
3220 com_node(c, CHILD(n, 8));
3221 com_backpatch(c, break_anchor);
3222}
3223
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003224/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003225
3226 SETUP_FINALLY L
3227 <code for S>
3228 POP_BLOCK
3229 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003230 L: <code for Sf>
3231 END_FINALLY
3232
3233 The special instructions use the block stack. Each block
3234 stack entry contains the instruction that created it (here
3235 SETUP_FINALLY), the level of the value stack at the time the
3236 block stack entry was created, and a label (here L).
3237
3238 SETUP_FINALLY:
3239 Pushes the current value stack level and the label
3240 onto the block stack.
3241 POP_BLOCK:
3242 Pops en entry from the block stack, and pops the value
3243 stack until its level is the same as indicated on the
3244 block stack. (The label is ignored.)
3245 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003246 Pops a variable number of entries from the *value* stack
3247 and re-raises the exception they specify. The number of
3248 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003249
3250 The block stack is unwound when an exception is raised:
3251 when a SETUP_FINALLY entry is found, the exception is pushed
3252 onto the value stack (and the exception condition is cleared),
3253 and the interpreter jumps to the label gotten from the block
3254 stack.
3255
3256 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003257 (The contents of the value stack is shown in [], with the top
3258 at the right; 'tb' is trace-back info, 'val' the exception's
3259 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003260
3261 Value stack Label Instruction Argument
3262 [] SETUP_EXCEPT L1
3263 [] <code for S>
3264 [] POP_BLOCK
3265 [] JUMP_FORWARD L0
3266
Guido van Rossum3f5da241990-12-20 15:06:42 +00003267 [tb, val, exc] L1: DUP )
3268 [tb, val, exc, exc] <evaluate E1> )
3269 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3270 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3271 [tb, val, exc, 1] POP )
3272 [tb, val, exc] POP
3273 [tb, val] <assign to V1> (or POP if no V1)
3274 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003275 [] <code for S1>
3276 JUMP_FORWARD L0
3277
Guido van Rossum3f5da241990-12-20 15:06:42 +00003278 [tb, val, exc, 0] L2: POP
3279 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003280 .............................etc.......................
3281
Guido van Rossum3f5da241990-12-20 15:06:42 +00003282 [tb, val, exc, 0] Ln+1: POP
3283 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003284
3285 [] L0: <next statement>
3286
3287 Of course, parts are not generated if Vi or Ei is not present.
3288*/
3289
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003291com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292{
3293 int except_anchor = 0;
3294 int end_anchor = 0;
3295 int else_anchor = 0;
3296 int i;
3297 node *ch;
3298
3299 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3300 block_push(c, SETUP_EXCEPT);
3301 com_node(c, CHILD(n, 2));
3302 com_addbyte(c, POP_BLOCK);
3303 block_pop(c, SETUP_EXCEPT);
3304 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3305 com_backpatch(c, except_anchor);
3306 for (i = 3;
3307 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3308 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003310 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003311 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003312 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003313 break;
3314 }
3315 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_push(c, 3); /* tb, val, exc pushed by exception */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003317 com_addoparg(c, SET_LINENO, ch->n_lineno);
3318 if (NCH(ch) > 1) {
3319 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003320 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003321 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003322 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003323 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003324 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3325 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003326 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003327 }
3328 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003329 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003330 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003331 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003332 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003333 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 com_pop(c, 1);
3335 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003336 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003337 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003338 com_node(c, CHILD(n, i+2));
3339 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3340 if (except_anchor) {
3341 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003342 /* We come in with [tb, val, exc, 0] on the
3343 stack; one pop and it's the same as
3344 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003345 com_addbyte(c, POP_TOP);
3346 }
3347 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003348 /* We actually come in here with [tb, val, exc] but the
3349 END_FINALLY will zap those and jump around.
3350 The c_stacklevel does not reflect them so we need not pop
3351 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003352 com_addbyte(c, END_FINALLY);
3353 com_backpatch(c, else_anchor);
3354 if (i < NCH(n))
3355 com_node(c, CHILD(n, i+2));
3356 com_backpatch(c, end_anchor);
3357}
3358
3359static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003360com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361{
3362 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003363 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003364
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003365 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3366 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003368 com_addbyte(c, POP_BLOCK);
3369 block_pop(c, SETUP_FINALLY);
3370 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003372 /* While the generated code pushes only one item,
3373 the try-finally handling can enter here with
3374 up to three items. OK, here are the details:
3375 3 for an exception, 2 for RETURN, 1 for BREAK. */
3376 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003377 com_backpatch(c, finally_anchor);
3378 ch = CHILD(n, NCH(n)-1);
3379 com_addoparg(c, SET_LINENO, ch->n_lineno);
3380 com_node(c, ch);
3381 com_addbyte(c, END_FINALLY);
3382 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003383 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003384}
3385
3386static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003387com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003388{
3389 REQ(n, try_stmt);
3390 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3391 | 'try' ':' suite 'finally' ':' suite */
3392 if (TYPE(CHILD(n, 3)) != except_clause)
3393 com_try_finally(c, n);
3394 else
3395 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396}
3397
Guido van Rossum8b993a91997-01-17 21:04:03 +00003398static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003399get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003400{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003401 int i;
3402
Guido van Rossum8b993a91997-01-17 21:04:03 +00003403 /* Label to avoid tail recursion */
3404 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003405 switch (TYPE(n)) {
3406
3407 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 if (NCH(n) == 1) {
3409 n = CHILD(n, 0);
3410 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003411 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003412 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003413 case file_input:
3414 for (i = 0; i < NCH(n); i++) {
3415 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003416 if (TYPE(ch) == stmt) {
3417 n = ch;
3418 goto next;
3419 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003420 }
3421 break;
3422
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003423 case stmt:
3424 case simple_stmt:
3425 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003426 n = CHILD(n, 0);
3427 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003428
3429 case expr_stmt:
3430 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003431 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003432 case test:
3433 case and_test:
3434 case not_test:
3435 case comparison:
3436 case expr:
3437 case xor_expr:
3438 case and_expr:
3439 case shift_expr:
3440 case arith_expr:
3441 case term:
3442 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003443 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003444 if (NCH(n) == 1) {
3445 n = CHILD(n, 0);
3446 goto next;
3447 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003448 break;
3449
3450 case atom:
3451 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003452 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003453 break;
3454
3455 }
3456 return NULL;
3457}
3458
Guido van Rossum79f25d91997-04-29 20:08:16 +00003459static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003460get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003461{
Guido van Rossum541563e1999-01-28 15:08:09 +00003462 /* Don't generate doc-strings if run with -OO */
3463 if (Py_OptimizeFlag > 1)
3464 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 n = get_rawdocstring(n);
3466 if (n == NULL)
3467 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003468 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469}
3470
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003472com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473{
3474 REQ(n, suite);
3475 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3476 if (NCH(n) == 1) {
3477 com_node(c, CHILD(n, 0));
3478 }
3479 else {
3480 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003481 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003482 node *ch = CHILD(n, i);
3483 if (TYPE(ch) == stmt)
3484 com_node(c, ch);
3485 }
3486 }
3487}
3488
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003489/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003491com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003492{
3493 int i = c->c_nblocks;
3494 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3495 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3496 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003497 else if (i <= 0) {
3498 /* at the outer level */
3499 com_error(c, PyExc_SyntaxError,
3500 "'continue' not properly in loop");
3501 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003502 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003503 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003504 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003505 if (c->c_block[j] == SETUP_LOOP)
3506 break;
3507 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003508 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003509 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003510 for (; i > j; --i) {
3511 if (c->c_block[i] == SETUP_EXCEPT ||
3512 c->c_block[i] == SETUP_FINALLY) {
3513 com_addoparg(c, CONTINUE_LOOP,
3514 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00003515 return;
3516 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003517 if (c->c_block[i] == END_FINALLY) {
3518 com_error(c, PyExc_SyntaxError,
3519 "'continue' not supported inside 'finally' clause");
3520 return;
3521 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003522 }
3523 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003524 com_error(c, PyExc_SyntaxError,
3525 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003526 }
3527 /* XXX Could allow it inside a 'finally' clause
3528 XXX if we could pop the exception still on the stack */
3529}
3530
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003531static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003532com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003533{
Guido van Rossum681d79a1995-07-18 14:51:37 +00003534 int i, nch, nargs, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003535 if (TYPE(n) == lambdef) {
3536 /* lambdef: 'lambda' [varargslist] ':' test */
3537 n = CHILD(n, 1);
3538 }
3539 else {
3540 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ... */
3541 n = CHILD(n, 2);
3542 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
3543 n = CHILD(n, 1);
3544 }
3545 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003546 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003547 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003548 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003549 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
3550 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003551 nargs = 0;
3552 ndefs = 0;
3553 for (i = 0; i < nch; i++) {
3554 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003555 if (TYPE(CHILD(n, i)) == STAR ||
3556 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003557 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003558 nargs++;
3559 i++;
3560 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00003561 t = RPAR; /* Anything except EQUAL or COMMA */
3562 else
3563 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003564 if (t == EQUAL) {
3565 i++;
3566 ndefs++;
3567 com_node(c, CHILD(n, i));
3568 i++;
3569 if (i >= nch)
3570 break;
3571 t = TYPE(CHILD(n, i));
3572 }
3573 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00003574 /* Treat "(a=1, b)" as an error */
3575 if (ndefs)
3576 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00003577 "non-default argument follows default argument");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003578 }
3579 if (t != COMMA)
3580 break;
3581 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003582 return ndefs;
3583}
3584
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003586com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003588 PyObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003589 int ndefs;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003591 ndefs = com_argdefs(c, n);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003592 symtable_enter_scope(c->c_symtable, STR(CHILD(n, 1)), TYPE(n),
3593 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003594 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003595 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003596 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003597 c->c_errors++;
3598 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003599 int closure = com_make_closure(c, (PyCodeObject *)co);
3600 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003602 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003603 if (closure)
3604 com_addoparg(c, MAKE_CLOSURE, ndefs);
3605 else
3606 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003607 com_pop(c, ndefs);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003608 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003609 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003610 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 }
3612}
3613
3614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003615com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00003616{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003617 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003618 REQ(n, testlist);
3619 /* testlist: test (',' test)* [','] */
3620 for (i = 0; i < NCH(n); i += 2)
3621 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003622 i = (NCH(n)+1) / 2;
3623 com_addoparg(c, BUILD_TUPLE, i);
3624 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00003625}
3626
3627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003628com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629{
Guido van Rossum25831651993-05-19 14:50:45 +00003630 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003631 PyObject *v;
3632 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003633 char *name;
3634
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00003636 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00003637 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00003638 c->c_errors++;
3639 return;
3640 }
3641 /* Push the class name on the stack */
3642 i = com_addconst(c, v);
3643 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003644 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00003646 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003647 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00003648 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003649 com_push(c, 1);
3650 }
Guido van Rossum25831651993-05-19 14:50:45 +00003651 else
3652 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003653 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003654 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003655 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003656 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003657 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003658 c->c_errors++;
3659 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003660 int closure = com_make_closure(c, co);
3661 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003662 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003664 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003665 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003666 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003667 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003668 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003669 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003670 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003671 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003672 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003673 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003674 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676}
3677
3678static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003679com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003680{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003682 if (c->c_errors)
3683 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 switch (TYPE(n)) {
3685
3686 /* Definition nodes */
3687
3688 case funcdef:
3689 com_funcdef(c, n);
3690 break;
3691 case classdef:
3692 com_classdef(c, n);
3693 break;
3694
3695 /* Trivial parse tree nodes */
3696
3697 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003698 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003700 n = CHILD(n, 0);
3701 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003702
3703 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003704 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
3705 com_addoparg(c, SET_LINENO, n->n_lineno);
3706 {
3707 int i;
3708 for (i = 0; i < NCH(n)-1; i += 2)
3709 com_node(c, CHILD(n, i));
3710 }
3711 break;
3712
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713 case compound_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003714 com_addoparg(c, SET_LINENO, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003715 n = CHILD(n, 0);
3716 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003717
3718 /* Statement nodes */
3719
3720 case expr_stmt:
3721 com_expr_stmt(c, n);
3722 break;
3723 case print_stmt:
3724 com_print_stmt(c, n);
3725 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003726 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00003727 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728 break;
3729 case pass_stmt:
3730 break;
3731 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003732 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003733 com_error(c, PyExc_SyntaxError,
3734 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003735 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736 com_addbyte(c, BREAK_LOOP);
3737 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003738 case continue_stmt:
3739 com_continue_stmt(c, n);
3740 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003741 case return_stmt:
3742 com_return_stmt(c, n);
3743 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00003744 case yield_stmt:
3745 com_yield_stmt(c, n);
3746 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 case raise_stmt:
3748 com_raise_stmt(c, n);
3749 break;
3750 case import_stmt:
3751 com_import_stmt(c, n);
3752 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00003753 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00003754 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003755 case exec_stmt:
3756 com_exec_stmt(c, n);
3757 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003758 case assert_stmt:
3759 com_assert_stmt(c, n);
3760 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 case if_stmt:
3762 com_if_stmt(c, n);
3763 break;
3764 case while_stmt:
3765 com_while_stmt(c, n);
3766 break;
3767 case for_stmt:
3768 com_for_stmt(c, n);
3769 break;
3770 case try_stmt:
3771 com_try_stmt(c, n);
3772 break;
3773 case suite:
3774 com_suite(c, n);
3775 break;
3776
3777 /* Expression nodes */
3778
3779 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003780 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00003781 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003782 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003783 break;
3784 case test:
3785 com_test(c, n);
3786 break;
3787 case and_test:
3788 com_and_test(c, n);
3789 break;
3790 case not_test:
3791 com_not_test(c, n);
3792 break;
3793 case comparison:
3794 com_comparison(c, n);
3795 break;
3796 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00003797 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 break;
3799 case expr:
3800 com_expr(c, n);
3801 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00003802 case xor_expr:
3803 com_xor_expr(c, n);
3804 break;
3805 case and_expr:
3806 com_and_expr(c, n);
3807 break;
3808 case shift_expr:
3809 com_shift_expr(c, n);
3810 break;
3811 case arith_expr:
3812 com_arith_expr(c, n);
3813 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003814 case term:
3815 com_term(c, n);
3816 break;
3817 case factor:
3818 com_factor(c, n);
3819 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00003820 case power:
3821 com_power(c, n);
3822 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 case atom:
3824 com_atom(c, n);
3825 break;
3826
3827 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003828 com_error(c, PyExc_SystemError,
3829 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830 }
3831}
3832
Tim Petersdbd9ba62000-07-09 03:09:57 +00003833static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003834
3835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003836com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837{
3838 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
3839 if (TYPE(CHILD(n, 0)) == LPAR)
3840 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003841 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003842 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003843 com_pop(c, 1);
3844 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845}
3846
3847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00003850 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 if (NCH(n) == 1) {
3852 com_fpdef(c, CHILD(n, 0));
3853 }
3854 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003855 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003856 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003857 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858 for (i = 0; i < NCH(n); i += 2)
3859 com_fpdef(c, CHILD(n, i));
3860 }
3861}
3862
3863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003864com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003865{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003866 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003867 int complex = 0;
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003868 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003869 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00003870 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00003871 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003872 nch = NCH(n);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003873 /* Enter all arguments in table of locals */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003874 for (i = 0, narg = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00003875 node *ch = CHILD(n, i);
3876 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003877 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00003878 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003879 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3880 fp = CHILD(ch, 0);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00003881 if (TYPE(fp) != NAME) {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00003882 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Guido van Rossum530956d1996-07-21 02:27:43 +00003883 complex = 1;
Guido van Rossumf10570b1995-07-07 22:53:21 +00003884 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003885 narg++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003886 /* all name updates handled by symtable */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003887 if (++i >= nch)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003888 break;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003889 ch = CHILD(n, i);
3890 if (TYPE(ch) == EQUAL)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003891 i += 2;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003892 else
3893 REQ(ch, COMMA);
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003894 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003895 if (complex) {
3896 /* Generate code for complex arguments only after
3897 having counted the simple arguments */
3898 int ilocal = 0;
3899 for (i = 0; i < nch; i++) {
3900 node *ch = CHILD(n, i);
3901 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00003902 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00003903 break;
3904 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
3905 fp = CHILD(ch, 0);
3906 if (TYPE(fp) != NAME) {
3907 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003908 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003909 com_fpdef(c, ch);
3910 }
3911 ilocal++;
3912 if (++i >= nch)
3913 break;
3914 ch = CHILD(n, i);
3915 if (TYPE(ch) == EQUAL)
3916 i += 2;
3917 else
3918 REQ(ch, COMMA);
3919 }
3920 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003921}
3922
3923static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003924com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003925{
3926 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003927 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003928 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003929 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003930 if (doc != NULL) {
3931 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003932 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003933 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003934 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003935 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00003936 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003937 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003938 for (i = 0; i < NCH(n); i++) {
3939 node *ch = CHILD(n, i);
3940 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
3941 com_node(c, ch);
3942 }
3943}
3944
3945/* Top-level compile-node interface */
3946
3947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003948compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003949{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003950 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951 node *ch;
3952 REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
Guido van Rossum9bfef441993-03-29 10:43:31 +00003953 c->c_name = STR(CHILD(n, 1));
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003954 doc = get_docstring(c, CHILD(n, 4));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003955 if (doc != NULL) {
3956 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003958 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003959 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00003960 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003961 ch = CHILD(n, 2); /* parameters: '(' [varargslist] ')' */
3962 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003963 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00003964 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003965 c->c_infunction = 1;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966 com_node(c, CHILD(n, 4));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003967 c->c_infunction = 0;
Tim Petersad1a18b2001-06-23 06:19:16 +00003968 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
3969 com_push(c, 1);
3970 com_addbyte(c, RETURN_VALUE);
3971 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972}
3973
3974static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003975compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00003976{
Guido van Rossum590baa41993-11-30 13:40:46 +00003977 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003978 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00003979 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00003980
3981 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003982 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00003983 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00003984 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00003985 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00003986 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00003987 else
3988 ch = CHILD(n, 2);
3989 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003990 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00003992}
3993
3994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003995compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003996{
3997 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00003998 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003999 REQ(n, classdef);
4000 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4001 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004002 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004003 /* Initialize local __module__ from global __name__ */
4004 com_addop_name(c, LOAD_GLOBAL, "__name__");
4005 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004007 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004008 if (doc != NULL) {
4009 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004010 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004011 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004012 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004013 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004014 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004015 }
4016 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004017 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004018 com_node(c, ch);
4019 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004021 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004023}
4024
4025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004027{
Guido van Rossum3f5da241990-12-20 15:06:42 +00004028 com_addoparg(c, SET_LINENO, n->n_lineno);
4029
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004030 switch (TYPE(n)) {
4031
Guido van Rossum4c417781991-01-21 16:09:22 +00004032 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004033 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004034 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035 n = CHILD(n, 0);
4036 if (TYPE(n) != NEWLINE)
4037 com_node(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004038 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004040 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004041 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004042 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043 break;
4044
Guido van Rossum4c417781991-01-21 16:09:22 +00004045 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004046 com_file_input(c, n);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004047 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004048 com_push(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004049 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004050 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 break;
4052
Guido van Rossum590baa41993-11-30 13:40:46 +00004053 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004054 com_node(c, CHILD(n, 0));
4055 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004056 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004057 break;
4058
Guido van Rossum590baa41993-11-30 13:40:46 +00004059 case lambdef: /* anonymous function definition */
4060 compile_lambdef(c, n);
4061 break;
4062
Guido van Rossum4c417781991-01-21 16:09:22 +00004063 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064 compile_funcdef(c, n);
4065 break;
4066
Guido van Rossum4c417781991-01-21 16:09:22 +00004067 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004068 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004069 break;
4070
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004072 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004073 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004074 }
4075}
4076
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004077static PyObject *
4078dict_keys_inorder(PyObject *dict, int offset)
4079{
4080 PyObject *tuple, *k, *v;
4081 int i, pos = 0, size = PyDict_Size(dict);
4082
4083 tuple = PyTuple_New(size);
4084 if (tuple == NULL)
4085 return NULL;
4086 while (PyDict_Next(dict, &pos, &k, &v)) {
4087 i = PyInt_AS_LONG(v);
4088 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004089 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004090 PyTuple_SET_ITEM(tuple, i - offset, k);
4091 }
4092 return tuple;
4093}
4094
Guido van Rossum79f25d91997-04-29 20:08:16 +00004095PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004096PyNode_Compile(node *n, char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004098 return PyNode_CompileFlags(n, filename, NULL);
4099}
4100
4101PyCodeObject *
4102PyNode_CompileFlags(node *n, char *filename, PyCompilerFlags *flags)
4103{
4104 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004105}
4106
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004107struct symtable *
4108PyNode_CompileSymtable(node *n, char *filename)
4109{
4110 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004111 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004112
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004113 ff = PyNode_Future(n, filename);
4114 if (ff == NULL)
4115 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004116
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004117 st = symtable_init();
Tim Peters8c5e4152001-11-04 19:26:58 +00004118 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004119 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004120 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004121 }
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004122 st->st_future = ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004123 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004124 if (st->st_errors > 0)
4125 goto fail;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004126 symtable_node(st, n);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004127 if (st->st_errors > 0)
4128 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004129
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004130 return st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004131 fail:
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004132 PyObject_FREE((void *)ff);
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004133 st->st_future = NULL;
4134 PySymtable_Free(st);
4135 return NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004136}
4137
Guido van Rossum79f25d91997-04-29 20:08:16 +00004138static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004139icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004140{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004141 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004142}
4143
Guido van Rossum79f25d91997-04-29 20:08:16 +00004144static PyCodeObject *
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004145jcompile(node *n, char *filename, struct compiling *base,
4146 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004147{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004149 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004150 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004152 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004153 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004154 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004155 /* c_symtable still points to parent's symbols */
4156 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004157 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004158 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004159 sc.c_flags |= base->c_flags & PyCF_MASK;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004160 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004161 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004162 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004163 if (sc.c_future == NULL) {
4164 com_free(&sc);
4165 return NULL;
4166 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004167 if (flags) {
4168 int merged = sc.c_future->ff_features |
4169 flags->cf_flags;
4170 sc.c_future->ff_features = merged;
4171 flags->cf_flags = merged;
4172 }
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004173 if (symtable_build(&sc, n) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004174 com_free(&sc);
4175 return NULL;
4176 }
4177 }
4178 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004179 if (symtable_load_symbols(&sc) < 0) {
4180 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004181 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004182 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004183 compile_node(&sc, n);
4184 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004185 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004186 PyObject *consts, *names, *varnames, *filename, *name,
4187 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004188 consts = PyList_AsTuple(sc.c_consts);
4189 names = PyList_AsTuple(sc.c_names);
4190 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004191 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4192 freevars = dict_keys_inorder(sc.c_freevars,
4193 PyTuple_GET_SIZE(cellvars));
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004194 filename = PyString_InternFromString(sc.c_filename);
4195 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004196 if (!PyErr_Occurred())
4197 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004198 sc.c_nlocals,
4199 sc.c_maxstacklevel,
4200 sc.c_flags,
4201 sc.c_code,
4202 consts,
4203 names,
4204 varnames,
4205 freevars,
4206 cellvars,
4207 filename,
4208 name,
4209 sc.c_firstlineno,
4210 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004211 Py_XDECREF(consts);
4212 Py_XDECREF(names);
4213 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004214 Py_XDECREF(freevars);
4215 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004216 Py_XDECREF(filename);
4217 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004218 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004219 else if (!PyErr_Occurred()) {
4220 /* This could happen if someone called PyErr_Clear() after an
4221 error was reported above. That's not supposed to happen,
4222 but I just plugged one case and I'm not sure there can't be
4223 others. In that case, raise SystemError so that at least
4224 it gets reported instead dumping core. */
4225 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004227 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004228 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004229 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004230 sc.c_symtable = NULL;
4231 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004232 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004233 return co;
4234}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004235
4236int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004237PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004238{
4239 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004240 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004241 int line = co->co_firstlineno;
4242 int addr = 0;
4243 while (--size >= 0) {
4244 addr += *p++;
4245 if (addr > addrq)
4246 break;
4247 line += *p++;
4248 }
4249 return line;
4250}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004252/* The test for LOCAL must come before the test for FREE in order to
4253 handle classes where name is both local and free. The local var is
4254 a method and the free var is a free var referenced within a method.
4255*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004256
4257static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004259{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004260 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004261 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004262
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004263 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4264 return CELL;
4265 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4266 return LOCAL;
4267 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4268 return FREE;
4269 v = PyDict_GetItemString(c->c_globals, name);
4270 if (v) {
4271 if (v == Py_None)
4272 return GLOBAL_EXPLICIT;
4273 else {
4274 return GLOBAL_IMPLICIT;
4275 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004277 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004278 "unknown scope for %.100s in %.100s(%s) "
4279 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4280 name, c->c_name,
4281 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4282 c->c_filename,
4283 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4284 PyObject_REPR(c->c_locals),
4285 PyObject_REPR(c->c_globals)
4286 );
4287
4288 Py_FatalError(buf);
4289 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004290}
4291
Guido van Rossum207fda62001-03-02 03:30:41 +00004292/* Helper functions to issue warnings */
4293
4294static int
4295issue_warning(char *msg, char *filename, int lineno)
4296{
4297 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4298 lineno, NULL, NULL) < 0) {
4299 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4300 PyErr_SetString(PyExc_SyntaxError, msg);
4301 PyErr_SyntaxLocation(filename, lineno);
4302 }
4303 return -1;
4304 }
4305 return 0;
4306}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004307
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004308static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004309symtable_warn(struct symtable *st, char *msg)
4310{
Guido van Rossum207fda62001-03-02 03:30:41 +00004311 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004312 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004313 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004314 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004315 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004316}
4317
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004318/* Helper function for setting lineno and filename */
4319
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004320static int
4321symtable_build(struct compiling *c, node *n)
4322{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004323 if ((c->c_symtable = symtable_init()) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004325 c->c_symtable->st_future = c->c_future;
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004326 c->c_symtable->st_filename = c->c_filename;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004327 symtable_enter_scope(c->c_symtable, TOP, TYPE(n), n->n_lineno);
4328 if (c->c_symtable->st_errors > 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004329 return -1;
4330 symtable_node(c->c_symtable, n);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004331 if (c->c_symtable->st_errors > 0)
4332 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004333 /* reset for second pass */
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004334 c->c_symtable->st_nscopes = 1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004335 c->c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004336 return 0;
4337}
4338
4339static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004340symtable_init_compiling_symbols(struct compiling *c)
4341{
4342 PyObject *varnames;
4343
4344 varnames = c->c_symtable->st_cur->ste_varnames;
4345 if (varnames == NULL) {
4346 varnames = PyList_New(0);
4347 if (varnames == NULL)
4348 return -1;
4349 c->c_symtable->st_cur->ste_varnames = varnames;
4350 Py_INCREF(varnames);
4351 } else
4352 Py_INCREF(varnames);
4353 c->c_varnames = varnames;
4354
4355 c->c_globals = PyDict_New();
4356 if (c->c_globals == NULL)
4357 return -1;
4358 c->c_freevars = PyDict_New();
4359 if (c->c_freevars == NULL)
4360 return -1;
4361 c->c_cellvars = PyDict_New();
4362 if (c->c_cellvars == NULL)
4363 return -1;
4364 return 0;
4365}
4366
4367struct symbol_info {
4368 int si_nlocals;
4369 int si_ncells;
4370 int si_nfrees;
4371 int si_nimplicit;
4372};
4373
4374static void
4375symtable_init_info(struct symbol_info *si)
4376{
4377 si->si_nlocals = 0;
4378 si->si_ncells = 0;
4379 si->si_nfrees = 0;
4380 si->si_nimplicit = 0;
4381}
4382
4383static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004384symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004385 struct symbol_info *si)
4386{
4387 PyObject *dict, *v;
4388
4389 /* Seperate logic for DEF_FREE. If it occurs in a function,
4390 it indicates a local that we must allocate storage for (a
4391 cell var). If it occurs in a class, then the class has a
4392 method and a free variable with the same name.
4393 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004394 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004395 /* If it isn't declared locally, it can't be a cell. */
4396 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
4397 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004398 v = PyInt_FromLong(si->si_ncells++);
4399 dict = c->c_cellvars;
4400 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004401 /* If it is free anyway, then there is no need to do
4402 anything here.
4403 */
4404 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00004405 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004406 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004407 v = PyInt_FromLong(si->si_nfrees++);
4408 dict = c->c_freevars;
4409 }
4410 if (v == NULL)
4411 return -1;
4412 if (PyDict_SetItem(dict, name, v) < 0) {
4413 Py_DECREF(v);
4414 return -1;
4415 }
4416 Py_DECREF(v);
4417 return 0;
4418}
4419
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004420/* If a variable is a cell and an argument, make sure that appears in
4421 co_cellvars before any variable to its right in varnames.
4422*/
4423
4424
4425static int
4426symtable_cellvar_offsets(PyObject **cellvars, int argcount,
4427 PyObject *varnames, int flags)
4428{
4429 PyObject *v, *w, *d, *list = NULL;
4430 int i, pos;
4431
4432 if (flags & CO_VARARGS)
4433 argcount++;
4434 if (flags & CO_VARKEYWORDS)
4435 argcount++;
4436 for (i = argcount; --i >= 0; ) {
4437 v = PyList_GET_ITEM(varnames, i);
4438 if (PyDict_GetItem(*cellvars, v)) {
4439 if (list == NULL) {
4440 list = PyList_New(1);
4441 if (list == NULL)
4442 return -1;
4443 PyList_SET_ITEM(list, 0, v);
4444 Py_INCREF(v);
4445 } else
4446 PyList_Insert(list, 0, v);
4447 }
4448 }
4449 if (list == NULL || PyList_GET_SIZE(list) == 0)
4450 return 0;
4451 /* There are cellvars that are also arguments. Create a dict
4452 to replace cellvars and put the args at the front.
4453 */
4454 d = PyDict_New();
4455 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
4456 v = PyInt_FromLong(i);
4457 if (v == NULL)
4458 goto fail;
4459 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
4460 goto fail;
4461 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
4462 goto fail;
4463 }
4464 pos = 0;
4465 i = PyList_GET_SIZE(list);
4466 Py_DECREF(list);
4467 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
4468 w = PyInt_FromLong(i++); /* don't care about the old key */
4469 if (PyDict_SetItem(d, v, w) < 0) {
4470 Py_DECREF(w);
4471 goto fail;
4472 }
4473 Py_DECREF(w);
4474 }
4475 Py_DECREF(*cellvars);
4476 *cellvars = d;
4477 return 1;
4478 fail:
4479 Py_DECREF(d);
4480 return -1;
4481}
4482
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004483static int
4484symtable_freevar_offsets(PyObject *freevars, int offset)
4485{
4486 PyObject *name, *v;
4487 int pos;
4488
4489 /* The cell vars are the first elements of the closure,
4490 followed by the free vars. Update the offsets in
4491 c_freevars to account for number of cellvars. */
4492 pos = 0;
4493 while (PyDict_Next(freevars, &pos, &name, &v)) {
4494 int i = PyInt_AS_LONG(v) + offset;
4495 PyObject *o = PyInt_FromLong(i);
4496 if (o == NULL)
4497 return -1;
4498 if (PyDict_SetItem(freevars, name, o) < 0) {
4499 Py_DECREF(o);
4500 return -1;
4501 }
4502 Py_DECREF(o);
4503 }
4504 return 0;
4505}
4506
4507static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004508symtable_check_unoptimized(struct compiling *c,
4509 PySymtableEntryObject *ste,
4510 struct symbol_info *si)
4511{
4512 char buf[300];
4513
4514 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
4515 || (ste->ste_nested && si->si_nimplicit)))
4516 return 0;
4517
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004518#define ILLEGAL_CONTAINS "contains a nested function with free variables"
4519
4520#define ILLEGAL_IS "is a nested function"
4521
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004522#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004523"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004524
4525#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004526"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004527
4528#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00004529"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004530"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004531
4532 /* XXX perhaps the linenos for these opt-breaking statements
4533 should be stored so the exception can point to them. */
4534
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004535 if (ste->ste_child_free) {
4536 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004537 PyOS_snprintf(buf, sizeof(buf),
4538 ILLEGAL_IMPORT_STAR,
4539 PyString_AS_STRING(ste->ste_name),
4540 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004541 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004542 PyOS_snprintf(buf, sizeof(buf),
4543 ILLEGAL_BARE_EXEC,
4544 PyString_AS_STRING(ste->ste_name),
4545 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004546 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004547 PyOS_snprintf(buf, sizeof(buf),
4548 ILLEGAL_EXEC_AND_IMPORT_STAR,
4549 PyString_AS_STRING(ste->ste_name),
4550 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004551 }
4552 } else {
4553 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004554 PyOS_snprintf(buf, sizeof(buf),
4555 ILLEGAL_IMPORT_STAR,
4556 PyString_AS_STRING(ste->ste_name),
4557 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004558 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004559 PyOS_snprintf(buf, sizeof(buf),
4560 ILLEGAL_BARE_EXEC,
4561 PyString_AS_STRING(ste->ste_name),
4562 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004563 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00004564 PyOS_snprintf(buf, sizeof(buf),
4565 ILLEGAL_EXEC_AND_IMPORT_STAR,
4566 PyString_AS_STRING(ste->ste_name),
4567 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004568 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004569 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00004570
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004571 PyErr_SetString(PyExc_SyntaxError, buf);
4572 PyErr_SyntaxLocation(c->c_symtable->st_filename,
4573 ste->ste_opt_lineno);
4574 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004575}
4576
4577static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004578symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
4579 struct symbol_info *si)
4580{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00004581 if (c->c_future)
4582 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00004583 if (ste->ste_generator)
4584 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004585 if (ste->ste_type != TYPE_MODULE)
4586 c->c_flags |= CO_NEWLOCALS;
4587 if (ste->ste_type == TYPE_FUNCTION) {
4588 c->c_nlocals = si->si_nlocals;
4589 if (ste->ste_optimized == 0)
4590 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004591 else if (ste->ste_optimized != OPT_EXEC)
4592 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004593 }
4594 return 0;
4595}
4596
4597static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004598symtable_load_symbols(struct compiling *c)
4599{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 static PyObject *implicit = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004602 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004603 PyObject *name, *varnames, *v;
4604 int i, flags, pos;
4605 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004606
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004607 if (implicit == NULL) {
4608 implicit = PyInt_FromLong(1);
4609 if (implicit == NULL)
4610 return -1;
4611 }
4612 v = NULL;
4613
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004614 if (symtable_init_compiling_symbols(c) < 0)
4615 goto fail;
4616 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004617 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004618 si.si_nlocals = PyList_GET_SIZE(varnames);
4619 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004620
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004621 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004622 v = PyInt_FromLong(i);
4623 if (PyDict_SetItem(c->c_locals,
4624 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004625 goto fail;
4626 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004627 }
4628
4629 /* XXX The cases below define the rules for whether a name is
4630 local or global. The logic could probably be clearer. */
4631 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004632 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
4633 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004634
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004635 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004636 /* undo the original DEF_FREE */
4637 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004639 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004640 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004641 2. Free variables in methods that are also class
4642 variables or declared global.
4643 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004644 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004645 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004646
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004647 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648 c->c_argcount--;
4649 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004650 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 c->c_argcount--;
4652 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004653 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004654 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004655 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004656 if (flags & DEF_PARAM) {
4657 PyErr_Format(PyExc_SyntaxError, LOCAL_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004658 PyString_AS_STRING(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00004659 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004660 ste->ste_lineno);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004661 st->st_errors++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004662 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004663 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004664 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
4665 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004666 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004667 si.si_nimplicit++;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004668 if (PyDict_SetItem(c->c_globals, name, implicit) < 0)
4669 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004670 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004671 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004672 if (v == NULL)
4673 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004674 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004675 goto fail;
4676 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004677 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004678 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004679 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004680 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004681 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004682 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683 if (v == NULL)
4684 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004685 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004686 goto fail;
4687 Py_DECREF(v);
4688 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004689 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004690 if (PyDict_SetItem(c->c_globals, name,
4691 implicit) < 0)
4692 goto fail;
4693 if (st->st_nscopes != 1) {
4694 v = PyInt_FromLong(flags);
4695 if (PyDict_SetItem(st->st_global,
4696 name, v))
4697 goto fail;
4698 Py_DECREF(v);
4699 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004700 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004701 }
4702 }
4703
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00004704 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
4705
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00004706 if (si.si_ncells > 1) { /* one cell is always in order */
4707 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
4708 c->c_varnames, c->c_flags) < 0)
4709 return -1;
4710 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004711 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
4712 return -1;
4713 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004714 fail:
4715 /* is this always the right thing to do? */
4716 Py_XDECREF(v);
4717 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004718}
4719
4720static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004721symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722{
4723 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004724
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004725 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004726 if (st == NULL)
4727 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004728 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00004729
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00004730 st->st_filename = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004731 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004732 goto fail;
4733 if ((st->st_symbols = PyDict_New()) == NULL)
4734 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004735 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004736 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004737 st->st_errors = 0;
4738 st->st_tmpname = 0;
4739 st->st_private = NULL;
4740 return st;
4741 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004742 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004743 return NULL;
4744}
4745
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004746void
4747PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004748{
4749 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004751 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004752 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753}
4754
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755/* When the compiler exits a scope, it must should update the scope's
4756 free variable information with the list of free variables in its
4757 children.
4758
4759 Variables that are free in children and defined in the current
4760 scope are cellvars.
4761
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004762 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763 false), free variables in children that are not defined here are
4764 implicit globals.
4765
4766*/
4767
4768static int
4769symtable_update_free_vars(struct symtable *st)
4770{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004771 int i, j, def;
4772 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004773 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004774
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004775 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004776 def = DEF_FREE_CLASS;
4777 else
4778 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004779 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004780 int pos = 0;
4781
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004782 if (list)
4783 PyList_SetSlice(list, 0,
4784 ((PyVarObject*)list)->ob_size, 0);
Barry Warsaw0372af72001-02-23 18:22:59 +00004785 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004786 PyList_GET_ITEM(ste->ste_children, i);
4787 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004788 int flags = PyInt_AS_LONG(o);
4789 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004790 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004791 if (list == NULL) {
4792 list = PyList_New(0);
4793 if (list == NULL)
4794 return -1;
4795 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004796 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004797 if (PyList_Append(list, name) < 0) {
4798 Py_DECREF(list);
4799 return -1;
4800 }
4801 }
4802 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004803 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004804 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00004805 v = PyDict_GetItem(ste->ste_symbols, name);
4806 /* If a name N is declared global in scope A and
4807 referenced in scope B contained (perhaps
4808 indirectly) in A and there are no scopes
4809 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00004810 is global in B. Unless A is a class scope,
4811 because class scopes are not considered for
4812 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00004813 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004814 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00004815 int flags = PyInt_AS_LONG(v);
4816 if (flags & DEF_GLOBAL) {
4817 symtable_undo_free(st, child->ste_id,
4818 name);
4819 continue;
4820 }
4821 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004822 if (ste->ste_nested) {
4823 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004824 name, def) < 0) {
4825 Py_DECREF(list);
4826 return -1;
4827 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004828 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004829 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004830 name) < 0) {
4831 Py_DECREF(list);
4832 return -1;
4833 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004834 }
4835 }
4836 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00004837
4838 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004839 return 0;
4840}
4841
4842/* If the current scope is a non-nested class or if name is not
4843 defined in the current, non-nested scope, then it is an implicit
4844 global in all nested scopes.
4845*/
4846
4847static int
4848symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
4849{
4850 PyObject *o;
4851 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004852 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00004853
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004855 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004856 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004857 if (o == NULL)
4858 return symtable_undo_free(st, child, name);
4859 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00004860
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004861 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862 return symtable_undo_free(st, child, name);
4863 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004864 return symtable_add_def_o(st, ste->ste_symbols,
4865 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866}
4867
4868static int
4869symtable_undo_free(struct symtable *st, PyObject *id,
4870 PyObject *name)
4871{
4872 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004873 PyObject *info;
4874 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004875
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004876 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
4877 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00004879
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004880 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004881 if (info == NULL)
4882 return 0;
4883 v = PyInt_AS_LONG(info);
4884 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004886 DEF_FREE_GLOBAL) < 0)
4887 return -1;
4888 } else
4889 /* If the name is defined here or declared global,
4890 then the recursion stops. */
4891 return 0;
4892
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004893 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
4894 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00004895 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004896 PyList_GET_ITEM(ste->ste_children, i);
4897 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 if (x < 0)
4899 return x;
4900 }
4901 return 0;
4902}
4903
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004904/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
4905 This reference is released when the scope is exited, via the DECREF
4906 in symtable_exit_scope().
4907*/
4908
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004909static int
4910symtable_exit_scope(struct symtable *st)
4911{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004912 int end;
4913
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004914 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004915 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004916 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004918 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
4919 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004920 if (PySequence_DelItem(st->st_stack, end) < 0)
4921 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004922 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004923}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004924
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004925static void
4926symtable_enter_scope(struct symtable *st, char *name, int type,
4927 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004929 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004930
4931 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004932 prev = st->st_cur;
4933 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
4934 Py_DECREF(st->st_cur);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004935 st->st_errors++;
4936 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004937 }
4938 }
Barry Warsaw0372af72001-02-23 18:22:59 +00004939 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004940 PySymtableEntry_New(st, name, type, lineno);
4941 if (strcmp(name, TOP) == 0)
4942 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004943 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004944 if (PyList_Append(prev->ste_children,
4945 (PyObject *)st->st_cur) < 0)
4946 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004947 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948}
4949
4950static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004951symtable_lookup(struct symtable *st, char *name)
4952{
4953 char buffer[MANGLE_LEN];
4954 PyObject *v;
4955 int flags;
4956
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00004957 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004958 name = buffer;
4959 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
4960 if (v == NULL) {
4961 if (PyErr_Occurred())
4962 return -1;
4963 else
4964 return 0;
4965 }
4966
4967 flags = PyInt_AS_LONG(v);
4968 return flags;
4969}
4970
4971static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004972symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004974 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004976 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004977
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00004978 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004979 name = buffer;
4980 if ((s = PyString_InternFromString(name)) == NULL)
4981 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00004982 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
4983 Py_DECREF(s);
4984 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004985}
4986
4987/* Must only be called with mangled names */
4988
4989static int
4990symtable_add_def_o(struct symtable *st, PyObject *dict,
4991 PyObject *name, int flag)
4992{
4993 PyObject *o;
4994 int val;
4995
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004997 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004998 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00004999 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005000 PyString_AsString(name));
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005001 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005002 st->st_cur->ste_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005003 return -1;
5004 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005005 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005008 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005010 Py_DECREF(o);
5011 return -1;
5012 }
5013 Py_DECREF(o);
5014
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005015 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005016 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005017 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005018 } else if (flag & DEF_GLOBAL) {
5019 /* XXX need to update DEF_GLOBAL for other flags too;
5020 perhaps only DEF_FREE_GLOBAL */
5021 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005022 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005024 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005025 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005026 o = PyInt_FromLong(val);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005027 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005028 Py_DECREF(o);
5029 return -1;
5030 }
5031 Py_DECREF(o);
5032 }
5033 return 0;
5034}
5035
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037
Tim Peters08a898f2001-06-28 01:52:22 +00005038/* Look for a yield stmt under n. Return 1 if found, else 0.
5039 This hack is used to look inside "if 0:" blocks (which are normally
5040 ignored) in case those are the only places a yield occurs (so that this
5041 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005042static int
5043look_for_yield(node *n)
5044{
5045 int i;
5046
5047 for (i = 0; i < NCH(n); ++i) {
5048 node *kid = CHILD(n, i);
5049
5050 switch (TYPE(kid)) {
5051
5052 case classdef:
5053 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005054 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005055 /* Stuff in nested functions and classes can't make
5056 the parent a generator. */
5057 return 0;
5058
5059 case yield_stmt:
5060 return 1;
5061
5062 default:
5063 if (look_for_yield(kid))
5064 return 1;
5065 }
5066 }
5067 return 0;
5068}
5069
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005070static void
5071symtable_node(struct symtable *st, node *n)
5072{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005073 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005074
5075 loop:
5076 switch (TYPE(n)) {
5077 case funcdef: {
5078 char *func_name = STR(CHILD(n, 1));
5079 symtable_add_def(st, func_name, DEF_LOCAL);
5080 symtable_default_args(st, CHILD(n, 2));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005081 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005082 symtable_funcdef(st, n);
5083 symtable_exit_scope(st);
5084 break;
5085 }
5086 case lambdef:
5087 if (NCH(n) == 4)
5088 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005089 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005090 symtable_funcdef(st, n);
5091 symtable_exit_scope(st);
5092 break;
5093 case classdef: {
5094 char *tmp, *class_name = STR(CHILD(n, 1));
5095 symtable_add_def(st, class_name, DEF_LOCAL);
5096 if (TYPE(CHILD(n, 2)) == LPAR) {
5097 node *bases = CHILD(n, 3);
5098 int i;
5099 for (i = 0; i < NCH(bases); i += 2) {
5100 symtable_node(st, CHILD(bases, i));
5101 }
5102 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005103 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 tmp = st->st_private;
5105 st->st_private = class_name;
5106 symtable_node(st, CHILD(n, NCH(n) - 1));
5107 st->st_private = tmp;
5108 symtable_exit_scope(st);
5109 break;
5110 }
5111 case if_stmt:
5112 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005113 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5114 if (st->st_cur->ste_generator == 0)
5115 st->st_cur->ste_generator =
5116 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005117 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005118 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005119 symtable_node(st, CHILD(n, i + 1));
5120 symtable_node(st, CHILD(n, i + 3));
5121 }
5122 if (i + 2 < NCH(n))
5123 symtable_node(st, CHILD(n, i + 2));
5124 break;
5125 case global_stmt:
5126 symtable_global(st, n);
5127 break;
5128 case import_stmt:
5129 symtable_import(st, n);
5130 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005131 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005132 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005133 symtable_node(st, CHILD(n, 1));
5134 if (NCH(n) > 2)
5135 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005136 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005137 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005138 st->st_cur->ste_opt_lineno = n->n_lineno;
5139 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140 if (NCH(n) > 4)
5141 symtable_node(st, CHILD(n, 5));
5142 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005143
5144 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005145 case assert_stmt:
5146 if (Py_OptimizeFlag)
5147 return;
5148 if (NCH(n) == 2) {
5149 n = CHILD(n, 1);
5150 goto loop;
5151 } else {
5152 symtable_node(st, CHILD(n, 1));
5153 n = CHILD(n, 3);
5154 goto loop;
5155 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 case except_clause:
5157 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005158 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 if (NCH(n) > 1) {
5160 n = CHILD(n, 1);
5161 goto loop;
5162 }
5163 break;
5164 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005165 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005167 case yield_stmt:
5168 st->st_cur->ste_generator = 1;
5169 n = CHILD(n, 1);
5170 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171 case expr_stmt:
5172 if (NCH(n) == 1)
5173 n = CHILD(n, 0);
5174 else {
5175 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005176 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 symtable_node(st, CHILD(n, 2));
5178 break;
5179 } else {
5180 int i;
5181 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005182 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005183 n = CHILD(n, NCH(n) - 1);
5184 }
5185 }
5186 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005187 case list_iter:
5188 n = CHILD(n, 0);
5189 if (TYPE(n) == list_for) {
5190 st->st_tmpname++;
5191 symtable_list_comprehension(st, n);
5192 st->st_tmpname--;
5193 } else {
5194 REQ(n, list_if);
5195 symtable_node(st, CHILD(n, 1));
5196 if (NCH(n) == 3) {
5197 n = CHILD(n, 2);
5198 goto loop;
5199 }
5200 }
5201 break;
5202 case for_stmt:
5203 symtable_assign(st, CHILD(n, 1), 0);
5204 for (i = 3; i < NCH(n); ++i)
5205 if (TYPE(CHILD(n, i)) >= single_input)
5206 symtable_node(st, CHILD(n, i));
5207 break;
5208 /* The remaining cases fall through to default except in
5209 special circumstances. This requires the individual cases
5210 to be coded with great care, even though they look like
5211 rather innocuous. Each case must double-check TYPE(n).
5212 */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005214 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 n = CHILD(n, 2);
5216 goto loop;
5217 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005218 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005219 case listmaker:
5220 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton23b42272001-03-19 20:38:06 +00005221 st->st_tmpname++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005222 symtable_list_comprehension(st, CHILD(n, 1));
Jeremy Hylton23b42272001-03-19 20:38:06 +00005223 symtable_node(st, CHILD(n, 0));
5224 st->st_tmpname--;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005225 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005227 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005228 case atom:
5229 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5230 symtable_add_use(st, STR(CHILD(n, 0)));
5231 break;
5232 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005233 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005234 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005235 /* Walk over every non-token child with a special case
5236 for one child.
5237 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005238 if (NCH(n) == 1) {
5239 n = CHILD(n, 0);
5240 goto loop;
5241 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005242 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005243 if (TYPE(CHILD(n, i)) >= single_input)
5244 symtable_node(st, CHILD(n, i));
5245 }
5246}
5247
5248static void
5249symtable_funcdef(struct symtable *st, node *n)
5250{
5251 node *body;
5252
5253 if (TYPE(n) == lambdef) {
5254 if (NCH(n) == 4)
5255 symtable_params(st, CHILD(n, 1));
5256 } else
5257 symtable_params(st, CHILD(n, 2));
5258 body = CHILD(n, NCH(n) - 1);
5259 symtable_node(st, body);
5260}
5261
5262/* The next two functions parse the argument tuple.
5263 symtable_default_arg() checks for names in the default arguments,
5264 which are references in the defining scope. symtable_params()
5265 parses the parameter names, which are defined in the function's
5266 body.
5267
5268 varargslist:
5269 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5270 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5271*/
5272
5273static void
5274symtable_default_args(struct symtable *st, node *n)
5275{
5276 node *c;
5277 int i;
5278
5279 if (TYPE(n) == parameters) {
5280 n = CHILD(n, 1);
5281 if (TYPE(n) == RPAR)
5282 return;
5283 }
5284 REQ(n, varargslist);
5285 for (i = 0; i < NCH(n); i += 2) {
5286 c = CHILD(n, i);
5287 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5288 break;
5289 }
5290 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5291 symtable_node(st, CHILD(n, i));
5292 }
5293}
5294
5295static void
5296symtable_params(struct symtable *st, node *n)
5297{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005298 int i, complex = -1, ext = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 node *c = NULL;
5300
5301 if (TYPE(n) == parameters) {
5302 n = CHILD(n, 1);
5303 if (TYPE(n) == RPAR)
5304 return;
5305 }
5306 REQ(n, varargslist);
5307 for (i = 0; i < NCH(n); i += 2) {
5308 c = CHILD(n, i);
5309 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5310 ext = 1;
5311 break;
5312 }
5313 if (TYPE(c) == test) {
5314 continue;
5315 }
5316 if (TYPE(CHILD(c, 0)) == NAME)
5317 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
5318 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005319 char nbuf[30];
5320 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005322 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323 }
5324 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325 if (ext) {
5326 c = CHILD(n, i);
5327 if (TYPE(c) == STAR) {
5328 i++;
5329 symtable_add_def(st, STR(CHILD(n, i)),
5330 DEF_PARAM | DEF_STAR);
5331 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00005332 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005333 c = NULL;
5334 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005335 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005336 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005337 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005338 i++;
5339 symtable_add_def(st, STR(CHILD(n, i)),
5340 DEF_PARAM | DEF_DOUBLESTAR);
5341 }
5342 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005343 if (complex >= 0) {
5344 int j;
5345 for (j = 0; j <= complex; j++) {
5346 c = CHILD(n, j);
5347 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00005348 c = CHILD(n, ++j);
5349 else if (TYPE(c) == EQUAL)
5350 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005351 if (TYPE(CHILD(c, 0)) == LPAR)
5352 symtable_params_fplist(st, CHILD(c, 1));
5353 }
5354 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355}
5356
5357static void
5358symtable_params_fplist(struct symtable *st, node *n)
5359{
5360 int i;
5361 node *c;
5362
5363 REQ(n, fplist);
5364 for (i = 0; i < NCH(n); i += 2) {
5365 c = CHILD(n, i);
5366 REQ(c, fpdef);
5367 if (NCH(c) == 1)
5368 symtable_add_def(st, STR(CHILD(c, 0)),
5369 DEF_PARAM | DEF_INTUPLE);
5370 else
5371 symtable_params_fplist(st, CHILD(c, 1));
5372 }
5373
5374}
5375
5376static void
5377symtable_global(struct symtable *st, node *n)
5378{
5379 int i;
5380
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005381 /* XXX It might be helpful to warn about module-level global
5382 statements, but it's hard to tell the difference between
5383 module-level and a string passed to exec.
5384 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00005385
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005386 for (i = 1; i < NCH(n); i += 2) {
5387 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005388 int flags;
5389
5390 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005391 if (flags < 0)
5392 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005393 if (flags && flags != DEF_GLOBAL) {
5394 char buf[500];
5395 if (flags & DEF_PARAM) {
5396 PyErr_Format(PyExc_SyntaxError,
5397 "name '%.400s' is local and global",
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005398 name);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005399 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005400 st->st_cur->ste_lineno);
5401 st->st_errors++;
5402 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005403 }
5404 else {
5405 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005406 PyOS_snprintf(buf, sizeof(buf),
5407 GLOBAL_AFTER_ASSIGN,
5408 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00005409 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005410 PyOS_snprintf(buf, sizeof(buf),
5411 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00005412 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00005413 }
5414 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005415 symtable_add_def(st, name, DEF_GLOBAL);
5416 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005417}
5418
5419static void
5420symtable_list_comprehension(struct symtable *st, node *n)
5421{
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005422 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005423
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005424 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", st->st_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005425 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005426 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005427 symtable_node(st, CHILD(n, 3));
5428 if (NCH(n) == 5)
5429 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005430}
5431
5432static void
5433symtable_import(struct symtable *st, node *n)
5434{
5435 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005436 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005437 | 'from' dotted_name 'import'
5438 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00005439 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005440 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005441 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005442 node *dotname = CHILD(n, 1);
5443 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
5444 /* check for bogus imports */
5445 if (n->n_lineno >= st->st_future->ff_last_lineno) {
5446 PyErr_SetString(PyExc_SyntaxError,
5447 LATE_FUTURE);
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00005448 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005449 n->n_lineno);
5450 st->st_errors++;
5451 return;
5452 }
5453 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005454 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005455 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00005456 if (symtable_warn(st,
5457 "import * only allowed at module level") < 0)
5458 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00005459 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005460 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005461 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005462 } else {
5463 for (i = 3; i < NCH(n); i += 2) {
5464 node *c = CHILD(n, i);
5465 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005466 symtable_assign(st, CHILD(c, 2),
5467 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005469 symtable_assign(st, CHILD(c, 0),
5470 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005471 }
5472 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005473 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005475 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005476 }
5477 }
5478}
5479
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005480/* The third argument to symatble_assign() is a flag to be passed to
5481 symtable_add_def() if it is eventually called. The flag is useful
5482 to specify the particular type of assignment that should be
5483 recorded, e.g. an assignment caused by import.
5484 */
5485
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005487symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005488{
5489 node *tmp;
5490 int i;
5491
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492 loop:
5493 switch (TYPE(n)) {
5494 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005495 /* invalid assignment, e.g. lambda x:x=2. The next
5496 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497 return;
5498 case power:
5499 if (NCH(n) > 2) {
5500 for (i = 2; i < NCH(n); ++i)
5501 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
5502 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005503 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 if (NCH(n) > 1) {
5505 symtable_node(st, CHILD(n, 0));
5506 symtable_node(st, CHILD(n, 1));
5507 } else {
5508 n = CHILD(n, 0);
5509 goto loop;
5510 }
5511 return;
5512 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00005513 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
5514 /* XXX This is an error, but the next pass
5515 will catch it. */
5516 return;
5517 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005518 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005519 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 }
5521 return;
5522 case exprlist:
5523 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00005524 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005525 if (NCH(n) == 1) {
5526 n = CHILD(n, 0);
5527 goto loop;
5528 }
5529 else {
5530 int i;
5531 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005532 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005533 return;
5534 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005535 case atom:
5536 tmp = CHILD(n, 0);
5537 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
5538 n = CHILD(n, 1);
5539 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00005540 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00005541 if (strcmp(STR(tmp), "__debug__") == 0) {
5542 PyErr_SetString(PyExc_SyntaxError,
5543 ASSIGN_DEBUG);
5544 PyErr_SyntaxLocation(st->st_filename,
Jeremy Hylton86424e32001-12-04 02:41:46 +00005545 n->n_lineno);
Jeremy Hylton778e2652001-11-09 19:50:08 +00005546 st->st_errors++;
5547 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005548 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00005549 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005550 return;
5551 case dotted_as_name:
5552 if (NCH(n) == 3)
5553 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005554 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005555 else
5556 symtable_add_def(st,
5557 STR(CHILD(CHILD(n,
5558 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005559 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005560 return;
5561 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005562 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 return;
5564 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005565 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005566 return;
5567 default:
5568 if (NCH(n) == 0)
5569 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00005570 if (NCH(n) == 1) {
5571 n = CHILD(n, 0);
5572 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00005574 /* Should only occur for errors like x + 1 = 1,
5575 which will be caught in the next pass. */
5576 for (i = 0; i < NCH(n); ++i)
5577 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005578 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 }
5580}