blob: be81ba0b1abb93484e2b13b983a8e485c912cb8f [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 Hettinger099ecfb2004-11-01 15:19:11 +0000539 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000540 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000541
542 lastlc = cumlc;
543 cumlc = 0;
544
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000545 switch (opcode) {
546
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000547 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000548 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000549 case UNARY_NOT:
550 if (codestr[i+1] != JUMP_IF_FALSE ||
551 codestr[i+4] != POP_TOP ||
552 !ISBASICBLOCK(blocks,i,5))
553 continue;
554 tgt = GETJUMPTGT(codestr, (i+1));
555 if (codestr[tgt] != POP_TOP)
556 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000557 j = GETARG(codestr, i+1) + 1;
558 codestr[i] = JUMP_IF_TRUE;
559 SETARG(codestr, i, j);
560 codestr[i+3] = POP_TOP;
561 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000562 break;
563
564 /* not a is b --> a is not b
565 not a in b --> a not in b
566 not a is not b --> a is b
567 not a not in b --> a in b */
568 case COMPARE_OP:
569 j = GETARG(codestr, i);
570 if (j < 6 || j > 9 ||
571 codestr[i+3] != UNARY_NOT ||
572 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000573 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000574 SETARG(codestr, i, (j^1));
575 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000576 break;
577
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000578 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
579 case LOAD_NAME:
580 case LOAD_GLOBAL:
581 j = GETARG(codestr, i);
582 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
583 if (name == NULL || strcmp(name, "None") != 0)
584 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000585 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
586 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000587 codestr[i] = LOAD_CONST;
588 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000589 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000590 break;
591 }
592 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000593 break;
594
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000595 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000596 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000597 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598 j = GETARG(codestr, i);
599 if (codestr[i+3] != JUMP_IF_FALSE ||
600 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000601 !ISBASICBLOCK(blocks,i,7) ||
602 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000603 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000604 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000605 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000606 break;
607
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000608 /* Try to fold tuples of constants.
609 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000610 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
611 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000612 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000613 j = GETARG(codestr, i);
614 h = i - 3 * j;
615 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000616 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000617 codestr[h] == LOAD_CONST &&
618 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
619 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000620 assert(codestr[i] == LOAD_CONST);
621 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000622 break;
623 }
624 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000626 j = GETARG(codestr, i);
627 if (codestr[i+3] != UNPACK_SEQUENCE ||
628 !ISBASICBLOCK(blocks,i,6) ||
629 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000630 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000631 if (j == 1) {
632 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000633 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000634 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000635 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000636 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000637 codestr[i] = ROT_THREE;
638 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000639 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000640 }
641 break;
642
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000643 /* Simplify conditional jump to conditional jump where the
644 result of the first test implies the success of a similar
645 test or the failure of the opposite test.
646 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000647 "if a and b:"
648 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000649 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000650 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000651 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000652 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
653 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000654 */
655 case JUMP_IF_FALSE:
656 case JUMP_IF_TRUE:
657 tgt = GETJUMPTGT(codestr, i);
658 j = codestr[tgt];
659 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
660 if (j == opcode) {
661 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
662 SETARG(codestr, i, tgttgt);
663 } else {
664 tgt -= i;
665 SETARG(codestr, i, tgt);
666 }
667 break;
668 }
669 /* Intentional fallthrough */
670
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000671 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000672 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000673 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000674 case JUMP_ABSOLUTE:
675 case CONTINUE_LOOP:
676 case SETUP_LOOP:
677 case SETUP_EXCEPT:
678 case SETUP_FINALLY:
679 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000680 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000681 continue;
682 tgttgt = GETJUMPTGT(codestr, tgt);
683 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
684 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000685 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000686 tgttgt -= i + 3; /* Calc relative jump addr */
687 if (tgttgt < 0) /* No backward relative jumps */
688 continue;
689 codestr[i] = opcode;
690 SETARG(codestr, i, tgttgt);
691 break;
692
693 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000694 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000695
696 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
697 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000698 if (i+4 >= codelen ||
699 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000700 !ISBASICBLOCK(blocks,i,5))
701 continue;
702 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000703 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000704 }
705 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000706
707 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000708 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
709 addrmap[i] = i - nops;
710 if (codestr[i] == NOP)
711 nops++;
712 }
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 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000752 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000753
754 code = PyString_FromStringAndSize((char *)codestr, h);
755 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000756 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000757 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000758 return code;
759
760exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000761 if (blocks != NULL)
762 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000763 if (addrmap != NULL)
764 PyMem_Free(addrmap);
765 if (codestr != NULL)
766 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000767 Py_INCREF(code);
768 return code;
769}
770
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000771/* End: Peephole optimizations ----------------------------------------- */
772
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000774PyCode_New(int argcount, int nlocals, int stacksize, int flags,
775 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000776 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
777 PyObject *filename, PyObject *name, int firstlineno,
778 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000779{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000781 int i;
782 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000783 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000784 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 consts == NULL || !PyTuple_Check(consts) ||
786 names == NULL || !PyTuple_Check(names) ||
787 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000788 freevars == NULL || !PyTuple_Check(freevars) ||
789 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 name == NULL || !PyString_Check(name) ||
791 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000792 lnotab == NULL || !PyString_Check(lnotab) ||
793 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000794 PyErr_BadInternalCall();
795 return NULL;
796 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000797 intern_strings(names);
798 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000799 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000800 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000801 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 for (i = PyTuple_Size(consts); --i >= 0; ) {
803 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000805 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000806 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000807 continue;
808 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000809 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000811 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000812 co->co_argcount = argcount;
813 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000814 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000815 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000816 Py_INCREF(code);
817 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000821 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000823 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000824 Py_INCREF(freevars);
825 co->co_freevars = freevars;
826 Py_INCREF(cellvars);
827 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000829 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000832 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000834 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000835 if (PyTuple_GET_SIZE(freevars) == 0 &&
836 PyTuple_GET_SIZE(cellvars) == 0)
837 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000838 }
839 return co;
840}
841
842
843/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000844
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000845/* The compiler uses two passes to generate bytecodes. The first pass
846 builds the symbol table. The second pass generates the bytecode.
847
848 The first pass uses a single symtable struct. The second pass uses
849 a compiling struct for each code block. The compiling structs
850 share a reference to the symtable.
851
852 The two passes communicate via symtable_load_symbols() and via
853 is_local() and is_global(). The former initializes several slots
854 in the compiling struct: c_varnames, c_locals, c_nlocals,
855 c_argcount, c_globals, and c_flags.
856*/
857
Tim Peters2a7f3842001-06-09 09:26:21 +0000858/* All about c_lnotab.
859
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000860c_lnotab is an array of unsigned bytes disguised as a Python string. Since
861version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
862mapped to source code line #s via c_lnotab instead.
863
Tim Peters2a7f3842001-06-09 09:26:21 +0000864The array is conceptually a list of
865 (bytecode offset increment, line number increment)
866pairs. The details are important and delicate, best illustrated by example:
867
868 byte code offset source code line number
869 0 1
870 6 2
871 50 7
872 350 307
873 361 308
874
875The first trick is that these numbers aren't stored, only the increments
876from one row to the next (this doesn't really work, but it's a start):
877
878 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
879
880The second trick is that an unsigned byte can't hold negative values, or
881values larger than 255, so (a) there's a deep assumption that byte code
882offsets and their corresponding line #s both increase monotonically, and (b)
883if at least one column jumps by more than 255 from one row to the next, more
884than one pair is written to the table. In case #b, there's no way to know
885from looking at the table later how many were written. That's the delicate
886part. A user of c_lnotab desiring to find the source line number
887corresponding to a bytecode address A should do something like this
888
889 lineno = addr = 0
890 for addr_incr, line_incr in c_lnotab:
891 addr += addr_incr
892 if addr > A:
893 return lineno
894 lineno += line_incr
895
896In order for this to work, when the addr field increments by more than 255,
897the line # increment in each pair generated must be 0 until the remaining addr
898increment is < 256. So, in the example above, com_set_lineno should not (as
899was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
900255, 0, 45, 255, 0, 45.
901*/
902
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000904 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000906 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000908 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000909 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 PyObject *c_locals; /* dictionary (value=localID) */
911 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000912 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000913 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000914 int c_nlocals; /* index of next local */
915 int c_argcount; /* number of top-level arguments */
916 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000917 int c_nexti; /* index into c_code */
918 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000919 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000920 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000921 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000922 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000923 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000924 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000925 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000926 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000927 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000928 int c_stacklevel; /* Current stack level */
929 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000930 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000932 int c_last_addr; /* last op addr seen and recorded in lnotab */
933 int c_last_line; /* last line seen and recorded in lnotab */
934 int c_lnotab_next; /* current length of lnotab */
935 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000936 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000937 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000938 int c_nested; /* Is block nested funcdef or lamdef? */
939 int c_closure; /* Is nested w/freevars? */
940 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000941 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000942 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943};
944
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000945static int
946is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000947{
948 if ((v & (USE | DEF_FREE))
949 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
950 return 1;
951 if (v & DEF_FREE_CLASS)
952 return 1;
953 return 0;
954}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000955
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000956static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000957com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000958{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000959 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
960
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000961 if (c == NULL) {
962 /* Error occurred via symtable call to
963 is_constant_false */
964 PyErr_SetString(exc, msg);
965 return;
966 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000967 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000968 if (c->c_lineno < 1 || c->c_interactive) {
969 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000971 return;
972 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000973 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000974 if (v == NULL)
975 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000976
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000977 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000978 if (line == NULL) {
979 Py_INCREF(Py_None);
980 line = Py_None;
981 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000982 if (exc == PyExc_SyntaxError) {
983 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
984 Py_None, line);
985 if (t == NULL)
986 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000987 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000988 if (w == NULL)
989 goto exit;
990 PyErr_SetObject(exc, w);
991 } else {
992 /* Make sure additional exceptions are printed with
993 file and line, also. */
994 PyErr_SetObject(exc, v);
995 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
996 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000997 exit:
998 Py_XDECREF(t);
999 Py_XDECREF(v);
1000 Py_XDECREF(w);
1001 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001002}
1003
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001004/* Interface to the block stack */
1005
1006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001007block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001008{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001009 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 com_error(c, PyExc_SystemError,
1011 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001012 }
1013 else {
1014 c->c_block[c->c_nblocks++] = type;
1015 }
1016}
1017
1018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001019block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001020{
1021 if (c->c_nblocks > 0)
1022 c->c_nblocks--;
1023 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001025 }
1026}
1027
Guido van Rossum681d79a1995-07-18 14:51:37 +00001028/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001029
Martin v. Löwis95292d62002-12-11 14:04:59 +00001030static int issue_warning(const char *, const char *, int);
1031static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001032static void com_free(struct compiling *);
1033static void com_push(struct compiling *, int);
1034static void com_pop(struct compiling *, int);
1035static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001036static void com_node(struct compiling *, node *);
1037static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001038static void com_addbyte(struct compiling *, int);
1039static void com_addint(struct compiling *, int);
1040static void com_addoparg(struct compiling *, int, int);
1041static void com_addfwref(struct compiling *, int, int *);
1042static void com_backpatch(struct compiling *, int);
1043static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1044static int com_addconst(struct compiling *, PyObject *);
1045static int com_addname(struct compiling *, PyObject *);
1046static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001047static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001048static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001049static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001050static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001051static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001052static void com_assign(struct compiling *, node *, int, node *);
1053static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001054static int com_make_closure(struct compiling *c, PyCodeObject *co);
1055
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001056static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001057static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001058 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001059static PyObject *parsestrplus(struct compiling*, node *);
1060static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001061static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001062
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001063static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001064
1065/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001066static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001067static struct symtable *symtable_build(node *, PyFutureFeatures *,
1068 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001069static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001070static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001071static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001072static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001073static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001074static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001075
1076static void symtable_node(struct symtable *, node *);
1077static void symtable_funcdef(struct symtable *, node *);
1078static void symtable_default_args(struct symtable *, node *);
1079static void symtable_params(struct symtable *, node *);
1080static void symtable_params_fplist(struct symtable *, node *n);
1081static void symtable_global(struct symtable *, node *);
1082static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001083static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001084static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001085static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001086static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001087static void symtable_gen_for(struct symtable *, node *, int);
1088static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001089
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001090static int symtable_update_free_vars(struct symtable *);
1091static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1092static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1093
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001094/* helper */
1095static void
1096do_pad(int pad)
1097{
1098 int i;
1099 for (i = 0; i < pad; ++i)
1100 fprintf(stderr, " ");
1101}
1102
1103static void
1104dump(node *n, int pad, int depth)
1105{
1106 int i;
1107 if (depth == 0)
1108 return;
1109 do_pad(pad);
1110 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1111 if (depth > 0)
1112 depth--;
1113 for (i = 0; i < NCH(n); ++i)
1114 dump(CHILD(n, i), pad + 1, depth);
1115}
1116
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001118com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001120 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1122 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001123 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001125 goto fail;
1126 if ((c->c_const_dict = PyDict_New()) == NULL)
1127 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001129 goto fail;
1130 if ((c->c_name_dict = PyDict_New()) == NULL)
1131 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001133 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1135 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001136 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001137 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001138 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001139 c->c_freevars = NULL;
1140 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001141 c->c_nlocals = 0;
1142 c->c_argcount = 0;
1143 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144 c->c_nexti = 0;
1145 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001146 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001147 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001149 c->c_begin = 0;
1150 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001152 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001153 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001154 c->c_stacklevel = 0;
1155 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001156 c->c_firstlineno = 0;
1157 c->c_last_addr = 0;
1158 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001159 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001160 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001161 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001162 c->c_nested = 0;
1163 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001164 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001165 return 1;
1166
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001167 fail:
1168 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169 return 0;
1170}
1171
1172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001173com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 Py_XDECREF(c->c_code);
1176 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001177 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001179 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 Py_XDECREF(c->c_globals);
1181 Py_XDECREF(c->c_locals);
1182 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001183 Py_XDECREF(c->c_freevars);
1184 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001186 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001187 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001188}
1189
1190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001191com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001192{
1193 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001194 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001195 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001196 /*
1197 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1198 c->c_filename, c->c_name, c->c_lineno,
1199 c->c_nexti, c->c_stacklevel, n);
1200 */
1201 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001202}
1203
1204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001205com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001206{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001207 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001208 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001209 else
1210 c->c_stacklevel -= n;
1211}
1212
1213static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001214com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215{
1216 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001218 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220}
1221
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001222static int
1223com_check_size(PyObject **s, int offset)
1224{
1225 int len = PyString_GET_SIZE(*s);
1226 if (offset >= len)
1227 return _PyString_Resize(s, len * 2);
1228 return 0;
1229}
1230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001232com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001234 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001235 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001236 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001237 if (com_check_size(&c->c_code, c->c_nexti)) {
1238 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001240 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001241 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242}
1243
1244static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001245com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001247 com_addbyte(c, x & 0xff);
1248 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249}
1250
1251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001252com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001253{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001254 char *p;
1255 if (c->c_lnotab == NULL)
1256 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001257 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1258 c->c_errors++;
1259 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001260 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001261 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001262 *p++ = addr;
1263 *p++ = line;
1264 c->c_lnotab_next += 2;
1265}
1266
1267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001268com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001269{
1270 c->c_lineno = lineno;
1271 if (c->c_firstlineno == 0) {
1272 c->c_firstlineno = c->c_last_line = lineno;
1273 }
1274 else {
1275 int incr_addr = c->c_nexti - c->c_last_addr;
1276 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001277 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001278 while (incr_addr > 255) {
1279 com_add_lnotab(c, 255, 0);
1280 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001281 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001282 while (incr_line > 255) {
1283 com_add_lnotab(c, incr_addr, 255);
1284 incr_line -=255;
1285 incr_addr = 0;
1286 }
1287 if (incr_addr > 0 || incr_line > 0)
1288 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001289 c->c_last_addr = c->c_nexti;
1290 c->c_last_line = lineno;
1291 }
1292}
1293
1294static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001295com_strip_lnotab(struct compiling *c)
1296{
1297 /* strip the last lnotab entry if no opcode were emitted.
1298 * This prevents a line number to be generated on a final
1299 * pass, like in the following example:
1300 *
1301 * if a:
1302 * print 5
1303 * else:
1304 * pass
1305 *
1306 * Without the fix, a line trace event would be generated
1307 * on the pass even if a is true (because of the implicit
1308 * return).
1309 */
1310 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1311 c->c_lnotab_next = c->c_lnotab_last;
1312 }
1313}
1314
1315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001316com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317{
Fred Drakeef8ace32000-08-24 00:32:09 +00001318 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001319 if (extended_arg){
1320 com_addbyte(c, EXTENDED_ARG);
1321 com_addint(c, extended_arg);
1322 arg &= 0xffff;
1323 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001324 com_addbyte(c, op);
1325 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001326}
1327
1328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001329com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330{
1331 /* Compile a forward reference for backpatching */
1332 int here;
1333 int anchor;
1334 com_addbyte(c, op);
1335 here = c->c_nexti;
1336 anchor = *p_anchor;
1337 *p_anchor = here;
1338 com_addint(c, anchor == 0 ? 0 : here - anchor);
1339}
1340
1341static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001342com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001344 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 int dist;
1347 int prev;
1348 for (;;) {
1349 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001350 prev = code[anchor] + (code[anchor+1] << 8);
1351 dist = target - (anchor+2);
1352 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001353 dist >>= 8;
1354 code[anchor+1] = dist;
1355 dist >>= 8;
1356 if (dist) {
1357 com_error(c, PyExc_SystemError,
1358 "com_backpatch: offset too large");
1359 break;
1360 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001361 if (!prev)
1362 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 anchor -= prev;
1364 }
1365}
1366
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001367/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368
1369static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001370com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001372 PyObject *w, *t, *np=NULL;
1373 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001374
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001375 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001376 if (t == NULL)
1377 goto fail;
1378 w = PyDict_GetItem(dict, t);
1379 if (w != NULL) {
1380 n = PyInt_AsLong(w);
1381 } else {
1382 n = PyList_Size(list);
1383 np = PyInt_FromLong(n);
1384 if (np == NULL)
1385 goto fail;
1386 if (PyList_Append(list, v) != 0)
1387 goto fail;
1388 if (PyDict_SetItem(dict, t, np) != 0)
1389 goto fail;
1390 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001391 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001392 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001393 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001394 fail:
1395 Py_XDECREF(np);
1396 Py_XDECREF(t);
1397 c->c_errors++;
1398 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001399}
1400
1401static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001404 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001405}
1406
1407static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001408com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001409{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001410 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411}
1412
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001413int
1414_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001415{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001416 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001417 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001418 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001419 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1420 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001421 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001422 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001423 return 0; /* Don't mangle __extremely_long_names */
1424 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1425 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001426 /* Strip leading underscores from class name */
1427 while (*p == '_')
1428 p++;
1429 if (*p == '\0')
1430 return 0; /* Don't mangle if class is just underscores */
1431 plen = strlen(p);
1432 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001433 plen = maxlen-nlen-2; /* Truncate class name if too long */
1434 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001435 buffer[0] = '_';
1436 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001437 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001438 return 1;
1439}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001440
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001442com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001446 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001447
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001448 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001449 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001450 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001451 c->c_errors++;
1452 i = 255;
1453 }
1454 else {
1455 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001458 com_addoparg(c, op, i);
1459}
1460
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001461#define NAME_LOCAL 0
1462#define NAME_GLOBAL 1
1463#define NAME_DEFAULT 2
1464#define NAME_CLOSURE 3
1465
1466static int
1467com_lookup_arg(PyObject *dict, PyObject *name)
1468{
1469 PyObject *v = PyDict_GetItem(dict, name);
1470 if (v == NULL)
1471 return -1;
1472 else
1473 return PyInt_AS_LONG(v);
1474}
1475
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001476static int
1477none_assignment_check(struct compiling *c, char *name, int assigning)
1478{
1479 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1480 char *msg;
1481 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001482 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001483 else
1484 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001485 com_error(c, PyExc_SyntaxError, msg);
1486 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001487 }
1488 return 0;
1489}
1490
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001491static void
1492com_addop_varname(struct compiling *c, int kind, char *name)
1493{
1494 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001495 int i, reftype;
1496 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001497 int op = STOP_CODE;
1498 char buffer[MANGLE_LEN];
1499
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001500 if (kind != VAR_LOAD &&
1501 none_assignment_check(c, name, kind == VAR_STORE))
1502 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001503 i = 255;
1504 goto done;
1505 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001506 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001507 name = buffer;
1508 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1509 c->c_errors++;
1510 i = 255;
1511 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001512 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001513
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001514 reftype = get_ref_type(c, name);
1515 switch (reftype) {
1516 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001517 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001518 scope = NAME_LOCAL;
1519 break;
1520 case GLOBAL_EXPLICIT:
1521 scope = NAME_GLOBAL;
1522 break;
1523 case GLOBAL_IMPLICIT:
1524 if (c->c_flags & CO_OPTIMIZED)
1525 scope = NAME_GLOBAL;
1526 break;
1527 case FREE:
1528 case CELL:
1529 scope = NAME_CLOSURE;
1530 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001531 }
1532
1533 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001534 if (scope == NAME_LOCAL)
1535 i = com_lookup_arg(c->c_locals, v);
1536 else if (reftype == FREE)
1537 i = com_lookup_arg(c->c_freevars, v);
1538 else if (reftype == CELL)
1539 i = com_lookup_arg(c->c_cellvars, v);
1540 if (i == -1) {
1541 c->c_errors++; /* XXX no exception set */
1542 i = 255;
1543 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001544 }
1545 Py_DECREF(v);
1546
1547 switch (kind) {
1548 case VAR_LOAD:
1549 switch (scope) {
1550 case NAME_LOCAL:
1551 op = LOAD_FAST;
1552 break;
1553 case NAME_GLOBAL:
1554 op = LOAD_GLOBAL;
1555 break;
1556 case NAME_DEFAULT:
1557 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001558 break;
1559 case NAME_CLOSURE:
1560 op = LOAD_DEREF;
1561 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001562 }
1563 break;
1564 case VAR_STORE:
1565 switch (scope) {
1566 case NAME_LOCAL:
1567 op = STORE_FAST;
1568 break;
1569 case NAME_GLOBAL:
1570 op = STORE_GLOBAL;
1571 break;
1572 case NAME_DEFAULT:
1573 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001574 break;
1575 case NAME_CLOSURE:
1576 op = STORE_DEREF;
1577 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001578 }
1579 break;
1580 case VAR_DELETE:
1581 switch (scope) {
1582 case NAME_LOCAL:
1583 op = DELETE_FAST;
1584 break;
1585 case NAME_GLOBAL:
1586 op = DELETE_GLOBAL;
1587 break;
1588 case NAME_DEFAULT:
1589 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001590 break;
1591 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001592 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001593 PyOS_snprintf(buf, sizeof(buf),
1594 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001595 com_error(c, PyExc_SyntaxError, buf);
1596 i = 255;
1597 break;
1598 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001599 }
1600 break;
1601 }
1602done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603 com_addoparg(c, op, i);
1604}
1605
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001606static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001607com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001608{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001609 char *name;
1610 char buffer[1000];
1611 /* XXX it is possible to write this code without the 1000
1612 chars on the total length of dotted names, I just can't be
1613 bothered right now */
1614 if (TYPE(n) == STAR)
1615 name = "*";
1616 else if (TYPE(n) == dotted_name) {
1617 char *p = buffer;
1618 int i;
1619 name = buffer;
1620 for (i = 0; i < NCH(n); i += 2) {
1621 char *s = STR(CHILD(n, i));
1622 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001623 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001624 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001625 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001626 break;
1627 }
1628 if (p != buffer)
1629 *p++ = '.';
1630 strcpy(p, s);
1631 p = strchr(p, '\0');
1632 }
1633 }
1634 else {
1635 REQ(n, NAME);
1636 name = STR(n);
1637 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001638 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001639}
1640
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001642parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001643{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001644 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001646 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001647#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001648 int imflag;
1649#endif
1650
Guido van Rossum282914b1991-04-04 10:42:56 +00001651 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001652 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001653#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001654 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001655#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001656 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001658 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001660 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001661 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001662 }
1663 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001664 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001666 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001667 if (errno != 0)
1668 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001670 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001671 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001672#ifndef WITHOUT_COMPLEX
1673 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001674 Py_complex z;
1675 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001676 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001677 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001678 PyFPE_END_PROTECT(z)
1679 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001680 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001681 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001682#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001683 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001684 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001685 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001686 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001688 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001689}
1690
Guido van Rossum79f25d91997-04-29 20:08:16 +00001691static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001692decode_utf8(char **sPtr, char *end, char* encoding)
1693{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001694#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001695 Py_FatalError("decode_utf8 should not be called in this build.");
1696 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001697#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001698 PyObject *u, *v;
1699 char *s, *t;
1700 t = s = *sPtr;
1701 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1702 while (s < end && (*s & 0x80)) s++;
1703 *sPtr = s;
1704 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1705 if (u == NULL)
1706 return NULL;
1707 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1708 Py_DECREF(u);
1709 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001710#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001711}
1712
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001713/* compiler.transformer.Transformer.decode_literal depends on what
1714 might seem like minor details of this function -- changes here
1715 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001716static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001717parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001718{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001720 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001721 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001722 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001723 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001724 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001725 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001726
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001727 if (isalpha(quote) || quote == '_') {
1728 if (quote == 'u' || quote == 'U') {
1729 quote = *++s;
1730 unicode = 1;
1731 }
1732 if (quote == 'r' || quote == 'R') {
1733 quote = *++s;
1734 rawmode = 1;
1735 }
1736 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001737 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001739 return NULL;
1740 }
1741 s++;
1742 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001743 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001744 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001745 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001746 return NULL;
1747 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001748 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 return NULL;
1751 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001752 if (len >= 4 && s[0] == quote && s[1] == quote) {
1753 s += 2;
1754 len -= 2;
1755 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001757 return NULL;
1758 }
1759 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001760#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001761 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001762 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001763 char *buf;
1764 char *p;
1765 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001766 if (encoding == NULL) {
1767 buf = s;
1768 u = NULL;
1769 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1770 buf = s;
1771 u = NULL;
1772 } else {
1773 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1774 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1775 if (u == NULL)
1776 return NULL;
1777 p = buf = PyString_AsString(u);
1778 end = s + len;
1779 while (s < end) {
1780 if (*s == '\\') {
1781 *p++ = *s++;
1782 if (*s & 0x80) {
1783 strcpy(p, "u005c");
1784 p += 5;
1785 }
1786 }
1787 if (*s & 0x80) { /* XXX inefficient */
1788 char *r;
1789 int rn, i;
1790 w = decode_utf8(&s, end, "utf-16-be");
1791 if (w == NULL) {
1792 Py_DECREF(u);
1793 return NULL;
1794 }
1795 r = PyString_AsString(w);
1796 rn = PyString_Size(w);
1797 assert(rn % 2 == 0);
1798 for (i = 0; i < rn; i += 2) {
1799 sprintf(p, "\\u%02x%02x",
1800 r[i + 0] & 0xFF,
1801 r[i + 1] & 0xFF);
1802 p += 6;
1803 }
1804 Py_DECREF(w);
1805 } else {
1806 *p++ = *s++;
1807 }
1808 }
1809 len = p - buf;
1810 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001811 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001812 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001813 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001814 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1815 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001816 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001817 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001818 return v;
1819
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001820 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001821#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001822 need_encoding = (encoding != NULL &&
1823 strcmp(encoding, "utf-8") != 0 &&
1824 strcmp(encoding, "iso-8859-1") != 0);
1825 if (rawmode || strchr(s, '\\') == NULL) {
1826 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001827#ifndef Py_USING_UNICODE
1828 /* This should not happen - we never see any other
1829 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001830 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001831#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001832 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1833 if (u == NULL)
1834 return NULL;
1835 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1836 Py_DECREF(u);
1837 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001838#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001839 } else {
1840 return PyString_FromStringAndSize(s, len);
1841 }
1842 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001843
1844 v = PyString_DecodeEscape(s, len, NULL, unicode,
1845 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001846 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001847 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 return v;
1849}
1850
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001852parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001853{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001855 int i;
1856 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001857 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001858 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001859 for (i = 1; i < NCH(n); i++) {
1860 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001861 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001862 if (s == NULL)
1863 goto onError;
1864 if (PyString_Check(v) && PyString_Check(s)) {
1865 PyString_ConcatAndDel(&v, s);
1866 if (v == NULL)
1867 goto onError;
1868 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001869#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001870 else {
1871 PyObject *temp;
1872 temp = PyUnicode_Concat(v, s);
1873 Py_DECREF(s);
1874 if (temp == NULL)
1875 goto onError;
1876 Py_DECREF(v);
1877 v = temp;
1878 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001879#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001880 }
1881 }
1882 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001883
1884 onError:
1885 Py_XDECREF(v);
1886 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001887}
1888
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001890com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001891{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001892 int anchor = 0;
1893 int save_begin = c->c_begin;
1894
Raymond Hettinger354433a2004-05-19 08:20:33 +00001895 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001896 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001897 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001898 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001899 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001900 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001901 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001902 c->c_loops++;
1903 com_list_iter(c, n, e, t);
1904 c->c_loops--;
1905 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1906 c->c_begin = save_begin;
1907 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001908 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001909}
1910
1911static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001912com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1913{
1914 int break_anchor = 0;
1915 int anchor = 0;
1916 int save_begin = c->c_begin;
1917
1918 REQ(n, gen_for);
1919 /* gen_for: for v in test [gen_iter] */
1920
1921 com_addfwref(c, SETUP_LOOP, &break_anchor);
1922 block_push(c, SETUP_LOOP);
1923
1924 if (is_outmost) {
1925 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1926 com_push(c, 1);
1927 }
1928 else {
1929 com_node(c, CHILD(n, 3));
1930 com_addbyte(c, GET_ITER);
1931 }
1932
1933 c->c_begin = c->c_nexti;
1934 com_set_lineno(c, c->c_last_line);
1935 com_addfwref(c, FOR_ITER, &anchor);
1936 com_push(c, 1);
1937 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1938
1939 if (NCH(n) == 5)
1940 com_gen_iter(c, CHILD(n, 4), t);
1941 else {
1942 com_test(c, t);
1943 com_addbyte(c, YIELD_VALUE);
1944 com_pop(c, 1);
1945 }
1946
1947 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1948 c->c_begin = save_begin;
1949
1950 com_backpatch(c, anchor);
1951 com_pop(c, 1); /* FOR_ITER has popped this */
1952 com_addbyte(c, POP_BLOCK);
1953 block_pop(c, SETUP_LOOP);
1954 com_backpatch(c, break_anchor);
1955}
1956
1957static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001958com_list_if(struct compiling *c, node *n, node *e, char *t)
1959{
1960 int anchor = 0;
1961 int a = 0;
1962 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001963 com_node(c, CHILD(n, 1));
1964 com_addfwref(c, JUMP_IF_FALSE, &a);
1965 com_addbyte(c, POP_TOP);
1966 com_pop(c, 1);
1967 com_list_iter(c, n, e, t);
1968 com_addfwref(c, JUMP_FORWARD, &anchor);
1969 com_backpatch(c, a);
1970 /* We jump here with an extra entry which we now pop */
1971 com_addbyte(c, POP_TOP);
1972 com_backpatch(c, anchor);
1973}
1974
1975static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001976com_gen_if(struct compiling *c, node *n, node *t)
1977{
1978 /* gen_if: 'if' test [gen_iter] */
1979 int anchor = 0;
1980 int a=0;
1981
1982 com_node(c, CHILD(n, 1));
1983 com_addfwref(c, JUMP_IF_FALSE, &a);
1984 com_addbyte(c, POP_TOP);
1985 com_pop(c, 1);
1986
1987 if (NCH(n) == 3)
1988 com_gen_iter(c, CHILD(n, 2), t);
1989 else {
1990 com_test(c, t);
1991 com_addbyte(c, YIELD_VALUE);
1992 com_pop(c, 1);
1993 }
1994 com_addfwref(c, JUMP_FORWARD, &anchor);
1995 com_backpatch(c, a);
1996 /* We jump here with an extra entry which we now pop */
1997 com_addbyte(c, POP_TOP);
1998 com_backpatch(c, anchor);
1999}
2000
2001static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002002com_list_iter(struct compiling *c,
2003 node *p, /* parent of list_iter node */
2004 node *e, /* element expression node */
2005 char *t /* name of result list temp local */)
2006{
2007 /* list_iter is the last child in a listmaker, list_for, or list_if */
2008 node *n = CHILD(p, NCH(p)-1);
2009 if (TYPE(n) == list_iter) {
2010 n = CHILD(n, 0);
2011 switch (TYPE(n)) {
2012 case list_for:
2013 com_list_for(c, n, e, t);
2014 break;
2015 case list_if:
2016 com_list_if(c, n, e, t);
2017 break;
2018 default:
2019 com_error(c, PyExc_SystemError,
2020 "invalid list_iter node type");
2021 }
2022 }
2023 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002024 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002025 com_push(c, 1);
2026 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002027 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002028 com_pop(c, 2);
2029 }
2030}
2031
2032static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002033com_gen_iter(struct compiling *c, node *n, node *t)
2034{
2035 /* gen_iter: gen_for | gen_if */
2036 node *ch;
2037 REQ(n, gen_iter);
2038
2039 ch = CHILD(n, 0);
2040
2041 switch (TYPE(ch)) {
2042 case gen_for:
2043 com_gen_for(c, ch, t, 0);
2044 break;
2045 case gen_if:
2046 com_gen_if(c, ch, t);
2047 break;
2048 default:
2049 com_error(c, PyExc_SystemError,
2050 "invalid gen_iter node type");
2051 }
2052}
2053
2054static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002055com_list_comprehension(struct compiling *c, node *n)
2056{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002057 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002058 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002059
2060 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002061 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002062 com_addoparg(c, BUILD_LIST, 0);
2063 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2064 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002065 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002066 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002067 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002068 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002069 --c->c_tmpname;
2070}
2071
2072static void
2073com_listmaker(struct compiling *c, node *n)
2074{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002075 /* listmaker: test ( list_for | (',' test)* [','] ) */
2076 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002077 com_list_comprehension(c, n);
2078 else {
2079 int len = 0;
2080 int i;
2081 for (i = 0; i < NCH(n); i += 2, len++)
2082 com_node(c, CHILD(n, i));
2083 com_addoparg(c, BUILD_LIST, len);
2084 com_pop(c, len-1);
2085 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086}
2087
2088static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002089com_generator_expression(struct compiling *c, node *n)
2090{
2091 /* testlist_gexp: test gen_for */
2092 /* argument: test gen_for */
2093 PyCodeObject *co;
2094
2095 REQ(CHILD(n, 0), test);
2096 REQ(CHILD(n, 1), gen_for);
2097
2098 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2099 n->n_lineno);
2100 co = icompile(n, c);
2101 symtable_exit_scope(c->c_symtable);
2102
2103 if (co == NULL)
2104 c->c_errors++;
2105 else {
2106 int closure = com_make_closure(c, co);
2107 int i = com_addconst(c, (PyObject *)co);
2108
2109 com_addoparg(c, LOAD_CONST, i);
2110 com_push(c, 1);
2111 if (closure)
2112 com_addoparg(c, MAKE_CLOSURE, 0);
2113 else
2114 com_addoparg(c, MAKE_FUNCTION, 0);
2115
2116 com_test(c, CHILD(CHILD(n, 1), 3));
2117 com_addbyte(c, GET_ITER);
2118 com_addoparg(c, CALL_FUNCTION, 1);
2119 com_pop(c, 1);
2120
2121 Py_DECREF(co);
2122 }
2123}
2124
2125static void
2126com_testlist_gexp(struct compiling *c, node *n)
2127{
2128 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2129 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2130 com_generator_expression(c, n);
2131 else com_list(c, n, 0);
2132}
2133
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002134
Raymond Hettinger354433a2004-05-19 08:20:33 +00002135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002136com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002137{
2138 int i;
2139 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2140 for (i = 0; i+2 < NCH(n); i += 4) {
2141 /* We must arrange things just right for STORE_SUBSCR.
2142 It wants the stack to look like (value) (dict) (key) */
2143 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002145 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002146 com_node(c, CHILD(n, i+2)); /* value */
2147 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002148 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002149 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002150 }
2151}
2152
2153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002154com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002155{
2156 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002158 int i;
2159 REQ(n, atom);
2160 ch = CHILD(n, 0);
2161 switch (TYPE(ch)) {
2162 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002163 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_push(c, 1);
2166 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002168 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002169 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002170 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002171 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002173 com_push(c, 1);
2174 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002176 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002178 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002179 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002180 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002181 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002182 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 break;
2184 case BACKQUOTE:
2185 com_node(c, CHILD(n, 1));
2186 com_addbyte(c, UNARY_CONVERT);
2187 break;
2188 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002189 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 i = 255;
2191 }
2192 else {
2193 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195 }
2196 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 break;
2199 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002200 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002201 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 c->c_errors++;
2203 i = 255;
2204 }
2205 else {
2206 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002207 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002208 }
2209 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002210 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211 break;
2212 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002213 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002214 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002215 break;
2216 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002217 com_error(c, PyExc_SystemError,
2218 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219 }
2220}
2221
2222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002223com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224{
2225 if (NCH(n) == 1) {
2226 com_addbyte(c, op);
2227 }
2228 else if (NCH(n) == 2) {
2229 if (TYPE(CHILD(n, 0)) != COLON) {
2230 com_node(c, CHILD(n, 0));
2231 com_addbyte(c, op+1);
2232 }
2233 else {
2234 com_node(c, CHILD(n, 1));
2235 com_addbyte(c, op+2);
2236 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002237 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002238 }
2239 else {
2240 com_node(c, CHILD(n, 0));
2241 com_node(c, CHILD(n, 2));
2242 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 }
2245}
2246
Guido van Rossum635abd21997-01-06 22:56:52 +00002247static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002248com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2249{
2250 if (NCH(n) == 1) {
2251 com_addbyte(c, DUP_TOP);
2252 com_push(c, 1);
2253 com_addbyte(c, SLICE);
2254 com_node(c, augn);
2255 com_addbyte(c, opcode);
2256 com_pop(c, 1);
2257 com_addbyte(c, ROT_TWO);
2258 com_addbyte(c, STORE_SLICE);
2259 com_pop(c, 2);
2260 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2261 com_node(c, CHILD(n, 0));
2262 com_addoparg(c, DUP_TOPX, 2);
2263 com_push(c, 2);
2264 com_addbyte(c, SLICE+1);
2265 com_pop(c, 1);
2266 com_node(c, augn);
2267 com_addbyte(c, opcode);
2268 com_pop(c, 1);
2269 com_addbyte(c, ROT_THREE);
2270 com_addbyte(c, STORE_SLICE+1);
2271 com_pop(c, 3);
2272 } else if (NCH(n) == 2) {
2273 com_node(c, CHILD(n, 1));
2274 com_addoparg(c, DUP_TOPX, 2);
2275 com_push(c, 2);
2276 com_addbyte(c, SLICE+2);
2277 com_pop(c, 1);
2278 com_node(c, augn);
2279 com_addbyte(c, opcode);
2280 com_pop(c, 1);
2281 com_addbyte(c, ROT_THREE);
2282 com_addbyte(c, STORE_SLICE+2);
2283 com_pop(c, 3);
2284 } else {
2285 com_node(c, CHILD(n, 0));
2286 com_node(c, CHILD(n, 2));
2287 com_addoparg(c, DUP_TOPX, 3);
2288 com_push(c, 3);
2289 com_addbyte(c, SLICE+3);
2290 com_pop(c, 2);
2291 com_node(c, augn);
2292 com_addbyte(c, opcode);
2293 com_pop(c, 1);
2294 com_addbyte(c, ROT_FOUR);
2295 com_addbyte(c, STORE_SLICE+3);
2296 com_pop(c, 4);
2297 }
2298}
2299
2300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002301com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002302{
2303 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002304 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002305 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002306 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002308 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 }
2310 else {
2311 com_node(c, CHILD(n, 0));
2312 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002313 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002314 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002315 if (NCH(n) == 2) {
2316 com_generator_expression(c, n);
2317 return;
2318 }
2319
Guido van Rossumf10570b1995-07-07 22:53:21 +00002320 m = n;
2321 do {
2322 m = CHILD(m, 0);
2323 } while (NCH(m) == 1);
2324 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002325 /* f(lambda x: x[0] = 3) ends up getting parsed with
2326 * LHS test = lambda x: x[0], and RHS test = 3.
2327 * SF bug 132313 points out that complaining about a keyword
2328 * then is very confusing.
2329 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002331 TYPE(m) == lambdef ?
2332 "lambda cannot contain assignment" :
2333 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002334 }
2335 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002337 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002338 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002340 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002341 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002342 else if (*pkeywords == NULL) {
2343 c->c_errors++;
2344 Py_DECREF(v);
2345 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 if (PyDict_GetItem(*pkeywords, v) != NULL)
2347 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002348 "duplicate keyword argument");
2349 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002351 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002352 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002355 }
2356 }
2357 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002358}
2359
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002361com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362{
2363 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002364 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 }
2366 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002368 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002369 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002370 int star_flag = 0;
2371 int starstar_flag = 0;
2372 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002373 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002374 na = 0;
2375 nk = 0;
2376 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002377 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002378 if (TYPE(ch) == STAR ||
2379 TYPE(ch) == DOUBLESTAR)
2380 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002381 if (ch->n_lineno != lineno) {
2382 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002383 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002384 }
2385 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002386 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002387 na++;
2388 else
2389 nk++;
2390 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002391 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002392 while (i < NCH(n)) {
2393 node *tok = CHILD(n, i);
2394 node *ch = CHILD(n, i+1);
2395 i += 3;
2396 switch (TYPE(tok)) {
2397 case STAR: star_flag = 1; break;
2398 case DOUBLESTAR: starstar_flag = 1; break;
2399 }
2400 com_node(c, ch);
2401 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002402 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002403 com_error(c, PyExc_SyntaxError,
2404 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002405 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002406 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002407 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002408 star_flag + (starstar_flag << 1);
2409 else
2410 opcode = CALL_FUNCTION;
2411 com_addoparg(c, opcode, na | (nk << 8));
2412 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413 }
2414}
2415
2416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002417com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418{
2419 com_addopname(c, LOAD_ATTR, n);
2420}
2421
2422static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002423com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002424{
2425 int i=0;
2426 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002427 node *ch;
2428
2429 /* first argument */
2430 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002432 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002433 i++;
2434 }
2435 else {
2436 com_node(c, CHILD(n,i));
2437 i++;
2438 REQ(CHILD(n,i),COLON);
2439 i++;
2440 }
2441 /* second argument */
2442 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2443 com_node(c, CHILD(n,i));
2444 i++;
2445 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002447 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002448 com_push(c, 1);
2449 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002450 /* remaining arguments */
2451 for (; i < NCH(n); i++) {
2452 ns++;
2453 ch=CHILD(n,i);
2454 REQ(ch, sliceop);
2455 if (NCH(ch) == 1) {
2456 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002457 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002458 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002459 }
2460 else
2461 com_node(c, CHILD(ch,1));
2462 }
2463 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002465}
2466
2467static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002468com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002469{
2470 node *ch;
2471 REQ(n, subscript);
2472 ch = CHILD(n,0);
2473 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002474 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002475 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002476 com_push(c, 1);
2477 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002478 else {
2479 /* check for slice */
2480 if ((TYPE(ch) == COLON || NCH(n) > 1))
2481 com_sliceobj(c, n);
2482 else {
2483 REQ(ch, test);
2484 com_node(c, ch);
2485 }
2486 }
2487}
2488
2489static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002490com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002491{
2492 int i, op;
2493 REQ(n, subscriptlist);
2494 /* Check to make backward compatible slice behavior for '[i:j]' */
2495 if (NCH(n) == 1) {
2496 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002497 /* 'Basic' slice, should have exactly one colon. */
2498 if ((TYPE(CHILD(sub, 0)) == COLON
2499 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2500 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2501 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002502 switch (assigning) {
2503 case OP_DELETE:
2504 op = DELETE_SLICE;
2505 break;
2506 case OP_ASSIGN:
2507 op = STORE_SLICE;
2508 break;
2509 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002510 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002511 break;
2512 default:
2513 com_augassign_slice(c, sub, assigning, augn);
2514 return;
2515 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002516 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002517 if (op == STORE_SLICE)
2518 com_pop(c, 2);
2519 else if (op == DELETE_SLICE)
2520 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002521 return;
2522 }
2523 }
2524 /* Else normal subscriptlist. Compile each subscript. */
2525 for (i = 0; i < NCH(n); i += 2)
2526 com_subscript(c, CHILD(n, i));
2527 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002528 if (NCH(n) > 1) {
2529 i = (NCH(n)+1) / 2;
2530 com_addoparg(c, BUILD_TUPLE, i);
2531 com_pop(c, i-1);
2532 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002533 switch (assigning) {
2534 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002535 op = DELETE_SUBSCR;
2536 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002537 break;
2538 default:
2539 case OP_ASSIGN:
2540 op = STORE_SUBSCR;
2541 i = 3;
2542 break;
2543 case OP_APPLY:
2544 op = BINARY_SUBSCR;
2545 i = 1;
2546 break;
2547 }
2548 if (assigning > OP_APPLY) {
2549 com_addoparg(c, DUP_TOPX, 2);
2550 com_push(c, 2);
2551 com_addbyte(c, BINARY_SUBSCR);
2552 com_pop(c, 1);
2553 com_node(c, augn);
2554 com_addbyte(c, assigning);
2555 com_pop(c, 1);
2556 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002558 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002559 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002560}
2561
2562static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002563com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564{
2565 REQ(n, trailer);
2566 switch (TYPE(CHILD(n, 0))) {
2567 case LPAR:
2568 com_call_function(c, CHILD(n, 1));
2569 break;
2570 case DOT:
2571 com_select_member(c, CHILD(n, 1));
2572 break;
2573 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002574 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002575 break;
2576 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002577 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002578 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002579 }
2580}
2581
2582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002583com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002584{
2585 int i;
2586 REQ(n, power);
2587 com_atom(c, CHILD(n, 0));
2588 for (i = 1; i < NCH(n); i++) {
2589 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2590 com_factor(c, CHILD(n, i+1));
2591 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002592 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002593 break;
2594 }
2595 else
2596 com_apply_trailer(c, CHILD(n, i));
2597 }
2598}
2599
2600static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002601com_invert_constant(struct compiling *c, node *n)
2602{
2603 /* Compute the inverse of int and longs and use them directly,
2604 but be prepared to generate code for all other
2605 possibilities (invalid numbers, floats, complex).
2606 */
2607 PyObject *num, *inv = NULL;
2608 int i;
2609
2610 REQ(n, NUMBER);
2611 num = parsenumber(c, STR(n));
2612 if (num == NULL)
2613 i = 255;
2614 else {
2615 inv = PyNumber_Invert(num);
2616 if (inv == NULL) {
2617 PyErr_Clear();
2618 i = com_addconst(c, num);
2619 } else {
2620 i = com_addconst(c, inv);
2621 Py_DECREF(inv);
2622 }
2623 Py_DECREF(num);
2624 }
2625 com_addoparg(c, LOAD_CONST, i);
2626 com_push(c, 1);
2627 if (num != NULL && inv == NULL)
2628 com_addbyte(c, UNARY_INVERT);
2629}
2630
Tim Peters51e26512001-09-07 08:45:55 +00002631static int
2632is_float_zero(const char *p)
2633{
2634 int found_radix_point = 0;
2635 int ch;
2636 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2637 switch (ch) {
2638 case '0':
2639 /* no reason to believe it's not 0 -- continue */
2640 break;
2641
2642 case 'e': case 'E': case 'j': case 'J':
2643 /* If this was a hex constant, we already would have
2644 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2645 must be an exponent marker, and we haven't yet
2646 seen a non-zero digit, and it doesn't matter what
2647 the exponent is then. For 'j' or 'J' similarly,
2648 except that this is an imaginary 0 then. */
2649 return 1;
2650
2651 case '.':
2652 found_radix_point = 1;
2653 break;
2654
2655 default:
2656 return 0;
2657 }
2658 }
2659 return found_radix_point;
2660}
2661
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002662static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002663com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002664{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002665 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002666 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002667 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002668 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002669 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002670 approriate value as a constant. If the value is negative,
2671 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002672 negative in the 0th position -- unless we're doing unary minus
2673 of a floating zero! In that case the sign is significant, but
2674 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002675 */
2676 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002677 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002678 && TYPE((pfactor = CHILD(n, 1))) == factor
2679 && NCH(pfactor) == 1
2680 && TYPE((ppower = CHILD(pfactor, 0))) == power
2681 && NCH(ppower) == 1
2682 && TYPE((patom = CHILD(ppower, 0))) == atom
2683 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002684 && !(childtype == MINUS &&
2685 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002686 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002687 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002688 return;
2689 }
2690 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002691 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002692 if (s == NULL) {
2693 com_error(c, PyExc_MemoryError, "");
2694 com_addbyte(c, 255);
2695 return;
2696 }
2697 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002698 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002699 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002700 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002701 }
Tim Peters51e26512001-09-07 08:45:55 +00002702 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002703 }
2704 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 com_factor(c, CHILD(n, 1));
2706 com_addbyte(c, UNARY_POSITIVE);
2707 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002708 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 com_factor(c, CHILD(n, 1));
2710 com_addbyte(c, UNARY_NEGATIVE);
2711 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002712 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002713 com_factor(c, CHILD(n, 1));
2714 com_addbyte(c, UNARY_INVERT);
2715 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002716 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002717 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718 }
2719}
2720
2721static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002722com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002723{
2724 int i;
2725 int op;
2726 REQ(n, term);
2727 com_factor(c, CHILD(n, 0));
2728 for (i = 2; i < NCH(n); i += 2) {
2729 com_factor(c, CHILD(n, i));
2730 switch (TYPE(CHILD(n, i-1))) {
2731 case STAR:
2732 op = BINARY_MULTIPLY;
2733 break;
2734 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002735 if (c->c_flags & CO_FUTURE_DIVISION)
2736 op = BINARY_TRUE_DIVIDE;
2737 else
2738 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002739 break;
2740 case PERCENT:
2741 op = BINARY_MODULO;
2742 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002743 case DOUBLESLASH:
2744 op = BINARY_FLOOR_DIVIDE;
2745 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002747 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002748 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002749 op = 255;
2750 }
2751 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002752 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002753 }
2754}
2755
2756static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002757com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002758{
2759 int i;
2760 int op;
2761 REQ(n, arith_expr);
2762 com_term(c, CHILD(n, 0));
2763 for (i = 2; i < NCH(n); i += 2) {
2764 com_term(c, CHILD(n, i));
2765 switch (TYPE(CHILD(n, i-1))) {
2766 case PLUS:
2767 op = BINARY_ADD;
2768 break;
2769 case MINUS:
2770 op = BINARY_SUBTRACT;
2771 break;
2772 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002773 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002774 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002775 op = 255;
2776 }
2777 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002779 }
2780}
2781
2782static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002783com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002784{
2785 int i;
2786 int op;
2787 REQ(n, shift_expr);
2788 com_arith_expr(c, CHILD(n, 0));
2789 for (i = 2; i < NCH(n); i += 2) {
2790 com_arith_expr(c, CHILD(n, i));
2791 switch (TYPE(CHILD(n, i-1))) {
2792 case LEFTSHIFT:
2793 op = BINARY_LSHIFT;
2794 break;
2795 case RIGHTSHIFT:
2796 op = BINARY_RSHIFT;
2797 break;
2798 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002799 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002800 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002801 op = 255;
2802 }
2803 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002804 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002805 }
2806}
2807
2808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002809com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002810{
2811 int i;
2812 int op;
2813 REQ(n, and_expr);
2814 com_shift_expr(c, CHILD(n, 0));
2815 for (i = 2; i < NCH(n); i += 2) {
2816 com_shift_expr(c, CHILD(n, i));
2817 if (TYPE(CHILD(n, i-1)) == AMPER) {
2818 op = BINARY_AND;
2819 }
2820 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002821 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002822 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002823 op = 255;
2824 }
2825 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002826 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002827 }
2828}
2829
2830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002831com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002832{
2833 int i;
2834 int op;
2835 REQ(n, xor_expr);
2836 com_and_expr(c, CHILD(n, 0));
2837 for (i = 2; i < NCH(n); i += 2) {
2838 com_and_expr(c, CHILD(n, i));
2839 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2840 op = BINARY_XOR;
2841 }
2842 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002843 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002844 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002845 op = 255;
2846 }
2847 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 }
2850}
2851
2852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002853com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854{
2855 int i;
2856 int op;
2857 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002858 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002859 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002860 com_xor_expr(c, CHILD(n, i));
2861 if (TYPE(CHILD(n, i-1)) == VBAR) {
2862 op = BINARY_OR;
2863 }
2864 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002865 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002866 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 op = 255;
2868 }
2869 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 }
2872}
2873
2874static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002875cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876{
2877 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002878 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2880 if (NCH(n) == 1) {
2881 n = CHILD(n, 0);
2882 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002883 case LESS: return PyCmp_LT;
2884 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002885 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002886 case LESSEQUAL: return PyCmp_LE;
2887 case GREATEREQUAL: return PyCmp_GE;
2888 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2889 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2890 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891 }
2892 }
2893 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002896 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002898 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 }
2900 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002901 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902}
2903
2904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906{
2907 int i;
2908 enum cmp_op op;
2909 int anchor;
2910 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2911 com_expr(c, CHILD(n, 0));
2912 if (NCH(n) == 1)
2913 return;
2914
2915 /****************************************************************
2916 The following code is generated for all but the last
2917 comparison in a chain:
2918
2919 label: on stack: opcode: jump to:
2920
2921 a <code to load b>
2922 a, b DUP_TOP
2923 a, b, b ROT_THREE
2924 b, a, b COMPARE_OP
2925 b, 0-or-1 JUMP_IF_FALSE L1
2926 b, 1 POP_TOP
2927 b
2928
2929 We are now ready to repeat this sequence for the next
2930 comparison in the chain.
2931
2932 For the last we generate:
2933
2934 b <code to load c>
2935 b, c COMPARE_OP
2936 0-or-1
2937
2938 If there were any jumps to L1 (i.e., there was more than one
2939 comparison), we generate:
2940
2941 0-or-1 JUMP_FORWARD L2
2942 L1: b, 0 ROT_TWO
2943 0, b POP_TOP
2944 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002945 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 ****************************************************************/
2947
2948 anchor = 0;
2949
2950 for (i = 2; i < NCH(n); i += 2) {
2951 com_expr(c, CHILD(n, i));
2952 if (i+2 < NCH(n)) {
2953 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002954 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 com_addbyte(c, ROT_THREE);
2956 }
2957 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002958 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002959 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002960 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 }
2962 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002963 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964 if (i+2 < NCH(n)) {
2965 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2966 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002967 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 }
2969 }
2970
2971 if (anchor) {
2972 int anchor2 = 0;
2973 com_addfwref(c, JUMP_FORWARD, &anchor2);
2974 com_backpatch(c, anchor);
2975 com_addbyte(c, ROT_TWO);
2976 com_addbyte(c, POP_TOP);
2977 com_backpatch(c, anchor2);
2978 }
2979}
2980
2981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002982com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983{
2984 REQ(n, not_test); /* 'not' not_test | comparison */
2985 if (NCH(n) == 1) {
2986 com_comparison(c, CHILD(n, 0));
2987 }
2988 else {
2989 com_not_test(c, CHILD(n, 1));
2990 com_addbyte(c, UNARY_NOT);
2991 }
2992}
2993
2994static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002995com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996{
2997 int i;
2998 int anchor;
2999 REQ(n, and_test); /* not_test ('and' not_test)* */
3000 anchor = 0;
3001 i = 0;
3002 for (;;) {
3003 com_not_test(c, CHILD(n, i));
3004 if ((i += 2) >= NCH(n))
3005 break;
3006 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 }
3010 if (anchor)
3011 com_backpatch(c, anchor);
3012}
3013
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003014static int
3015com_make_closure(struct compiling *c, PyCodeObject *co)
3016{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003017 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003018 if (free == 0)
3019 return 0;
3020 for (i = 0; i < free; ++i) {
3021 /* Bypass com_addop_varname because it will generate
3022 LOAD_DEREF but LOAD_CLOSURE is needed.
3023 */
3024 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3025 int arg, reftype;
3026
3027 /* Special case: If a class contains a method with a
3028 free variable that has the same name as a method,
3029 the name will be considered free *and* local in the
3030 class. It should be handled by the closure, as
3031 well as by the normal name loookup logic.
3032 */
3033 reftype = get_ref_type(c, PyString_AS_STRING(name));
3034 if (reftype == CELL)
3035 arg = com_lookup_arg(c->c_cellvars, name);
3036 else /* (reftype == FREE) */
3037 arg = com_lookup_arg(c->c_freevars, name);
3038 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003039 fprintf(stderr, "lookup %s in %s %d %d\n"
3040 "freevars of %s: %s\n",
3041 PyObject_REPR(name),
3042 c->c_name,
3043 reftype, arg,
3044 PyString_AS_STRING(co->co_name),
3045 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003046 Py_FatalError("com_make_closure()");
3047 }
3048 com_addoparg(c, LOAD_CLOSURE, arg);
3049
3050 }
3051 com_push(c, free);
3052 return 1;
3053}
3054
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003056com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003058 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003059 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003060 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003061 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003062 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003063 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3064 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003065 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003066 if (co == NULL) {
3067 c->c_errors++;
3068 return;
3069 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003070 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003071 i = com_addconst(c, (PyObject *)co);
3072 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003073 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003074 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003075 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003076 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003077 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003078 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003079 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003080 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003083 else {
3084 int anchor = 0;
3085 int i = 0;
3086 for (;;) {
3087 com_and_test(c, CHILD(n, i));
3088 if ((i += 2) >= NCH(n))
3089 break;
3090 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3091 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003092 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003093 }
3094 if (anchor)
3095 com_backpatch(c, anchor);
3096 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097}
3098
3099static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003100com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101{
3102 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003103 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104 com_node(c, CHILD(n, 0));
3105 }
3106 else {
3107 int i;
3108 int len;
3109 len = (NCH(n) + 1) / 2;
3110 for (i = 0; i < NCH(n); i += 2)
3111 com_node(c, CHILD(n, i));
3112 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003113 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114 }
3115}
3116
3117
3118/* Begin of assignment compilation */
3119
Thomas Wouters434d0822000-08-24 20:11:32 +00003120
3121static void
3122com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3123{
3124 com_addbyte(c, DUP_TOP);
3125 com_push(c, 1);
3126 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003127 com_node(c, augn);
3128 com_addbyte(c, opcode);
3129 com_pop(c, 1);
3130 com_addbyte(c, ROT_TWO);
3131 com_addopname(c, STORE_ATTR, n);
3132 com_pop(c, 2);
3133}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134
3135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003136com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003138 if (none_assignment_check(c, STR(n), assigning))
3139 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003141 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142}
3143
3144static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003145com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 REQ(n, trailer);
3148 switch (TYPE(CHILD(n, 0))) {
3149 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003150 if (assigning == OP_DELETE)
3151 com_error(c, PyExc_SyntaxError,
3152 "can't delete function call");
3153 else
3154 com_error(c, PyExc_SyntaxError,
3155 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003156 break;
3157 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003158 if (assigning > OP_APPLY)
3159 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3160 else
3161 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003163 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003164 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 break;
3166 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003167 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 }
3169}
3170
3171static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003172com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173{
3174 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003175 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3176 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003178 if (assigning) {
3179 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003180 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003181 com_push(c, i-1);
3182 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003184 com_assign(c, CHILD(n, i), assigning, NULL);
3185}
3186
3187static void
3188com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3189{
3190 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003191 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003192 com_push(c, 1);
3193 com_node(c, augn);
3194 com_addbyte(c, opcode);
3195 com_pop(c, 1);
3196 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197}
3198
3199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003200com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201{
3202 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003203 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003204 if (assigning)
3205 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206}
3207
3208static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003209com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210{
3211 /* Loop to avoid trivial recursion */
3212 for (;;) {
3213 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003214
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 case exprlist:
3216 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003217 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003218 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003220 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003221 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003222 "assign to generator expression not possible");
3223 return;
3224 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003225 if (assigning > OP_APPLY) {
3226 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003227 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003228 return;
3229 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003230 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 return;
3232 }
3233 n = CHILD(n, 0);
3234 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003235
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003236 case test:
3237 case and_test:
3238 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003241 case xor_expr:
3242 case and_expr:
3243 case shift_expr:
3244 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003246 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003248 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003249 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 return;
3251 }
3252 n = CHILD(n, 0);
3253 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003254
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003255 case power: /* atom trailer* ('**' power)*
3256 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003257 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003258 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003259 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260 return;
3261 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003262 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263 int i;
3264 com_node(c, CHILD(n, 0));
3265 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003266 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003267 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003268 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003269 return;
3270 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 com_apply_trailer(c, CHILD(n, i));
3272 } /* NB i is still alive */
3273 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003274 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 return;
3276 }
3277 n = CHILD(n, 0);
3278 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003279
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 case atom:
3281 switch (TYPE(CHILD(n, 0))) {
3282 case LPAR:
3283 n = CHILD(n, 1);
3284 if (TYPE(n) == RPAR) {
3285 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003286 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003287 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 return;
3289 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003290 if (assigning > OP_APPLY) {
3291 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003292 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003293 return;
3294 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003295 break;
3296 case LSQB:
3297 n = CHILD(n, 1);
3298 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003299 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003300 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 return;
3302 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003303 if (assigning > OP_APPLY) {
3304 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003305 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003306 return;
3307 }
3308 if (NCH(n) > 1
3309 && TYPE(CHILD(n, 1)) == list_for) {
3310 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003311 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003312 return;
3313 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003314 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315 return;
3316 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003317 if (assigning > OP_APPLY)
3318 com_augassign_name(c, CHILD(n, 0),
3319 assigning, augn);
3320 else
3321 com_assign_name(c, CHILD(n, 0),
3322 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323 return;
3324 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003325 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003326 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 return;
3328 }
3329 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003330
3331 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 com_error(c, PyExc_SyntaxError,
3333 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003334 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003335
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003337 com_error(c, PyExc_SystemError,
3338 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003340
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 }
3342 }
3343}
Guido van Rossum7c531111997-03-11 18:42:21 +00003344
Thomas Wouters434d0822000-08-24 20:11:32 +00003345static void
3346com_augassign(struct compiling *c, node *n)
3347{
3348 int opcode;
3349
3350 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3351 case '+': opcode = INPLACE_ADD; break;
3352 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003353 case '/':
3354 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3355 opcode = INPLACE_FLOOR_DIVIDE;
3356 else if (c->c_flags & CO_FUTURE_DIVISION)
3357 opcode = INPLACE_TRUE_DIVIDE;
3358 else
3359 opcode = INPLACE_DIVIDE;
3360 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003361 case '%': opcode = INPLACE_MODULO; break;
3362 case '<': opcode = INPLACE_LSHIFT; break;
3363 case '>': opcode = INPLACE_RSHIFT; break;
3364 case '&': opcode = INPLACE_AND; break;
3365 case '^': opcode = INPLACE_XOR; break;
3366 case '|': opcode = INPLACE_OR; break;
3367 case '*':
3368 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3369 opcode = INPLACE_POWER;
3370 else
3371 opcode = INPLACE_MULTIPLY;
3372 break;
3373 default:
3374 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3375 return;
3376 }
3377 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3378}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003379
3380static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003381com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382{
Thomas Wouters434d0822000-08-24 20:11:32 +00003383 REQ(n, expr_stmt);
3384 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003385 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003386 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003388 if (NCH(n) == 1) {
3389 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003390 if (c->c_interactive)
3391 com_addbyte(c, PRINT_EXPR);
3392 else
3393 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003394 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003395 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003396 else if (TYPE(CHILD(n,1)) == augassign)
3397 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 else {
3399 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003400 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003401 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003402 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003404 com_push(c, 1);
3405 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003406 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 }
3408 }
3409}
3410
3411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003412com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003413{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003414 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003415 int i;
3416 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003417 if (Py_OptimizeFlag)
3418 return;
3419 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003420
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003421 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003422 raise AssertionError [, <message>]
3423
3424 where <message> is the second test, if present.
3425 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003426 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003427 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003428 com_addbyte(c, POP_TOP);
3429 com_pop(c, 1);
3430 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003431 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003432 com_push(c, 1);
3433 i = NCH(n)/2; /* Either 2 or 4 */
3434 if (i > 1)
3435 com_node(c, CHILD(n, 3));
3436 com_addoparg(c, RAISE_VARARGS, i);
3437 com_pop(c, i);
3438 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003439 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003440 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003441 com_addbyte(c, POP_TOP);
3442}
3443
3444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003445com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003447 int i = 1;
3448 node* stream = NULL;
3449
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003450 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003451
3452 /* are we using the extended print form? */
3453 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3454 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003455 com_node(c, stream);
3456 /* stack: [...] => [... stream] */
3457 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003458 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3459 i = 4;
3460 else
3461 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003462 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003463 for (; i < NCH(n); i += 2) {
3464 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003465 com_addbyte(c, DUP_TOP);
3466 /* stack: [stream] => [stream stream] */
3467 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003468 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003469 /* stack: [stream stream] => [stream stream obj] */
3470 com_addbyte(c, ROT_TWO);
3471 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003472 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003473 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003474 com_pop(c, 2);
3475 }
3476 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003477 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003478 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003479 com_addbyte(c, PRINT_ITEM);
3480 com_pop(c, 1);
3481 }
3482 }
3483 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003484 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003485 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003486 /* must pop the extra stream object off the stack */
3487 com_addbyte(c, POP_TOP);
3488 /* stack: [... stream] => [...] */
3489 com_pop(c, 1);
3490 }
3491 }
3492 else {
3493 if (stream != NULL) {
3494 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003495 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003496 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003497 com_pop(c, 1);
3498 }
3499 else
3500 com_addbyte(c, PRINT_NEWLINE);
3501 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003502}
3503
3504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003505com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003507 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003508 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003509 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003510 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003511 if (c->c_flags & CO_GENERATOR) {
3512 if (NCH(n) > 1) {
3513 com_error(c, PyExc_SyntaxError,
3514 "'return' with argument inside generator");
3515 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003516 }
3517 if (NCH(n) < 2) {
3518 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 com_push(c, 1);
3520 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003521 else
3522 com_node(c, CHILD(n, 1));
3523 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003524 com_pop(c, 1);
3525}
3526
3527static void
3528com_yield_stmt(struct compiling *c, node *n)
3529{
Tim Peters95c80f82001-06-23 02:07:08 +00003530 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003531 REQ(n, yield_stmt); /* 'yield' testlist */
3532 if (!c->c_infunction) {
3533 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3534 }
Tim Peters95c80f82001-06-23 02:07:08 +00003535
3536 for (i = 0; i < c->c_nblocks; ++i) {
3537 if (c->c_block[i] == SETUP_FINALLY) {
3538 com_error(c, PyExc_SyntaxError,
3539 "'yield' not allowed in a 'try' block "
3540 "with a 'finally' clause");
3541 return;
3542 }
3543 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003544 com_node(c, CHILD(n, 1));
3545 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547}
3548
3549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003551{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003552 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003553 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3554 if (NCH(n) > 1) {
3555 com_node(c, CHILD(n, 1));
3556 if (NCH(n) > 3) {
3557 com_node(c, CHILD(n, 3));
3558 if (NCH(n) > 5)
3559 com_node(c, CHILD(n, 5));
3560 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003561 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562 i = NCH(n)/2;
3563 com_addoparg(c, RAISE_VARARGS, i);
3564 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565}
3566
3567static void
Thomas Wouters52152252000-08-17 22:55:00 +00003568com_from_import(struct compiling *c, node *n)
3569{
3570 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3571 com_push(c, 1);
3572 if (NCH(n) > 1) {
3573 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3574 com_error(c, PyExc_SyntaxError, "invalid syntax");
3575 return;
3576 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003577 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003578 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003579 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003580 com_pop(c, 1);
3581}
3582
3583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003586 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003587 int i;
3588 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003589 n = CHILD(n, 0);
3590 /* import_stmt: import_name | import_from */
3591 if (TYPE(n) == import_from) {
3592 /* 'from' dotted_name 'import' ('*' |
3593 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003594 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003595 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003596 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3597 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003598 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003599 else {
3600 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3601 TYPE(CHILD(n, 3)) != LPAR) {
3602 com_error(c, PyExc_SyntaxError,
3603 "trailing comma not allowed "
3604 "without surrounding parentheses");
3605 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003606 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003607 REQ(nn, import_as_names);
3608 tup = PyTuple_New((NCH(nn) + 1) / 2);
3609 for (i = 0; i < NCH(nn); i += 2)
3610 PyTuple_SET_ITEM(tup, i / 2,
3611 PyString_FromString(STR(
3612 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003613 }
3614 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003615 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003616 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003617 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003618 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003619 com_addbyte(c, IMPORT_STAR);
3620 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003621 for (i = 0; i < NCH(nn); i += 2)
3622 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003623 com_addbyte(c, POP_TOP);
3624 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003625 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626 }
3627 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003628 /* 'import' dotted_as_names */
3629 nn = CHILD(n, 1);
3630 REQ(nn, dotted_as_names);
3631 for (i = 0; i < NCH(nn); i += 2) {
3632 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003633 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003634 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003635 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003636 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003637 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003638 int j;
3639 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003640 com_error(c, PyExc_SyntaxError,
3641 "invalid syntax");
3642 return;
3643 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003644 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3645 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003646 CHILD(CHILD(subn, 0),
3647 j));
3648 com_addop_varname(c, VAR_STORE,
3649 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003650 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003651 com_addop_varname(c, VAR_STORE,
3652 STR(CHILD(CHILD(subn, 0),
3653 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655 }
3656 }
3657}
3658
3659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003660com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003661{
3662 REQ(n, exec_stmt);
3663 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3664 com_node(c, CHILD(n, 1));
3665 if (NCH(n) >= 4)
3666 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003667 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003668 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003669 com_push(c, 1);
3670 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003671 if (NCH(n) >= 6)
3672 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003673 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003674 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003675 com_push(c, 1);
3676 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003677 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003678 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003679}
3680
Guido van Rossum7c531111997-03-11 18:42:21 +00003681static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003683{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003684 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003685 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003686 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003687
3688 /* Label to avoid tail recursion */
3689 next:
3690 switch (TYPE(n)) {
3691
3692 case suite:
3693 if (NCH(n) == 1) {
3694 n = CHILD(n, 0);
3695 goto next;
3696 }
3697 /* Fall through */
3698 case file_input:
3699 for (i = 0; i < NCH(n); i++) {
3700 node *ch = CHILD(n, i);
3701 if (TYPE(ch) == stmt) {
3702 n = ch;
3703 goto next;
3704 }
3705 }
3706 break;
3707
3708 case stmt:
3709 case simple_stmt:
3710 case small_stmt:
3711 n = CHILD(n, 0);
3712 goto next;
3713
3714 case expr_stmt:
3715 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003716 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003717 case test:
3718 case and_test:
3719 case not_test:
3720 case comparison:
3721 case expr:
3722 case xor_expr:
3723 case and_expr:
3724 case shift_expr:
3725 case arith_expr:
3726 case term:
3727 case factor:
3728 case power:
3729 case atom:
3730 if (NCH(n) == 1) {
3731 n = CHILD(n, 0);
3732 goto next;
3733 }
3734 break;
3735
3736 case NAME:
3737 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3738 return 1;
3739 break;
3740
3741 case NUMBER:
3742 v = parsenumber(c, STR(n));
3743 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003745 break;
3746 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003747 i = PyObject_IsTrue(v);
3748 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003749 return i == 0;
3750
3751 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003752 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003753 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003754 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003755 break;
3756 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003757 i = PyObject_IsTrue(v);
3758 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003759 return i == 0;
3760
3761 }
3762 return 0;
3763}
3764
Tim Peters08a898f2001-06-28 01:52:22 +00003765
3766/* Look under n for a return stmt with an expression.
3767 * This hack is used to find illegal returns under "if 0:" blocks in
3768 * functions already known to be generators (as determined by the symtable
3769 * pass).
3770 * Return the offending return node if found, else NULL.
3771 */
3772static node *
3773look_for_offending_return(node *n)
3774{
3775 int i;
3776
3777 for (i = 0; i < NCH(n); ++i) {
3778 node *kid = CHILD(n, i);
3779
3780 switch (TYPE(kid)) {
3781 case classdef:
3782 case funcdef:
3783 case lambdef:
3784 /* Stuff in nested functions & classes doesn't
3785 affect the code block we started in. */
3786 return NULL;
3787
3788 case return_stmt:
3789 if (NCH(kid) > 1)
3790 return kid;
3791 break;
3792
3793 default: {
3794 node *bad = look_for_offending_return(kid);
3795 if (bad != NULL)
3796 return bad;
3797 }
3798 }
3799 }
3800
3801 return NULL;
3802}
3803
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003804static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003805com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003806{
3807 int i;
3808 int anchor = 0;
3809 REQ(n, if_stmt);
3810 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3811 for (i = 0; i+3 < NCH(n); i+=4) {
3812 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003813 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003814 if (is_constant_false(c, ch)) {
3815 /* We're going to skip this block. However, if this
3816 is a generator, we have to check the dead code
3817 anyway to make sure there aren't any return stmts
3818 with expressions, in the same scope. */
3819 if (c->c_flags & CO_GENERATOR) {
3820 node *p = look_for_offending_return(n);
3821 if (p != NULL) {
3822 int savelineno = c->c_lineno;
3823 c->c_lineno = p->n_lineno;
3824 com_error(c, PyExc_SyntaxError,
3825 "'return' with argument "
3826 "inside generator");
3827 c->c_lineno = savelineno;
3828 }
3829 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003830 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003831 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003832 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003833 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003834 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835 com_addfwref(c, JUMP_IF_FALSE, &a);
3836 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003837 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003838 com_node(c, CHILD(n, i+3));
3839 com_addfwref(c, JUMP_FORWARD, &anchor);
3840 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003841 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003842 com_addbyte(c, POP_TOP);
3843 }
3844 if (i+2 < NCH(n))
3845 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003846 if (anchor)
3847 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848}
3849
3850static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003851com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852{
3853 int break_anchor = 0;
3854 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003855 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3857 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003858 block_push(c, SETUP_LOOP);
3859 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003860 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 com_node(c, CHILD(n, 1));
3862 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3863 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003864 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003865 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003867 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003868 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3869 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003872 com_addbyte(c, POP_TOP);
3873 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003874 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003875 if (NCH(n) > 4)
3876 com_node(c, CHILD(n, 6));
3877 com_backpatch(c, break_anchor);
3878}
3879
3880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003881com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 int break_anchor = 0;
3884 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003885 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003886 REQ(n, for_stmt);
3887 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3888 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003889 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003890 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003891 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003892 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003893 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003894 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003896 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003897 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003898 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003899 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003900 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3901 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003902 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003903 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003904 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003905 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003906 if (NCH(n) > 8)
3907 com_node(c, CHILD(n, 8));
3908 com_backpatch(c, break_anchor);
3909}
3910
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003911/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003912
3913 SETUP_FINALLY L
3914 <code for S>
3915 POP_BLOCK
3916 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003917 L: <code for Sf>
3918 END_FINALLY
3919
3920 The special instructions use the block stack. Each block
3921 stack entry contains the instruction that created it (here
3922 SETUP_FINALLY), the level of the value stack at the time the
3923 block stack entry was created, and a label (here L).
3924
3925 SETUP_FINALLY:
3926 Pushes the current value stack level and the label
3927 onto the block stack.
3928 POP_BLOCK:
3929 Pops en entry from the block stack, and pops the value
3930 stack until its level is the same as indicated on the
3931 block stack. (The label is ignored.)
3932 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003933 Pops a variable number of entries from the *value* stack
3934 and re-raises the exception they specify. The number of
3935 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003936
3937 The block stack is unwound when an exception is raised:
3938 when a SETUP_FINALLY entry is found, the exception is pushed
3939 onto the value stack (and the exception condition is cleared),
3940 and the interpreter jumps to the label gotten from the block
3941 stack.
3942
3943 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003944 (The contents of the value stack is shown in [], with the top
3945 at the right; 'tb' is trace-back info, 'val' the exception's
3946 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003947
3948 Value stack Label Instruction Argument
3949 [] SETUP_EXCEPT L1
3950 [] <code for S>
3951 [] POP_BLOCK
3952 [] JUMP_FORWARD L0
3953
Guido van Rossum3f5da241990-12-20 15:06:42 +00003954 [tb, val, exc] L1: DUP )
3955 [tb, val, exc, exc] <evaluate E1> )
3956 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3957 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3958 [tb, val, exc, 1] POP )
3959 [tb, val, exc] POP
3960 [tb, val] <assign to V1> (or POP if no V1)
3961 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003962 [] <code for S1>
3963 JUMP_FORWARD L0
3964
Guido van Rossum3f5da241990-12-20 15:06:42 +00003965 [tb, val, exc, 0] L2: POP
3966 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003967 .............................etc.......................
3968
Guido van Rossum3f5da241990-12-20 15:06:42 +00003969 [tb, val, exc, 0] Ln+1: POP
3970 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003971
3972 [] L0: <next statement>
3973
3974 Of course, parts are not generated if Vi or Ei is not present.
3975*/
3976
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003979{
3980 int except_anchor = 0;
3981 int end_anchor = 0;
3982 int else_anchor = 0;
3983 int i;
3984 node *ch;
3985
3986 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3987 block_push(c, SETUP_EXCEPT);
3988 com_node(c, CHILD(n, 2));
3989 com_addbyte(c, POP_BLOCK);
3990 block_pop(c, SETUP_EXCEPT);
3991 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3992 com_backpatch(c, except_anchor);
3993 for (i = 3;
3994 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3995 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003996 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003997 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003998 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003999 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004000 break;
4001 }
4002 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004003 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004004 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004005 if (NCH(ch) > 1) {
4006 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004007 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004008 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004009 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004010 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004011 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4012 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004013 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004014 }
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 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004018 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004019 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004020 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004021 com_pop(c, 1);
4022 }
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);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004025 com_node(c, CHILD(n, i+2));
4026 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4027 if (except_anchor) {
4028 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004029 /* We come in with [tb, val, exc, 0] on the
4030 stack; one pop and it's the same as
4031 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004032 com_addbyte(c, POP_TOP);
4033 }
4034 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004035 /* We actually come in here with [tb, val, exc] but the
4036 END_FINALLY will zap those and jump around.
4037 The c_stacklevel does not reflect them so we need not pop
4038 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004039 com_addbyte(c, END_FINALLY);
4040 com_backpatch(c, else_anchor);
4041 if (i < NCH(n))
4042 com_node(c, CHILD(n, i+2));
4043 com_backpatch(c, end_anchor);
4044}
4045
4046static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004047com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048{
4049 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004050 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004051
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004052 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4053 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004055 com_addbyte(c, POP_BLOCK);
4056 block_pop(c, SETUP_FINALLY);
4057 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004058 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 /* While the generated code pushes only one item,
4060 the try-finally handling can enter here with
4061 up to three items. OK, here are the details:
4062 3 for an exception, 2 for RETURN, 1 for BREAK. */
4063 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004064 com_backpatch(c, finally_anchor);
4065 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004066 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004067 com_node(c, ch);
4068 com_addbyte(c, END_FINALLY);
4069 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004070 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004071}
4072
4073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004074com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004075{
4076 REQ(n, try_stmt);
4077 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4078 | 'try' ':' suite 'finally' ':' suite */
4079 if (TYPE(CHILD(n, 3)) != except_clause)
4080 com_try_finally(c, n);
4081 else
4082 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083}
4084
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004086get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004087{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004088 int i;
4089
Guido van Rossum8b993a91997-01-17 21:04:03 +00004090 /* Label to avoid tail recursion */
4091 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004092 switch (TYPE(n)) {
4093
4094 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004095 if (NCH(n) == 1) {
4096 n = CHILD(n, 0);
4097 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004098 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004099 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004100 case file_input:
4101 for (i = 0; i < NCH(n); i++) {
4102 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004103 if (TYPE(ch) == stmt) {
4104 n = ch;
4105 goto next;
4106 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004107 }
4108 break;
4109
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004110 case stmt:
4111 case simple_stmt:
4112 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004113 n = CHILD(n, 0);
4114 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004115
4116 case expr_stmt:
4117 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004118 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004119 case test:
4120 case and_test:
4121 case not_test:
4122 case comparison:
4123 case expr:
4124 case xor_expr:
4125 case and_expr:
4126 case shift_expr:
4127 case arith_expr:
4128 case term:
4129 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004130 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004131 if (NCH(n) == 1) {
4132 n = CHILD(n, 0);
4133 goto next;
4134 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004135 break;
4136
4137 case atom:
4138 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004139 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004140 break;
4141
4142 }
4143 return NULL;
4144}
4145
Guido van Rossum79f25d91997-04-29 20:08:16 +00004146static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004147get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004148{
Guido van Rossum541563e1999-01-28 15:08:09 +00004149 /* Don't generate doc-strings if run with -OO */
4150 if (Py_OptimizeFlag > 1)
4151 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004152 n = get_rawdocstring(n);
4153 if (n == NULL)
4154 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004155 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004156}
4157
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004159com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004160{
4161 REQ(n, suite);
4162 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4163 if (NCH(n) == 1) {
4164 com_node(c, CHILD(n, 0));
4165 }
4166 else {
4167 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004168 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004169 node *ch = CHILD(n, i);
4170 if (TYPE(ch) == stmt)
4171 com_node(c, ch);
4172 }
4173 }
4174}
4175
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004176/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004178com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004179{
4180 int i = c->c_nblocks;
4181 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4182 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4183 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004184 else if (i <= 0) {
4185 /* at the outer level */
4186 com_error(c, PyExc_SyntaxError,
4187 "'continue' not properly in loop");
4188 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004189 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004190 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004191 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004192 if (c->c_block[j] == SETUP_LOOP)
4193 break;
4194 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004195 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004196 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004197 for (; i > j; --i) {
4198 if (c->c_block[i] == SETUP_EXCEPT ||
4199 c->c_block[i] == SETUP_FINALLY) {
4200 com_addoparg(c, CONTINUE_LOOP,
4201 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004202 return;
4203 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004204 if (c->c_block[i] == END_FINALLY) {
4205 com_error(c, PyExc_SyntaxError,
4206 "'continue' not supported inside 'finally' clause");
4207 return;
4208 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004209 }
4210 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004211 com_error(c, PyExc_SyntaxError,
4212 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004213 }
4214 /* XXX Could allow it inside a 'finally' clause
4215 XXX if we could pop the exception still on the stack */
4216}
4217
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004218/* Return the number of default values in the argument list.
4219
4220 If a non-default argument follows a default argument, set an
4221 exception and return -1.
4222*/
4223
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004224static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004225com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004226{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004227 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004228 if (TYPE(n) == lambdef) {
4229 /* lambdef: 'lambda' [varargslist] ':' test */
4230 n = CHILD(n, 1);
4231 }
4232 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004233 REQ(n, funcdef);
4234 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4235 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4237 n = CHILD(n, 1);
4238 }
4239 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004240 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004241 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004242 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004243 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4244 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004245 ndefs = 0;
4246 for (i = 0; i < nch; i++) {
4247 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004248 if (TYPE(CHILD(n, i)) == STAR ||
4249 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004250 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004251 i++;
4252 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004253 t = RPAR; /* Anything except EQUAL or COMMA */
4254 else
4255 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004256 if (t == EQUAL) {
4257 i++;
4258 ndefs++;
4259 com_node(c, CHILD(n, i));
4260 i++;
4261 if (i >= nch)
4262 break;
4263 t = TYPE(CHILD(n, i));
4264 }
4265 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004266 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004267 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004268 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004269 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004270 return -1;
4271 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004272 }
4273 if (t != COMMA)
4274 break;
4275 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004276 return ndefs;
4277}
4278
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004279static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004280com_decorator_name(struct compiling *c, node *n)
4281{
4282 /* dotted_name: NAME ('.' NAME)* */
4283
4284 int i, nch;
4285 node *varname;
4286
4287 REQ(n, dotted_name);
4288 nch = NCH(n);
4289 assert(nch >= 1 && nch % 2 == 1);
4290
4291 varname = CHILD(n, 0);
4292 REQ(varname, NAME);
4293 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004294 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004295
4296 for (i = 1; i < nch; i += 2) {
4297 node *attrname;
4298
4299 REQ(CHILD(n, i), DOT);
4300
4301 attrname = CHILD(n, i + 1);
4302 REQ(attrname, NAME);
4303 com_addop_name(c, LOAD_ATTR, STR(attrname));
4304 }
4305}
4306
4307static void
4308com_decorator(struct compiling *c, node *n)
4309{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004310 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004311 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004312 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004313 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004314 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004315 com_decorator_name(c, CHILD(n, 1));
4316
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004317 if (nch > 3) {
4318 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004319 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004320 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004321 com_call_function(c, CHILD(n, 3));
4322 }
4323}
4324
4325static int
4326com_decorators(struct compiling *c, node *n)
4327{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004328 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004329
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004330 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004331 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004332 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004333
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004334 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004335 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004336 REQ(ch, decorator);
4337
4338 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004339 }
4340
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004341 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004342}
4343
4344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004345com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004346{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004347 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004348 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004349
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004350 REQ(n, funcdef);
4351 /* -6 -5 -4 -3 -2 -1
4352 funcdef: [decorators] 'def' NAME parameters ':' suite */
4353
4354 if (NCH(n) == 6)
4355 ndecorators = com_decorators(c, CHILD(n, 0));
4356 else
4357 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004358
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004359 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004360 if (ndefs < 0)
4361 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004362 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004363 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004366 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004367 c->c_errors++;
4368 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004369 int closure = com_make_closure(c, (PyCodeObject *)co);
4370 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004371 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004372 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004373 if (closure)
4374 com_addoparg(c, MAKE_CLOSURE, ndefs);
4375 else
4376 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004377 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004378
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004379 while (ndecorators > 0) {
4380 com_addoparg(c, CALL_FUNCTION, 1);
4381 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004382 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004383 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004384
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004385 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004386 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004387 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004388 }
4389}
4390
4391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004392com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004393{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004394 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004395 REQ(n, testlist);
4396 /* testlist: test (',' test)* [','] */
4397 for (i = 0; i < NCH(n); i += 2)
4398 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004399 i = (NCH(n)+1) / 2;
4400 com_addoparg(c, BUILD_TUPLE, i);
4401 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004402}
4403
4404static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004405com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004406{
Guido van Rossum25831651993-05-19 14:50:45 +00004407 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004408 PyObject *v;
4409 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004410 char *name;
4411
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004412 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004413 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004414 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004415 c->c_errors++;
4416 return;
4417 }
4418 /* Push the class name on the stack */
4419 i = com_addconst(c, v);
4420 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004421 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004422 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004423 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004424 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004425 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004426 com_push(c, 1);
4427 }
Guido van Rossum25831651993-05-19 14:50:45 +00004428 else
4429 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004430 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004431 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004432 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004433 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004434 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004435 c->c_errors++;
4436 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004437 int closure = com_make_closure(c, co);
4438 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004439 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004440 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004441 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004442 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004443 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004444 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004445 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004446 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004447 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004448 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004449 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004450 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004451 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004452 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004453}
4454
4455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004456com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004457{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004458 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004459 if (c->c_errors)
4460 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004461 switch (TYPE(n)) {
4462
4463 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004464
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004465 case funcdef:
4466 com_funcdef(c, n);
4467 break;
4468 case classdef:
4469 com_classdef(c, n);
4470 break;
4471
4472 /* Trivial parse tree nodes */
4473
4474 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004475 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004476 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004477 n = CHILD(n, 0);
4478 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004479
4480 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004481 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004482 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004483 {
4484 int i;
4485 for (i = 0; i < NCH(n)-1; i += 2)
4486 com_node(c, CHILD(n, i));
4487 }
4488 break;
4489
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004490 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004491 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004492 n = CHILD(n, 0);
4493 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004494
4495 /* Statement nodes */
4496
4497 case expr_stmt:
4498 com_expr_stmt(c, n);
4499 break;
4500 case print_stmt:
4501 com_print_stmt(c, n);
4502 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004503 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004504 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505 break;
4506 case pass_stmt:
4507 break;
4508 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004509 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004510 com_error(c, PyExc_SyntaxError,
4511 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004512 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004513 com_addbyte(c, BREAK_LOOP);
4514 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004515 case continue_stmt:
4516 com_continue_stmt(c, n);
4517 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004518 case return_stmt:
4519 com_return_stmt(c, n);
4520 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004521 case yield_stmt:
4522 com_yield_stmt(c, n);
4523 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004524 case raise_stmt:
4525 com_raise_stmt(c, n);
4526 break;
4527 case import_stmt:
4528 com_import_stmt(c, n);
4529 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004530 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004531 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004532 case exec_stmt:
4533 com_exec_stmt(c, n);
4534 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004535 case assert_stmt:
4536 com_assert_stmt(c, n);
4537 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004538 case if_stmt:
4539 com_if_stmt(c, n);
4540 break;
4541 case while_stmt:
4542 com_while_stmt(c, n);
4543 break;
4544 case for_stmt:
4545 com_for_stmt(c, n);
4546 break;
4547 case try_stmt:
4548 com_try_stmt(c, n);
4549 break;
4550 case suite:
4551 com_suite(c, n);
4552 break;
4553
4554 /* Expression nodes */
4555
4556 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004557 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004558 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004559 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004560 break;
4561 case test:
4562 com_test(c, n);
4563 break;
4564 case and_test:
4565 com_and_test(c, n);
4566 break;
4567 case not_test:
4568 com_not_test(c, n);
4569 break;
4570 case comparison:
4571 com_comparison(c, n);
4572 break;
4573 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004574 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004575 break;
4576 case expr:
4577 com_expr(c, n);
4578 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004579 case xor_expr:
4580 com_xor_expr(c, n);
4581 break;
4582 case and_expr:
4583 com_and_expr(c, n);
4584 break;
4585 case shift_expr:
4586 com_shift_expr(c, n);
4587 break;
4588 case arith_expr:
4589 com_arith_expr(c, n);
4590 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004591 case term:
4592 com_term(c, n);
4593 break;
4594 case factor:
4595 com_factor(c, n);
4596 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004597 case power:
4598 com_power(c, n);
4599 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004600 case atom:
4601 com_atom(c, n);
4602 break;
4603
4604 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004605 com_error(c, PyExc_SystemError,
4606 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004607 }
4608}
4609
Tim Petersdbd9ba62000-07-09 03:09:57 +00004610static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004611
4612static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004613com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004614{
4615 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4616 if (TYPE(CHILD(n, 0)) == LPAR)
4617 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004618 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004620 com_pop(c, 1);
4621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004622}
4623
4624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004625com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004626{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004627 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004628 if (NCH(n) == 1) {
4629 com_fpdef(c, CHILD(n, 0));
4630 }
4631 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004632 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004633 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004634 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004635 for (i = 0; i < NCH(n); i += 2)
4636 com_fpdef(c, CHILD(n, i));
4637 }
4638}
4639
4640static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004641com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004642{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004643 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004644 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004645 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004646 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004647 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004648 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004649 nch = NCH(n);
4650 /* Enter all arguments in table of locals */
4651 for (i = 0, narg = 0; i < nch; i++) {
4652 node *ch = CHILD(n, i);
4653 node *fp;
4654 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004655 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004656 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4657 fp = CHILD(ch, 0);
4658 if (TYPE(fp) != NAME) {
4659 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4660 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004661 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004662 narg++;
4663 /* all name updates handled by symtable */
4664 if (++i >= nch)
4665 break;
4666 ch = CHILD(n, i);
4667 if (TYPE(ch) == EQUAL)
4668 i += 2;
4669 else
4670 REQ(ch, COMMA);
4671 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004672 if (complex) {
4673 /* Generate code for complex arguments only after
4674 having counted the simple arguments */
4675 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004676 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004677 node *ch = CHILD(n, i);
4678 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004679 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004680 break;
4681 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4682 fp = CHILD(ch, 0);
4683 if (TYPE(fp) != NAME) {
4684 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004685 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004686 com_fpdef(c, ch);
4687 }
4688 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004689 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004690 break;
4691 ch = CHILD(n, i);
4692 if (TYPE(ch) == EQUAL)
4693 i += 2;
4694 else
4695 REQ(ch, COMMA);
4696 }
4697 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004698}
4699
4700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004701com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004702{
4703 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004704 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004705 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004706 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004707 if (doc != NULL) {
4708 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004709 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004710 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004711 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004712 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004713 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004714 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004715 for (i = 0; i < NCH(n); i++) {
4716 node *ch = CHILD(n, i);
4717 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4718 com_node(c, ch);
4719 }
4720}
4721
4722/* Top-level compile-node interface */
4723
4724static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004725compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004726{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004727 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004728 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004729 REQ(n, funcdef);
4730 /* -6 -5 -4 -3 -2 -1
4731 funcdef: [decorators] 'def' NAME parameters ':' suite */
4732 c->c_name = STR(RCHILD(n, -4));
4733 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004734 if (doc != NULL) {
4735 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004736 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004737 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004738 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004739 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004740 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004741 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004742 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004743 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004744 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004745 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004746 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004747 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004748 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4749 com_push(c, 1);
4750 com_addbyte(c, RETURN_VALUE);
4751 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004752}
4753
4754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004755compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004756{
Guido van Rossum590baa41993-11-30 13:40:46 +00004757 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004758 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004759 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004760
4761 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004762 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004763 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004764 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004765 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004766 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004767 else
4768 ch = CHILD(n, 2);
4769 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004770 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004771 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004772}
4773
4774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004775compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004776{
4777 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004778 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004779 REQ(n, classdef);
4780 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4781 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004782 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004783 /* Initialize local __module__ from global __name__ */
4784 com_addop_name(c, LOAD_GLOBAL, "__name__");
4785 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004786 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004787 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004788 if (doc != NULL) {
4789 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004790 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004791 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004792 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004793 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004794 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004795 }
4796 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004797 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004798 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004799 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004800 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004801 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004802 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004803 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004804}
4805
4806static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004807compile_generator_expression(struct compiling *c, node *n)
4808{
4809 /* testlist_gexp: test gen_for */
4810 /* argument: test gen_for */
4811 REQ(CHILD(n, 0), test);
4812 REQ(CHILD(n, 1), gen_for);
4813
4814 c->c_name = "<generator expression>";
4815 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4816
4817 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4818 com_push(c, 1);
4819 com_addbyte(c, RETURN_VALUE);
4820 com_pop(c, 1);
4821}
4822
4823static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004824compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004825{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004826 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004827
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004828 switch (TYPE(n)) {
4829
Guido van Rossum4c417781991-01-21 16:09:22 +00004830 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004831 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004832 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004833 n = CHILD(n, 0);
4834 if (TYPE(n) != NEWLINE)
4835 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004836 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004837 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4838 com_push(c, 1);
4839 com_addbyte(c, RETURN_VALUE);
4840 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004841 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004842 break;
4843
Guido van Rossum4c417781991-01-21 16:09:22 +00004844 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004845 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004846 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004847 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4848 com_push(c, 1);
4849 com_addbyte(c, RETURN_VALUE);
4850 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004851 break;
4852
Guido van Rossum590baa41993-11-30 13:40:46 +00004853 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004854 com_node(c, CHILD(n, 0));
4855 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004856 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004857 break;
4858
Guido van Rossum590baa41993-11-30 13:40:46 +00004859 case lambdef: /* anonymous function definition */
4860 compile_lambdef(c, n);
4861 break;
4862
Guido van Rossum4c417781991-01-21 16:09:22 +00004863 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004864 compile_funcdef(c, n);
4865 break;
4866
Guido van Rossum4c417781991-01-21 16:09:22 +00004867 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004868 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004869 break;
4870
Raymond Hettinger354433a2004-05-19 08:20:33 +00004871 case testlist_gexp: /* A generator expression */
4872 case argument: /* A generator expression */
4873 compile_generator_expression(c, n);
4874 break;
4875
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004876 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004877 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004878 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004879 }
4880}
4881
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004882static PyObject *
4883dict_keys_inorder(PyObject *dict, int offset)
4884{
4885 PyObject *tuple, *k, *v;
4886 int i, pos = 0, size = PyDict_Size(dict);
4887
4888 tuple = PyTuple_New(size);
4889 if (tuple == NULL)
4890 return NULL;
4891 while (PyDict_Next(dict, &pos, &k, &v)) {
4892 i = PyInt_AS_LONG(v);
4893 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004894 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004895 PyTuple_SET_ITEM(tuple, i - offset, k);
4896 }
4897 return tuple;
4898}
4899
Guido van Rossum79f25d91997-04-29 20:08:16 +00004900PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004901PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004902{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004903 return PyNode_CompileFlags(n, filename, NULL);
4904}
4905
4906PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004907PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004908{
4909 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004910}
4911
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004912struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004913PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004914{
4915 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004916 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004917
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004918 ff = PyNode_Future(n, filename);
4919 if (ff == NULL)
4920 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004921 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004922 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004923 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004924 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004925 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004926 return st;
4927}
4928
Guido van Rossum79f25d91997-04-29 20:08:16 +00004929static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004930icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004931{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004932 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004933}
4934
Guido van Rossum79f25d91997-04-29 20:08:16 +00004935static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004936jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004937 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004938{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004939 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004940 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004941 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004942 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004943 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4944 sc.c_encoding = "utf-8";
4945 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004946 sc.c_encoding = STR(n);
4947 n = CHILD(n, 0);
4948 } else {
4949 sc.c_encoding = NULL;
4950 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004952 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004953 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004954 /* c_symtable still points to parent's symbols */
4955 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004956 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004958 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004959 if (base->c_encoding != NULL) {
4960 assert(sc.c_encoding == NULL);
4961 sc.c_encoding = base->c_encoding;
4962 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004964 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004965 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004966 if (sc.c_future == NULL) {
4967 com_free(&sc);
4968 return NULL;
4969 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004970 if (flags) {
4971 int merged = sc.c_future->ff_features |
4972 flags->cf_flags;
4973 sc.c_future->ff_features = merged;
4974 flags->cf_flags = merged;
4975 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004976 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4977 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004978 com_free(&sc);
4979 return NULL;
4980 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004981 /* reset symbol table for second pass */
4982 sc.c_symtable->st_nscopes = 1;
4983 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004984 }
4985 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004986 if (symtable_load_symbols(&sc) < 0) {
4987 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004989 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004990 compile_node(&sc, n);
4991 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004992 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004993 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004994 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004995 names = PyList_AsTuple(sc.c_names);
4996 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004997 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4998 freevars = dict_keys_inorder(sc.c_freevars,
4999 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005000 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005001 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005002 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5003 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005004 if (!PyErr_Occurred())
5005 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005006 sc.c_nlocals,
5007 sc.c_maxstacklevel,
5008 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005009 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005010 consts,
5011 names,
5012 varnames,
5013 freevars,
5014 cellvars,
5015 filename,
5016 name,
5017 sc.c_firstlineno,
5018 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005019 Py_XDECREF(consts);
5020 Py_XDECREF(names);
5021 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022 Py_XDECREF(freevars);
5023 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005024 Py_XDECREF(filename);
5025 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005026 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005027 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005028 else if (!PyErr_Occurred()) {
5029 /* This could happen if someone called PyErr_Clear() after an
5030 error was reported above. That's not supposed to happen,
5031 but I just plugged one case and I'm not sure there can't be
5032 others. In that case, raise SystemError so that at least
5033 it gets reported instead dumping core. */
5034 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5035 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005037 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005038 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005039 sc.c_symtable = NULL;
5040 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005041 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005042 return co;
5043}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005044
5045int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005046PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005047{
5048 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005049 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005050 int line = co->co_firstlineno;
5051 int addr = 0;
5052 while (--size >= 0) {
5053 addr += *p++;
5054 if (addr > addrq)
5055 break;
5056 line += *p++;
5057 }
5058 return line;
5059}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005060
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005061/* The test for LOCAL must come before the test for FREE in order to
5062 handle classes where name is both local and free. The local var is
5063 a method and the free var is a free var referenced within a method.
5064*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065
5066static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005067get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005068{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005069 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005070 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005071
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005072 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5073 return CELL;
5074 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5075 return LOCAL;
5076 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5077 return FREE;
5078 v = PyDict_GetItemString(c->c_globals, name);
5079 if (v) {
5080 if (v == Py_None)
5081 return GLOBAL_EXPLICIT;
5082 else {
5083 return GLOBAL_IMPLICIT;
5084 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005086 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005087 "unknown scope for %.100s in %.100s(%s) "
5088 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5089 name, c->c_name,
5090 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5091 c->c_filename,
5092 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5093 PyObject_REPR(c->c_locals),
5094 PyObject_REPR(c->c_globals)
5095 );
5096
5097 Py_FatalError(buf);
5098 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005099}
5100
Guido van Rossum207fda62001-03-02 03:30:41 +00005101/* Helper functions to issue warnings */
5102
5103static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005104issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005105{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005106 if (PyErr_Occurred()) {
5107 /* This can happen because symtable_node continues
5108 processing even after raising a SyntaxError.
5109 Calling PyErr_WarnExplicit now would clobber the
5110 pending exception; instead we fail and let that
5111 exception propagate.
5112 */
5113 return -1;
5114 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005115 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5116 lineno, NULL, NULL) < 0) {
5117 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5118 PyErr_SetString(PyExc_SyntaxError, msg);
5119 PyErr_SyntaxLocation(filename, lineno);
5120 }
5121 return -1;
5122 }
5123 return 0;
5124}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005125
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005126static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005127symtable_warn(struct symtable *st, char *msg)
5128{
Guido van Rossum207fda62001-03-02 03:30:41 +00005129 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005130 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005131 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005132 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005133 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005134}
5135
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005136/* Helper function for setting lineno and filename */
5137
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005138static struct symtable *
5139symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005141 struct symtable *st;
5142
5143 st = symtable_init();
5144 if (st == NULL)
5145 return NULL;
5146 st->st_future = ff;
5147 st->st_filename = filename;
5148 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5149 if (st->st_errors > 0)
5150 goto fail;
5151 symtable_node(st, n);
5152 if (st->st_errors > 0)
5153 goto fail;
5154 return st;
5155 fail:
5156 if (!PyErr_Occurred()) {
5157 /* This could happen because after a syntax error is
5158 detected, the symbol-table-building continues for
5159 a while, and PyErr_Clear() might erroneously be
5160 called during that process. One such case has been
5161 fixed, but there might be more (now or later).
5162 */
5163 PyErr_SetString(PyExc_SystemError, "lost exception");
5164 }
5165 st->st_future = NULL;
5166 st->st_filename = NULL;
5167 PySymtable_Free(st);
5168 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005169}
5170
5171static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005172symtable_init_compiling_symbols(struct compiling *c)
5173{
5174 PyObject *varnames;
5175
5176 varnames = c->c_symtable->st_cur->ste_varnames;
5177 if (varnames == NULL) {
5178 varnames = PyList_New(0);
5179 if (varnames == NULL)
5180 return -1;
5181 c->c_symtable->st_cur->ste_varnames = varnames;
5182 Py_INCREF(varnames);
5183 } else
5184 Py_INCREF(varnames);
5185 c->c_varnames = varnames;
5186
5187 c->c_globals = PyDict_New();
5188 if (c->c_globals == NULL)
5189 return -1;
5190 c->c_freevars = PyDict_New();
5191 if (c->c_freevars == NULL)
5192 return -1;
5193 c->c_cellvars = PyDict_New();
5194 if (c->c_cellvars == NULL)
5195 return -1;
5196 return 0;
5197}
5198
5199struct symbol_info {
5200 int si_nlocals;
5201 int si_ncells;
5202 int si_nfrees;
5203 int si_nimplicit;
5204};
5205
5206static void
5207symtable_init_info(struct symbol_info *si)
5208{
5209 si->si_nlocals = 0;
5210 si->si_ncells = 0;
5211 si->si_nfrees = 0;
5212 si->si_nimplicit = 0;
5213}
5214
5215static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005216symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005217 struct symbol_info *si)
5218{
5219 PyObject *dict, *v;
5220
5221 /* Seperate logic for DEF_FREE. If it occurs in a function,
5222 it indicates a local that we must allocate storage for (a
5223 cell var). If it occurs in a class, then the class has a
5224 method and a free variable with the same name.
5225 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005226 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005227 /* If it isn't declared locally, it can't be a cell. */
5228 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5229 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005230 v = PyInt_FromLong(si->si_ncells++);
5231 dict = c->c_cellvars;
5232 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005233 /* If it is free anyway, then there is no need to do
5234 anything here.
5235 */
5236 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005237 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005238 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005239 v = PyInt_FromLong(si->si_nfrees++);
5240 dict = c->c_freevars;
5241 }
5242 if (v == NULL)
5243 return -1;
5244 if (PyDict_SetItem(dict, name, v) < 0) {
5245 Py_DECREF(v);
5246 return -1;
5247 }
5248 Py_DECREF(v);
5249 return 0;
5250}
5251
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005252/* If a variable is a cell and an argument, make sure that appears in
5253 co_cellvars before any variable to its right in varnames.
5254*/
5255
5256
5257static int
5258symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5259 PyObject *varnames, int flags)
5260{
Tim Petersb39903b2003-03-24 17:22:24 +00005261 PyObject *v = NULL;
5262 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005263 int i, pos;
5264
5265 if (flags & CO_VARARGS)
5266 argcount++;
5267 if (flags & CO_VARKEYWORDS)
5268 argcount++;
5269 for (i = argcount; --i >= 0; ) {
5270 v = PyList_GET_ITEM(varnames, i);
5271 if (PyDict_GetItem(*cellvars, v)) {
5272 if (list == NULL) {
5273 list = PyList_New(1);
5274 if (list == NULL)
5275 return -1;
5276 PyList_SET_ITEM(list, 0, v);
5277 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005278 } else {
5279 if (PyList_Insert(list, 0, v) < 0) {
5280 Py_DECREF(list);
5281 return -1;
5282 }
5283 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005284 }
5285 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005286 if (list == NULL)
5287 return 0;
5288
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005289 /* There are cellvars that are also arguments. Create a dict
5290 to replace cellvars and put the args at the front.
5291 */
5292 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005293 if (d == NULL)
5294 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005295 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5296 v = PyInt_FromLong(i);
5297 if (v == NULL)
5298 goto fail;
5299 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5300 goto fail;
5301 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5302 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005303 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005304 }
5305 pos = 0;
5306 i = PyList_GET_SIZE(list);
5307 Py_DECREF(list);
5308 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5309 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005310 if (w == NULL)
5311 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005312 if (PyDict_SetItem(d, v, w) < 0) {
5313 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005314 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005315 goto fail;
5316 }
5317 Py_DECREF(w);
5318 }
5319 Py_DECREF(*cellvars);
5320 *cellvars = d;
5321 return 1;
5322 fail:
5323 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005324 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005325 return -1;
5326}
5327
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005328static int
5329symtable_freevar_offsets(PyObject *freevars, int offset)
5330{
5331 PyObject *name, *v;
5332 int pos;
5333
5334 /* The cell vars are the first elements of the closure,
5335 followed by the free vars. Update the offsets in
5336 c_freevars to account for number of cellvars. */
5337 pos = 0;
5338 while (PyDict_Next(freevars, &pos, &name, &v)) {
5339 int i = PyInt_AS_LONG(v) + offset;
5340 PyObject *o = PyInt_FromLong(i);
5341 if (o == NULL)
5342 return -1;
5343 if (PyDict_SetItem(freevars, name, o) < 0) {
5344 Py_DECREF(o);
5345 return -1;
5346 }
5347 Py_DECREF(o);
5348 }
5349 return 0;
5350}
5351
5352static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005353symtable_check_unoptimized(struct compiling *c,
5354 PySymtableEntryObject *ste,
5355 struct symbol_info *si)
5356{
5357 char buf[300];
5358
5359 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5360 || (ste->ste_nested && si->si_nimplicit)))
5361 return 0;
5362
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005363#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5364
5365#define ILLEGAL_IS "is a nested function"
5366
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005367#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005368"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005369
5370#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005371"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005372
5373#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005374"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005375"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005376
5377 /* XXX perhaps the linenos for these opt-breaking statements
5378 should be stored so the exception can point to them. */
5379
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005380 if (ste->ste_child_free) {
5381 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005382 PyOS_snprintf(buf, sizeof(buf),
5383 ILLEGAL_IMPORT_STAR,
5384 PyString_AS_STRING(ste->ste_name),
5385 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005386 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005387 PyOS_snprintf(buf, sizeof(buf),
5388 ILLEGAL_BARE_EXEC,
5389 PyString_AS_STRING(ste->ste_name),
5390 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005391 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005392 PyOS_snprintf(buf, sizeof(buf),
5393 ILLEGAL_EXEC_AND_IMPORT_STAR,
5394 PyString_AS_STRING(ste->ste_name),
5395 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005396 }
5397 } else {
5398 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005399 PyOS_snprintf(buf, sizeof(buf),
5400 ILLEGAL_IMPORT_STAR,
5401 PyString_AS_STRING(ste->ste_name),
5402 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005403 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005404 PyOS_snprintf(buf, sizeof(buf),
5405 ILLEGAL_BARE_EXEC,
5406 PyString_AS_STRING(ste->ste_name),
5407 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005408 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005409 PyOS_snprintf(buf, sizeof(buf),
5410 ILLEGAL_EXEC_AND_IMPORT_STAR,
5411 PyString_AS_STRING(ste->ste_name),
5412 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005413 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005414 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005415
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005416 PyErr_SetString(PyExc_SyntaxError, buf);
5417 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5418 ste->ste_opt_lineno);
5419 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005420}
5421
5422static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005423symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5424 struct symbol_info *si)
5425{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005426 if (c->c_future)
5427 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005428 if (ste->ste_generator)
5429 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005430 if (ste->ste_type != TYPE_MODULE)
5431 c->c_flags |= CO_NEWLOCALS;
5432 if (ste->ste_type == TYPE_FUNCTION) {
5433 c->c_nlocals = si->si_nlocals;
5434 if (ste->ste_optimized == 0)
5435 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005436 else if (ste->ste_optimized != OPT_EXEC)
5437 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005438 }
5439 return 0;
5440}
5441
5442static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005443symtable_error(struct symtable *st, int lineno)
5444{
5445 if (lineno == 0)
5446 lineno = st->st_cur->ste_lineno;
5447 PyErr_SyntaxLocation(st->st_filename, lineno);
5448 st->st_errors++;
5449 return -1;
5450}
5451
5452static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005453symtable_load_symbols(struct compiling *c)
5454{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005455 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005456 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005457 PyObject *name, *varnames, *v;
5458 int i, flags, pos;
5459 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005461 v = NULL;
5462
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005463 if (symtable_init_compiling_symbols(c) < 0)
5464 goto fail;
5465 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005466 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005467 si.si_nlocals = PyList_GET_SIZE(varnames);
5468 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005469
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005470 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005471 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005472 if (v == NULL)
5473 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 if (PyDict_SetItem(c->c_locals,
5475 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005476 goto fail;
5477 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 }
5479
5480 /* XXX The cases below define the rules for whether a name is
5481 local or global. The logic could probably be clearer. */
5482 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005483 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5484 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005485
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005486 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005487 /* undo the original DEF_FREE */
5488 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005489
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005490 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005491 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005492 2. Free variables in methods that are also class
5493 variables or declared global.
5494 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005495 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005496 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005498 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 c->c_argcount--;
5500 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005501 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005502 c->c_argcount--;
5503 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005506 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005507 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005508 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005509 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005510 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005511 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5514 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005515 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005516 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005517 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005518 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005519 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005520 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005521 if (v == NULL)
5522 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005523 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005524 goto fail;
5525 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005526 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005527 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005529 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005530 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005531 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005532 if (v == NULL)
5533 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005534 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005535 goto fail;
5536 Py_DECREF(v);
5537 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005538 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005539 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005540 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005541 goto fail;
5542 if (st->st_nscopes != 1) {
5543 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005544 if (v == NULL)
5545 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005546 if (PyDict_SetItem(st->st_global,
5547 name, v))
5548 goto fail;
5549 Py_DECREF(v);
5550 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005551 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005552 }
5553 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005554 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5555
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005556 if (si.si_ncells > 1) { /* one cell is always in order */
5557 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5558 c->c_varnames, c->c_flags) < 0)
5559 return -1;
5560 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005561 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5562 return -1;
5563 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005564 fail:
5565 /* is this always the right thing to do? */
5566 Py_XDECREF(v);
5567 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005568}
5569
5570static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005571symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572{
5573 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005575 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005576 if (st == NULL)
5577 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005578 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005579
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005580 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005581 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005582 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583 goto fail;
5584 if ((st->st_symbols = PyDict_New()) == NULL)
5585 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005587 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005588 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589 st->st_private = NULL;
5590 return st;
5591 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005592 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005593 return NULL;
5594}
5595
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005596void
5597PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598{
5599 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005601 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005602 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603}
5604
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005605/* When the compiler exits a scope, it must should update the scope's
5606 free variable information with the list of free variables in its
5607 children.
5608
5609 Variables that are free in children and defined in the current
5610 scope are cellvars.
5611
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005612 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005613 false), free variables in children that are not defined here are
5614 implicit globals.
5615
5616*/
5617
5618static int
5619symtable_update_free_vars(struct symtable *st)
5620{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005621 int i, j, def;
5622 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005623 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005625 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626 def = DEF_FREE_CLASS;
5627 else
5628 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005629 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005630 int pos = 0;
5631
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005632 if (list && PyList_SetSlice(list, 0,
5633 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005634 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005635 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005636 PyList_GET_ITEM(ste->ste_children, i);
5637 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005638 int flags = PyInt_AS_LONG(o);
5639 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005640 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005641 if (list == NULL) {
5642 list = PyList_New(0);
5643 if (list == NULL)
5644 return -1;
5645 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005646 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005647 if (PyList_Append(list, name) < 0) {
5648 Py_DECREF(list);
5649 return -1;
5650 }
5651 }
5652 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005653 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005654 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005655 v = PyDict_GetItem(ste->ste_symbols, name);
5656 /* If a name N is declared global in scope A and
5657 referenced in scope B contained (perhaps
5658 indirectly) in A and there are no scopes
5659 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005660 is global in B. Unless A is a class scope,
5661 because class scopes are not considered for
5662 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005663 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005664 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005665 int flags = PyInt_AS_LONG(v);
5666 if (flags & DEF_GLOBAL) {
5667 symtable_undo_free(st, child->ste_id,
5668 name);
5669 continue;
5670 }
5671 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005672 if (ste->ste_nested) {
5673 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005674 name, def) < 0) {
5675 Py_DECREF(list);
5676 return -1;
5677 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005680 name) < 0) {
5681 Py_DECREF(list);
5682 return -1;
5683 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684 }
5685 }
5686 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005687
5688 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 return 0;
5690}
5691
5692/* If the current scope is a non-nested class or if name is not
5693 defined in the current, non-nested scope, then it is an implicit
5694 global in all nested scopes.
5695*/
5696
5697static int
5698symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5699{
5700 PyObject *o;
5701 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005702 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005703
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005704 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005705 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005706 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005707 if (o == NULL)
5708 return symtable_undo_free(st, child, name);
5709 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005710
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005711 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005712 return symtable_undo_free(st, child, name);
5713 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005714 return symtable_add_def_o(st, ste->ste_symbols,
5715 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716}
5717
5718static int
5719symtable_undo_free(struct symtable *st, PyObject *id,
5720 PyObject *name)
5721{
5722 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005723 PyObject *info;
5724 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005725
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005726 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5727 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005729
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005730 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 if (info == NULL)
5732 return 0;
5733 v = PyInt_AS_LONG(info);
5734 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005735 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005736 DEF_FREE_GLOBAL) < 0)
5737 return -1;
5738 } else
5739 /* If the name is defined here or declared global,
5740 then the recursion stops. */
5741 return 0;
5742
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005743 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5744 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005745 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005746 PyList_GET_ITEM(ste->ste_children, i);
5747 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005748 if (x < 0)
5749 return x;
5750 }
5751 return 0;
5752}
5753
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005754/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5755 This reference is released when the scope is exited, via the DECREF
5756 in symtable_exit_scope().
5757*/
5758
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005759static int
5760symtable_exit_scope(struct symtable *st)
5761{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005762 int end;
5763
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005764 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005766 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005768 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5769 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 if (PySequence_DelItem(st->st_stack, end) < 0)
5771 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005772 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005774
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005775static void
5776symtable_enter_scope(struct symtable *st, char *name, int type,
5777 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005778{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005779 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005780
5781 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005782 prev = st->st_cur;
5783 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005784 st->st_errors++;
5785 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005786 }
5787 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005788 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005789 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005790 if (st->st_cur == NULL) {
5791 st->st_errors++;
5792 return;
5793 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005794 if (strcmp(name, TOP) == 0)
5795 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005796 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005797 if (PyList_Append(prev->ste_children,
5798 (PyObject *)st->st_cur) < 0)
5799 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005800 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801}
5802
5803static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005804symtable_lookup(struct symtable *st, char *name)
5805{
5806 char buffer[MANGLE_LEN];
5807 PyObject *v;
5808 int flags;
5809
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005810 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005811 name = buffer;
5812 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5813 if (v == NULL) {
5814 if (PyErr_Occurred())
5815 return -1;
5816 else
5817 return 0;
5818 }
5819
5820 flags = PyInt_AS_LONG(v);
5821 return flags;
5822}
5823
5824static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005825symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005826{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005828 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005829 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005830
Guido van Rossumb7164622002-08-16 02:48:11 +00005831 /* Warn about None, except inside a tuple (where the assignment
5832 code already issues a warning). */
5833 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5834 *name == 'N' && strcmp(name, "None") == 0)
5835 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005836 PyErr_SetString(PyExc_SyntaxError,
5837 "Invalid syntax. Assignment to None.");
5838 symtable_error(st, 0);
5839 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005840 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005841 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 name = buffer;
5843 if ((s = PyString_InternFromString(name)) == NULL)
5844 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005845 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5846 Py_DECREF(s);
5847 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005848}
5849
5850/* Must only be called with mangled names */
5851
5852static int
5853symtable_add_def_o(struct symtable *st, PyObject *dict,
5854 PyObject *name, int flag)
5855{
5856 PyObject *o;
5857 int val;
5858
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005859 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005860 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005861 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005862 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005863 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005864 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005865 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005866 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005867 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005868 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005869 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005870 if (o == NULL)
5871 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005872 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005873 Py_DECREF(o);
5874 return -1;
5875 }
5876 Py_DECREF(o);
5877
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005878 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005879 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005880 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005881 } else if (flag & DEF_GLOBAL) {
5882 /* XXX need to update DEF_GLOBAL for other flags too;
5883 perhaps only DEF_FREE_GLOBAL */
5884 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005885 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005886 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005887 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005888 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005889 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005890 if (o == NULL)
5891 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005892 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005893 Py_DECREF(o);
5894 return -1;
5895 }
5896 Py_DECREF(o);
5897 }
5898 return 0;
5899}
5900
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005901#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005902
Tim Peters08a898f2001-06-28 01:52:22 +00005903/* Look for a yield stmt under n. Return 1 if found, else 0.
5904 This hack is used to look inside "if 0:" blocks (which are normally
5905 ignored) in case those are the only places a yield occurs (so that this
5906 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005907static int
5908look_for_yield(node *n)
5909{
5910 int i;
5911
5912 for (i = 0; i < NCH(n); ++i) {
5913 node *kid = CHILD(n, i);
5914
5915 switch (TYPE(kid)) {
5916
5917 case classdef:
5918 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005919 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005920 /* Stuff in nested functions and classes can't make
5921 the parent a generator. */
5922 return 0;
5923
5924 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005925 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005926
5927 default:
5928 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005929 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005930 }
5931 }
5932 return 0;
5933}
5934
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935static void
5936symtable_node(struct symtable *st, node *n)
5937{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005938 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005939
5940 loop:
5941 switch (TYPE(n)) {
5942 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005943 char *func_name;
5944 if (NCH(n) == 6)
5945 symtable_node(st, CHILD(n, 0));
5946 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005947 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005948 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005949 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005950 symtable_funcdef(st, n);
5951 symtable_exit_scope(st);
5952 break;
5953 }
5954 case lambdef:
5955 if (NCH(n) == 4)
5956 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005957 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005958 symtable_funcdef(st, n);
5959 symtable_exit_scope(st);
5960 break;
5961 case classdef: {
5962 char *tmp, *class_name = STR(CHILD(n, 1));
5963 symtable_add_def(st, class_name, DEF_LOCAL);
5964 if (TYPE(CHILD(n, 2)) == LPAR) {
5965 node *bases = CHILD(n, 3);
5966 int i;
5967 for (i = 0; i < NCH(bases); i += 2) {
5968 symtable_node(st, CHILD(bases, i));
5969 }
5970 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005971 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005972 tmp = st->st_private;
5973 st->st_private = class_name;
5974 symtable_node(st, CHILD(n, NCH(n) - 1));
5975 st->st_private = tmp;
5976 symtable_exit_scope(st);
5977 break;
5978 }
5979 case if_stmt:
5980 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005981 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5982 if (st->st_cur->ste_generator == 0)
5983 st->st_cur->ste_generator =
5984 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005985 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005986 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005987 symtable_node(st, CHILD(n, i + 1));
5988 symtable_node(st, CHILD(n, i + 3));
5989 }
5990 if (i + 2 < NCH(n))
5991 symtable_node(st, CHILD(n, i + 2));
5992 break;
5993 case global_stmt:
5994 symtable_global(st, n);
5995 break;
5996 case import_stmt:
5997 symtable_import(st, n);
5998 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005999 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006000 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006001 symtable_node(st, CHILD(n, 1));
6002 if (NCH(n) > 2)
6003 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006004 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006005 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006006 st->st_cur->ste_opt_lineno = n->n_lineno;
6007 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006008 if (NCH(n) > 4)
6009 symtable_node(st, CHILD(n, 5));
6010 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006011
6012 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006013 case assert_stmt:
6014 if (Py_OptimizeFlag)
6015 return;
6016 if (NCH(n) == 2) {
6017 n = CHILD(n, 1);
6018 goto loop;
6019 } else {
6020 symtable_node(st, CHILD(n, 1));
6021 n = CHILD(n, 3);
6022 goto loop;
6023 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006024 case except_clause:
6025 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006026 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006027 if (NCH(n) > 1) {
6028 n = CHILD(n, 1);
6029 goto loop;
6030 }
6031 break;
6032 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006033 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006035 case yield_stmt:
6036 st->st_cur->ste_generator = 1;
6037 n = CHILD(n, 1);
6038 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006039 case expr_stmt:
6040 if (NCH(n) == 1)
6041 n = CHILD(n, 0);
6042 else {
6043 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006044 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045 symtable_node(st, CHILD(n, 2));
6046 break;
6047 } else {
6048 int i;
6049 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006050 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006051 n = CHILD(n, NCH(n) - 1);
6052 }
6053 }
6054 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006055 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006056 /* only occurs when there are multiple for loops
6057 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006058 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006059 if (TYPE(n) == list_for)
6060 symtable_list_for(st, n);
6061 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006062 REQ(n, list_if);
6063 symtable_node(st, CHILD(n, 1));
6064 if (NCH(n) == 3) {
6065 n = CHILD(n, 2);
6066 goto loop;
6067 }
6068 }
6069 break;
6070 case for_stmt:
6071 symtable_assign(st, CHILD(n, 1), 0);
6072 for (i = 3; i < NCH(n); ++i)
6073 if (TYPE(CHILD(n, i)) >= single_input)
6074 symtable_node(st, CHILD(n, i));
6075 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006076 case arglist:
6077 if (NCH(n) > 1)
6078 for (i = 0; i < NCH(n); ++i) {
6079 node *ch = CHILD(n, i);
6080 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6081 TYPE(CHILD(ch, 1)) == gen_for) {
6082 PyErr_SetString(PyExc_SyntaxError,
6083 "invalid syntax");
6084 symtable_error(st, n->n_lineno);
6085 return;
6086 }
6087 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006088 /* The remaining cases fall through to default except in
6089 special circumstances. This requires the individual cases
6090 to be coded with great care, even though they look like
6091 rather innocuous. Each case must double-check TYPE(n).
6092 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006093 case decorator:
6094 if (TYPE(n) == decorator) {
6095 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6096 node *name, *varname;
6097 name = CHILD(n, 1);
6098 REQ(name, dotted_name);
6099 varname = CHILD(name, 0);
6100 REQ(varname, NAME);
6101 symtable_add_use(st, STR(varname));
6102 }
6103 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006104 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006105 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006106 n = CHILD(n, 2);
6107 goto loop;
6108 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006109 else if (TYPE(n) == argument && NCH(n) == 2 &&
6110 TYPE(CHILD(n, 1)) == gen_for) {
6111 symtable_generator_expression(st, n);
6112 break;
6113 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006114 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006115 case listmaker:
6116 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006117 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006118 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006119 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006120 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006121 case testlist_gexp:
6122 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6123 symtable_generator_expression(st, n);
6124 break;
6125 }
6126 /* fall through */
6127
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 case atom:
6129 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6130 symtable_add_use(st, STR(CHILD(n, 0)));
6131 break;
6132 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006133 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006135 /* Walk over every non-token child with a special case
6136 for one child.
6137 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006138 if (NCH(n) == 1) {
6139 n = CHILD(n, 0);
6140 goto loop;
6141 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006142 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006143 if (TYPE(CHILD(n, i)) >= single_input)
6144 symtable_node(st, CHILD(n, i));
6145 }
6146}
6147
6148static void
6149symtable_funcdef(struct symtable *st, node *n)
6150{
6151 node *body;
6152
6153 if (TYPE(n) == lambdef) {
6154 if (NCH(n) == 4)
6155 symtable_params(st, CHILD(n, 1));
6156 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006157 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006158 body = CHILD(n, NCH(n) - 1);
6159 symtable_node(st, body);
6160}
6161
6162/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006163 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006164 which are references in the defining scope. symtable_params()
6165 parses the parameter names, which are defined in the function's
6166 body.
6167
6168 varargslist:
6169 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6170 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6171*/
6172
6173static void
6174symtable_default_args(struct symtable *st, node *n)
6175{
6176 node *c;
6177 int i;
6178
6179 if (TYPE(n) == parameters) {
6180 n = CHILD(n, 1);
6181 if (TYPE(n) == RPAR)
6182 return;
6183 }
6184 REQ(n, varargslist);
6185 for (i = 0; i < NCH(n); i += 2) {
6186 c = CHILD(n, i);
6187 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6188 break;
6189 }
6190 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6191 symtable_node(st, CHILD(n, i));
6192 }
6193}
6194
6195static void
6196symtable_params(struct symtable *st, node *n)
6197{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006198 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006199 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200
6201 if (TYPE(n) == parameters) {
6202 n = CHILD(n, 1);
6203 if (TYPE(n) == RPAR)
6204 return;
6205 }
6206 REQ(n, varargslist);
6207 for (i = 0; i < NCH(n); i += 2) {
6208 c = CHILD(n, i);
6209 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6210 ext = 1;
6211 break;
6212 }
6213 if (TYPE(c) == test) {
6214 continue;
6215 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006216 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006217 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006218 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006219 char nbuf[30];
6220 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006222 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006223 }
6224 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006225 if (ext) {
6226 c = CHILD(n, i);
6227 if (TYPE(c) == STAR) {
6228 i++;
6229 symtable_add_def(st, STR(CHILD(n, i)),
6230 DEF_PARAM | DEF_STAR);
6231 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006232 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006233 c = NULL;
6234 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006235 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006236 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006237 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006238 i++;
6239 symtable_add_def(st, STR(CHILD(n, i)),
6240 DEF_PARAM | DEF_DOUBLESTAR);
6241 }
6242 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006243 if (complex >= 0) {
6244 int j;
6245 for (j = 0; j <= complex; j++) {
6246 c = CHILD(n, j);
6247 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006248 c = CHILD(n, ++j);
6249 else if (TYPE(c) == EQUAL)
6250 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006251 if (TYPE(CHILD(c, 0)) == LPAR)
6252 symtable_params_fplist(st, CHILD(c, 1));
6253 }
6254 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006255}
6256
6257static void
6258symtable_params_fplist(struct symtable *st, node *n)
6259{
6260 int i;
6261 node *c;
6262
6263 REQ(n, fplist);
6264 for (i = 0; i < NCH(n); i += 2) {
6265 c = CHILD(n, i);
6266 REQ(c, fpdef);
6267 if (NCH(c) == 1)
6268 symtable_add_def(st, STR(CHILD(c, 0)),
6269 DEF_PARAM | DEF_INTUPLE);
6270 else
6271 symtable_params_fplist(st, CHILD(c, 1));
6272 }
6273
6274}
6275
6276static void
6277symtable_global(struct symtable *st, node *n)
6278{
6279 int i;
6280
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006281 /* XXX It might be helpful to warn about module-level global
6282 statements, but it's hard to tell the difference between
6283 module-level and a string passed to exec.
6284 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006285
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006286 for (i = 1; i < NCH(n); i += 2) {
6287 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006288 int flags;
6289
6290 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006291 if (flags < 0)
6292 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006293 if (flags && flags != DEF_GLOBAL) {
6294 char buf[500];
6295 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006296 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006297 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006298 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006299 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006300 }
6301 else {
6302 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006303 PyOS_snprintf(buf, sizeof(buf),
6304 GLOBAL_AFTER_ASSIGN,
6305 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006306 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006307 PyOS_snprintf(buf, sizeof(buf),
6308 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006309 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006310 }
6311 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006312 symtable_add_def(st, name, DEF_GLOBAL);
6313 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006314}
6315
6316static void
6317symtable_list_comprehension(struct symtable *st, node *n)
6318{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006319 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006320 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006321
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006322 REQ(n, listmaker);
6323 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6324 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006325 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006326 symtable_list_for(st, CHILD(n, 1));
6327 symtable_node(st, CHILD(n, 0));
6328 --st->st_cur->ste_tmpname;
6329}
6330
6331static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006332symtable_generator_expression(struct symtable *st, node *n)
6333{
6334 /* testlist_gexp: test gen_for */
6335 REQ(CHILD(n, 0), test);
6336 REQ(CHILD(n, 1), gen_for);
6337
6338 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6339 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6340
6341 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6342
6343 symtable_gen_for(st, CHILD(n, 1), 1);
6344 symtable_node(st, CHILD(n, 0));
6345 symtable_exit_scope(st);
6346
6347 /* for outmost iterable precomputation */
6348 symtable_node(st, CHILD(CHILD(n, 1), 3));
6349}
6350
6351static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006352symtable_list_for(struct symtable *st, node *n)
6353{
6354 REQ(n, list_for);
6355 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006356 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006357 symtable_node(st, CHILD(n, 3));
6358 if (NCH(n) == 5)
6359 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006360}
6361
6362static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006363symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6364{
6365 REQ(n, gen_for);
6366
6367 /* gen_for: for v in test [gen_iter] */
6368 symtable_assign(st, CHILD(n, 1), 0);
6369 if (is_outmost)
6370 symtable_add_use(st, "[outmost-iterable]");
6371 else
6372 symtable_node(st, CHILD(n, 3));
6373
6374 if (NCH(n) == 5)
6375 symtable_gen_iter(st, CHILD(n, 4));
6376}
6377
6378static void
6379symtable_gen_iter(struct symtable *st, node *n)
6380{
6381 REQ(n, gen_iter);
6382
6383 n = CHILD(n, 0);
6384 if (TYPE(n) == gen_for)
6385 symtable_gen_for(st, n, 0);
6386 else {
6387 REQ(n, gen_if);
6388 symtable_node(st, CHILD(n, 1));
6389
6390 if (NCH(n) == 3)
6391 symtable_gen_iter(st, CHILD(n, 2));
6392 }
6393}
6394
6395static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006396symtable_import(struct symtable *st, node *n)
6397{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006398 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006399 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006400 /* import_stmt: import_name | import_from */
6401 n = CHILD(n, 0);
6402 if (TYPE(n) == import_from) {
6403 /* import_from: 'from' dotted_name 'import' ('*' |
6404 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006405 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006406 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006407 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6408 /* check for bogus imports */
6409 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6410 PyErr_SetString(PyExc_SyntaxError,
6411 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006412 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006413 return;
6414 }
6415 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006416 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6417 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006418 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006419 if (symtable_warn(st,
6420 "import * only allowed at module level") < 0)
6421 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006422 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006423 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006424 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006425 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006426 REQ(nn, import_as_names);
6427 for (i = 0; i < NCH(nn); i += 2) {
6428 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006429 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006430 symtable_assign(st, CHILD(c, 2),
6431 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006432 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006433 symtable_assign(st, CHILD(c, 0),
6434 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006435 }
6436 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006437 } else {
6438 /* 'import' dotted_as_names */
6439 nn = CHILD(n, 1);
6440 REQ(nn, dotted_as_names);
6441 for (i = 0; i < NCH(nn); i += 2)
6442 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006443 }
6444}
6445
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006446/* The third argument to symatble_assign() is a flag to be passed to
6447 symtable_add_def() if it is eventually called. The flag is useful
6448 to specify the particular type of assignment that should be
6449 recorded, e.g. an assignment caused by import.
6450 */
6451
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006452static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006453symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006454{
6455 node *tmp;
6456 int i;
6457
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006458 loop:
6459 switch (TYPE(n)) {
6460 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006461 /* invalid assignment, e.g. lambda x:x=2. The next
6462 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006463 return;
6464 case power:
6465 if (NCH(n) > 2) {
6466 for (i = 2; i < NCH(n); ++i)
6467 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6468 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006469 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006470 if (NCH(n) > 1) {
6471 symtable_node(st, CHILD(n, 0));
6472 symtable_node(st, CHILD(n, 1));
6473 } else {
6474 n = CHILD(n, 0);
6475 goto loop;
6476 }
6477 return;
6478 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006479 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6480 /* XXX This is an error, but the next pass
6481 will catch it. */
6482 return;
6483 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006484 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006485 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006486 }
6487 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006488 case testlist_gexp:
6489 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6490 /* XXX This is an error, but the next pass
6491 will catch it. */
6492 return;
6493 } else {
6494 for (i = 0; i < NCH(n); i += 2)
6495 symtable_assign(st, CHILD(n, i), def_flag);
6496 }
6497 return;
6498
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006499 case exprlist:
6500 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006501 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006502 if (NCH(n) == 1) {
6503 n = CHILD(n, 0);
6504 goto loop;
6505 }
6506 else {
6507 int i;
6508 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006509 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006510 return;
6511 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006512 case atom:
6513 tmp = CHILD(n, 0);
6514 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6515 n = CHILD(n, 1);
6516 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006517 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006518 if (strcmp(STR(tmp), "__debug__") == 0) {
6519 PyErr_SetString(PyExc_SyntaxError,
6520 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006521 symtable_error(st, n->n_lineno);
6522 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006523 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006524 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006525 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006526 return;
6527 case dotted_as_name:
6528 if (NCH(n) == 3)
6529 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006530 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006531 else
6532 symtable_add_def(st,
6533 STR(CHILD(CHILD(n,
6534 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006535 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006536 return;
6537 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006538 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006539 return;
6540 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006541 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006542 return;
6543 default:
6544 if (NCH(n) == 0)
6545 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006546 if (NCH(n) == 1) {
6547 n = CHILD(n, 0);
6548 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006549 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006550 /* Should only occur for errors like x + 1 = 1,
6551 which will be caught in the next pass. */
6552 for (i = 0; i < NCH(n); ++i)
6553 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006554 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006555 }
6556}