blob: f8083074070bbf8fa2494fe24fdddf17d27110f2 [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 Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
400 Bails out with no change if one or more of the LOAD_CONSTs is missing. */
401static int
402tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
403{
404 PyObject *newconst, *constant;
405 int i, arg, len_consts;
406
407 /* Pre-conditions */
408 assert(PyList_CheckExact(consts));
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000409 assert(codestr[n*3] == BUILD_TUPLE);
410 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000411 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000412 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413
414 /* Buildup new tuple of constants */
415 newconst = PyTuple_New(n);
416 if (newconst == NULL)
417 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000418 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000419 for (i=0 ; i<n ; i++) {
420 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000421 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000422 constant = PyList_GET_ITEM(consts, arg);
423 Py_INCREF(constant);
424 PyTuple_SET_ITEM(newconst, i, constant);
425 }
426
427 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000428 if (PyList_Append(consts, newconst)) {
429 Py_DECREF(newconst);
430 return 0;
431 }
432 Py_DECREF(newconst);
433
434 /* Write NOPs over old LOAD_CONSTS and
435 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
436 memset(codestr, NOP, n*3);
437 codestr[n*3] = LOAD_CONST;
438 SETARG(codestr, (n*3), len_consts);
439 return 1;
440}
441
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000442static unsigned int *
443markblocks(unsigned char *code, int len)
444{
445 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000446 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000447
448 if (blocks == NULL)
449 return NULL;
450 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000451
452 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000453 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
454 opcode = code[i];
455 switch (opcode) {
456 case FOR_ITER:
457 case JUMP_FORWARD:
458 case JUMP_IF_FALSE:
459 case JUMP_IF_TRUE:
460 case JUMP_ABSOLUTE:
461 case CONTINUE_LOOP:
462 case SETUP_LOOP:
463 case SETUP_EXCEPT:
464 case SETUP_FINALLY:
465 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000466 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000467 break;
468 }
469 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000470 /* Build block numbers in the second pass */
471 for (i=0 ; i<len ; i++) {
472 blockcnt += blocks[i]; /* increment blockcnt over labels */
473 blocks[i] = blockcnt;
474 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000475 return blocks;
476}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000477
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000478/* Perform basic peephole optimizations to components of a code object.
479 The consts object should still be in list form to allow new constants
480 to be appended.
481
482 To keep the optimizer simple, it bails out (does nothing) for code
483 containing extended arguments or that has a length over 32,700. That
484 allows us to avoid overflow and sign issues. Likewise, it bails when
485 the lineno table has complex encoding for gaps >= 255.
486
487 Optimizations are restricted to simple transformations occuring within a
488 single basic block. All transformations keep the code size the same or
489 smaller. For those that reduce size, the gaps are initially filled with
490 NOPs. Later those NOPs are removed and the jump addresses retargeted in
491 a single pass. Line numbering is adjusted accordingly. */
492
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000493static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000494optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000495{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000496 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000498 unsigned char *codestr = NULL;
499 unsigned char *lineno;
500 int *addrmap = NULL;
501 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000502 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000503 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000504 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000505
Raymond Hettingereffb3932004-10-30 08:55:08 +0000506 /* Bail out if an exception is set */
507 if (PyErr_Occurred())
508 goto exitUnchanged;
509
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000510 /* Bypass optimization when the lineno table is too complex */
511 assert(PyString_Check(lineno_obj));
512 lineno = PyString_AS_STRING(lineno_obj);
513 tabsiz = PyString_GET_SIZE(lineno_obj);
514 if (memchr(lineno, 255, tabsiz) != NULL)
515 goto exitUnchanged;
516
Raymond Hettingera12fa142004-08-24 04:34:16 +0000517 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000518 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000519 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000520 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000521 goto exitUnchanged;
522
523 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000524 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000525 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000526 goto exitUnchanged;
527 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000528
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000529 /* Mapping to new jump targets after NOPs are removed */
530 addrmap = PyMem_Malloc(codelen * sizeof(int));
531 if (addrmap == NULL)
532 goto exitUnchanged;
533
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000534 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000535 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000536 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000537 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000538
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000539 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
540 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000541 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000542
543 lastlc = cumlc;
544 cumlc = 0;
545
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000546 switch (opcode) {
547
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000548 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000549 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000550 case UNARY_NOT:
551 if (codestr[i+1] != JUMP_IF_FALSE ||
552 codestr[i+4] != POP_TOP ||
553 !ISBASICBLOCK(blocks,i,5))
554 continue;
555 tgt = GETJUMPTGT(codestr, (i+1));
556 if (codestr[tgt] != POP_TOP)
557 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000558 j = GETARG(codestr, i+1) + 1;
559 codestr[i] = JUMP_IF_TRUE;
560 SETARG(codestr, i, j);
561 codestr[i+3] = POP_TOP;
562 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000563 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000564 break;
565
566 /* not a is b --> a is not b
567 not a in b --> a not in b
568 not a is not b --> a is b
569 not a not in b --> a in b */
570 case COMPARE_OP:
571 j = GETARG(codestr, i);
572 if (j < 6 || j > 9 ||
573 codestr[i+3] != UNARY_NOT ||
574 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000575 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000576 SETARG(codestr, i, (j^1));
577 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000578 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000579 break;
580
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000581 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
582 case LOAD_NAME:
583 case LOAD_GLOBAL:
584 j = GETARG(codestr, i);
585 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
586 if (name == NULL || strcmp(name, "None") != 0)
587 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000588 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
589 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000590 codestr[i] = LOAD_CONST;
591 SETARG(codestr, i, j);
592 break;
593 }
594 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000595 break;
596
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000597 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000599 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000600 j = GETARG(codestr, i);
601 if (codestr[i+3] != JUMP_IF_FALSE ||
602 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000603 !ISBASICBLOCK(blocks,i,7) ||
604 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000605 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000606 memset(codestr+i, NOP, 7);
607 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000608 break;
609
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000610 /* Try to fold tuples of constants.
611 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000612 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
613 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000614 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000615 j = GETARG(codestr, i);
616 h = i - 3 * j;
617 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000618 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000619 codestr[h] == LOAD_CONST &&
620 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
621 tuple_of_constants(&codestr[h], j, consts)) {
622 nops += 3 * j;
623 break;
624 }
625 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000626 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000627 j = GETARG(codestr, i);
628 if (codestr[i+3] != UNPACK_SEQUENCE ||
629 !ISBASICBLOCK(blocks,i,6) ||
630 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000631 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000632 if (j == 1) {
633 memset(codestr+i, NOP, 6);
634 nops += 6;
635 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000636 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000637 memset(codestr+i+1, NOP, 5);
638 nops += 5;
639 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000640 codestr[i] = ROT_THREE;
641 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000642 memset(codestr+i+2, NOP, 4);
643 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000644 }
645 break;
646
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000647 /* Simplify conditional jump to conditional jump where the
648 result of the first test implies the success of a similar
649 test or the failure of the opposite test.
650 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000651 "if a and b:"
652 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000653 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000654 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000655 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000656 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
657 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000658 */
659 case JUMP_IF_FALSE:
660 case JUMP_IF_TRUE:
661 tgt = GETJUMPTGT(codestr, i);
662 j = codestr[tgt];
663 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
664 if (j == opcode) {
665 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
666 SETARG(codestr, i, tgttgt);
667 } else {
668 tgt -= i;
669 SETARG(codestr, i, tgt);
670 }
671 break;
672 }
673 /* Intentional fallthrough */
674
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000675 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000676 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000678 case JUMP_ABSOLUTE:
679 case CONTINUE_LOOP:
680 case SETUP_LOOP:
681 case SETUP_EXCEPT:
682 case SETUP_FINALLY:
683 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000684 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000685 continue;
686 tgttgt = GETJUMPTGT(codestr, tgt);
687 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
688 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000689 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000690 tgttgt -= i + 3; /* Calc relative jump addr */
691 if (tgttgt < 0) /* No backward relative jumps */
692 continue;
693 codestr[i] = opcode;
694 SETARG(codestr, i, tgttgt);
695 break;
696
697 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000698 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000699
700 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
701 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000702 if (i+4 >= codelen ||
703 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000704 !ISBASICBLOCK(blocks,i,5))
705 continue;
706 memset(codestr+i+1, NOP, 4);
707 nops += 4;
708 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000709 }
710 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000711
712 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000713 cum_orig_line = 0;
714 last_line = 0;
715 for (i=0 ; i < tabsiz ; i+=2) {
716 cum_orig_line += lineno[i];
717 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000718 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000719 lineno[i] =((unsigned char)(new_line - last_line));
720 last_line = new_line;
721 }
722
723 /* Remove NOPs and fixup jump targets */
724 for (i=0, h=0 ; i<codelen ; ) {
725 opcode = codestr[i];
726 switch (opcode) {
727 case NOP:
728 i++;
729 continue;
730
731 case JUMP_ABSOLUTE:
732 case CONTINUE_LOOP:
733 j = addrmap[GETARG(codestr, i)];
734 SETARG(codestr, i, j);
735 break;
736
737 case FOR_ITER:
738 case JUMP_FORWARD:
739 case JUMP_IF_FALSE:
740 case JUMP_IF_TRUE:
741 case SETUP_LOOP:
742 case SETUP_EXCEPT:
743 case SETUP_FINALLY:
744 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
745 SETARG(codestr, i, j);
746 break;
747 }
748 adj = CODESIZE(opcode);
749 while (adj--)
750 codestr[h++] = codestr[i++];
751 }
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000752 /* The following assertion detects the presence of NOPs in the input
753 bytecode. The compiler never produces NOPs so far; if one day it
754 does, the way 'nops' is counted above must be changed. */
Raymond Hettingera12fa142004-08-24 04:34:16 +0000755 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000756
757 code = PyString_FromStringAndSize((char *)codestr, h);
758 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000759 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000760 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000761 return code;
762
763exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000764 if (blocks != NULL)
765 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000766 if (addrmap != NULL)
767 PyMem_Free(addrmap);
768 if (codestr != NULL)
769 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000770 Py_INCREF(code);
771 return code;
772}
773
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000774/* End: Peephole optimizations ----------------------------------------- */
775
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000777PyCode_New(int argcount, int nlocals, int stacksize, int flags,
778 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000779 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
780 PyObject *filename, PyObject *name, int firstlineno,
781 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000784 int i;
785 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000786 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000787 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 consts == NULL || !PyTuple_Check(consts) ||
789 names == NULL || !PyTuple_Check(names) ||
790 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000791 freevars == NULL || !PyTuple_Check(freevars) ||
792 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 name == NULL || !PyString_Check(name) ||
794 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000795 lnotab == NULL || !PyString_Check(lnotab) ||
796 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000797 PyErr_BadInternalCall();
798 return NULL;
799 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000800 intern_strings(names);
801 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000802 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000803 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000804 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 for (i = PyTuple_Size(consts); --i >= 0; ) {
806 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000808 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000809 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000810 continue;
811 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000812 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000815 co->co_argcount = argcount;
816 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000817 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000818 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000819 Py_INCREF(code);
820 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000826 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000827 Py_INCREF(freevars);
828 co->co_freevars = freevars;
829 Py_INCREF(cellvars);
830 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000832 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000834 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000835 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000838 if (PyTuple_GET_SIZE(freevars) == 0 &&
839 PyTuple_GET_SIZE(cellvars) == 0)
840 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000841 }
842 return co;
843}
844
845
846/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000847
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000848/* The compiler uses two passes to generate bytecodes. The first pass
849 builds the symbol table. The second pass generates the bytecode.
850
851 The first pass uses a single symtable struct. The second pass uses
852 a compiling struct for each code block. The compiling structs
853 share a reference to the symtable.
854
855 The two passes communicate via symtable_load_symbols() and via
856 is_local() and is_global(). The former initializes several slots
857 in the compiling struct: c_varnames, c_locals, c_nlocals,
858 c_argcount, c_globals, and c_flags.
859*/
860
Tim Peters2a7f3842001-06-09 09:26:21 +0000861/* All about c_lnotab.
862
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000863c_lnotab is an array of unsigned bytes disguised as a Python string. Since
864version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
865mapped to source code line #s via c_lnotab instead.
866
Tim Peters2a7f3842001-06-09 09:26:21 +0000867The array is conceptually a list of
868 (bytecode offset increment, line number increment)
869pairs. The details are important and delicate, best illustrated by example:
870
871 byte code offset source code line number
872 0 1
873 6 2
874 50 7
875 350 307
876 361 308
877
878The first trick is that these numbers aren't stored, only the increments
879from one row to the next (this doesn't really work, but it's a start):
880
881 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
882
883The second trick is that an unsigned byte can't hold negative values, or
884values larger than 255, so (a) there's a deep assumption that byte code
885offsets and their corresponding line #s both increase monotonically, and (b)
886if at least one column jumps by more than 255 from one row to the next, more
887than one pair is written to the table. In case #b, there's no way to know
888from looking at the table later how many were written. That's the delicate
889part. A user of c_lnotab desiring to find the source line number
890corresponding to a bytecode address A should do something like this
891
892 lineno = addr = 0
893 for addr_incr, line_incr in c_lnotab:
894 addr += addr_incr
895 if addr > A:
896 return lineno
897 lineno += line_incr
898
899In order for this to work, when the addr field increments by more than 255,
900the line # increment in each pair generated must be 0 until the remaining addr
901increment is < 256. So, in the example above, com_set_lineno should not (as
902was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
903255, 0, 45, 255, 0, 45.
904*/
905
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000906struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000907 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000909 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000911 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000912 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 PyObject *c_locals; /* dictionary (value=localID) */
914 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000915 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000916 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000917 int c_nlocals; /* index of next local */
918 int c_argcount; /* number of top-level arguments */
919 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000920 int c_nexti; /* index into c_code */
921 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000922 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000923 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000924 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000925 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000926 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000927 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000928 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000929 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000930 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000931 int c_stacklevel; /* Current stack level */
932 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000933 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000935 int c_last_addr; /* last op addr seen and recorded in lnotab */
936 int c_last_line; /* last line seen and recorded in lnotab */
937 int c_lnotab_next; /* current length of lnotab */
938 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000939 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000940 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000941 int c_nested; /* Is block nested funcdef or lamdef? */
942 int c_closure; /* Is nested w/freevars? */
943 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000944 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000945 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000946};
947
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000948static int
949is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000950{
951 if ((v & (USE | DEF_FREE))
952 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
953 return 1;
954 if (v & DEF_FREE_CLASS)
955 return 1;
956 return 0;
957}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000958
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000960com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000961{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000962 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
963
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000964 if (c == NULL) {
965 /* Error occurred via symtable call to
966 is_constant_false */
967 PyErr_SetString(exc, msg);
968 return;
969 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000970 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000971 if (c->c_lineno < 1 || c->c_interactive) {
972 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000974 return;
975 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000976 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000977 if (v == NULL)
978 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000979
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000980 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000981 if (line == NULL) {
982 Py_INCREF(Py_None);
983 line = Py_None;
984 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000985 if (exc == PyExc_SyntaxError) {
986 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
987 Py_None, line);
988 if (t == NULL)
989 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000990 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000991 if (w == NULL)
992 goto exit;
993 PyErr_SetObject(exc, w);
994 } else {
995 /* Make sure additional exceptions are printed with
996 file and line, also. */
997 PyErr_SetObject(exc, v);
998 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
999 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001000 exit:
1001 Py_XDECREF(t);
1002 Py_XDECREF(v);
1003 Py_XDECREF(w);
1004 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001005}
1006
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001007/* Interface to the block stack */
1008
1009static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001010block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001011{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001012 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 com_error(c, PyExc_SystemError,
1014 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001015 }
1016 else {
1017 c->c_block[c->c_nblocks++] = type;
1018 }
1019}
1020
1021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001022block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001023{
1024 if (c->c_nblocks > 0)
1025 c->c_nblocks--;
1026 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001028 }
1029}
1030
Guido van Rossum681d79a1995-07-18 14:51:37 +00001031/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001032
Martin v. Löwis95292d62002-12-11 14:04:59 +00001033static int issue_warning(const char *, const char *, int);
1034static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001035static void com_free(struct compiling *);
1036static void com_push(struct compiling *, int);
1037static void com_pop(struct compiling *, int);
1038static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001039static void com_node(struct compiling *, node *);
1040static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001041static void com_addbyte(struct compiling *, int);
1042static void com_addint(struct compiling *, int);
1043static void com_addoparg(struct compiling *, int, int);
1044static void com_addfwref(struct compiling *, int, int *);
1045static void com_backpatch(struct compiling *, int);
1046static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1047static int com_addconst(struct compiling *, PyObject *);
1048static int com_addname(struct compiling *, PyObject *);
1049static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001050static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001051static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001052static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001053static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001054static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001055static void com_assign(struct compiling *, node *, int, node *);
1056static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001057static int com_make_closure(struct compiling *c, PyCodeObject *co);
1058
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001059static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001060static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001061 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001062static PyObject *parsestrplus(struct compiling*, node *);
1063static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001064static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001065
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001066static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001067
1068/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001069static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001070static struct symtable *symtable_build(node *, PyFutureFeatures *,
1071 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001072static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001073static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001074static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001075static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001077static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001078
1079static void symtable_node(struct symtable *, node *);
1080static void symtable_funcdef(struct symtable *, node *);
1081static void symtable_default_args(struct symtable *, node *);
1082static void symtable_params(struct symtable *, node *);
1083static void symtable_params_fplist(struct symtable *, node *n);
1084static void symtable_global(struct symtable *, node *);
1085static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001086static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001087static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001088static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001089static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001090static void symtable_gen_for(struct symtable *, node *, int);
1091static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001092
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001093static int symtable_update_free_vars(struct symtable *);
1094static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1095static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1096
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001097/* helper */
1098static void
1099do_pad(int pad)
1100{
1101 int i;
1102 for (i = 0; i < pad; ++i)
1103 fprintf(stderr, " ");
1104}
1105
1106static void
1107dump(node *n, int pad, int depth)
1108{
1109 int i;
1110 if (depth == 0)
1111 return;
1112 do_pad(pad);
1113 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1114 if (depth > 0)
1115 depth--;
1116 for (i = 0; i < NCH(n); ++i)
1117 dump(CHILD(n, i), pad + 1, depth);
1118}
1119
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001121com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001123 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1125 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001126 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001128 goto fail;
1129 if ((c->c_const_dict = PyDict_New()) == NULL)
1130 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001132 goto fail;
1133 if ((c->c_name_dict = PyDict_New()) == NULL)
1134 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001136 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1138 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001139 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001140 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001141 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001142 c->c_freevars = NULL;
1143 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001144 c->c_nlocals = 0;
1145 c->c_argcount = 0;
1146 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 c->c_nexti = 0;
1148 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001150 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001152 c->c_begin = 0;
1153 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001154 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001155 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001156 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001157 c->c_stacklevel = 0;
1158 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001159 c->c_firstlineno = 0;
1160 c->c_last_addr = 0;
1161 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001162 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001163 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001164 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001165 c->c_nested = 0;
1166 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001167 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001168 return 1;
1169
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001170 fail:
1171 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 return 0;
1173}
1174
1175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001176com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001177{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 Py_XDECREF(c->c_code);
1179 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001180 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001182 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 Py_XDECREF(c->c_globals);
1184 Py_XDECREF(c->c_locals);
1185 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001186 Py_XDECREF(c->c_freevars);
1187 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001189 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001190 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001191}
1192
1193static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001194com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001195{
1196 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001197 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001198 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001199 /*
1200 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1201 c->c_filename, c->c_name, c->c_lineno,
1202 c->c_nexti, c->c_stacklevel, n);
1203 */
1204 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001205}
1206
1207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001208com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001209{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001210 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001211 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001212 else
1213 c->c_stacklevel -= n;
1214}
1215
1216static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001217com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218{
1219 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001221 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001222 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223}
1224
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001225static int
1226com_check_size(PyObject **s, int offset)
1227{
1228 int len = PyString_GET_SIZE(*s);
1229 if (offset >= len)
1230 return _PyString_Resize(s, len * 2);
1231 return 0;
1232}
1233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001235com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001237 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001238 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001239 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001240 if (com_check_size(&c->c_code, c->c_nexti)) {
1241 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001244 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245}
1246
1247static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001248com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001250 com_addbyte(c, x & 0xff);
1251 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252}
1253
1254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001255com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001256{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001257 char *p;
1258 if (c->c_lnotab == NULL)
1259 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001260 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1261 c->c_errors++;
1262 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001263 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001264 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001265 *p++ = addr;
1266 *p++ = line;
1267 c->c_lnotab_next += 2;
1268}
1269
1270static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001271com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001272{
1273 c->c_lineno = lineno;
1274 if (c->c_firstlineno == 0) {
1275 c->c_firstlineno = c->c_last_line = lineno;
1276 }
1277 else {
1278 int incr_addr = c->c_nexti - c->c_last_addr;
1279 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001280 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001281 while (incr_addr > 255) {
1282 com_add_lnotab(c, 255, 0);
1283 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001284 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001285 while (incr_line > 255) {
1286 com_add_lnotab(c, incr_addr, 255);
1287 incr_line -=255;
1288 incr_addr = 0;
1289 }
1290 if (incr_addr > 0 || incr_line > 0)
1291 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001292 c->c_last_addr = c->c_nexti;
1293 c->c_last_line = lineno;
1294 }
1295}
1296
1297static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001298com_strip_lnotab(struct compiling *c)
1299{
1300 /* strip the last lnotab entry if no opcode were emitted.
1301 * This prevents a line number to be generated on a final
1302 * pass, like in the following example:
1303 *
1304 * if a:
1305 * print 5
1306 * else:
1307 * pass
1308 *
1309 * Without the fix, a line trace event would be generated
1310 * on the pass even if a is true (because of the implicit
1311 * return).
1312 */
1313 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1314 c->c_lnotab_next = c->c_lnotab_last;
1315 }
1316}
1317
1318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001319com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320{
Fred Drakeef8ace32000-08-24 00:32:09 +00001321 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001322 if (extended_arg){
1323 com_addbyte(c, EXTENDED_ARG);
1324 com_addint(c, extended_arg);
1325 arg &= 0xffff;
1326 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001327 com_addbyte(c, op);
1328 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329}
1330
1331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001332com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001333{
1334 /* Compile a forward reference for backpatching */
1335 int here;
1336 int anchor;
1337 com_addbyte(c, op);
1338 here = c->c_nexti;
1339 anchor = *p_anchor;
1340 *p_anchor = here;
1341 com_addint(c, anchor == 0 ? 0 : here - anchor);
1342}
1343
1344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001345com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001347 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001349 int dist;
1350 int prev;
1351 for (;;) {
1352 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001353 prev = code[anchor] + (code[anchor+1] << 8);
1354 dist = target - (anchor+2);
1355 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001356 dist >>= 8;
1357 code[anchor+1] = dist;
1358 dist >>= 8;
1359 if (dist) {
1360 com_error(c, PyExc_SystemError,
1361 "com_backpatch: offset too large");
1362 break;
1363 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 if (!prev)
1365 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366 anchor -= prev;
1367 }
1368}
1369
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001370/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371
1372static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001373com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001374{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001375 PyObject *w, *t, *np=NULL;
1376 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001377
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001378 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001379 if (t == NULL)
1380 goto fail;
1381 w = PyDict_GetItem(dict, t);
1382 if (w != NULL) {
1383 n = PyInt_AsLong(w);
1384 } else {
1385 n = PyList_Size(list);
1386 np = PyInt_FromLong(n);
1387 if (np == NULL)
1388 goto fail;
1389 if (PyList_Append(list, v) != 0)
1390 goto fail;
1391 if (PyDict_SetItem(dict, t, np) != 0)
1392 goto fail;
1393 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001394 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001395 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001396 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001397 fail:
1398 Py_XDECREF(np);
1399 Py_XDECREF(t);
1400 c->c_errors++;
1401 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402}
1403
1404static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001405com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001407 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408}
1409
1410static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001411com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001412{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001413 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414}
1415
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001416int
1417_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001418{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001419 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001420 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001421 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001422 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1423 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001424 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001425 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001426 return 0; /* Don't mangle __extremely_long_names */
1427 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1428 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001429 /* Strip leading underscores from class name */
1430 while (*p == '_')
1431 p++;
1432 if (*p == '\0')
1433 return 0; /* Don't mangle if class is just underscores */
1434 plen = strlen(p);
1435 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001436 plen = maxlen-nlen-2; /* Truncate class name if too long */
1437 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001438 buffer[0] = '_';
1439 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001440 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001441 return 1;
1442}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001443
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001445com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001449 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001450
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001451 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001452 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001453 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454 c->c_errors++;
1455 i = 255;
1456 }
1457 else {
1458 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001461 com_addoparg(c, op, i);
1462}
1463
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001464#define NAME_LOCAL 0
1465#define NAME_GLOBAL 1
1466#define NAME_DEFAULT 2
1467#define NAME_CLOSURE 3
1468
1469static int
1470com_lookup_arg(PyObject *dict, PyObject *name)
1471{
1472 PyObject *v = PyDict_GetItem(dict, name);
1473 if (v == NULL)
1474 return -1;
1475 else
1476 return PyInt_AS_LONG(v);
1477}
1478
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001479static int
1480none_assignment_check(struct compiling *c, char *name, int assigning)
1481{
1482 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1483 char *msg;
1484 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001485 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001486 else
1487 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001488 com_error(c, PyExc_SyntaxError, msg);
1489 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001490 }
1491 return 0;
1492}
1493
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001494static void
1495com_addop_varname(struct compiling *c, int kind, char *name)
1496{
1497 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001498 int i, reftype;
1499 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001500 int op = STOP_CODE;
1501 char buffer[MANGLE_LEN];
1502
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001503 if (kind != VAR_LOAD &&
1504 none_assignment_check(c, name, kind == VAR_STORE))
1505 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001506 i = 255;
1507 goto done;
1508 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001509 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001510 name = buffer;
1511 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1512 c->c_errors++;
1513 i = 255;
1514 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001515 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001516
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001517 reftype = get_ref_type(c, name);
1518 switch (reftype) {
1519 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001520 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001521 scope = NAME_LOCAL;
1522 break;
1523 case GLOBAL_EXPLICIT:
1524 scope = NAME_GLOBAL;
1525 break;
1526 case GLOBAL_IMPLICIT:
1527 if (c->c_flags & CO_OPTIMIZED)
1528 scope = NAME_GLOBAL;
1529 break;
1530 case FREE:
1531 case CELL:
1532 scope = NAME_CLOSURE;
1533 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001534 }
1535
1536 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001537 if (scope == NAME_LOCAL)
1538 i = com_lookup_arg(c->c_locals, v);
1539 else if (reftype == FREE)
1540 i = com_lookup_arg(c->c_freevars, v);
1541 else if (reftype == CELL)
1542 i = com_lookup_arg(c->c_cellvars, v);
1543 if (i == -1) {
1544 c->c_errors++; /* XXX no exception set */
1545 i = 255;
1546 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001547 }
1548 Py_DECREF(v);
1549
1550 switch (kind) {
1551 case VAR_LOAD:
1552 switch (scope) {
1553 case NAME_LOCAL:
1554 op = LOAD_FAST;
1555 break;
1556 case NAME_GLOBAL:
1557 op = LOAD_GLOBAL;
1558 break;
1559 case NAME_DEFAULT:
1560 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001561 break;
1562 case NAME_CLOSURE:
1563 op = LOAD_DEREF;
1564 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001565 }
1566 break;
1567 case VAR_STORE:
1568 switch (scope) {
1569 case NAME_LOCAL:
1570 op = STORE_FAST;
1571 break;
1572 case NAME_GLOBAL:
1573 op = STORE_GLOBAL;
1574 break;
1575 case NAME_DEFAULT:
1576 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001577 break;
1578 case NAME_CLOSURE:
1579 op = STORE_DEREF;
1580 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001581 }
1582 break;
1583 case VAR_DELETE:
1584 switch (scope) {
1585 case NAME_LOCAL:
1586 op = DELETE_FAST;
1587 break;
1588 case NAME_GLOBAL:
1589 op = DELETE_GLOBAL;
1590 break;
1591 case NAME_DEFAULT:
1592 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001593 break;
1594 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001595 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001596 PyOS_snprintf(buf, sizeof(buf),
1597 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001598 com_error(c, PyExc_SyntaxError, buf);
1599 i = 255;
1600 break;
1601 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001602 }
1603 break;
1604 }
1605done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606 com_addoparg(c, op, i);
1607}
1608
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001610com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001611{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001612 char *name;
1613 char buffer[1000];
1614 /* XXX it is possible to write this code without the 1000
1615 chars on the total length of dotted names, I just can't be
1616 bothered right now */
1617 if (TYPE(n) == STAR)
1618 name = "*";
1619 else if (TYPE(n) == dotted_name) {
1620 char *p = buffer;
1621 int i;
1622 name = buffer;
1623 for (i = 0; i < NCH(n); i += 2) {
1624 char *s = STR(CHILD(n, i));
1625 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001627 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001628 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001629 break;
1630 }
1631 if (p != buffer)
1632 *p++ = '.';
1633 strcpy(p, s);
1634 p = strchr(p, '\0');
1635 }
1636 }
1637 else {
1638 REQ(n, NAME);
1639 name = STR(n);
1640 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001641 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001642}
1643
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001645parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001647 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001649 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001650#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001651 int imflag;
1652#endif
1653
Guido van Rossum282914b1991-04-04 10:42:56 +00001654 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001655 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001656#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001657 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001658#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001659 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001661 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001663 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001664 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001665 }
1666 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001667 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001669 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001670 if (errno != 0)
1671 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001673 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001674 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001675#ifndef WITHOUT_COMPLEX
1676 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001677 Py_complex z;
1678 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001679 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001680 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001681 PyFPE_END_PROTECT(z)
1682 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001683 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001684 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001685#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001686 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001687 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001688 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001689 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001691 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001692}
1693
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001695decode_utf8(char **sPtr, char *end, char* encoding)
1696{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001697#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001698 Py_FatalError("decode_utf8 should not be called in this build.");
1699 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001700#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001701 PyObject *u, *v;
1702 char *s, *t;
1703 t = s = *sPtr;
1704 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1705 while (s < end && (*s & 0x80)) s++;
1706 *sPtr = s;
1707 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1708 if (u == NULL)
1709 return NULL;
1710 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1711 Py_DECREF(u);
1712 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001713#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001714}
1715
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001716/* compiler.transformer.Transformer.decode_literal depends on what
1717 might seem like minor details of this function -- changes here
1718 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001719static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001720parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001721{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001722 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001723 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001724 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001725 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001726 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001727 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001728 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001729
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001730 if (isalpha(quote) || quote == '_') {
1731 if (quote == 'u' || quote == 'U') {
1732 quote = *++s;
1733 unicode = 1;
1734 }
1735 if (quote == 'r' || quote == 'R') {
1736 quote = *++s;
1737 rawmode = 1;
1738 }
1739 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001740 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001742 return NULL;
1743 }
1744 s++;
1745 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001746 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001747 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001748 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001749 return NULL;
1750 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001751 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001753 return NULL;
1754 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001755 if (len >= 4 && s[0] == quote && s[1] == quote) {
1756 s += 2;
1757 len -= 2;
1758 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001760 return NULL;
1761 }
1762 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001763#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001764 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001765 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001766 char *buf;
1767 char *p;
1768 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001769 if (encoding == NULL) {
1770 buf = s;
1771 u = NULL;
1772 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1773 buf = s;
1774 u = NULL;
1775 } else {
1776 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1777 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1778 if (u == NULL)
1779 return NULL;
1780 p = buf = PyString_AsString(u);
1781 end = s + len;
1782 while (s < end) {
1783 if (*s == '\\') {
1784 *p++ = *s++;
1785 if (*s & 0x80) {
1786 strcpy(p, "u005c");
1787 p += 5;
1788 }
1789 }
1790 if (*s & 0x80) { /* XXX inefficient */
1791 char *r;
1792 int rn, i;
1793 w = decode_utf8(&s, end, "utf-16-be");
1794 if (w == NULL) {
1795 Py_DECREF(u);
1796 return NULL;
1797 }
1798 r = PyString_AsString(w);
1799 rn = PyString_Size(w);
1800 assert(rn % 2 == 0);
1801 for (i = 0; i < rn; i += 2) {
1802 sprintf(p, "\\u%02x%02x",
1803 r[i + 0] & 0xFF,
1804 r[i + 1] & 0xFF);
1805 p += 6;
1806 }
1807 Py_DECREF(w);
1808 } else {
1809 *p++ = *s++;
1810 }
1811 }
1812 len = p - buf;
1813 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001814 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001815 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001816 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001817 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1818 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001819 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001820 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001821 return v;
1822
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001823 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001824#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001825 need_encoding = (encoding != NULL &&
1826 strcmp(encoding, "utf-8") != 0 &&
1827 strcmp(encoding, "iso-8859-1") != 0);
1828 if (rawmode || strchr(s, '\\') == NULL) {
1829 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001830#ifndef Py_USING_UNICODE
1831 /* This should not happen - we never see any other
1832 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001833 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001834#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001835 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1836 if (u == NULL)
1837 return NULL;
1838 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1839 Py_DECREF(u);
1840 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001841#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001842 } else {
1843 return PyString_FromStringAndSize(s, len);
1844 }
1845 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001846
1847 v = PyString_DecodeEscape(s, len, NULL, unicode,
1848 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001849 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001850 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001851 return v;
1852}
1853
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001855parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001856{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001858 int i;
1859 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001860 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001861 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001862 for (i = 1; i < NCH(n); i++) {
1863 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001864 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001865 if (s == NULL)
1866 goto onError;
1867 if (PyString_Check(v) && PyString_Check(s)) {
1868 PyString_ConcatAndDel(&v, s);
1869 if (v == NULL)
1870 goto onError;
1871 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001872#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001873 else {
1874 PyObject *temp;
1875 temp = PyUnicode_Concat(v, s);
1876 Py_DECREF(s);
1877 if (temp == NULL)
1878 goto onError;
1879 Py_DECREF(v);
1880 v = temp;
1881 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001882#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001883 }
1884 }
1885 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001886
1887 onError:
1888 Py_XDECREF(v);
1889 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001890}
1891
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001893com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001894{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001895 int anchor = 0;
1896 int save_begin = c->c_begin;
1897
Raymond Hettinger354433a2004-05-19 08:20:33 +00001898 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001899 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001900 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001901 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001902 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001903 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001904 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001905 c->c_loops++;
1906 com_list_iter(c, n, e, t);
1907 c->c_loops--;
1908 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1909 c->c_begin = save_begin;
1910 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001911 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001912}
1913
1914static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001915com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1916{
1917 int break_anchor = 0;
1918 int anchor = 0;
1919 int save_begin = c->c_begin;
1920
1921 REQ(n, gen_for);
1922 /* gen_for: for v in test [gen_iter] */
1923
1924 com_addfwref(c, SETUP_LOOP, &break_anchor);
1925 block_push(c, SETUP_LOOP);
1926
1927 if (is_outmost) {
1928 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1929 com_push(c, 1);
1930 }
1931 else {
1932 com_node(c, CHILD(n, 3));
1933 com_addbyte(c, GET_ITER);
1934 }
1935
1936 c->c_begin = c->c_nexti;
1937 com_set_lineno(c, c->c_last_line);
1938 com_addfwref(c, FOR_ITER, &anchor);
1939 com_push(c, 1);
1940 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1941
1942 if (NCH(n) == 5)
1943 com_gen_iter(c, CHILD(n, 4), t);
1944 else {
1945 com_test(c, t);
1946 com_addbyte(c, YIELD_VALUE);
1947 com_pop(c, 1);
1948 }
1949
1950 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1951 c->c_begin = save_begin;
1952
1953 com_backpatch(c, anchor);
1954 com_pop(c, 1); /* FOR_ITER has popped this */
1955 com_addbyte(c, POP_BLOCK);
1956 block_pop(c, SETUP_LOOP);
1957 com_backpatch(c, break_anchor);
1958}
1959
1960static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001961com_list_if(struct compiling *c, node *n, node *e, char *t)
1962{
1963 int anchor = 0;
1964 int a = 0;
1965 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001966 com_node(c, CHILD(n, 1));
1967 com_addfwref(c, JUMP_IF_FALSE, &a);
1968 com_addbyte(c, POP_TOP);
1969 com_pop(c, 1);
1970 com_list_iter(c, n, e, t);
1971 com_addfwref(c, JUMP_FORWARD, &anchor);
1972 com_backpatch(c, a);
1973 /* We jump here with an extra entry which we now pop */
1974 com_addbyte(c, POP_TOP);
1975 com_backpatch(c, anchor);
1976}
1977
1978static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001979com_gen_if(struct compiling *c, node *n, node *t)
1980{
1981 /* gen_if: 'if' test [gen_iter] */
1982 int anchor = 0;
1983 int a=0;
1984
1985 com_node(c, CHILD(n, 1));
1986 com_addfwref(c, JUMP_IF_FALSE, &a);
1987 com_addbyte(c, POP_TOP);
1988 com_pop(c, 1);
1989
1990 if (NCH(n) == 3)
1991 com_gen_iter(c, CHILD(n, 2), t);
1992 else {
1993 com_test(c, t);
1994 com_addbyte(c, YIELD_VALUE);
1995 com_pop(c, 1);
1996 }
1997 com_addfwref(c, JUMP_FORWARD, &anchor);
1998 com_backpatch(c, a);
1999 /* We jump here with an extra entry which we now pop */
2000 com_addbyte(c, POP_TOP);
2001 com_backpatch(c, anchor);
2002}
2003
2004static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002005com_list_iter(struct compiling *c,
2006 node *p, /* parent of list_iter node */
2007 node *e, /* element expression node */
2008 char *t /* name of result list temp local */)
2009{
2010 /* list_iter is the last child in a listmaker, list_for, or list_if */
2011 node *n = CHILD(p, NCH(p)-1);
2012 if (TYPE(n) == list_iter) {
2013 n = CHILD(n, 0);
2014 switch (TYPE(n)) {
2015 case list_for:
2016 com_list_for(c, n, e, t);
2017 break;
2018 case list_if:
2019 com_list_if(c, n, e, t);
2020 break;
2021 default:
2022 com_error(c, PyExc_SystemError,
2023 "invalid list_iter node type");
2024 }
2025 }
2026 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002027 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002028 com_push(c, 1);
2029 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002030 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002031 com_pop(c, 2);
2032 }
2033}
2034
2035static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002036com_gen_iter(struct compiling *c, node *n, node *t)
2037{
2038 /* gen_iter: gen_for | gen_if */
2039 node *ch;
2040 REQ(n, gen_iter);
2041
2042 ch = CHILD(n, 0);
2043
2044 switch (TYPE(ch)) {
2045 case gen_for:
2046 com_gen_for(c, ch, t, 0);
2047 break;
2048 case gen_if:
2049 com_gen_if(c, ch, t);
2050 break;
2051 default:
2052 com_error(c, PyExc_SystemError,
2053 "invalid gen_iter node type");
2054 }
2055}
2056
2057static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002058com_list_comprehension(struct compiling *c, node *n)
2059{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002060 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002061 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002062
2063 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002064 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002065 com_addoparg(c, BUILD_LIST, 0);
2066 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2067 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002068 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002069 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002070 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002071 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002072 --c->c_tmpname;
2073}
2074
2075static void
2076com_listmaker(struct compiling *c, node *n)
2077{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002078 /* listmaker: test ( list_for | (',' test)* [','] ) */
2079 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002080 com_list_comprehension(c, n);
2081 else {
2082 int len = 0;
2083 int i;
2084 for (i = 0; i < NCH(n); i += 2, len++)
2085 com_node(c, CHILD(n, i));
2086 com_addoparg(c, BUILD_LIST, len);
2087 com_pop(c, len-1);
2088 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002089}
2090
2091static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002092com_generator_expression(struct compiling *c, node *n)
2093{
2094 /* testlist_gexp: test gen_for */
2095 /* argument: test gen_for */
2096 PyCodeObject *co;
2097
2098 REQ(CHILD(n, 0), test);
2099 REQ(CHILD(n, 1), gen_for);
2100
2101 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2102 n->n_lineno);
2103 co = icompile(n, c);
2104 symtable_exit_scope(c->c_symtable);
2105
2106 if (co == NULL)
2107 c->c_errors++;
2108 else {
2109 int closure = com_make_closure(c, co);
2110 int i = com_addconst(c, (PyObject *)co);
2111
2112 com_addoparg(c, LOAD_CONST, i);
2113 com_push(c, 1);
2114 if (closure)
2115 com_addoparg(c, MAKE_CLOSURE, 0);
2116 else
2117 com_addoparg(c, MAKE_FUNCTION, 0);
2118
2119 com_test(c, CHILD(CHILD(n, 1), 3));
2120 com_addbyte(c, GET_ITER);
2121 com_addoparg(c, CALL_FUNCTION, 1);
2122 com_pop(c, 1);
2123
2124 Py_DECREF(co);
2125 }
2126}
2127
2128static void
2129com_testlist_gexp(struct compiling *c, node *n)
2130{
2131 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2132 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2133 com_generator_expression(c, n);
2134 else com_list(c, n, 0);
2135}
2136
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002137
Raymond Hettinger354433a2004-05-19 08:20:33 +00002138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002139com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002140{
2141 int i;
2142 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2143 for (i = 0; i+2 < NCH(n); i += 4) {
2144 /* We must arrange things just right for STORE_SUBSCR.
2145 It wants the stack to look like (value) (dict) (key) */
2146 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002147 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002148 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002149 com_node(c, CHILD(n, i+2)); /* value */
2150 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002151 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002153 }
2154}
2155
2156static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002157com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158{
2159 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002160 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002161 int i;
2162 REQ(n, atom);
2163 ch = CHILD(n, 0);
2164 switch (TYPE(ch)) {
2165 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 com_push(c, 1);
2169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002171 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002173 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002174 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002176 com_push(c, 1);
2177 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002179 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002181 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002183 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002184 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002185 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002186 break;
2187 case BACKQUOTE:
2188 com_node(c, CHILD(n, 1));
2189 com_addbyte(c, UNARY_CONVERT);
2190 break;
2191 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002192 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 i = 255;
2194 }
2195 else {
2196 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002197 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 }
2199 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002200 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002201 break;
2202 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002203 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002204 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002205 c->c_errors++;
2206 i = 255;
2207 }
2208 else {
2209 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 }
2212 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002213 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 break;
2215 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002216 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002217 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002218 break;
2219 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002220 com_error(c, PyExc_SystemError,
2221 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002222 }
2223}
2224
2225static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002226com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002227{
2228 if (NCH(n) == 1) {
2229 com_addbyte(c, op);
2230 }
2231 else if (NCH(n) == 2) {
2232 if (TYPE(CHILD(n, 0)) != COLON) {
2233 com_node(c, CHILD(n, 0));
2234 com_addbyte(c, op+1);
2235 }
2236 else {
2237 com_node(c, CHILD(n, 1));
2238 com_addbyte(c, op+2);
2239 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002240 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241 }
2242 else {
2243 com_node(c, CHILD(n, 0));
2244 com_node(c, CHILD(n, 2));
2245 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002246 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002247 }
2248}
2249
Guido van Rossum635abd21997-01-06 22:56:52 +00002250static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002251com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2252{
2253 if (NCH(n) == 1) {
2254 com_addbyte(c, DUP_TOP);
2255 com_push(c, 1);
2256 com_addbyte(c, SLICE);
2257 com_node(c, augn);
2258 com_addbyte(c, opcode);
2259 com_pop(c, 1);
2260 com_addbyte(c, ROT_TWO);
2261 com_addbyte(c, STORE_SLICE);
2262 com_pop(c, 2);
2263 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2264 com_node(c, CHILD(n, 0));
2265 com_addoparg(c, DUP_TOPX, 2);
2266 com_push(c, 2);
2267 com_addbyte(c, SLICE+1);
2268 com_pop(c, 1);
2269 com_node(c, augn);
2270 com_addbyte(c, opcode);
2271 com_pop(c, 1);
2272 com_addbyte(c, ROT_THREE);
2273 com_addbyte(c, STORE_SLICE+1);
2274 com_pop(c, 3);
2275 } else if (NCH(n) == 2) {
2276 com_node(c, CHILD(n, 1));
2277 com_addoparg(c, DUP_TOPX, 2);
2278 com_push(c, 2);
2279 com_addbyte(c, SLICE+2);
2280 com_pop(c, 1);
2281 com_node(c, augn);
2282 com_addbyte(c, opcode);
2283 com_pop(c, 1);
2284 com_addbyte(c, ROT_THREE);
2285 com_addbyte(c, STORE_SLICE+2);
2286 com_pop(c, 3);
2287 } else {
2288 com_node(c, CHILD(n, 0));
2289 com_node(c, CHILD(n, 2));
2290 com_addoparg(c, DUP_TOPX, 3);
2291 com_push(c, 3);
2292 com_addbyte(c, SLICE+3);
2293 com_pop(c, 2);
2294 com_node(c, augn);
2295 com_addbyte(c, opcode);
2296 com_pop(c, 1);
2297 com_addbyte(c, ROT_FOUR);
2298 com_addbyte(c, STORE_SLICE+3);
2299 com_pop(c, 4);
2300 }
2301}
2302
2303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002304com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002305{
2306 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002307 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002308 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002309 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002311 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002312 }
2313 else {
2314 com_node(c, CHILD(n, 0));
2315 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002316 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002317 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002318 if (NCH(n) == 2) {
2319 com_generator_expression(c, n);
2320 return;
2321 }
2322
Guido van Rossumf10570b1995-07-07 22:53:21 +00002323 m = n;
2324 do {
2325 m = CHILD(m, 0);
2326 } while (NCH(m) == 1);
2327 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002328 /* f(lambda x: x[0] = 3) ends up getting parsed with
2329 * LHS test = lambda x: x[0], and RHS test = 3.
2330 * SF bug 132313 points out that complaining about a keyword
2331 * then is very confusing.
2332 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002334 TYPE(m) == lambdef ?
2335 "lambda cannot contain assignment" :
2336 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002337 }
2338 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002340 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002341 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002343 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002344 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002345 else if (*pkeywords == NULL) {
2346 c->c_errors++;
2347 Py_DECREF(v);
2348 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 if (PyDict_GetItem(*pkeywords, v) != NULL)
2350 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002351 "duplicate keyword argument");
2352 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002354 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002355 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002357 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002358 }
2359 }
2360 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002361}
2362
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002363static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002364com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365{
2366 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002367 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
2369 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002371 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002372 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002373 int star_flag = 0;
2374 int starstar_flag = 0;
2375 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002376 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002377 na = 0;
2378 nk = 0;
2379 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002380 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002381 if (TYPE(ch) == STAR ||
2382 TYPE(ch) == DOUBLESTAR)
2383 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002384 if (ch->n_lineno != lineno) {
2385 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002386 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002387 }
2388 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002389 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002390 na++;
2391 else
2392 nk++;
2393 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002395 while (i < NCH(n)) {
2396 node *tok = CHILD(n, i);
2397 node *ch = CHILD(n, i+1);
2398 i += 3;
2399 switch (TYPE(tok)) {
2400 case STAR: star_flag = 1; break;
2401 case DOUBLESTAR: starstar_flag = 1; break;
2402 }
2403 com_node(c, ch);
2404 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002405 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002406 com_error(c, PyExc_SyntaxError,
2407 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002408 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002409 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002410 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002411 star_flag + (starstar_flag << 1);
2412 else
2413 opcode = CALL_FUNCTION;
2414 com_addoparg(c, opcode, na | (nk << 8));
2415 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002416 }
2417}
2418
2419static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002420com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421{
2422 com_addopname(c, LOAD_ATTR, n);
2423}
2424
2425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002427{
2428 int i=0;
2429 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002430 node *ch;
2431
2432 /* first argument */
2433 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002434 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002436 i++;
2437 }
2438 else {
2439 com_node(c, CHILD(n,i));
2440 i++;
2441 REQ(CHILD(n,i),COLON);
2442 i++;
2443 }
2444 /* second argument */
2445 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2446 com_node(c, CHILD(n,i));
2447 i++;
2448 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002449 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002451 com_push(c, 1);
2452 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002453 /* remaining arguments */
2454 for (; i < NCH(n); i++) {
2455 ns++;
2456 ch=CHILD(n,i);
2457 REQ(ch, sliceop);
2458 if (NCH(ch) == 1) {
2459 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002460 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002462 }
2463 else
2464 com_node(c, CHILD(ch,1));
2465 }
2466 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002468}
2469
2470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002471com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002472{
2473 node *ch;
2474 REQ(n, subscript);
2475 ch = CHILD(n,0);
2476 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002478 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002479 com_push(c, 1);
2480 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002481 else {
2482 /* check for slice */
2483 if ((TYPE(ch) == COLON || NCH(n) > 1))
2484 com_sliceobj(c, n);
2485 else {
2486 REQ(ch, test);
2487 com_node(c, ch);
2488 }
2489 }
2490}
2491
2492static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002493com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002494{
2495 int i, op;
2496 REQ(n, subscriptlist);
2497 /* Check to make backward compatible slice behavior for '[i:j]' */
2498 if (NCH(n) == 1) {
2499 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002500 /* 'Basic' slice, should have exactly one colon. */
2501 if ((TYPE(CHILD(sub, 0)) == COLON
2502 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2503 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2504 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002505 switch (assigning) {
2506 case OP_DELETE:
2507 op = DELETE_SLICE;
2508 break;
2509 case OP_ASSIGN:
2510 op = STORE_SLICE;
2511 break;
2512 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002513 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002514 break;
2515 default:
2516 com_augassign_slice(c, sub, assigning, augn);
2517 return;
2518 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002519 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 if (op == STORE_SLICE)
2521 com_pop(c, 2);
2522 else if (op == DELETE_SLICE)
2523 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002524 return;
2525 }
2526 }
2527 /* Else normal subscriptlist. Compile each subscript. */
2528 for (i = 0; i < NCH(n); i += 2)
2529 com_subscript(c, CHILD(n, i));
2530 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002531 if (NCH(n) > 1) {
2532 i = (NCH(n)+1) / 2;
2533 com_addoparg(c, BUILD_TUPLE, i);
2534 com_pop(c, i-1);
2535 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002536 switch (assigning) {
2537 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002538 op = DELETE_SUBSCR;
2539 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002540 break;
2541 default:
2542 case OP_ASSIGN:
2543 op = STORE_SUBSCR;
2544 i = 3;
2545 break;
2546 case OP_APPLY:
2547 op = BINARY_SUBSCR;
2548 i = 1;
2549 break;
2550 }
2551 if (assigning > OP_APPLY) {
2552 com_addoparg(c, DUP_TOPX, 2);
2553 com_push(c, 2);
2554 com_addbyte(c, BINARY_SUBSCR);
2555 com_pop(c, 1);
2556 com_node(c, augn);
2557 com_addbyte(c, assigning);
2558 com_pop(c, 1);
2559 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002561 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002563}
2564
2565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002566com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567{
2568 REQ(n, trailer);
2569 switch (TYPE(CHILD(n, 0))) {
2570 case LPAR:
2571 com_call_function(c, CHILD(n, 1));
2572 break;
2573 case DOT:
2574 com_select_member(c, CHILD(n, 1));
2575 break;
2576 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002577 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002578 break;
2579 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002580 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002581 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002582 }
2583}
2584
2585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002586com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002587{
2588 int i;
2589 REQ(n, power);
2590 com_atom(c, CHILD(n, 0));
2591 for (i = 1; i < NCH(n); i++) {
2592 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2593 com_factor(c, CHILD(n, i+1));
2594 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002596 break;
2597 }
2598 else
2599 com_apply_trailer(c, CHILD(n, i));
2600 }
2601}
2602
2603static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002604com_invert_constant(struct compiling *c, node *n)
2605{
2606 /* Compute the inverse of int and longs and use them directly,
2607 but be prepared to generate code for all other
2608 possibilities (invalid numbers, floats, complex).
2609 */
2610 PyObject *num, *inv = NULL;
2611 int i;
2612
2613 REQ(n, NUMBER);
2614 num = parsenumber(c, STR(n));
2615 if (num == NULL)
2616 i = 255;
2617 else {
2618 inv = PyNumber_Invert(num);
2619 if (inv == NULL) {
2620 PyErr_Clear();
2621 i = com_addconst(c, num);
2622 } else {
2623 i = com_addconst(c, inv);
2624 Py_DECREF(inv);
2625 }
2626 Py_DECREF(num);
2627 }
2628 com_addoparg(c, LOAD_CONST, i);
2629 com_push(c, 1);
2630 if (num != NULL && inv == NULL)
2631 com_addbyte(c, UNARY_INVERT);
2632}
2633
Tim Peters51e26512001-09-07 08:45:55 +00002634static int
2635is_float_zero(const char *p)
2636{
2637 int found_radix_point = 0;
2638 int ch;
2639 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2640 switch (ch) {
2641 case '0':
2642 /* no reason to believe it's not 0 -- continue */
2643 break;
2644
2645 case 'e': case 'E': case 'j': case 'J':
2646 /* If this was a hex constant, we already would have
2647 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2648 must be an exponent marker, and we haven't yet
2649 seen a non-zero digit, and it doesn't matter what
2650 the exponent is then. For 'j' or 'J' similarly,
2651 except that this is an imaginary 0 then. */
2652 return 1;
2653
2654 case '.':
2655 found_radix_point = 1;
2656 break;
2657
2658 default:
2659 return 0;
2660 }
2661 }
2662 return found_radix_point;
2663}
2664
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002666com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002668 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002669 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002671 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002672 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002673 approriate value as a constant. If the value is negative,
2674 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002675 negative in the 0th position -- unless we're doing unary minus
2676 of a floating zero! In that case the sign is significant, but
2677 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002678 */
2679 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002680 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002681 && TYPE((pfactor = CHILD(n, 1))) == factor
2682 && NCH(pfactor) == 1
2683 && TYPE((ppower = CHILD(pfactor, 0))) == power
2684 && NCH(ppower) == 1
2685 && TYPE((patom = CHILD(ppower, 0))) == atom
2686 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002687 && !(childtype == MINUS &&
2688 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002689 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002690 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002691 return;
2692 }
2693 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002694 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002695 if (s == NULL) {
2696 com_error(c, PyExc_MemoryError, "");
2697 com_addbyte(c, 255);
2698 return;
2699 }
2700 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002701 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002702 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002703 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002704 }
Tim Peters51e26512001-09-07 08:45:55 +00002705 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002706 }
2707 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 com_factor(c, CHILD(n, 1));
2709 com_addbyte(c, UNARY_POSITIVE);
2710 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002711 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002712 com_factor(c, CHILD(n, 1));
2713 com_addbyte(c, UNARY_NEGATIVE);
2714 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002715 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002716 com_factor(c, CHILD(n, 1));
2717 com_addbyte(c, UNARY_INVERT);
2718 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002719 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002720 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002721 }
2722}
2723
2724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002725com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726{
2727 int i;
2728 int op;
2729 REQ(n, term);
2730 com_factor(c, CHILD(n, 0));
2731 for (i = 2; i < NCH(n); i += 2) {
2732 com_factor(c, CHILD(n, i));
2733 switch (TYPE(CHILD(n, i-1))) {
2734 case STAR:
2735 op = BINARY_MULTIPLY;
2736 break;
2737 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002738 if (c->c_flags & CO_FUTURE_DIVISION)
2739 op = BINARY_TRUE_DIVIDE;
2740 else
2741 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002742 break;
2743 case PERCENT:
2744 op = BINARY_MODULO;
2745 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002746 case DOUBLESLASH:
2747 op = BINARY_FLOOR_DIVIDE;
2748 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002749 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002750 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002751 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002752 op = 255;
2753 }
2754 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002756 }
2757}
2758
2759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002761{
2762 int i;
2763 int op;
2764 REQ(n, arith_expr);
2765 com_term(c, CHILD(n, 0));
2766 for (i = 2; i < NCH(n); i += 2) {
2767 com_term(c, CHILD(n, i));
2768 switch (TYPE(CHILD(n, i-1))) {
2769 case PLUS:
2770 op = BINARY_ADD;
2771 break;
2772 case MINUS:
2773 op = BINARY_SUBTRACT;
2774 break;
2775 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002776 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002777 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002778 op = 255;
2779 }
2780 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002781 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002782 }
2783}
2784
2785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002787{
2788 int i;
2789 int op;
2790 REQ(n, shift_expr);
2791 com_arith_expr(c, CHILD(n, 0));
2792 for (i = 2; i < NCH(n); i += 2) {
2793 com_arith_expr(c, CHILD(n, i));
2794 switch (TYPE(CHILD(n, i-1))) {
2795 case LEFTSHIFT:
2796 op = BINARY_LSHIFT;
2797 break;
2798 case RIGHTSHIFT:
2799 op = BINARY_RSHIFT;
2800 break;
2801 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002802 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002803 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002804 op = 255;
2805 }
2806 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002807 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002808 }
2809}
2810
2811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002813{
2814 int i;
2815 int op;
2816 REQ(n, and_expr);
2817 com_shift_expr(c, CHILD(n, 0));
2818 for (i = 2; i < NCH(n); i += 2) {
2819 com_shift_expr(c, CHILD(n, i));
2820 if (TYPE(CHILD(n, i-1)) == AMPER) {
2821 op = BINARY_AND;
2822 }
2823 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002824 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002825 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002826 op = 255;
2827 }
2828 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002829 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002830 }
2831}
2832
2833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002834com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002835{
2836 int i;
2837 int op;
2838 REQ(n, xor_expr);
2839 com_and_expr(c, CHILD(n, 0));
2840 for (i = 2; i < NCH(n); i += 2) {
2841 com_and_expr(c, CHILD(n, i));
2842 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2843 op = BINARY_XOR;
2844 }
2845 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002846 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002847 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 op = 255;
2849 }
2850 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002851 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 }
2853}
2854
2855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002856com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857{
2858 int i;
2859 int op;
2860 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002861 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002863 com_xor_expr(c, CHILD(n, i));
2864 if (TYPE(CHILD(n, i-1)) == VBAR) {
2865 op = BINARY_OR;
2866 }
2867 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002868 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002869 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 op = 255;
2871 }
2872 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002873 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 }
2875}
2876
2877static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002878cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879{
2880 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002881 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2883 if (NCH(n) == 1) {
2884 n = CHILD(n, 0);
2885 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002886 case LESS: return PyCmp_LT;
2887 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002888 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002889 case LESSEQUAL: return PyCmp_LE;
2890 case GREATEREQUAL: return PyCmp_GE;
2891 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2892 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2893 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 }
2895 }
2896 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002899 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002901 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 }
2903 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002904 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002905}
2906
2907static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002908com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909{
2910 int i;
2911 enum cmp_op op;
2912 int anchor;
2913 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2914 com_expr(c, CHILD(n, 0));
2915 if (NCH(n) == 1)
2916 return;
2917
2918 /****************************************************************
2919 The following code is generated for all but the last
2920 comparison in a chain:
2921
2922 label: on stack: opcode: jump to:
2923
2924 a <code to load b>
2925 a, b DUP_TOP
2926 a, b, b ROT_THREE
2927 b, a, b COMPARE_OP
2928 b, 0-or-1 JUMP_IF_FALSE L1
2929 b, 1 POP_TOP
2930 b
2931
2932 We are now ready to repeat this sequence for the next
2933 comparison in the chain.
2934
2935 For the last we generate:
2936
2937 b <code to load c>
2938 b, c COMPARE_OP
2939 0-or-1
2940
2941 If there were any jumps to L1 (i.e., there was more than one
2942 comparison), we generate:
2943
2944 0-or-1 JUMP_FORWARD L2
2945 L1: b, 0 ROT_TWO
2946 0, b POP_TOP
2947 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 ****************************************************************/
2950
2951 anchor = 0;
2952
2953 for (i = 2; i < NCH(n); i += 2) {
2954 com_expr(c, CHILD(n, i));
2955 if (i+2 < NCH(n)) {
2956 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002957 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 com_addbyte(c, ROT_THREE);
2959 }
2960 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002961 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002962 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002963 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 }
2965 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002966 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 if (i+2 < NCH(n)) {
2968 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2969 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002970 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971 }
2972 }
2973
2974 if (anchor) {
2975 int anchor2 = 0;
2976 com_addfwref(c, JUMP_FORWARD, &anchor2);
2977 com_backpatch(c, anchor);
2978 com_addbyte(c, ROT_TWO);
2979 com_addbyte(c, POP_TOP);
2980 com_backpatch(c, anchor2);
2981 }
2982}
2983
2984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002985com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002986{
2987 REQ(n, not_test); /* 'not' not_test | comparison */
2988 if (NCH(n) == 1) {
2989 com_comparison(c, CHILD(n, 0));
2990 }
2991 else {
2992 com_not_test(c, CHILD(n, 1));
2993 com_addbyte(c, UNARY_NOT);
2994 }
2995}
2996
2997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002998com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999{
3000 int i;
3001 int anchor;
3002 REQ(n, and_test); /* not_test ('and' not_test)* */
3003 anchor = 0;
3004 i = 0;
3005 for (;;) {
3006 com_not_test(c, CHILD(n, i));
3007 if ((i += 2) >= NCH(n))
3008 break;
3009 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003011 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012 }
3013 if (anchor)
3014 com_backpatch(c, anchor);
3015}
3016
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003017static int
3018com_make_closure(struct compiling *c, PyCodeObject *co)
3019{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003020 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003021 if (free == 0)
3022 return 0;
3023 for (i = 0; i < free; ++i) {
3024 /* Bypass com_addop_varname because it will generate
3025 LOAD_DEREF but LOAD_CLOSURE is needed.
3026 */
3027 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3028 int arg, reftype;
3029
3030 /* Special case: If a class contains a method with a
3031 free variable that has the same name as a method,
3032 the name will be considered free *and* local in the
3033 class. It should be handled by the closure, as
3034 well as by the normal name loookup logic.
3035 */
3036 reftype = get_ref_type(c, PyString_AS_STRING(name));
3037 if (reftype == CELL)
3038 arg = com_lookup_arg(c->c_cellvars, name);
3039 else /* (reftype == FREE) */
3040 arg = com_lookup_arg(c->c_freevars, name);
3041 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003042 fprintf(stderr, "lookup %s in %s %d %d\n"
3043 "freevars of %s: %s\n",
3044 PyObject_REPR(name),
3045 c->c_name,
3046 reftype, arg,
3047 PyString_AS_STRING(co->co_name),
3048 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003049 Py_FatalError("com_make_closure()");
3050 }
3051 com_addoparg(c, LOAD_CLOSURE, arg);
3052
3053 }
3054 com_push(c, free);
3055 return 1;
3056}
3057
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003059com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003062 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003063 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003064 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003065 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003066 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3067 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003068 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003069 if (co == NULL) {
3070 c->c_errors++;
3071 return;
3072 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003073 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003074 i = com_addconst(c, (PyObject *)co);
3075 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003076 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003078 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003079 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003080 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003081 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003082 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003083 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003086 else {
3087 int anchor = 0;
3088 int i = 0;
3089 for (;;) {
3090 com_and_test(c, CHILD(n, i));
3091 if ((i += 2) >= NCH(n))
3092 break;
3093 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3094 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003095 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003096 }
3097 if (anchor)
3098 com_backpatch(c, anchor);
3099 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100}
3101
3102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003103com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104{
3105 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003106 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 com_node(c, CHILD(n, 0));
3108 }
3109 else {
3110 int i;
3111 int len;
3112 len = (NCH(n) + 1) / 2;
3113 for (i = 0; i < NCH(n); i += 2)
3114 com_node(c, CHILD(n, i));
3115 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117 }
3118}
3119
3120
3121/* Begin of assignment compilation */
3122
Thomas Wouters434d0822000-08-24 20:11:32 +00003123
3124static void
3125com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3126{
3127 com_addbyte(c, DUP_TOP);
3128 com_push(c, 1);
3129 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003130 com_node(c, augn);
3131 com_addbyte(c, opcode);
3132 com_pop(c, 1);
3133 com_addbyte(c, ROT_TWO);
3134 com_addopname(c, STORE_ATTR, n);
3135 com_pop(c, 2);
3136}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137
3138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003139com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003141 if (none_assignment_check(c, STR(n), assigning))
3142 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145}
3146
3147static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003148com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 REQ(n, trailer);
3151 switch (TYPE(CHILD(n, 0))) {
3152 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003153 if (assigning == OP_DELETE)
3154 com_error(c, PyExc_SyntaxError,
3155 "can't delete function call");
3156 else
3157 com_error(c, PyExc_SyntaxError,
3158 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 break;
3160 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003161 if (assigning > OP_APPLY)
3162 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3163 else
3164 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003166 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003167 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 break;
3169 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171 }
3172}
3173
3174static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003175com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176{
3177 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003178 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3179 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003181 if (assigning) {
3182 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003183 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003184 com_push(c, i-1);
3185 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003187 com_assign(c, CHILD(n, i), assigning, NULL);
3188}
3189
3190static void
3191com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3192{
3193 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003194 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003195 com_push(c, 1);
3196 com_node(c, augn);
3197 com_addbyte(c, opcode);
3198 com_pop(c, 1);
3199 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200}
3201
3202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003203com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204{
3205 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003206 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003207 if (assigning)
3208 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209}
3210
3211static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003212com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213{
3214 /* Loop to avoid trivial recursion */
3215 for (;;) {
3216 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003217
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 case exprlist:
3219 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003220 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003221 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003223 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003224 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003225 "assign to generator expression not possible");
3226 return;
3227 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003228 if (assigning > OP_APPLY) {
3229 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003230 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003231 return;
3232 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003233 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 return;
3235 }
3236 n = CHILD(n, 0);
3237 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003238
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 case test:
3240 case and_test:
3241 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003244 case xor_expr:
3245 case and_expr:
3246 case shift_expr:
3247 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003249 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003251 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003252 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 return;
3254 }
3255 n = CHILD(n, 0);
3256 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003257
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003258 case power: /* atom trailer* ('**' power)*
3259 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003260 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003261 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003262 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 return;
3264 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003265 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 int i;
3267 com_node(c, CHILD(n, 0));
3268 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003269 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003270 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003271 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003272 return;
3273 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 com_apply_trailer(c, CHILD(n, i));
3275 } /* NB i is still alive */
3276 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003277 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 return;
3279 }
3280 n = CHILD(n, 0);
3281 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003282
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 case atom:
3284 switch (TYPE(CHILD(n, 0))) {
3285 case LPAR:
3286 n = CHILD(n, 1);
3287 if (TYPE(n) == RPAR) {
3288 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003289 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003290 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 return;
3292 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003293 if (assigning > OP_APPLY) {
3294 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003295 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003296 return;
3297 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 break;
3299 case LSQB:
3300 n = CHILD(n, 1);
3301 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003302 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003303 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304 return;
3305 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003306 if (assigning > OP_APPLY) {
3307 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003308 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003309 return;
3310 }
3311 if (NCH(n) > 1
3312 && TYPE(CHILD(n, 1)) == list_for) {
3313 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003314 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003315 return;
3316 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003317 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 return;
3319 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003320 if (assigning > OP_APPLY)
3321 com_augassign_name(c, CHILD(n, 0),
3322 assigning, augn);
3323 else
3324 com_assign_name(c, CHILD(n, 0),
3325 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326 return;
3327 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003328 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003329 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330 return;
3331 }
3332 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003333
3334 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003335 com_error(c, PyExc_SyntaxError,
3336 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003337 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003340 com_error(c, PyExc_SystemError,
3341 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 }
3345 }
3346}
Guido van Rossum7c531111997-03-11 18:42:21 +00003347
Thomas Wouters434d0822000-08-24 20:11:32 +00003348static void
3349com_augassign(struct compiling *c, node *n)
3350{
3351 int opcode;
3352
3353 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3354 case '+': opcode = INPLACE_ADD; break;
3355 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003356 case '/':
3357 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3358 opcode = INPLACE_FLOOR_DIVIDE;
3359 else if (c->c_flags & CO_FUTURE_DIVISION)
3360 opcode = INPLACE_TRUE_DIVIDE;
3361 else
3362 opcode = INPLACE_DIVIDE;
3363 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003364 case '%': opcode = INPLACE_MODULO; break;
3365 case '<': opcode = INPLACE_LSHIFT; break;
3366 case '>': opcode = INPLACE_RSHIFT; break;
3367 case '&': opcode = INPLACE_AND; break;
3368 case '^': opcode = INPLACE_XOR; break;
3369 case '|': opcode = INPLACE_OR; break;
3370 case '*':
3371 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3372 opcode = INPLACE_POWER;
3373 else
3374 opcode = INPLACE_MULTIPLY;
3375 break;
3376 default:
3377 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3378 return;
3379 }
3380 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3381}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382
3383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003384com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385{
Thomas Wouters434d0822000-08-24 20:11:32 +00003386 REQ(n, expr_stmt);
3387 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003388 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003389 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003390 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003391 if (NCH(n) == 1) {
3392 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003393 if (c->c_interactive)
3394 com_addbyte(c, PRINT_EXPR);
3395 else
3396 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003399 else if (TYPE(CHILD(n,1)) == augassign)
3400 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 else {
3402 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003403 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003404 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003405 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 com_push(c, 1);
3408 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003409 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 }
3411 }
3412}
3413
3414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003415com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003416{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003417 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003418 int i;
3419 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003420 if (Py_OptimizeFlag)
3421 return;
3422 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003423
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003424 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003425 raise AssertionError [, <message>]
3426
3427 where <message> is the second test, if present.
3428 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003429 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003430 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003431 com_addbyte(c, POP_TOP);
3432 com_pop(c, 1);
3433 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003434 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003435 com_push(c, 1);
3436 i = NCH(n)/2; /* Either 2 or 4 */
3437 if (i > 1)
3438 com_node(c, CHILD(n, 3));
3439 com_addoparg(c, RAISE_VARARGS, i);
3440 com_pop(c, i);
3441 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003442 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003443 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003444 com_addbyte(c, POP_TOP);
3445}
3446
3447static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003448com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003450 int i = 1;
3451 node* stream = NULL;
3452
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003453 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003454
3455 /* are we using the extended print form? */
3456 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3457 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003458 com_node(c, stream);
3459 /* stack: [...] => [... stream] */
3460 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003461 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3462 i = 4;
3463 else
3464 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003466 for (; i < NCH(n); i += 2) {
3467 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003468 com_addbyte(c, DUP_TOP);
3469 /* stack: [stream] => [stream stream] */
3470 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003471 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003472 /* stack: [stream stream] => [stream stream obj] */
3473 com_addbyte(c, ROT_TWO);
3474 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003475 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003476 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003477 com_pop(c, 2);
3478 }
3479 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003480 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003481 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003482 com_addbyte(c, PRINT_ITEM);
3483 com_pop(c, 1);
3484 }
3485 }
3486 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003487 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003488 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003489 /* must pop the extra stream object off the stack */
3490 com_addbyte(c, POP_TOP);
3491 /* stack: [... stream] => [...] */
3492 com_pop(c, 1);
3493 }
3494 }
3495 else {
3496 if (stream != NULL) {
3497 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003498 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003499 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003500 com_pop(c, 1);
3501 }
3502 else
3503 com_addbyte(c, PRINT_NEWLINE);
3504 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505}
3506
3507static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003508com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003510 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003511 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003512 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003513 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003514 if (c->c_flags & CO_GENERATOR) {
3515 if (NCH(n) > 1) {
3516 com_error(c, PyExc_SyntaxError,
3517 "'return' with argument inside generator");
3518 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003519 }
3520 if (NCH(n) < 2) {
3521 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 com_push(c, 1);
3523 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003524 else
3525 com_node(c, CHILD(n, 1));
3526 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003527 com_pop(c, 1);
3528}
3529
3530static void
3531com_yield_stmt(struct compiling *c, node *n)
3532{
Tim Peters95c80f82001-06-23 02:07:08 +00003533 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003534 REQ(n, yield_stmt); /* 'yield' testlist */
3535 if (!c->c_infunction) {
3536 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3537 }
Tim Peters95c80f82001-06-23 02:07:08 +00003538
3539 for (i = 0; i < c->c_nblocks; ++i) {
3540 if (c->c_block[i] == SETUP_FINALLY) {
3541 com_error(c, PyExc_SyntaxError,
3542 "'yield' not allowed in a 'try' block "
3543 "with a 'finally' clause");
3544 return;
3545 }
3546 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003547 com_node(c, CHILD(n, 1));
3548 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550}
3551
3552static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003553com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003554{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003555 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003556 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3557 if (NCH(n) > 1) {
3558 com_node(c, CHILD(n, 1));
3559 if (NCH(n) > 3) {
3560 com_node(c, CHILD(n, 3));
3561 if (NCH(n) > 5)
3562 com_node(c, CHILD(n, 5));
3563 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003564 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 i = NCH(n)/2;
3566 com_addoparg(c, RAISE_VARARGS, i);
3567 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003568}
3569
3570static void
Thomas Wouters52152252000-08-17 22:55:00 +00003571com_from_import(struct compiling *c, node *n)
3572{
3573 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3574 com_push(c, 1);
3575 if (NCH(n) > 1) {
3576 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3577 com_error(c, PyExc_SyntaxError, "invalid syntax");
3578 return;
3579 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003580 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003581 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003582 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003583 com_pop(c, 1);
3584}
3585
3586static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003587com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003588{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003589 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 int i;
3591 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003592 n = CHILD(n, 0);
3593 /* import_stmt: import_name | import_from */
3594 if (TYPE(n) == import_from) {
3595 /* 'from' dotted_name 'import' ('*' |
3596 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003597 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003598 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003599 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3600 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003601 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003602 else {
3603 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3604 TYPE(CHILD(n, 3)) != LPAR) {
3605 com_error(c, PyExc_SyntaxError,
3606 "trailing comma not allowed "
3607 "without surrounding parentheses");
3608 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003609 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003610 REQ(nn, import_as_names);
3611 tup = PyTuple_New((NCH(nn) + 1) / 2);
3612 for (i = 0; i < NCH(nn); i += 2)
3613 PyTuple_SET_ITEM(tup, i / 2,
3614 PyString_FromString(STR(
3615 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003616 }
3617 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003618 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003619 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003620 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003621 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003622 com_addbyte(c, IMPORT_STAR);
3623 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003624 for (i = 0; i < NCH(nn); i += 2)
3625 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003626 com_addbyte(c, POP_TOP);
3627 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003628 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629 }
3630 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003631 /* 'import' dotted_as_names */
3632 nn = CHILD(n, 1);
3633 REQ(nn, dotted_as_names);
3634 for (i = 0; i < NCH(nn); i += 2) {
3635 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003636 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003637 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003639 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003640 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003641 int j;
3642 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003643 com_error(c, PyExc_SyntaxError,
3644 "invalid syntax");
3645 return;
3646 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003647 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3648 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003649 CHILD(CHILD(subn, 0),
3650 j));
3651 com_addop_varname(c, VAR_STORE,
3652 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003653 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003654 com_addop_varname(c, VAR_STORE,
3655 STR(CHILD(CHILD(subn, 0),
3656 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003657 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003658 }
3659 }
3660}
3661
3662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003663com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003664{
3665 REQ(n, exec_stmt);
3666 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3667 com_node(c, CHILD(n, 1));
3668 if (NCH(n) >= 4)
3669 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003671 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 com_push(c, 1);
3673 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003674 if (NCH(n) >= 6)
3675 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003677 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003678 com_push(c, 1);
3679 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003680 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003681 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003682}
3683
Guido van Rossum7c531111997-03-11 18:42:21 +00003684static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003685is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003686{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003687 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003688 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003689 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003690
3691 /* Label to avoid tail recursion */
3692 next:
3693 switch (TYPE(n)) {
3694
3695 case suite:
3696 if (NCH(n) == 1) {
3697 n = CHILD(n, 0);
3698 goto next;
3699 }
3700 /* Fall through */
3701 case file_input:
3702 for (i = 0; i < NCH(n); i++) {
3703 node *ch = CHILD(n, i);
3704 if (TYPE(ch) == stmt) {
3705 n = ch;
3706 goto next;
3707 }
3708 }
3709 break;
3710
3711 case stmt:
3712 case simple_stmt:
3713 case small_stmt:
3714 n = CHILD(n, 0);
3715 goto next;
3716
3717 case expr_stmt:
3718 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003719 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003720 case test:
3721 case and_test:
3722 case not_test:
3723 case comparison:
3724 case expr:
3725 case xor_expr:
3726 case and_expr:
3727 case shift_expr:
3728 case arith_expr:
3729 case term:
3730 case factor:
3731 case power:
3732 case atom:
3733 if (NCH(n) == 1) {
3734 n = CHILD(n, 0);
3735 goto next;
3736 }
3737 break;
3738
3739 case NAME:
3740 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3741 return 1;
3742 break;
3743
3744 case NUMBER:
3745 v = parsenumber(c, STR(n));
3746 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003747 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003748 break;
3749 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003750 i = PyObject_IsTrue(v);
3751 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003752 return i == 0;
3753
3754 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003755 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003756 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003757 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003758 break;
3759 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003760 i = PyObject_IsTrue(v);
3761 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003762 return i == 0;
3763
3764 }
3765 return 0;
3766}
3767
Tim Peters08a898f2001-06-28 01:52:22 +00003768
3769/* Look under n for a return stmt with an expression.
3770 * This hack is used to find illegal returns under "if 0:" blocks in
3771 * functions already known to be generators (as determined by the symtable
3772 * pass).
3773 * Return the offending return node if found, else NULL.
3774 */
3775static node *
3776look_for_offending_return(node *n)
3777{
3778 int i;
3779
3780 for (i = 0; i < NCH(n); ++i) {
3781 node *kid = CHILD(n, i);
3782
3783 switch (TYPE(kid)) {
3784 case classdef:
3785 case funcdef:
3786 case lambdef:
3787 /* Stuff in nested functions & classes doesn't
3788 affect the code block we started in. */
3789 return NULL;
3790
3791 case return_stmt:
3792 if (NCH(kid) > 1)
3793 return kid;
3794 break;
3795
3796 default: {
3797 node *bad = look_for_offending_return(kid);
3798 if (bad != NULL)
3799 return bad;
3800 }
3801 }
3802 }
3803
3804 return NULL;
3805}
3806
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003808com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809{
3810 int i;
3811 int anchor = 0;
3812 REQ(n, if_stmt);
3813 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3814 for (i = 0; i+3 < NCH(n); i+=4) {
3815 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003816 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003817 if (is_constant_false(c, ch)) {
3818 /* We're going to skip this block. However, if this
3819 is a generator, we have to check the dead code
3820 anyway to make sure there aren't any return stmts
3821 with expressions, in the same scope. */
3822 if (c->c_flags & CO_GENERATOR) {
3823 node *p = look_for_offending_return(n);
3824 if (p != NULL) {
3825 int savelineno = c->c_lineno;
3826 c->c_lineno = p->n_lineno;
3827 com_error(c, PyExc_SyntaxError,
3828 "'return' with argument "
3829 "inside generator");
3830 c->c_lineno = savelineno;
3831 }
3832 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003833 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003834 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003835 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003836 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003837 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 com_addfwref(c, JUMP_IF_FALSE, &a);
3839 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003840 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 com_node(c, CHILD(n, i+3));
3842 com_addfwref(c, JUMP_FORWARD, &anchor);
3843 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003844 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845 com_addbyte(c, POP_TOP);
3846 }
3847 if (i+2 < NCH(n))
3848 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003849 if (anchor)
3850 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851}
3852
3853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003854com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855{
3856 int break_anchor = 0;
3857 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003858 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3860 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003861 block_push(c, SETUP_LOOP);
3862 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003863 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003864 com_node(c, CHILD(n, 1));
3865 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3866 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003867 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003868 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003870 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003871 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3872 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003873 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003874 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003875 com_addbyte(c, POP_TOP);
3876 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003877 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 if (NCH(n) > 4)
3879 com_node(c, CHILD(n, 6));
3880 com_backpatch(c, break_anchor);
3881}
3882
3883static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003884com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 int break_anchor = 0;
3887 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003888 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889 REQ(n, for_stmt);
3890 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3891 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003892 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003894 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003895 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003896 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003897 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003898 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003899 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003900 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003902 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003903 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3904 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003905 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003906 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003907 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003908 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003909 if (NCH(n) > 8)
3910 com_node(c, CHILD(n, 8));
3911 com_backpatch(c, break_anchor);
3912}
3913
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003914/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003915
3916 SETUP_FINALLY L
3917 <code for S>
3918 POP_BLOCK
3919 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003920 L: <code for Sf>
3921 END_FINALLY
3922
3923 The special instructions use the block stack. Each block
3924 stack entry contains the instruction that created it (here
3925 SETUP_FINALLY), the level of the value stack at the time the
3926 block stack entry was created, and a label (here L).
3927
3928 SETUP_FINALLY:
3929 Pushes the current value stack level and the label
3930 onto the block stack.
3931 POP_BLOCK:
3932 Pops en entry from the block stack, and pops the value
3933 stack until its level is the same as indicated on the
3934 block stack. (The label is ignored.)
3935 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003936 Pops a variable number of entries from the *value* stack
3937 and re-raises the exception they specify. The number of
3938 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003939
3940 The block stack is unwound when an exception is raised:
3941 when a SETUP_FINALLY entry is found, the exception is pushed
3942 onto the value stack (and the exception condition is cleared),
3943 and the interpreter jumps to the label gotten from the block
3944 stack.
3945
3946 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003947 (The contents of the value stack is shown in [], with the top
3948 at the right; 'tb' is trace-back info, 'val' the exception's
3949 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003950
3951 Value stack Label Instruction Argument
3952 [] SETUP_EXCEPT L1
3953 [] <code for S>
3954 [] POP_BLOCK
3955 [] JUMP_FORWARD L0
3956
Guido van Rossum3f5da241990-12-20 15:06:42 +00003957 [tb, val, exc] L1: DUP )
3958 [tb, val, exc, exc] <evaluate E1> )
3959 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3960 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3961 [tb, val, exc, 1] POP )
3962 [tb, val, exc] POP
3963 [tb, val] <assign to V1> (or POP if no V1)
3964 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003965 [] <code for S1>
3966 JUMP_FORWARD L0
3967
Guido van Rossum3f5da241990-12-20 15:06:42 +00003968 [tb, val, exc, 0] L2: POP
3969 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003970 .............................etc.......................
3971
Guido van Rossum3f5da241990-12-20 15:06:42 +00003972 [tb, val, exc, 0] Ln+1: POP
3973 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003974
3975 [] L0: <next statement>
3976
3977 Of course, parts are not generated if Vi or Ei is not present.
3978*/
3979
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003981com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003982{
3983 int except_anchor = 0;
3984 int end_anchor = 0;
3985 int else_anchor = 0;
3986 int i;
3987 node *ch;
3988
3989 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3990 block_push(c, SETUP_EXCEPT);
3991 com_node(c, CHILD(n, 2));
3992 com_addbyte(c, POP_BLOCK);
3993 block_pop(c, SETUP_EXCEPT);
3994 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3995 com_backpatch(c, except_anchor);
3996 for (i = 3;
3997 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3998 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003999 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004000 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004001 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004002 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004003 break;
4004 }
4005 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004007 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004008 if (NCH(ch) > 1) {
4009 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004010 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004011 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004012 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004013 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004014 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4015 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004017 }
4018 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004019 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004020 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004021 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004023 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004024 com_pop(c, 1);
4025 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004026 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004027 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004028 com_node(c, CHILD(n, i+2));
4029 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4030 if (except_anchor) {
4031 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004032 /* We come in with [tb, val, exc, 0] on the
4033 stack; one pop and it's the same as
4034 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004035 com_addbyte(c, POP_TOP);
4036 }
4037 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004038 /* We actually come in here with [tb, val, exc] but the
4039 END_FINALLY will zap those and jump around.
4040 The c_stacklevel does not reflect them so we need not pop
4041 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004042 com_addbyte(c, END_FINALLY);
4043 com_backpatch(c, else_anchor);
4044 if (i < NCH(n))
4045 com_node(c, CHILD(n, i+2));
4046 com_backpatch(c, end_anchor);
4047}
4048
4049static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004050com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051{
4052 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004053 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004054
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004055 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4056 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004057 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004058 com_addbyte(c, POP_BLOCK);
4059 block_pop(c, SETUP_FINALLY);
4060 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004061 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004062 /* While the generated code pushes only one item,
4063 the try-finally handling can enter here with
4064 up to three items. OK, here are the details:
4065 3 for an exception, 2 for RETURN, 1 for BREAK. */
4066 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004067 com_backpatch(c, finally_anchor);
4068 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004069 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004070 com_node(c, ch);
4071 com_addbyte(c, END_FINALLY);
4072 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004073 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004074}
4075
4076static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004077com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004078{
4079 REQ(n, try_stmt);
4080 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4081 | 'try' ':' suite 'finally' ':' suite */
4082 if (TYPE(CHILD(n, 3)) != except_clause)
4083 com_try_finally(c, n);
4084 else
4085 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086}
4087
Guido van Rossum8b993a91997-01-17 21:04:03 +00004088static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004089get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004090{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004091 int i;
4092
Guido van Rossum8b993a91997-01-17 21:04:03 +00004093 /* Label to avoid tail recursion */
4094 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004095 switch (TYPE(n)) {
4096
4097 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004098 if (NCH(n) == 1) {
4099 n = CHILD(n, 0);
4100 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004101 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004102 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004103 case file_input:
4104 for (i = 0; i < NCH(n); i++) {
4105 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004106 if (TYPE(ch) == stmt) {
4107 n = ch;
4108 goto next;
4109 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004110 }
4111 break;
4112
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004113 case stmt:
4114 case simple_stmt:
4115 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004116 n = CHILD(n, 0);
4117 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004118
4119 case expr_stmt:
4120 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004121 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004122 case test:
4123 case and_test:
4124 case not_test:
4125 case comparison:
4126 case expr:
4127 case xor_expr:
4128 case and_expr:
4129 case shift_expr:
4130 case arith_expr:
4131 case term:
4132 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004133 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 if (NCH(n) == 1) {
4135 n = CHILD(n, 0);
4136 goto next;
4137 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004138 break;
4139
4140 case atom:
4141 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004142 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004143 break;
4144
4145 }
4146 return NULL;
4147}
4148
Guido van Rossum79f25d91997-04-29 20:08:16 +00004149static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004150get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151{
Guido van Rossum541563e1999-01-28 15:08:09 +00004152 /* Don't generate doc-strings if run with -OO */
4153 if (Py_OptimizeFlag > 1)
4154 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004155 n = get_rawdocstring(n);
4156 if (n == NULL)
4157 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004158 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159}
4160
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004161static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004162com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004163{
4164 REQ(n, suite);
4165 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4166 if (NCH(n) == 1) {
4167 com_node(c, CHILD(n, 0));
4168 }
4169 else {
4170 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004171 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172 node *ch = CHILD(n, i);
4173 if (TYPE(ch) == stmt)
4174 com_node(c, ch);
4175 }
4176 }
4177}
4178
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004179/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004181com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004182{
4183 int i = c->c_nblocks;
4184 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4185 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4186 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004187 else if (i <= 0) {
4188 /* at the outer level */
4189 com_error(c, PyExc_SyntaxError,
4190 "'continue' not properly in loop");
4191 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004192 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004193 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004194 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004195 if (c->c_block[j] == SETUP_LOOP)
4196 break;
4197 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004198 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004199 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004200 for (; i > j; --i) {
4201 if (c->c_block[i] == SETUP_EXCEPT ||
4202 c->c_block[i] == SETUP_FINALLY) {
4203 com_addoparg(c, CONTINUE_LOOP,
4204 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004205 return;
4206 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004207 if (c->c_block[i] == END_FINALLY) {
4208 com_error(c, PyExc_SyntaxError,
4209 "'continue' not supported inside 'finally' clause");
4210 return;
4211 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004212 }
4213 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004214 com_error(c, PyExc_SyntaxError,
4215 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004216 }
4217 /* XXX Could allow it inside a 'finally' clause
4218 XXX if we could pop the exception still on the stack */
4219}
4220
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004221/* Return the number of default values in the argument list.
4222
4223 If a non-default argument follows a default argument, set an
4224 exception and return -1.
4225*/
4226
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004227static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004228com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004229{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004230 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004231 if (TYPE(n) == lambdef) {
4232 /* lambdef: 'lambda' [varargslist] ':' test */
4233 n = CHILD(n, 1);
4234 }
4235 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004236 REQ(n, funcdef);
4237 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4238 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004239 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4240 n = CHILD(n, 1);
4241 }
4242 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004243 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004244 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004245 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004246 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4247 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004248 ndefs = 0;
4249 for (i = 0; i < nch; i++) {
4250 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004251 if (TYPE(CHILD(n, i)) == STAR ||
4252 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004253 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004254 i++;
4255 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004256 t = RPAR; /* Anything except EQUAL or COMMA */
4257 else
4258 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004259 if (t == EQUAL) {
4260 i++;
4261 ndefs++;
4262 com_node(c, CHILD(n, i));
4263 i++;
4264 if (i >= nch)
4265 break;
4266 t = TYPE(CHILD(n, i));
4267 }
4268 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004269 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004270 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004271 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004272 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004273 return -1;
4274 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004275 }
4276 if (t != COMMA)
4277 break;
4278 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004279 return ndefs;
4280}
4281
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004282static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004283com_decorator_name(struct compiling *c, node *n)
4284{
4285 /* dotted_name: NAME ('.' NAME)* */
4286
4287 int i, nch;
4288 node *varname;
4289
4290 REQ(n, dotted_name);
4291 nch = NCH(n);
4292 assert(nch >= 1 && nch % 2 == 1);
4293
4294 varname = CHILD(n, 0);
4295 REQ(varname, NAME);
4296 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004297 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004298
4299 for (i = 1; i < nch; i += 2) {
4300 node *attrname;
4301
4302 REQ(CHILD(n, i), DOT);
4303
4304 attrname = CHILD(n, i + 1);
4305 REQ(attrname, NAME);
4306 com_addop_name(c, LOAD_ATTR, STR(attrname));
4307 }
4308}
4309
4310static void
4311com_decorator(struct compiling *c, node *n)
4312{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004313 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004314 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004315 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004316 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004317 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004318 com_decorator_name(c, CHILD(n, 1));
4319
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004320 if (nch > 3) {
4321 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004322 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004323 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004324 com_call_function(c, CHILD(n, 3));
4325 }
4326}
4327
4328static int
4329com_decorators(struct compiling *c, node *n)
4330{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004331 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004332
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004333 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004334 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004335 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004336
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004337 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004338 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004339 REQ(ch, decorator);
4340
4341 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004342 }
4343
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004344 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004345}
4346
4347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004348com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004349{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004350 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004351 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004352
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004353 REQ(n, funcdef);
4354 /* -6 -5 -4 -3 -2 -1
4355 funcdef: [decorators] 'def' NAME parameters ':' suite */
4356
4357 if (NCH(n) == 6)
4358 ndecorators = com_decorators(c, CHILD(n, 0));
4359 else
4360 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004361
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004362 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004363 if (ndefs < 0)
4364 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004365 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004366 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004367 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004368 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004369 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004370 c->c_errors++;
4371 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372 int closure = com_make_closure(c, (PyCodeObject *)co);
4373 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004374 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004375 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376 if (closure)
4377 com_addoparg(c, MAKE_CLOSURE, ndefs);
4378 else
4379 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004380 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004381
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004382 while (ndecorators > 0) {
4383 com_addoparg(c, CALL_FUNCTION, 1);
4384 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004385 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004386 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004387
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004388 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004389 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004390 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004391 }
4392}
4393
4394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004395com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004396{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004397 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004398 REQ(n, testlist);
4399 /* testlist: test (',' test)* [','] */
4400 for (i = 0; i < NCH(n); i += 2)
4401 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004402 i = (NCH(n)+1) / 2;
4403 com_addoparg(c, BUILD_TUPLE, i);
4404 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004405}
4406
4407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004408com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004409{
Guido van Rossum25831651993-05-19 14:50:45 +00004410 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004411 PyObject *v;
4412 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004413 char *name;
4414
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004415 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004416 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004417 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004418 c->c_errors++;
4419 return;
4420 }
4421 /* Push the class name on the stack */
4422 i = com_addconst(c, v);
4423 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004424 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004425 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004426 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004427 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004428 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004429 com_push(c, 1);
4430 }
Guido van Rossum25831651993-05-19 14:50:45 +00004431 else
4432 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004434 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004435 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004438 c->c_errors++;
4439 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004440 int closure = com_make_closure(c, co);
4441 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004442 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004444 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004445 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004446 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004447 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004448 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004449 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004450 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004451 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004452 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004453 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004454 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004455 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004456}
4457
4458static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004459com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004460{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004461 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004462 if (c->c_errors)
4463 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004464 switch (TYPE(n)) {
4465
4466 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004467
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004468 case funcdef:
4469 com_funcdef(c, n);
4470 break;
4471 case classdef:
4472 com_classdef(c, n);
4473 break;
4474
4475 /* Trivial parse tree nodes */
4476
4477 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004478 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004479 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004480 n = CHILD(n, 0);
4481 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004482
4483 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004484 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004485 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004486 {
4487 int i;
4488 for (i = 0; i < NCH(n)-1; i += 2)
4489 com_node(c, CHILD(n, i));
4490 }
4491 break;
4492
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004493 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004494 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004495 n = CHILD(n, 0);
4496 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004497
4498 /* Statement nodes */
4499
4500 case expr_stmt:
4501 com_expr_stmt(c, n);
4502 break;
4503 case print_stmt:
4504 com_print_stmt(c, n);
4505 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004506 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004507 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004508 break;
4509 case pass_stmt:
4510 break;
4511 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004512 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004513 com_error(c, PyExc_SyntaxError,
4514 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004515 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004516 com_addbyte(c, BREAK_LOOP);
4517 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004518 case continue_stmt:
4519 com_continue_stmt(c, n);
4520 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004521 case return_stmt:
4522 com_return_stmt(c, n);
4523 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004524 case yield_stmt:
4525 com_yield_stmt(c, n);
4526 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527 case raise_stmt:
4528 com_raise_stmt(c, n);
4529 break;
4530 case import_stmt:
4531 com_import_stmt(c, n);
4532 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004533 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004534 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004535 case exec_stmt:
4536 com_exec_stmt(c, n);
4537 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004538 case assert_stmt:
4539 com_assert_stmt(c, n);
4540 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004541 case if_stmt:
4542 com_if_stmt(c, n);
4543 break;
4544 case while_stmt:
4545 com_while_stmt(c, n);
4546 break;
4547 case for_stmt:
4548 com_for_stmt(c, n);
4549 break;
4550 case try_stmt:
4551 com_try_stmt(c, n);
4552 break;
4553 case suite:
4554 com_suite(c, n);
4555 break;
4556
4557 /* Expression nodes */
4558
4559 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004560 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004561 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004562 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004563 break;
4564 case test:
4565 com_test(c, n);
4566 break;
4567 case and_test:
4568 com_and_test(c, n);
4569 break;
4570 case not_test:
4571 com_not_test(c, n);
4572 break;
4573 case comparison:
4574 com_comparison(c, n);
4575 break;
4576 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004577 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004578 break;
4579 case expr:
4580 com_expr(c, n);
4581 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004582 case xor_expr:
4583 com_xor_expr(c, n);
4584 break;
4585 case and_expr:
4586 com_and_expr(c, n);
4587 break;
4588 case shift_expr:
4589 com_shift_expr(c, n);
4590 break;
4591 case arith_expr:
4592 com_arith_expr(c, n);
4593 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594 case term:
4595 com_term(c, n);
4596 break;
4597 case factor:
4598 com_factor(c, n);
4599 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004600 case power:
4601 com_power(c, n);
4602 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004603 case atom:
4604 com_atom(c, n);
4605 break;
4606
4607 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004608 com_error(c, PyExc_SystemError,
4609 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004610 }
4611}
4612
Tim Petersdbd9ba62000-07-09 03:09:57 +00004613static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004614
4615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004616com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617{
4618 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4619 if (TYPE(CHILD(n, 0)) == LPAR)
4620 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004621 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004622 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004623 com_pop(c, 1);
4624 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004625}
4626
4627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004628com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004629{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004630 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004631 if (NCH(n) == 1) {
4632 com_fpdef(c, CHILD(n, 0));
4633 }
4634 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004635 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004636 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004637 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004638 for (i = 0; i < NCH(n); i += 2)
4639 com_fpdef(c, CHILD(n, i));
4640 }
4641}
4642
4643static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004644com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004645{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004646 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004647 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004648 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004649 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004650 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004651 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004652 nch = NCH(n);
4653 /* Enter all arguments in table of locals */
4654 for (i = 0, narg = 0; i < nch; i++) {
4655 node *ch = CHILD(n, i);
4656 node *fp;
4657 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004658 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004659 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4660 fp = CHILD(ch, 0);
4661 if (TYPE(fp) != NAME) {
4662 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4663 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004664 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004665 narg++;
4666 /* all name updates handled by symtable */
4667 if (++i >= nch)
4668 break;
4669 ch = CHILD(n, i);
4670 if (TYPE(ch) == EQUAL)
4671 i += 2;
4672 else
4673 REQ(ch, COMMA);
4674 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004675 if (complex) {
4676 /* Generate code for complex arguments only after
4677 having counted the simple arguments */
4678 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004679 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004680 node *ch = CHILD(n, i);
4681 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004682 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004683 break;
4684 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4685 fp = CHILD(ch, 0);
4686 if (TYPE(fp) != NAME) {
4687 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004688 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004689 com_fpdef(c, ch);
4690 }
4691 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004692 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004693 break;
4694 ch = CHILD(n, i);
4695 if (TYPE(ch) == EQUAL)
4696 i += 2;
4697 else
4698 REQ(ch, COMMA);
4699 }
4700 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004701}
4702
4703static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004704com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004705{
4706 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004707 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004708 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004709 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004710 if (doc != NULL) {
4711 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004712 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004713 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004714 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004715 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004716 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004717 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004718 for (i = 0; i < NCH(n); i++) {
4719 node *ch = CHILD(n, i);
4720 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4721 com_node(c, ch);
4722 }
4723}
4724
4725/* Top-level compile-node interface */
4726
4727static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004728compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004729{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004730 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004731 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004732 REQ(n, funcdef);
4733 /* -6 -5 -4 -3 -2 -1
4734 funcdef: [decorators] 'def' NAME parameters ':' suite */
4735 c->c_name = STR(RCHILD(n, -4));
4736 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004737 if (doc != NULL) {
4738 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004739 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004740 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004741 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004742 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004743 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004744 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004745 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004746 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004747 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004748 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004749 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004750 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004751 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4752 com_push(c, 1);
4753 com_addbyte(c, RETURN_VALUE);
4754 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004755}
4756
4757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004758compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004759{
Guido van Rossum590baa41993-11-30 13:40:46 +00004760 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004761 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004762 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004763
4764 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004765 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004766 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004767 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004768 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004769 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004770 else
4771 ch = CHILD(n, 2);
4772 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004773 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004774 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004775}
4776
4777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004778compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004779{
4780 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004781 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004782 REQ(n, classdef);
4783 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4784 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004785 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004786 /* Initialize local __module__ from global __name__ */
4787 com_addop_name(c, LOAD_GLOBAL, "__name__");
4788 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004789 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004790 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004791 if (doc != NULL) {
4792 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004793 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004794 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004795 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004796 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004797 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004798 }
4799 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004800 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004801 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004802 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004803 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004804 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004805 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004806 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004807}
4808
4809static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004810compile_generator_expression(struct compiling *c, node *n)
4811{
4812 /* testlist_gexp: test gen_for */
4813 /* argument: test gen_for */
4814 REQ(CHILD(n, 0), test);
4815 REQ(CHILD(n, 1), gen_for);
4816
4817 c->c_name = "<generator expression>";
4818 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4819
4820 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4821 com_push(c, 1);
4822 com_addbyte(c, RETURN_VALUE);
4823 com_pop(c, 1);
4824}
4825
4826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004827compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004828{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004829 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004830
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004831 switch (TYPE(n)) {
4832
Guido van Rossum4c417781991-01-21 16:09:22 +00004833 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004834 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004835 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004836 n = CHILD(n, 0);
4837 if (TYPE(n) != NEWLINE)
4838 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004839 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004840 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4841 com_push(c, 1);
4842 com_addbyte(c, RETURN_VALUE);
4843 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004844 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004845 break;
4846
Guido van Rossum4c417781991-01-21 16:09:22 +00004847 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004848 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004849 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004850 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4851 com_push(c, 1);
4852 com_addbyte(c, RETURN_VALUE);
4853 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004854 break;
4855
Guido van Rossum590baa41993-11-30 13:40:46 +00004856 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004857 com_node(c, CHILD(n, 0));
4858 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004859 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004860 break;
4861
Guido van Rossum590baa41993-11-30 13:40:46 +00004862 case lambdef: /* anonymous function definition */
4863 compile_lambdef(c, n);
4864 break;
4865
Guido van Rossum4c417781991-01-21 16:09:22 +00004866 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004867 compile_funcdef(c, n);
4868 break;
4869
Guido van Rossum4c417781991-01-21 16:09:22 +00004870 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004871 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004872 break;
4873
Raymond Hettinger354433a2004-05-19 08:20:33 +00004874 case testlist_gexp: /* A generator expression */
4875 case argument: /* A generator expression */
4876 compile_generator_expression(c, n);
4877 break;
4878
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004879 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004880 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004881 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004882 }
4883}
4884
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885static PyObject *
4886dict_keys_inorder(PyObject *dict, int offset)
4887{
4888 PyObject *tuple, *k, *v;
4889 int i, pos = 0, size = PyDict_Size(dict);
4890
4891 tuple = PyTuple_New(size);
4892 if (tuple == NULL)
4893 return NULL;
4894 while (PyDict_Next(dict, &pos, &k, &v)) {
4895 i = PyInt_AS_LONG(v);
4896 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004897 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 PyTuple_SET_ITEM(tuple, i - offset, k);
4899 }
4900 return tuple;
4901}
4902
Guido van Rossum79f25d91997-04-29 20:08:16 +00004903PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004904PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004905{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004906 return PyNode_CompileFlags(n, filename, NULL);
4907}
4908
4909PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004910PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004911{
4912 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004913}
4914
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004915struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004916PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004917{
4918 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004919 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004920
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004921 ff = PyNode_Future(n, filename);
4922 if (ff == NULL)
4923 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004924 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004925 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004926 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004927 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004928 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004929 return st;
4930}
4931
Guido van Rossum79f25d91997-04-29 20:08:16 +00004932static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004933icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004934{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004935 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004936}
4937
Guido van Rossum79f25d91997-04-29 20:08:16 +00004938static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004939jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004940 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004941{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004942 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004943 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004944 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004945 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004946 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4947 sc.c_encoding = "utf-8";
4948 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004949 sc.c_encoding = STR(n);
4950 n = CHILD(n, 0);
4951 } else {
4952 sc.c_encoding = NULL;
4953 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004954 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004955 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 /* c_symtable still points to parent's symbols */
4958 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004959 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004960 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004961 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004962 if (base->c_encoding != NULL) {
4963 assert(sc.c_encoding == NULL);
4964 sc.c_encoding = base->c_encoding;
4965 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004966 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004967 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004968 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004969 if (sc.c_future == NULL) {
4970 com_free(&sc);
4971 return NULL;
4972 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004973 if (flags) {
4974 int merged = sc.c_future->ff_features |
4975 flags->cf_flags;
4976 sc.c_future->ff_features = merged;
4977 flags->cf_flags = merged;
4978 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004979 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4980 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004981 com_free(&sc);
4982 return NULL;
4983 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004984 /* reset symbol table for second pass */
4985 sc.c_symtable->st_nscopes = 1;
4986 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004987 }
4988 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 if (symtable_load_symbols(&sc) < 0) {
4990 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004992 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004993 compile_node(&sc, n);
4994 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004995 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004996 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004997 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004998 names = PyList_AsTuple(sc.c_names);
4999 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005000 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5001 freevars = dict_keys_inorder(sc.c_freevars,
5002 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005003 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005004 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005005 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5006 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005007 if (!PyErr_Occurred())
5008 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 sc.c_nlocals,
5010 sc.c_maxstacklevel,
5011 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005012 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005013 consts,
5014 names,
5015 varnames,
5016 freevars,
5017 cellvars,
5018 filename,
5019 name,
5020 sc.c_firstlineno,
5021 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005022 Py_XDECREF(consts);
5023 Py_XDECREF(names);
5024 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005025 Py_XDECREF(freevars);
5026 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005027 Py_XDECREF(filename);
5028 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005029 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005030 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005031 else if (!PyErr_Occurred()) {
5032 /* This could happen if someone called PyErr_Clear() after an
5033 error was reported above. That's not supposed to happen,
5034 but I just plugged one case and I'm not sure there can't be
5035 others. In that case, raise SystemError so that at least
5036 it gets reported instead dumping core. */
5037 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5038 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005039 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005040 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005041 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005042 sc.c_symtable = NULL;
5043 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005044 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005045 return co;
5046}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005047
5048int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005049PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005050{
5051 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005052 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005053 int line = co->co_firstlineno;
5054 int addr = 0;
5055 while (--size >= 0) {
5056 addr += *p++;
5057 if (addr > addrq)
5058 break;
5059 line += *p++;
5060 }
5061 return line;
5062}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005063
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005064/* The test for LOCAL must come before the test for FREE in order to
5065 handle classes where name is both local and free. The local var is
5066 a method and the free var is a free var referenced within a method.
5067*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068
5069static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005071{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005072 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005073 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005074
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005075 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5076 return CELL;
5077 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5078 return LOCAL;
5079 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5080 return FREE;
5081 v = PyDict_GetItemString(c->c_globals, name);
5082 if (v) {
5083 if (v == Py_None)
5084 return GLOBAL_EXPLICIT;
5085 else {
5086 return GLOBAL_IMPLICIT;
5087 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005089 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005090 "unknown scope for %.100s in %.100s(%s) "
5091 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5092 name, c->c_name,
5093 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5094 c->c_filename,
5095 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5096 PyObject_REPR(c->c_locals),
5097 PyObject_REPR(c->c_globals)
5098 );
5099
5100 Py_FatalError(buf);
5101 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102}
5103
Guido van Rossum207fda62001-03-02 03:30:41 +00005104/* Helper functions to issue warnings */
5105
5106static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005107issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005108{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005109 if (PyErr_Occurred()) {
5110 /* This can happen because symtable_node continues
5111 processing even after raising a SyntaxError.
5112 Calling PyErr_WarnExplicit now would clobber the
5113 pending exception; instead we fail and let that
5114 exception propagate.
5115 */
5116 return -1;
5117 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005118 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5119 lineno, NULL, NULL) < 0) {
5120 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5121 PyErr_SetString(PyExc_SyntaxError, msg);
5122 PyErr_SyntaxLocation(filename, lineno);
5123 }
5124 return -1;
5125 }
5126 return 0;
5127}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005128
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005129static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005130symtable_warn(struct symtable *st, char *msg)
5131{
Guido van Rossum207fda62001-03-02 03:30:41 +00005132 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005133 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005134 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005135 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005136 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005137}
5138
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005139/* Helper function for setting lineno and filename */
5140
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005141static struct symtable *
5142symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005143{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005144 struct symtable *st;
5145
5146 st = symtable_init();
5147 if (st == NULL)
5148 return NULL;
5149 st->st_future = ff;
5150 st->st_filename = filename;
5151 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5152 if (st->st_errors > 0)
5153 goto fail;
5154 symtable_node(st, n);
5155 if (st->st_errors > 0)
5156 goto fail;
5157 return st;
5158 fail:
5159 if (!PyErr_Occurred()) {
5160 /* This could happen because after a syntax error is
5161 detected, the symbol-table-building continues for
5162 a while, and PyErr_Clear() might erroneously be
5163 called during that process. One such case has been
5164 fixed, but there might be more (now or later).
5165 */
5166 PyErr_SetString(PyExc_SystemError, "lost exception");
5167 }
5168 st->st_future = NULL;
5169 st->st_filename = NULL;
5170 PySymtable_Free(st);
5171 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005172}
5173
5174static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005175symtable_init_compiling_symbols(struct compiling *c)
5176{
5177 PyObject *varnames;
5178
5179 varnames = c->c_symtable->st_cur->ste_varnames;
5180 if (varnames == NULL) {
5181 varnames = PyList_New(0);
5182 if (varnames == NULL)
5183 return -1;
5184 c->c_symtable->st_cur->ste_varnames = varnames;
5185 Py_INCREF(varnames);
5186 } else
5187 Py_INCREF(varnames);
5188 c->c_varnames = varnames;
5189
5190 c->c_globals = PyDict_New();
5191 if (c->c_globals == NULL)
5192 return -1;
5193 c->c_freevars = PyDict_New();
5194 if (c->c_freevars == NULL)
5195 return -1;
5196 c->c_cellvars = PyDict_New();
5197 if (c->c_cellvars == NULL)
5198 return -1;
5199 return 0;
5200}
5201
5202struct symbol_info {
5203 int si_nlocals;
5204 int si_ncells;
5205 int si_nfrees;
5206 int si_nimplicit;
5207};
5208
5209static void
5210symtable_init_info(struct symbol_info *si)
5211{
5212 si->si_nlocals = 0;
5213 si->si_ncells = 0;
5214 si->si_nfrees = 0;
5215 si->si_nimplicit = 0;
5216}
5217
5218static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005219symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005220 struct symbol_info *si)
5221{
5222 PyObject *dict, *v;
5223
5224 /* Seperate logic for DEF_FREE. If it occurs in a function,
5225 it indicates a local that we must allocate storage for (a
5226 cell var). If it occurs in a class, then the class has a
5227 method and a free variable with the same name.
5228 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005229 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005230 /* If it isn't declared locally, it can't be a cell. */
5231 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5232 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005233 v = PyInt_FromLong(si->si_ncells++);
5234 dict = c->c_cellvars;
5235 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005236 /* If it is free anyway, then there is no need to do
5237 anything here.
5238 */
5239 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005240 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005241 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005242 v = PyInt_FromLong(si->si_nfrees++);
5243 dict = c->c_freevars;
5244 }
5245 if (v == NULL)
5246 return -1;
5247 if (PyDict_SetItem(dict, name, v) < 0) {
5248 Py_DECREF(v);
5249 return -1;
5250 }
5251 Py_DECREF(v);
5252 return 0;
5253}
5254
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005255/* If a variable is a cell and an argument, make sure that appears in
5256 co_cellvars before any variable to its right in varnames.
5257*/
5258
5259
5260static int
5261symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5262 PyObject *varnames, int flags)
5263{
Tim Petersb39903b2003-03-24 17:22:24 +00005264 PyObject *v = NULL;
5265 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005266 int i, pos;
5267
5268 if (flags & CO_VARARGS)
5269 argcount++;
5270 if (flags & CO_VARKEYWORDS)
5271 argcount++;
5272 for (i = argcount; --i >= 0; ) {
5273 v = PyList_GET_ITEM(varnames, i);
5274 if (PyDict_GetItem(*cellvars, v)) {
5275 if (list == NULL) {
5276 list = PyList_New(1);
5277 if (list == NULL)
5278 return -1;
5279 PyList_SET_ITEM(list, 0, v);
5280 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005281 } else {
5282 if (PyList_Insert(list, 0, v) < 0) {
5283 Py_DECREF(list);
5284 return -1;
5285 }
5286 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005287 }
5288 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005289 if (list == NULL)
5290 return 0;
5291
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005292 /* There are cellvars that are also arguments. Create a dict
5293 to replace cellvars and put the args at the front.
5294 */
5295 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005296 if (d == NULL)
5297 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005298 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5299 v = PyInt_FromLong(i);
5300 if (v == NULL)
5301 goto fail;
5302 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5303 goto fail;
5304 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5305 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005306 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005307 }
5308 pos = 0;
5309 i = PyList_GET_SIZE(list);
5310 Py_DECREF(list);
5311 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5312 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005313 if (w == NULL)
5314 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005315 if (PyDict_SetItem(d, v, w) < 0) {
5316 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005317 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005318 goto fail;
5319 }
5320 Py_DECREF(w);
5321 }
5322 Py_DECREF(*cellvars);
5323 *cellvars = d;
5324 return 1;
5325 fail:
5326 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005327 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005328 return -1;
5329}
5330
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005331static int
5332symtable_freevar_offsets(PyObject *freevars, int offset)
5333{
5334 PyObject *name, *v;
5335 int pos;
5336
5337 /* The cell vars are the first elements of the closure,
5338 followed by the free vars. Update the offsets in
5339 c_freevars to account for number of cellvars. */
5340 pos = 0;
5341 while (PyDict_Next(freevars, &pos, &name, &v)) {
5342 int i = PyInt_AS_LONG(v) + offset;
5343 PyObject *o = PyInt_FromLong(i);
5344 if (o == NULL)
5345 return -1;
5346 if (PyDict_SetItem(freevars, name, o) < 0) {
5347 Py_DECREF(o);
5348 return -1;
5349 }
5350 Py_DECREF(o);
5351 }
5352 return 0;
5353}
5354
5355static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005356symtable_check_unoptimized(struct compiling *c,
5357 PySymtableEntryObject *ste,
5358 struct symbol_info *si)
5359{
5360 char buf[300];
5361
5362 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5363 || (ste->ste_nested && si->si_nimplicit)))
5364 return 0;
5365
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005366#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5367
5368#define ILLEGAL_IS "is a nested function"
5369
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005370#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005371"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005372
5373#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005374"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005375
5376#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005377"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005378"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005379
5380 /* XXX perhaps the linenos for these opt-breaking statements
5381 should be stored so the exception can point to them. */
5382
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005383 if (ste->ste_child_free) {
5384 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005385 PyOS_snprintf(buf, sizeof(buf),
5386 ILLEGAL_IMPORT_STAR,
5387 PyString_AS_STRING(ste->ste_name),
5388 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005389 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005390 PyOS_snprintf(buf, sizeof(buf),
5391 ILLEGAL_BARE_EXEC,
5392 PyString_AS_STRING(ste->ste_name),
5393 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005394 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005395 PyOS_snprintf(buf, sizeof(buf),
5396 ILLEGAL_EXEC_AND_IMPORT_STAR,
5397 PyString_AS_STRING(ste->ste_name),
5398 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005399 }
5400 } else {
5401 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005402 PyOS_snprintf(buf, sizeof(buf),
5403 ILLEGAL_IMPORT_STAR,
5404 PyString_AS_STRING(ste->ste_name),
5405 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005406 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005407 PyOS_snprintf(buf, sizeof(buf),
5408 ILLEGAL_BARE_EXEC,
5409 PyString_AS_STRING(ste->ste_name),
5410 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005411 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005412 PyOS_snprintf(buf, sizeof(buf),
5413 ILLEGAL_EXEC_AND_IMPORT_STAR,
5414 PyString_AS_STRING(ste->ste_name),
5415 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005416 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005417 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005418
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005419 PyErr_SetString(PyExc_SyntaxError, buf);
5420 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5421 ste->ste_opt_lineno);
5422 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005423}
5424
5425static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005426symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5427 struct symbol_info *si)
5428{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005429 if (c->c_future)
5430 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005431 if (ste->ste_generator)
5432 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005433 if (ste->ste_type != TYPE_MODULE)
5434 c->c_flags |= CO_NEWLOCALS;
5435 if (ste->ste_type == TYPE_FUNCTION) {
5436 c->c_nlocals = si->si_nlocals;
5437 if (ste->ste_optimized == 0)
5438 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005439 else if (ste->ste_optimized != OPT_EXEC)
5440 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005441 }
5442 return 0;
5443}
5444
5445static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005446symtable_error(struct symtable *st, int lineno)
5447{
5448 if (lineno == 0)
5449 lineno = st->st_cur->ste_lineno;
5450 PyErr_SyntaxLocation(st->st_filename, lineno);
5451 st->st_errors++;
5452 return -1;
5453}
5454
5455static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005456symtable_load_symbols(struct compiling *c)
5457{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005458 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005459 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005460 PyObject *name, *varnames, *v;
5461 int i, flags, pos;
5462 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464 v = NULL;
5465
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005466 if (symtable_init_compiling_symbols(c) < 0)
5467 goto fail;
5468 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005469 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005470 si.si_nlocals = PyList_GET_SIZE(varnames);
5471 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005473 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005475 if (v == NULL)
5476 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005477 if (PyDict_SetItem(c->c_locals,
5478 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005479 goto fail;
5480 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481 }
5482
5483 /* XXX The cases below define the rules for whether a name is
5484 local or global. The logic could probably be clearer. */
5485 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005486 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5487 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005488
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005489 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005490 /* undo the original DEF_FREE */
5491 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005493 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005494 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005495 2. Free variables in methods that are also class
5496 variables or declared global.
5497 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005498 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005499 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005500
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005501 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005502 c->c_argcount--;
5503 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505 c->c_argcount--;
5506 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005507 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005509 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005510 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005511 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005512 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005513 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005514 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005515 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5517 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005518 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005519 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005520 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005521 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005522 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005523 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005524 if (v == NULL)
5525 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005526 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005527 goto fail;
5528 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005529 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005530 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005531 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005532 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005533 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005534 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005535 if (v == NULL)
5536 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005537 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005538 goto fail;
5539 Py_DECREF(v);
5540 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005541 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005542 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005543 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005544 goto fail;
5545 if (st->st_nscopes != 1) {
5546 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005547 if (v == NULL)
5548 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005549 if (PyDict_SetItem(st->st_global,
5550 name, v))
5551 goto fail;
5552 Py_DECREF(v);
5553 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005554 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555 }
5556 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005557 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5558
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005559 if (si.si_ncells > 1) { /* one cell is always in order */
5560 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5561 c->c_varnames, c->c_flags) < 0)
5562 return -1;
5563 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005564 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5565 return -1;
5566 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567 fail:
5568 /* is this always the right thing to do? */
5569 Py_XDECREF(v);
5570 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571}
5572
5573static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005574symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575{
5576 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005577
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005578 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 if (st == NULL)
5580 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005581 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005582
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005583 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005584 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586 goto fail;
5587 if ((st->st_symbols = PyDict_New()) == NULL)
5588 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005590 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005591 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005592 st->st_private = NULL;
5593 return st;
5594 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005595 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 return NULL;
5597}
5598
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005599void
5600PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601{
5602 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005604 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005605 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005606}
5607
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608/* When the compiler exits a scope, it must should update the scope's
5609 free variable information with the list of free variables in its
5610 children.
5611
5612 Variables that are free in children and defined in the current
5613 scope are cellvars.
5614
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005615 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616 false), free variables in children that are not defined here are
5617 implicit globals.
5618
5619*/
5620
5621static int
5622symtable_update_free_vars(struct symtable *st)
5623{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005624 int i, j, def;
5625 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005626 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005628 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005629 def = DEF_FREE_CLASS;
5630 else
5631 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005632 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005633 int pos = 0;
5634
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005635 if (list && PyList_SetSlice(list, 0,
5636 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005637 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005638 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005639 PyList_GET_ITEM(ste->ste_children, i);
5640 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005641 int flags = PyInt_AS_LONG(o);
5642 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005643 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005644 if (list == NULL) {
5645 list = PyList_New(0);
5646 if (list == NULL)
5647 return -1;
5648 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005649 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005650 if (PyList_Append(list, name) < 0) {
5651 Py_DECREF(list);
5652 return -1;
5653 }
5654 }
5655 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005656 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005657 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005658 v = PyDict_GetItem(ste->ste_symbols, name);
5659 /* If a name N is declared global in scope A and
5660 referenced in scope B contained (perhaps
5661 indirectly) in A and there are no scopes
5662 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005663 is global in B. Unless A is a class scope,
5664 because class scopes are not considered for
5665 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005666 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005667 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005668 int flags = PyInt_AS_LONG(v);
5669 if (flags & DEF_GLOBAL) {
5670 symtable_undo_free(st, child->ste_id,
5671 name);
5672 continue;
5673 }
5674 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005675 if (ste->ste_nested) {
5676 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005677 name, def) < 0) {
5678 Py_DECREF(list);
5679 return -1;
5680 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005681 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005682 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005683 name) < 0) {
5684 Py_DECREF(list);
5685 return -1;
5686 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005687 }
5688 }
5689 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005690
5691 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 return 0;
5693}
5694
5695/* If the current scope is a non-nested class or if name is not
5696 defined in the current, non-nested scope, then it is an implicit
5697 global in all nested scopes.
5698*/
5699
5700static int
5701symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5702{
5703 PyObject *o;
5704 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005705 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005706
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005707 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005708 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005709 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005710 if (o == NULL)
5711 return symtable_undo_free(st, child, name);
5712 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005713
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005714 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005715 return symtable_undo_free(st, child, name);
5716 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005717 return symtable_add_def_o(st, ste->ste_symbols,
5718 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005719}
5720
5721static int
5722symtable_undo_free(struct symtable *st, PyObject *id,
5723 PyObject *name)
5724{
5725 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005726 PyObject *info;
5727 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005729 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5730 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005732
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005733 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 if (info == NULL)
5735 return 0;
5736 v = PyInt_AS_LONG(info);
5737 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005738 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739 DEF_FREE_GLOBAL) < 0)
5740 return -1;
5741 } else
5742 /* If the name is defined here or declared global,
5743 then the recursion stops. */
5744 return 0;
5745
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005746 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5747 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005748 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005749 PyList_GET_ITEM(ste->ste_children, i);
5750 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005751 if (x < 0)
5752 return x;
5753 }
5754 return 0;
5755}
5756
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005757/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5758 This reference is released when the scope is exited, via the DECREF
5759 in symtable_exit_scope().
5760*/
5761
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005762static int
5763symtable_exit_scope(struct symtable *st)
5764{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 int end;
5766
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005767 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005768 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005769 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005771 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5772 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 if (PySequence_DelItem(st->st_stack, end) < 0)
5774 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005775 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005776}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005777
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005778static void
5779symtable_enter_scope(struct symtable *st, char *name, int type,
5780 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005782 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005783
5784 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005785 prev = st->st_cur;
5786 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005787 st->st_errors++;
5788 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005789 }
5790 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005791 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005792 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005793 if (st->st_cur == NULL) {
5794 st->st_errors++;
5795 return;
5796 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005797 if (strcmp(name, TOP) == 0)
5798 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005799 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005800 if (PyList_Append(prev->ste_children,
5801 (PyObject *)st->st_cur) < 0)
5802 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005803 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005804}
5805
5806static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005807symtable_lookup(struct symtable *st, char *name)
5808{
5809 char buffer[MANGLE_LEN];
5810 PyObject *v;
5811 int flags;
5812
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005813 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005814 name = buffer;
5815 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5816 if (v == NULL) {
5817 if (PyErr_Occurred())
5818 return -1;
5819 else
5820 return 0;
5821 }
5822
5823 flags = PyInt_AS_LONG(v);
5824 return flags;
5825}
5826
5827static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005828symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005829{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005830 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005831 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005832 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005833
Guido van Rossumb7164622002-08-16 02:48:11 +00005834 /* Warn about None, except inside a tuple (where the assignment
5835 code already issues a warning). */
5836 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5837 *name == 'N' && strcmp(name, "None") == 0)
5838 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005839 PyErr_SetString(PyExc_SyntaxError,
5840 "Invalid syntax. Assignment to None.");
5841 symtable_error(st, 0);
5842 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005843 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005844 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005845 name = buffer;
5846 if ((s = PyString_InternFromString(name)) == NULL)
5847 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005848 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5849 Py_DECREF(s);
5850 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005851}
5852
5853/* Must only be called with mangled names */
5854
5855static int
5856symtable_add_def_o(struct symtable *st, PyObject *dict,
5857 PyObject *name, int flag)
5858{
5859 PyObject *o;
5860 int val;
5861
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005862 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005863 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005864 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005865 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005866 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005867 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005868 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005869 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005870 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005871 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005873 if (o == NULL)
5874 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005875 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005876 Py_DECREF(o);
5877 return -1;
5878 }
5879 Py_DECREF(o);
5880
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005881 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005882 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005883 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005884 } else if (flag & DEF_GLOBAL) {
5885 /* XXX need to update DEF_GLOBAL for other flags too;
5886 perhaps only DEF_FREE_GLOBAL */
5887 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005888 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005889 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005890 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005891 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005892 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005893 if (o == NULL)
5894 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005895 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005896 Py_DECREF(o);
5897 return -1;
5898 }
5899 Py_DECREF(o);
5900 }
5901 return 0;
5902}
5903
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005905
Tim Peters08a898f2001-06-28 01:52:22 +00005906/* Look for a yield stmt under n. Return 1 if found, else 0.
5907 This hack is used to look inside "if 0:" blocks (which are normally
5908 ignored) in case those are the only places a yield occurs (so that this
5909 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005910static int
5911look_for_yield(node *n)
5912{
5913 int i;
5914
5915 for (i = 0; i < NCH(n); ++i) {
5916 node *kid = CHILD(n, i);
5917
5918 switch (TYPE(kid)) {
5919
5920 case classdef:
5921 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005922 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005923 /* Stuff in nested functions and classes can't make
5924 the parent a generator. */
5925 return 0;
5926
5927 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005928 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005929
5930 default:
5931 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005932 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005933 }
5934 }
5935 return 0;
5936}
5937
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005938static void
5939symtable_node(struct symtable *st, node *n)
5940{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005941 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005942
5943 loop:
5944 switch (TYPE(n)) {
5945 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005946 char *func_name;
5947 if (NCH(n) == 6)
5948 symtable_node(st, CHILD(n, 0));
5949 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005950 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005951 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005952 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005953 symtable_funcdef(st, n);
5954 symtable_exit_scope(st);
5955 break;
5956 }
5957 case lambdef:
5958 if (NCH(n) == 4)
5959 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005960 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005961 symtable_funcdef(st, n);
5962 symtable_exit_scope(st);
5963 break;
5964 case classdef: {
5965 char *tmp, *class_name = STR(CHILD(n, 1));
5966 symtable_add_def(st, class_name, DEF_LOCAL);
5967 if (TYPE(CHILD(n, 2)) == LPAR) {
5968 node *bases = CHILD(n, 3);
5969 int i;
5970 for (i = 0; i < NCH(bases); i += 2) {
5971 symtable_node(st, CHILD(bases, i));
5972 }
5973 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005974 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005975 tmp = st->st_private;
5976 st->st_private = class_name;
5977 symtable_node(st, CHILD(n, NCH(n) - 1));
5978 st->st_private = tmp;
5979 symtable_exit_scope(st);
5980 break;
5981 }
5982 case if_stmt:
5983 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005984 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5985 if (st->st_cur->ste_generator == 0)
5986 st->st_cur->ste_generator =
5987 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005988 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005989 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005990 symtable_node(st, CHILD(n, i + 1));
5991 symtable_node(st, CHILD(n, i + 3));
5992 }
5993 if (i + 2 < NCH(n))
5994 symtable_node(st, CHILD(n, i + 2));
5995 break;
5996 case global_stmt:
5997 symtable_global(st, n);
5998 break;
5999 case import_stmt:
6000 symtable_import(st, n);
6001 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006002 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006003 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006004 symtable_node(st, CHILD(n, 1));
6005 if (NCH(n) > 2)
6006 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006007 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006008 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006009 st->st_cur->ste_opt_lineno = n->n_lineno;
6010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 if (NCH(n) > 4)
6012 symtable_node(st, CHILD(n, 5));
6013 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006014
6015 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006016 case assert_stmt:
6017 if (Py_OptimizeFlag)
6018 return;
6019 if (NCH(n) == 2) {
6020 n = CHILD(n, 1);
6021 goto loop;
6022 } else {
6023 symtable_node(st, CHILD(n, 1));
6024 n = CHILD(n, 3);
6025 goto loop;
6026 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006027 case except_clause:
6028 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006029 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030 if (NCH(n) > 1) {
6031 n = CHILD(n, 1);
6032 goto loop;
6033 }
6034 break;
6035 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006036 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006038 case yield_stmt:
6039 st->st_cur->ste_generator = 1;
6040 n = CHILD(n, 1);
6041 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006042 case expr_stmt:
6043 if (NCH(n) == 1)
6044 n = CHILD(n, 0);
6045 else {
6046 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006047 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006048 symtable_node(st, CHILD(n, 2));
6049 break;
6050 } else {
6051 int i;
6052 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006053 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 n = CHILD(n, NCH(n) - 1);
6055 }
6056 }
6057 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006058 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006059 /* only occurs when there are multiple for loops
6060 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006061 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006062 if (TYPE(n) == list_for)
6063 symtable_list_for(st, n);
6064 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006065 REQ(n, list_if);
6066 symtable_node(st, CHILD(n, 1));
6067 if (NCH(n) == 3) {
6068 n = CHILD(n, 2);
6069 goto loop;
6070 }
6071 }
6072 break;
6073 case for_stmt:
6074 symtable_assign(st, CHILD(n, 1), 0);
6075 for (i = 3; i < NCH(n); ++i)
6076 if (TYPE(CHILD(n, i)) >= single_input)
6077 symtable_node(st, CHILD(n, i));
6078 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006079 case arglist:
6080 if (NCH(n) > 1)
6081 for (i = 0; i < NCH(n); ++i) {
6082 node *ch = CHILD(n, i);
6083 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6084 TYPE(CHILD(ch, 1)) == gen_for) {
6085 PyErr_SetString(PyExc_SyntaxError,
6086 "invalid syntax");
6087 symtable_error(st, n->n_lineno);
6088 return;
6089 }
6090 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006091 /* The remaining cases fall through to default except in
6092 special circumstances. This requires the individual cases
6093 to be coded with great care, even though they look like
6094 rather innocuous. Each case must double-check TYPE(n).
6095 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006096 case decorator:
6097 if (TYPE(n) == decorator) {
6098 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6099 node *name, *varname;
6100 name = CHILD(n, 1);
6101 REQ(name, dotted_name);
6102 varname = CHILD(name, 0);
6103 REQ(varname, NAME);
6104 symtable_add_use(st, STR(varname));
6105 }
6106 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006107 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006108 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006109 n = CHILD(n, 2);
6110 goto loop;
6111 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006112 else if (TYPE(n) == argument && NCH(n) == 2 &&
6113 TYPE(CHILD(n, 1)) == gen_for) {
6114 symtable_generator_expression(st, n);
6115 break;
6116 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006117 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006118 case listmaker:
6119 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006120 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006121 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006122 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006123 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006124 case testlist_gexp:
6125 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6126 symtable_generator_expression(st, n);
6127 break;
6128 }
6129 /* fall through */
6130
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006131 case atom:
6132 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6133 symtable_add_use(st, STR(CHILD(n, 0)));
6134 break;
6135 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006136 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006137 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006138 /* Walk over every non-token child with a special case
6139 for one child.
6140 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006141 if (NCH(n) == 1) {
6142 n = CHILD(n, 0);
6143 goto loop;
6144 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006145 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006146 if (TYPE(CHILD(n, i)) >= single_input)
6147 symtable_node(st, CHILD(n, i));
6148 }
6149}
6150
6151static void
6152symtable_funcdef(struct symtable *st, node *n)
6153{
6154 node *body;
6155
6156 if (TYPE(n) == lambdef) {
6157 if (NCH(n) == 4)
6158 symtable_params(st, CHILD(n, 1));
6159 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006160 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161 body = CHILD(n, NCH(n) - 1);
6162 symtable_node(st, body);
6163}
6164
6165/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006166 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006167 which are references in the defining scope. symtable_params()
6168 parses the parameter names, which are defined in the function's
6169 body.
6170
6171 varargslist:
6172 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6173 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6174*/
6175
6176static void
6177symtable_default_args(struct symtable *st, node *n)
6178{
6179 node *c;
6180 int i;
6181
6182 if (TYPE(n) == parameters) {
6183 n = CHILD(n, 1);
6184 if (TYPE(n) == RPAR)
6185 return;
6186 }
6187 REQ(n, varargslist);
6188 for (i = 0; i < NCH(n); i += 2) {
6189 c = CHILD(n, i);
6190 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6191 break;
6192 }
6193 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6194 symtable_node(st, CHILD(n, i));
6195 }
6196}
6197
6198static void
6199symtable_params(struct symtable *st, node *n)
6200{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006201 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006202 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006203
6204 if (TYPE(n) == parameters) {
6205 n = CHILD(n, 1);
6206 if (TYPE(n) == RPAR)
6207 return;
6208 }
6209 REQ(n, varargslist);
6210 for (i = 0; i < NCH(n); i += 2) {
6211 c = CHILD(n, i);
6212 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6213 ext = 1;
6214 break;
6215 }
6216 if (TYPE(c) == test) {
6217 continue;
6218 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006219 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006220 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006221 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006222 char nbuf[30];
6223 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006224 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006225 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006226 }
6227 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006228 if (ext) {
6229 c = CHILD(n, i);
6230 if (TYPE(c) == STAR) {
6231 i++;
6232 symtable_add_def(st, STR(CHILD(n, i)),
6233 DEF_PARAM | DEF_STAR);
6234 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006235 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006236 c = NULL;
6237 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006238 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006239 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006240 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006241 i++;
6242 symtable_add_def(st, STR(CHILD(n, i)),
6243 DEF_PARAM | DEF_DOUBLESTAR);
6244 }
6245 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006246 if (complex >= 0) {
6247 int j;
6248 for (j = 0; j <= complex; j++) {
6249 c = CHILD(n, j);
6250 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006251 c = CHILD(n, ++j);
6252 else if (TYPE(c) == EQUAL)
6253 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006254 if (TYPE(CHILD(c, 0)) == LPAR)
6255 symtable_params_fplist(st, CHILD(c, 1));
6256 }
6257 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006258}
6259
6260static void
6261symtable_params_fplist(struct symtable *st, node *n)
6262{
6263 int i;
6264 node *c;
6265
6266 REQ(n, fplist);
6267 for (i = 0; i < NCH(n); i += 2) {
6268 c = CHILD(n, i);
6269 REQ(c, fpdef);
6270 if (NCH(c) == 1)
6271 symtable_add_def(st, STR(CHILD(c, 0)),
6272 DEF_PARAM | DEF_INTUPLE);
6273 else
6274 symtable_params_fplist(st, CHILD(c, 1));
6275 }
6276
6277}
6278
6279static void
6280symtable_global(struct symtable *st, node *n)
6281{
6282 int i;
6283
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006284 /* XXX It might be helpful to warn about module-level global
6285 statements, but it's hard to tell the difference between
6286 module-level and a string passed to exec.
6287 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006288
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006289 for (i = 1; i < NCH(n); i += 2) {
6290 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006291 int flags;
6292
6293 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006294 if (flags < 0)
6295 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006296 if (flags && flags != DEF_GLOBAL) {
6297 char buf[500];
6298 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006299 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006300 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006301 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006302 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006303 }
6304 else {
6305 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006306 PyOS_snprintf(buf, sizeof(buf),
6307 GLOBAL_AFTER_ASSIGN,
6308 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006309 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006310 PyOS_snprintf(buf, sizeof(buf),
6311 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006312 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006313 }
6314 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006315 symtable_add_def(st, name, DEF_GLOBAL);
6316 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006317}
6318
6319static void
6320symtable_list_comprehension(struct symtable *st, node *n)
6321{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006322 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006323 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006324
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006325 REQ(n, listmaker);
6326 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6327 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006328 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006329 symtable_list_for(st, CHILD(n, 1));
6330 symtable_node(st, CHILD(n, 0));
6331 --st->st_cur->ste_tmpname;
6332}
6333
6334static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006335symtable_generator_expression(struct symtable *st, node *n)
6336{
6337 /* testlist_gexp: test gen_for */
6338 REQ(CHILD(n, 0), test);
6339 REQ(CHILD(n, 1), gen_for);
6340
6341 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6342 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6343
6344 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6345
6346 symtable_gen_for(st, CHILD(n, 1), 1);
6347 symtable_node(st, CHILD(n, 0));
6348 symtable_exit_scope(st);
6349
6350 /* for outmost iterable precomputation */
6351 symtable_node(st, CHILD(CHILD(n, 1), 3));
6352}
6353
6354static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006355symtable_list_for(struct symtable *st, node *n)
6356{
6357 REQ(n, list_for);
6358 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006359 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006360 symtable_node(st, CHILD(n, 3));
6361 if (NCH(n) == 5)
6362 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006363}
6364
6365static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006366symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6367{
6368 REQ(n, gen_for);
6369
6370 /* gen_for: for v in test [gen_iter] */
6371 symtable_assign(st, CHILD(n, 1), 0);
6372 if (is_outmost)
6373 symtable_add_use(st, "[outmost-iterable]");
6374 else
6375 symtable_node(st, CHILD(n, 3));
6376
6377 if (NCH(n) == 5)
6378 symtable_gen_iter(st, CHILD(n, 4));
6379}
6380
6381static void
6382symtable_gen_iter(struct symtable *st, node *n)
6383{
6384 REQ(n, gen_iter);
6385
6386 n = CHILD(n, 0);
6387 if (TYPE(n) == gen_for)
6388 symtable_gen_for(st, n, 0);
6389 else {
6390 REQ(n, gen_if);
6391 symtable_node(st, CHILD(n, 1));
6392
6393 if (NCH(n) == 3)
6394 symtable_gen_iter(st, CHILD(n, 2));
6395 }
6396}
6397
6398static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006399symtable_import(struct symtable *st, node *n)
6400{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006401 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006402 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006403 /* import_stmt: import_name | import_from */
6404 n = CHILD(n, 0);
6405 if (TYPE(n) == import_from) {
6406 /* import_from: 'from' dotted_name 'import' ('*' |
6407 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006408 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006409 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006410 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6411 /* check for bogus imports */
6412 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6413 PyErr_SetString(PyExc_SyntaxError,
6414 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006415 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006416 return;
6417 }
6418 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006419 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6420 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006421 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006422 if (symtable_warn(st,
6423 "import * only allowed at module level") < 0)
6424 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006425 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006426 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006427 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006428 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006429 REQ(nn, import_as_names);
6430 for (i = 0; i < NCH(nn); i += 2) {
6431 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006432 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006433 symtable_assign(st, CHILD(c, 2),
6434 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006435 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006436 symtable_assign(st, CHILD(c, 0),
6437 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006438 }
6439 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006440 } else {
6441 /* 'import' dotted_as_names */
6442 nn = CHILD(n, 1);
6443 REQ(nn, dotted_as_names);
6444 for (i = 0; i < NCH(nn); i += 2)
6445 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006446 }
6447}
6448
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006449/* The third argument to symatble_assign() is a flag to be passed to
6450 symtable_add_def() if it is eventually called. The flag is useful
6451 to specify the particular type of assignment that should be
6452 recorded, e.g. an assignment caused by import.
6453 */
6454
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006455static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006456symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006457{
6458 node *tmp;
6459 int i;
6460
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006461 loop:
6462 switch (TYPE(n)) {
6463 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006464 /* invalid assignment, e.g. lambda x:x=2. The next
6465 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006466 return;
6467 case power:
6468 if (NCH(n) > 2) {
6469 for (i = 2; i < NCH(n); ++i)
6470 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6471 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006472 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006473 if (NCH(n) > 1) {
6474 symtable_node(st, CHILD(n, 0));
6475 symtable_node(st, CHILD(n, 1));
6476 } else {
6477 n = CHILD(n, 0);
6478 goto loop;
6479 }
6480 return;
6481 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006482 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6483 /* XXX This is an error, but the next pass
6484 will catch it. */
6485 return;
6486 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006487 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006488 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006489 }
6490 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006491 case testlist_gexp:
6492 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6493 /* XXX This is an error, but the next pass
6494 will catch it. */
6495 return;
6496 } else {
6497 for (i = 0; i < NCH(n); i += 2)
6498 symtable_assign(st, CHILD(n, i), def_flag);
6499 }
6500 return;
6501
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006502 case exprlist:
6503 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006504 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006505 if (NCH(n) == 1) {
6506 n = CHILD(n, 0);
6507 goto loop;
6508 }
6509 else {
6510 int i;
6511 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006512 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006513 return;
6514 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006515 case atom:
6516 tmp = CHILD(n, 0);
6517 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6518 n = CHILD(n, 1);
6519 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006520 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006521 if (strcmp(STR(tmp), "__debug__") == 0) {
6522 PyErr_SetString(PyExc_SyntaxError,
6523 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006524 symtable_error(st, n->n_lineno);
6525 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006526 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006527 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006528 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006529 return;
6530 case dotted_as_name:
6531 if (NCH(n) == 3)
6532 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006533 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006534 else
6535 symtable_add_def(st,
6536 STR(CHILD(CHILD(n,
6537 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006538 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006539 return;
6540 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006541 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006542 return;
6543 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006544 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006545 return;
6546 default:
6547 if (NCH(n) == 0)
6548 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006549 if (NCH(n) == 1) {
6550 n = CHILD(n, 0);
6551 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006552 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006553 /* Should only occur for errors like x + 1 = 1,
6554 which will be caught in the next pass. */
6555 for (i = 0; i < NCH(n); ++i)
6556 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006557 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006558 }
6559}