blob: ea325ff0698a48991883ae10973dca6e58e788d2 [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);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003609 for (i = 0; i < NCH(nn); i += 2) {
3610 PyObject *s = PyString_FromString(
3611 STR(CHILD(CHILD(nn, i), 0)));
3612 if (s == NULL) {
3613 Py_CLEAR(tup);
3614 break;
3615 } else
3616 PyTuple_SET_ITEM(tup, i / 2, s);
3617 }
3618 if (tup == NULL) {
3619 /* Assume that failue above was MemoryError */
3620 com_error(c, PyExc_MemoryError, "");
3621 return;
3622 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003623 }
3624 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003625 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003626 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003627 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003628 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003629 com_addbyte(c, IMPORT_STAR);
3630 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003631 for (i = 0; i < NCH(nn); i += 2)
3632 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003633 com_addbyte(c, POP_TOP);
3634 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003635 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636 }
3637 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003638 /* 'import' dotted_as_names */
3639 nn = CHILD(n, 1);
3640 REQ(nn, dotted_as_names);
3641 for (i = 0; i < NCH(nn); i += 2) {
3642 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003643 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003645 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003646 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003647 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003648 int j;
3649 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003650 com_error(c, PyExc_SyntaxError,
3651 "invalid syntax");
3652 return;
3653 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003654 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3655 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003656 CHILD(CHILD(subn, 0),
3657 j));
3658 com_addop_varname(c, VAR_STORE,
3659 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003660 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003661 com_addop_varname(c, VAR_STORE,
3662 STR(CHILD(CHILD(subn, 0),
3663 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665 }
3666 }
3667}
3668
3669static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003670com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003671{
3672 REQ(n, exec_stmt);
3673 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3674 com_node(c, CHILD(n, 1));
3675 if (NCH(n) >= 4)
3676 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003677 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003678 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003679 com_push(c, 1);
3680 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003681 if (NCH(n) >= 6)
3682 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003683 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003684 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003685 com_push(c, 1);
3686 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003687 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003688 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003689}
3690
Guido van Rossum7c531111997-03-11 18:42:21 +00003691static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003692is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003693{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003694 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003695 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003696 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003697
3698 /* Label to avoid tail recursion */
3699 next:
3700 switch (TYPE(n)) {
3701
3702 case suite:
3703 if (NCH(n) == 1) {
3704 n = CHILD(n, 0);
3705 goto next;
3706 }
3707 /* Fall through */
3708 case file_input:
3709 for (i = 0; i < NCH(n); i++) {
3710 node *ch = CHILD(n, i);
3711 if (TYPE(ch) == stmt) {
3712 n = ch;
3713 goto next;
3714 }
3715 }
3716 break;
3717
3718 case stmt:
3719 case simple_stmt:
3720 case small_stmt:
3721 n = CHILD(n, 0);
3722 goto next;
3723
3724 case expr_stmt:
3725 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003726 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003727 case test:
3728 case and_test:
3729 case not_test:
3730 case comparison:
3731 case expr:
3732 case xor_expr:
3733 case and_expr:
3734 case shift_expr:
3735 case arith_expr:
3736 case term:
3737 case factor:
3738 case power:
3739 case atom:
3740 if (NCH(n) == 1) {
3741 n = CHILD(n, 0);
3742 goto next;
3743 }
3744 break;
3745
3746 case NAME:
3747 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3748 return 1;
3749 break;
3750
3751 case NUMBER:
3752 v = parsenumber(c, STR(n));
3753 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 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003762 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003763 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003764 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003765 break;
3766 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003767 i = PyObject_IsTrue(v);
3768 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003769 return i == 0;
3770
3771 }
3772 return 0;
3773}
3774
Tim Peters08a898f2001-06-28 01:52:22 +00003775
3776/* Look under n for a return stmt with an expression.
3777 * This hack is used to find illegal returns under "if 0:" blocks in
3778 * functions already known to be generators (as determined by the symtable
3779 * pass).
3780 * Return the offending return node if found, else NULL.
3781 */
3782static node *
3783look_for_offending_return(node *n)
3784{
3785 int i;
3786
3787 for (i = 0; i < NCH(n); ++i) {
3788 node *kid = CHILD(n, i);
3789
3790 switch (TYPE(kid)) {
3791 case classdef:
3792 case funcdef:
3793 case lambdef:
3794 /* Stuff in nested functions & classes doesn't
3795 affect the code block we started in. */
3796 return NULL;
3797
3798 case return_stmt:
3799 if (NCH(kid) > 1)
3800 return kid;
3801 break;
3802
3803 default: {
3804 node *bad = look_for_offending_return(kid);
3805 if (bad != NULL)
3806 return bad;
3807 }
3808 }
3809 }
3810
3811 return NULL;
3812}
3813
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003814static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003815com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003816{
3817 int i;
3818 int anchor = 0;
3819 REQ(n, if_stmt);
3820 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3821 for (i = 0; i+3 < NCH(n); i+=4) {
3822 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003823 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003824 if (is_constant_false(c, ch)) {
3825 /* We're going to skip this block. However, if this
3826 is a generator, we have to check the dead code
3827 anyway to make sure there aren't any return stmts
3828 with expressions, in the same scope. */
3829 if (c->c_flags & CO_GENERATOR) {
3830 node *p = look_for_offending_return(n);
3831 if (p != NULL) {
3832 int savelineno = c->c_lineno;
3833 c->c_lineno = p->n_lineno;
3834 com_error(c, PyExc_SyntaxError,
3835 "'return' with argument "
3836 "inside generator");
3837 c->c_lineno = savelineno;
3838 }
3839 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003840 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003841 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003842 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003843 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003844 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845 com_addfwref(c, JUMP_IF_FALSE, &a);
3846 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003847 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 com_node(c, CHILD(n, i+3));
3849 com_addfwref(c, JUMP_FORWARD, &anchor);
3850 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003851 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003852 com_addbyte(c, POP_TOP);
3853 }
3854 if (i+2 < NCH(n))
3855 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003856 if (anchor)
3857 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858}
3859
3860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003861com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862{
3863 int break_anchor = 0;
3864 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003865 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003866 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3867 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003868 block_push(c, SETUP_LOOP);
3869 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003870 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871 com_node(c, CHILD(n, 1));
3872 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3873 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003874 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003875 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003876 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003877 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003878 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3879 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003880 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003882 com_addbyte(c, POP_TOP);
3883 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003884 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 if (NCH(n) > 4)
3886 com_node(c, CHILD(n, 6));
3887 com_backpatch(c, break_anchor);
3888}
3889
3890static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003891com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003892{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 int break_anchor = 0;
3894 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003895 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003896 REQ(n, for_stmt);
3897 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3898 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003899 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003900 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003901 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003902 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003903 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003904 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003905 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003906 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003907 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003908 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003909 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003910 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3911 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003912 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003913 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003914 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003915 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916 if (NCH(n) > 8)
3917 com_node(c, CHILD(n, 8));
3918 com_backpatch(c, break_anchor);
3919}
3920
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003921/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003922
3923 SETUP_FINALLY L
3924 <code for S>
3925 POP_BLOCK
3926 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003927 L: <code for Sf>
3928 END_FINALLY
3929
3930 The special instructions use the block stack. Each block
3931 stack entry contains the instruction that created it (here
3932 SETUP_FINALLY), the level of the value stack at the time the
3933 block stack entry was created, and a label (here L).
3934
3935 SETUP_FINALLY:
3936 Pushes the current value stack level and the label
3937 onto the block stack.
3938 POP_BLOCK:
3939 Pops en entry from the block stack, and pops the value
3940 stack until its level is the same as indicated on the
3941 block stack. (The label is ignored.)
3942 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003943 Pops a variable number of entries from the *value* stack
3944 and re-raises the exception they specify. The number of
3945 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003946
3947 The block stack is unwound when an exception is raised:
3948 when a SETUP_FINALLY entry is found, the exception is pushed
3949 onto the value stack (and the exception condition is cleared),
3950 and the interpreter jumps to the label gotten from the block
3951 stack.
3952
3953 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003954 (The contents of the value stack is shown in [], with the top
3955 at the right; 'tb' is trace-back info, 'val' the exception's
3956 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003957
3958 Value stack Label Instruction Argument
3959 [] SETUP_EXCEPT L1
3960 [] <code for S>
3961 [] POP_BLOCK
3962 [] JUMP_FORWARD L0
3963
Guido van Rossum3f5da241990-12-20 15:06:42 +00003964 [tb, val, exc] L1: DUP )
3965 [tb, val, exc, exc] <evaluate E1> )
3966 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3967 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3968 [tb, val, exc, 1] POP )
3969 [tb, val, exc] POP
3970 [tb, val] <assign to V1> (or POP if no V1)
3971 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003972 [] <code for S1>
3973 JUMP_FORWARD L0
3974
Guido van Rossum3f5da241990-12-20 15:06:42 +00003975 [tb, val, exc, 0] L2: POP
3976 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003977 .............................etc.......................
3978
Guido van Rossum3f5da241990-12-20 15:06:42 +00003979 [tb, val, exc, 0] Ln+1: POP
3980 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003981
3982 [] L0: <next statement>
3983
3984 Of course, parts are not generated if Vi or Ei is not present.
3985*/
3986
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003988com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003989{
3990 int except_anchor = 0;
3991 int end_anchor = 0;
3992 int else_anchor = 0;
3993 int i;
3994 node *ch;
3995
3996 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3997 block_push(c, SETUP_EXCEPT);
3998 com_node(c, CHILD(n, 2));
3999 com_addbyte(c, POP_BLOCK);
4000 block_pop(c, SETUP_EXCEPT);
4001 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4002 com_backpatch(c, except_anchor);
4003 for (i = 3;
4004 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4005 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004007 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004008 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004009 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004010 break;
4011 }
4012 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004013 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004014 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004015 if (NCH(ch) > 1) {
4016 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004017 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004018 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004019 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004021 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4022 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004023 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004024 }
4025 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004026 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004027 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004028 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004029 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004030 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004031 com_pop(c, 1);
4032 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004033 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004034 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004035 com_node(c, CHILD(n, i+2));
4036 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4037 if (except_anchor) {
4038 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039 /* We come in with [tb, val, exc, 0] on the
4040 stack; one pop and it's the same as
4041 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004042 com_addbyte(c, POP_TOP);
4043 }
4044 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004045 /* We actually come in here with [tb, val, exc] but the
4046 END_FINALLY will zap those and jump around.
4047 The c_stacklevel does not reflect them so we need not pop
4048 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004049 com_addbyte(c, END_FINALLY);
4050 com_backpatch(c, else_anchor);
4051 if (i < NCH(n))
4052 com_node(c, CHILD(n, i+2));
4053 com_backpatch(c, end_anchor);
4054}
4055
4056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004057com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004058{
4059 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004060 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004061
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004062 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4063 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004065 com_addbyte(c, POP_BLOCK);
4066 block_pop(c, SETUP_FINALLY);
4067 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004068 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004069 /* While the generated code pushes only one item,
4070 the try-finally handling can enter here with
4071 up to three items. OK, here are the details:
4072 3 for an exception, 2 for RETURN, 1 for BREAK. */
4073 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004074 com_backpatch(c, finally_anchor);
4075 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004076 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004077 com_node(c, ch);
4078 com_addbyte(c, END_FINALLY);
4079 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004081}
4082
4083static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004084com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004085{
4086 REQ(n, try_stmt);
4087 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4088 | 'try' ':' suite 'finally' ':' suite */
4089 if (TYPE(CHILD(n, 3)) != except_clause)
4090 com_try_finally(c, n);
4091 else
4092 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004093}
4094
Guido van Rossum8b993a91997-01-17 21:04:03 +00004095static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004096get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004097{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004098 int i;
4099
Guido van Rossum8b993a91997-01-17 21:04:03 +00004100 /* Label to avoid tail recursion */
4101 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004102 switch (TYPE(n)) {
4103
4104 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004105 if (NCH(n) == 1) {
4106 n = CHILD(n, 0);
4107 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004108 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004109 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004110 case file_input:
4111 for (i = 0; i < NCH(n); i++) {
4112 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004113 if (TYPE(ch) == stmt) {
4114 n = ch;
4115 goto next;
4116 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004117 }
4118 break;
4119
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004120 case stmt:
4121 case simple_stmt:
4122 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004123 n = CHILD(n, 0);
4124 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004125
4126 case expr_stmt:
4127 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004128 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004129 case test:
4130 case and_test:
4131 case not_test:
4132 case comparison:
4133 case expr:
4134 case xor_expr:
4135 case and_expr:
4136 case shift_expr:
4137 case arith_expr:
4138 case term:
4139 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004140 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004141 if (NCH(n) == 1) {
4142 n = CHILD(n, 0);
4143 goto next;
4144 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004145 break;
4146
4147 case atom:
4148 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004149 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004150 break;
4151
4152 }
4153 return NULL;
4154}
4155
Guido van Rossum79f25d91997-04-29 20:08:16 +00004156static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004157get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004158{
Guido van Rossum541563e1999-01-28 15:08:09 +00004159 /* Don't generate doc-strings if run with -OO */
4160 if (Py_OptimizeFlag > 1)
4161 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 n = get_rawdocstring(n);
4163 if (n == NULL)
4164 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004165 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004166}
4167
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004168static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004169com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004170{
4171 REQ(n, suite);
4172 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4173 if (NCH(n) == 1) {
4174 com_node(c, CHILD(n, 0));
4175 }
4176 else {
4177 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004178 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004179 node *ch = CHILD(n, i);
4180 if (TYPE(ch) == stmt)
4181 com_node(c, ch);
4182 }
4183 }
4184}
4185
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004186/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004189{
4190 int i = c->c_nblocks;
4191 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4192 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4193 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004194 else if (i <= 0) {
4195 /* at the outer level */
4196 com_error(c, PyExc_SyntaxError,
4197 "'continue' not properly in loop");
4198 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004199 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004200 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004201 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004202 if (c->c_block[j] == SETUP_LOOP)
4203 break;
4204 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004205 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004206 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004207 for (; i > j; --i) {
4208 if (c->c_block[i] == SETUP_EXCEPT ||
4209 c->c_block[i] == SETUP_FINALLY) {
4210 com_addoparg(c, CONTINUE_LOOP,
4211 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004212 return;
4213 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004214 if (c->c_block[i] == END_FINALLY) {
4215 com_error(c, PyExc_SyntaxError,
4216 "'continue' not supported inside 'finally' clause");
4217 return;
4218 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004219 }
4220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004221 com_error(c, PyExc_SyntaxError,
4222 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004223 }
4224 /* XXX Could allow it inside a 'finally' clause
4225 XXX if we could pop the exception still on the stack */
4226}
4227
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004228/* Return the number of default values in the argument list.
4229
4230 If a non-default argument follows a default argument, set an
4231 exception and return -1.
4232*/
4233
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004234static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004235com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004237 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004238 if (TYPE(n) == lambdef) {
4239 /* lambdef: 'lambda' [varargslist] ':' test */
4240 n = CHILD(n, 1);
4241 }
4242 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004243 REQ(n, funcdef);
4244 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4245 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004246 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4247 n = CHILD(n, 1);
4248 }
4249 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004250 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004251 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004252 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004253 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4254 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004255 ndefs = 0;
4256 for (i = 0; i < nch; i++) {
4257 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004258 if (TYPE(CHILD(n, i)) == STAR ||
4259 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004260 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004261 i++;
4262 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004263 t = RPAR; /* Anything except EQUAL or COMMA */
4264 else
4265 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004266 if (t == EQUAL) {
4267 i++;
4268 ndefs++;
4269 com_node(c, CHILD(n, i));
4270 i++;
4271 if (i >= nch)
4272 break;
4273 t = TYPE(CHILD(n, i));
4274 }
4275 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004276 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004277 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004278 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004279 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004280 return -1;
4281 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004282 }
4283 if (t != COMMA)
4284 break;
4285 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004286 return ndefs;
4287}
4288
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004289static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004290com_decorator_name(struct compiling *c, node *n)
4291{
4292 /* dotted_name: NAME ('.' NAME)* */
4293
4294 int i, nch;
4295 node *varname;
4296
4297 REQ(n, dotted_name);
4298 nch = NCH(n);
4299 assert(nch >= 1 && nch % 2 == 1);
4300
4301 varname = CHILD(n, 0);
4302 REQ(varname, NAME);
4303 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004304 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004305
4306 for (i = 1; i < nch; i += 2) {
4307 node *attrname;
4308
4309 REQ(CHILD(n, i), DOT);
4310
4311 attrname = CHILD(n, i + 1);
4312 REQ(attrname, NAME);
4313 com_addop_name(c, LOAD_ATTR, STR(attrname));
4314 }
4315}
4316
4317static void
4318com_decorator(struct compiling *c, node *n)
4319{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004320 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004321 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004322 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004323 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004324 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004325 com_decorator_name(c, CHILD(n, 1));
4326
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004327 if (nch > 3) {
4328 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004329 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004330 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004331 com_call_function(c, CHILD(n, 3));
4332 }
4333}
4334
4335static int
4336com_decorators(struct compiling *c, node *n)
4337{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004338 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004339
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004340 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004341 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004342 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004343
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004344 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004345 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004346 REQ(ch, decorator);
4347
4348 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004349 }
4350
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004351 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004352}
4353
4354static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004355com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004357 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004358 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004359
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004360 REQ(n, funcdef);
4361 /* -6 -5 -4 -3 -2 -1
4362 funcdef: [decorators] 'def' NAME parameters ':' suite */
4363
4364 if (NCH(n) == 6)
4365 ndecorators = com_decorators(c, CHILD(n, 0));
4366 else
4367 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004368
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004369 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004370 if (ndefs < 0)
4371 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004372 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004373 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004374 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004375 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004376 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004377 c->c_errors++;
4378 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004379 int closure = com_make_closure(c, (PyCodeObject *)co);
4380 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004381 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004382 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004383 if (closure)
4384 com_addoparg(c, MAKE_CLOSURE, ndefs);
4385 else
4386 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004387 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004388
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004389 while (ndecorators > 0) {
4390 com_addoparg(c, CALL_FUNCTION, 1);
4391 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004392 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004393 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004394
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004395 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004396 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004397 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004398 }
4399}
4400
4401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004402com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004403{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004404 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004405 REQ(n, testlist);
4406 /* testlist: test (',' test)* [','] */
4407 for (i = 0; i < NCH(n); i += 2)
4408 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004409 i = (NCH(n)+1) / 2;
4410 com_addoparg(c, BUILD_TUPLE, i);
4411 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004412}
4413
4414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004415com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004416{
Guido van Rossum25831651993-05-19 14:50:45 +00004417 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004418 PyObject *v;
4419 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 char *name;
4421
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004422 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004423 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004424 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004425 c->c_errors++;
4426 return;
4427 }
4428 /* Push the class name on the stack */
4429 i = com_addconst(c, v);
4430 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004431 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004432 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004433 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004434 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004435 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004436 com_push(c, 1);
4437 }
Guido van Rossum25831651993-05-19 14:50:45 +00004438 else
4439 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004440 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004441 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004442 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004443 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004444 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004445 c->c_errors++;
4446 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004447 int closure = com_make_closure(c, co);
4448 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004449 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004450 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004451 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004452 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004453 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004454 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004455 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004456 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004457 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004458 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004459 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004460 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004461 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004462 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004463}
4464
4465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004466com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004467{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004468 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004469 if (c->c_errors)
4470 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004471 switch (TYPE(n)) {
4472
4473 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004474
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004475 case funcdef:
4476 com_funcdef(c, n);
4477 break;
4478 case classdef:
4479 com_classdef(c, n);
4480 break;
4481
4482 /* Trivial parse tree nodes */
4483
4484 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004485 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004486 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004487 n = CHILD(n, 0);
4488 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004489
4490 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004491 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004492 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004493 {
4494 int i;
4495 for (i = 0; i < NCH(n)-1; i += 2)
4496 com_node(c, CHILD(n, i));
4497 }
4498 break;
4499
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004500 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004501 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004502 n = CHILD(n, 0);
4503 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004504
4505 /* Statement nodes */
4506
4507 case expr_stmt:
4508 com_expr_stmt(c, n);
4509 break;
4510 case print_stmt:
4511 com_print_stmt(c, n);
4512 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004513 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004514 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515 break;
4516 case pass_stmt:
4517 break;
4518 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004519 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004520 com_error(c, PyExc_SyntaxError,
4521 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004522 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004523 com_addbyte(c, BREAK_LOOP);
4524 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004525 case continue_stmt:
4526 com_continue_stmt(c, n);
4527 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004528 case return_stmt:
4529 com_return_stmt(c, n);
4530 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004531 case yield_stmt:
4532 com_yield_stmt(c, n);
4533 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004534 case raise_stmt:
4535 com_raise_stmt(c, n);
4536 break;
4537 case import_stmt:
4538 com_import_stmt(c, n);
4539 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004540 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004541 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004542 case exec_stmt:
4543 com_exec_stmt(c, n);
4544 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004545 case assert_stmt:
4546 com_assert_stmt(c, n);
4547 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004548 case if_stmt:
4549 com_if_stmt(c, n);
4550 break;
4551 case while_stmt:
4552 com_while_stmt(c, n);
4553 break;
4554 case for_stmt:
4555 com_for_stmt(c, n);
4556 break;
4557 case try_stmt:
4558 com_try_stmt(c, n);
4559 break;
4560 case suite:
4561 com_suite(c, n);
4562 break;
4563
4564 /* Expression nodes */
4565
4566 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004567 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004568 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004569 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004570 break;
4571 case test:
4572 com_test(c, n);
4573 break;
4574 case and_test:
4575 com_and_test(c, n);
4576 break;
4577 case not_test:
4578 com_not_test(c, n);
4579 break;
4580 case comparison:
4581 com_comparison(c, n);
4582 break;
4583 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004584 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004585 break;
4586 case expr:
4587 com_expr(c, n);
4588 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004589 case xor_expr:
4590 com_xor_expr(c, n);
4591 break;
4592 case and_expr:
4593 com_and_expr(c, n);
4594 break;
4595 case shift_expr:
4596 com_shift_expr(c, n);
4597 break;
4598 case arith_expr:
4599 com_arith_expr(c, n);
4600 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004601 case term:
4602 com_term(c, n);
4603 break;
4604 case factor:
4605 com_factor(c, n);
4606 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004607 case power:
4608 com_power(c, n);
4609 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004610 case atom:
4611 com_atom(c, n);
4612 break;
4613
4614 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004615 com_error(c, PyExc_SystemError,
4616 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617 }
4618}
4619
Tim Petersdbd9ba62000-07-09 03:09:57 +00004620static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004621
4622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004623com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004624{
4625 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4626 if (TYPE(CHILD(n, 0)) == LPAR)
4627 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004628 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004629 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004630 com_pop(c, 1);
4631 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004632}
4633
4634static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004635com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004636{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004637 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004638 if (NCH(n) == 1) {
4639 com_fpdef(c, CHILD(n, 0));
4640 }
4641 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004642 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004643 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004644 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004645 for (i = 0; i < NCH(n); i += 2)
4646 com_fpdef(c, CHILD(n, i));
4647 }
4648}
4649
4650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004651com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004652{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004653 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004654 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004655 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004656 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004657 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004658 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004659 nch = NCH(n);
4660 /* Enter all arguments in table of locals */
4661 for (i = 0, narg = 0; i < nch; i++) {
4662 node *ch = CHILD(n, i);
4663 node *fp;
4664 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004665 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004666 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4667 fp = CHILD(ch, 0);
4668 if (TYPE(fp) != NAME) {
4669 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4670 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004671 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004672 narg++;
4673 /* all name updates handled by symtable */
4674 if (++i >= nch)
4675 break;
4676 ch = CHILD(n, i);
4677 if (TYPE(ch) == EQUAL)
4678 i += 2;
4679 else
4680 REQ(ch, COMMA);
4681 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004682 if (complex) {
4683 /* Generate code for complex arguments only after
4684 having counted the simple arguments */
4685 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004686 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004687 node *ch = CHILD(n, i);
4688 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004689 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004690 break;
4691 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4692 fp = CHILD(ch, 0);
4693 if (TYPE(fp) != NAME) {
4694 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004695 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004696 com_fpdef(c, ch);
4697 }
4698 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004699 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004700 break;
4701 ch = CHILD(n, i);
4702 if (TYPE(ch) == EQUAL)
4703 i += 2;
4704 else
4705 REQ(ch, COMMA);
4706 }
4707 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004708}
4709
4710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004711com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004712{
4713 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004714 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004715 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004716 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004717 if (doc != NULL) {
4718 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004719 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004720 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004721 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004722 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004723 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004724 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004725 for (i = 0; i < NCH(n); i++) {
4726 node *ch = CHILD(n, i);
4727 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4728 com_node(c, ch);
4729 }
4730}
4731
4732/* Top-level compile-node interface */
4733
4734static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004735compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004736{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004737 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004739 REQ(n, funcdef);
4740 /* -6 -5 -4 -3 -2 -1
4741 funcdef: [decorators] 'def' NAME parameters ':' suite */
4742 c->c_name = STR(RCHILD(n, -4));
4743 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004744 if (doc != NULL) {
4745 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004746 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004747 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004748 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004749 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004750 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004751 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004752 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004753 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004754 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004755 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004756 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004757 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004758 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4759 com_push(c, 1);
4760 com_addbyte(c, RETURN_VALUE);
4761 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004762}
4763
4764static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004765compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004766{
Guido van Rossum590baa41993-11-30 13:40:46 +00004767 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004768 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004769 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004770
4771 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004772 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004773 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004774 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004775 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004776 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004777 else
4778 ch = CHILD(n, 2);
4779 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004780 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004781 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004782}
4783
4784static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004785compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004786{
4787 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004788 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004789 REQ(n, classdef);
4790 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4791 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004792 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004793 /* Initialize local __module__ from global __name__ */
4794 com_addop_name(c, LOAD_GLOBAL, "__name__");
4795 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004796 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004797 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004798 if (doc != NULL) {
4799 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004800 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004801 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004802 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004803 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004804 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004805 }
4806 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004807 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004808 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004809 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004810 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004811 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004812 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004813 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004814}
4815
4816static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004817compile_generator_expression(struct compiling *c, node *n)
4818{
4819 /* testlist_gexp: test gen_for */
4820 /* argument: test gen_for */
4821 REQ(CHILD(n, 0), test);
4822 REQ(CHILD(n, 1), gen_for);
4823
4824 c->c_name = "<generator expression>";
4825 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4826
4827 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4828 com_push(c, 1);
4829 com_addbyte(c, RETURN_VALUE);
4830 com_pop(c, 1);
4831}
4832
4833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004834compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004835{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004836 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004837
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 switch (TYPE(n)) {
4839
Guido van Rossum4c417781991-01-21 16:09:22 +00004840 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004841 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004842 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004843 n = CHILD(n, 0);
4844 if (TYPE(n) != NEWLINE)
4845 com_node(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 Rossum4ca6c9d1994-08-29 12:16:12 +00004851 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004852 break;
4853
Guido van Rossum4c417781991-01-21 16:09:22 +00004854 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004855 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004856 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004857 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4858 com_push(c, 1);
4859 com_addbyte(c, RETURN_VALUE);
4860 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004861 break;
4862
Guido van Rossum590baa41993-11-30 13:40:46 +00004863 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004864 com_node(c, CHILD(n, 0));
4865 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004866 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004867 break;
4868
Guido van Rossum590baa41993-11-30 13:40:46 +00004869 case lambdef: /* anonymous function definition */
4870 compile_lambdef(c, n);
4871 break;
4872
Guido van Rossum4c417781991-01-21 16:09:22 +00004873 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004874 compile_funcdef(c, n);
4875 break;
4876
Guido van Rossum4c417781991-01-21 16:09:22 +00004877 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004878 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004879 break;
4880
Raymond Hettinger354433a2004-05-19 08:20:33 +00004881 case testlist_gexp: /* A generator expression */
4882 case argument: /* A generator expression */
4883 compile_generator_expression(c, n);
4884 break;
4885
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004886 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004887 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004888 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004889 }
4890}
4891
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004892static PyObject *
4893dict_keys_inorder(PyObject *dict, int offset)
4894{
4895 PyObject *tuple, *k, *v;
4896 int i, pos = 0, size = PyDict_Size(dict);
4897
4898 tuple = PyTuple_New(size);
4899 if (tuple == NULL)
4900 return NULL;
4901 while (PyDict_Next(dict, &pos, &k, &v)) {
4902 i = PyInt_AS_LONG(v);
4903 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004904 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905 PyTuple_SET_ITEM(tuple, i - offset, k);
4906 }
4907 return tuple;
4908}
4909
Guido van Rossum79f25d91997-04-29 20:08:16 +00004910PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004911PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004912{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004913 return PyNode_CompileFlags(n, filename, NULL);
4914}
4915
4916PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004917PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004918{
4919 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004920}
4921
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004922struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004923PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004924{
4925 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004926 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004927
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004928 ff = PyNode_Future(n, filename);
4929 if (ff == NULL)
4930 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004931 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004932 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004933 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004934 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004935 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004936 return st;
4937}
4938
Guido van Rossum79f25d91997-04-29 20:08:16 +00004939static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004940icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004941{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004942 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004943}
4944
Guido van Rossum79f25d91997-04-29 20:08:16 +00004945static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004946jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004947 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004948{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004949 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004950 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004951 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004952 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004953 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4954 sc.c_encoding = "utf-8";
4955 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004956 sc.c_encoding = STR(n);
4957 n = CHILD(n, 0);
4958 } else {
4959 sc.c_encoding = NULL;
4960 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004962 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004964 /* c_symtable still points to parent's symbols */
4965 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004966 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004967 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004968 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004969 if (base->c_encoding != NULL) {
4970 assert(sc.c_encoding == NULL);
4971 sc.c_encoding = base->c_encoding;
4972 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004974 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004975 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004976 if (sc.c_future == NULL) {
4977 com_free(&sc);
4978 return NULL;
4979 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004980 if (flags) {
4981 int merged = sc.c_future->ff_features |
4982 flags->cf_flags;
4983 sc.c_future->ff_features = merged;
4984 flags->cf_flags = merged;
4985 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004986 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4987 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004988 com_free(&sc);
4989 return NULL;
4990 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004991 /* reset symbol table for second pass */
4992 sc.c_symtable->st_nscopes = 1;
4993 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004994 }
4995 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004996 if (symtable_load_symbols(&sc) < 0) {
4997 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004998 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004999 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005000 compile_node(&sc, n);
5001 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005002 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005003 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005004 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005005 names = PyList_AsTuple(sc.c_names);
5006 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5008 freevars = dict_keys_inorder(sc.c_freevars,
5009 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005010 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005011 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005012 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5013 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005014 if (!PyErr_Occurred())
5015 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005016 sc.c_nlocals,
5017 sc.c_maxstacklevel,
5018 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005019 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005020 consts,
5021 names,
5022 varnames,
5023 freevars,
5024 cellvars,
5025 filename,
5026 name,
5027 sc.c_firstlineno,
5028 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005029 Py_XDECREF(consts);
5030 Py_XDECREF(names);
5031 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005032 Py_XDECREF(freevars);
5033 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005034 Py_XDECREF(filename);
5035 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005036 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005037 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005038 else if (!PyErr_Occurred()) {
5039 /* This could happen if someone called PyErr_Clear() after an
5040 error was reported above. That's not supposed to happen,
5041 but I just plugged one case and I'm not sure there can't be
5042 others. In that case, raise SystemError so that at least
5043 it gets reported instead dumping core. */
5044 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5045 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005046 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005047 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005048 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005049 sc.c_symtable = NULL;
5050 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005051 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005052 return co;
5053}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005054
5055int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005056PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005057{
5058 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005059 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005060 int line = co->co_firstlineno;
5061 int addr = 0;
5062 while (--size >= 0) {
5063 addr += *p++;
5064 if (addr > addrq)
5065 break;
5066 line += *p++;
5067 }
5068 return line;
5069}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005070
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005071/* The test for LOCAL must come before the test for FREE in order to
5072 handle classes where name is both local and free. The local var is
5073 a method and the free var is a free var referenced within a method.
5074*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075
5076static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005077get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005079 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005081
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005082 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5083 return CELL;
5084 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5085 return LOCAL;
5086 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5087 return FREE;
5088 v = PyDict_GetItemString(c->c_globals, name);
5089 if (v) {
5090 if (v == Py_None)
5091 return GLOBAL_EXPLICIT;
5092 else {
5093 return GLOBAL_IMPLICIT;
5094 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005096 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005097 "unknown scope for %.100s in %.100s(%s) "
5098 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5099 name, c->c_name,
5100 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5101 c->c_filename,
5102 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5103 PyObject_REPR(c->c_locals),
5104 PyObject_REPR(c->c_globals)
5105 );
5106
5107 Py_FatalError(buf);
5108 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005109}
5110
Guido van Rossum207fda62001-03-02 03:30:41 +00005111/* Helper functions to issue warnings */
5112
5113static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005114issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005115{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005116 if (PyErr_Occurred()) {
5117 /* This can happen because symtable_node continues
5118 processing even after raising a SyntaxError.
5119 Calling PyErr_WarnExplicit now would clobber the
5120 pending exception; instead we fail and let that
5121 exception propagate.
5122 */
5123 return -1;
5124 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005125 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5126 lineno, NULL, NULL) < 0) {
5127 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5128 PyErr_SetString(PyExc_SyntaxError, msg);
5129 PyErr_SyntaxLocation(filename, lineno);
5130 }
5131 return -1;
5132 }
5133 return 0;
5134}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005135
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005136static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005137symtable_warn(struct symtable *st, char *msg)
5138{
Guido van Rossum207fda62001-03-02 03:30:41 +00005139 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005140 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005141 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005142 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005143 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005144}
5145
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005146/* Helper function for setting lineno and filename */
5147
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005148static struct symtable *
5149symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005151 struct symtable *st;
5152
5153 st = symtable_init();
5154 if (st == NULL)
5155 return NULL;
5156 st->st_future = ff;
5157 st->st_filename = filename;
5158 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5159 if (st->st_errors > 0)
5160 goto fail;
5161 symtable_node(st, n);
5162 if (st->st_errors > 0)
5163 goto fail;
5164 return st;
5165 fail:
5166 if (!PyErr_Occurred()) {
5167 /* This could happen because after a syntax error is
5168 detected, the symbol-table-building continues for
5169 a while, and PyErr_Clear() might erroneously be
5170 called during that process. One such case has been
5171 fixed, but there might be more (now or later).
5172 */
5173 PyErr_SetString(PyExc_SystemError, "lost exception");
5174 }
5175 st->st_future = NULL;
5176 st->st_filename = NULL;
5177 PySymtable_Free(st);
5178 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005179}
5180
5181static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005182symtable_init_compiling_symbols(struct compiling *c)
5183{
5184 PyObject *varnames;
5185
5186 varnames = c->c_symtable->st_cur->ste_varnames;
5187 if (varnames == NULL) {
5188 varnames = PyList_New(0);
5189 if (varnames == NULL)
5190 return -1;
5191 c->c_symtable->st_cur->ste_varnames = varnames;
5192 Py_INCREF(varnames);
5193 } else
5194 Py_INCREF(varnames);
5195 c->c_varnames = varnames;
5196
5197 c->c_globals = PyDict_New();
5198 if (c->c_globals == NULL)
5199 return -1;
5200 c->c_freevars = PyDict_New();
5201 if (c->c_freevars == NULL)
5202 return -1;
5203 c->c_cellvars = PyDict_New();
5204 if (c->c_cellvars == NULL)
5205 return -1;
5206 return 0;
5207}
5208
5209struct symbol_info {
5210 int si_nlocals;
5211 int si_ncells;
5212 int si_nfrees;
5213 int si_nimplicit;
5214};
5215
5216static void
5217symtable_init_info(struct symbol_info *si)
5218{
5219 si->si_nlocals = 0;
5220 si->si_ncells = 0;
5221 si->si_nfrees = 0;
5222 si->si_nimplicit = 0;
5223}
5224
5225static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005226symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005227 struct symbol_info *si)
5228{
5229 PyObject *dict, *v;
5230
5231 /* Seperate logic for DEF_FREE. If it occurs in a function,
5232 it indicates a local that we must allocate storage for (a
5233 cell var). If it occurs in a class, then the class has a
5234 method and a free variable with the same name.
5235 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005236 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005237 /* If it isn't declared locally, it can't be a cell. */
5238 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5239 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005240 v = PyInt_FromLong(si->si_ncells++);
5241 dict = c->c_cellvars;
5242 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005243 /* If it is free anyway, then there is no need to do
5244 anything here.
5245 */
5246 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005247 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005248 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005249 v = PyInt_FromLong(si->si_nfrees++);
5250 dict = c->c_freevars;
5251 }
5252 if (v == NULL)
5253 return -1;
5254 if (PyDict_SetItem(dict, name, v) < 0) {
5255 Py_DECREF(v);
5256 return -1;
5257 }
5258 Py_DECREF(v);
5259 return 0;
5260}
5261
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005262/* If a variable is a cell and an argument, make sure that appears in
5263 co_cellvars before any variable to its right in varnames.
5264*/
5265
5266
5267static int
5268symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5269 PyObject *varnames, int flags)
5270{
Tim Petersb39903b2003-03-24 17:22:24 +00005271 PyObject *v = NULL;
5272 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005273 int i, pos;
5274
5275 if (flags & CO_VARARGS)
5276 argcount++;
5277 if (flags & CO_VARKEYWORDS)
5278 argcount++;
5279 for (i = argcount; --i >= 0; ) {
5280 v = PyList_GET_ITEM(varnames, i);
5281 if (PyDict_GetItem(*cellvars, v)) {
5282 if (list == NULL) {
5283 list = PyList_New(1);
5284 if (list == NULL)
5285 return -1;
5286 PyList_SET_ITEM(list, 0, v);
5287 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005288 } else {
5289 if (PyList_Insert(list, 0, v) < 0) {
5290 Py_DECREF(list);
5291 return -1;
5292 }
5293 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005294 }
5295 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005296 if (list == NULL)
5297 return 0;
5298
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005299 /* There are cellvars that are also arguments. Create a dict
5300 to replace cellvars and put the args at the front.
5301 */
5302 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005303 if (d == NULL)
5304 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005305 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5306 v = PyInt_FromLong(i);
5307 if (v == NULL)
5308 goto fail;
5309 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5310 goto fail;
5311 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5312 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005313 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005314 }
5315 pos = 0;
5316 i = PyList_GET_SIZE(list);
5317 Py_DECREF(list);
5318 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5319 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005320 if (w == NULL)
5321 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005322 if (PyDict_SetItem(d, v, w) < 0) {
5323 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005324 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005325 goto fail;
5326 }
5327 Py_DECREF(w);
5328 }
5329 Py_DECREF(*cellvars);
5330 *cellvars = d;
5331 return 1;
5332 fail:
5333 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005334 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005335 return -1;
5336}
5337
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005338static int
5339symtable_freevar_offsets(PyObject *freevars, int offset)
5340{
5341 PyObject *name, *v;
5342 int pos;
5343
5344 /* The cell vars are the first elements of the closure,
5345 followed by the free vars. Update the offsets in
5346 c_freevars to account for number of cellvars. */
5347 pos = 0;
5348 while (PyDict_Next(freevars, &pos, &name, &v)) {
5349 int i = PyInt_AS_LONG(v) + offset;
5350 PyObject *o = PyInt_FromLong(i);
5351 if (o == NULL)
5352 return -1;
5353 if (PyDict_SetItem(freevars, name, o) < 0) {
5354 Py_DECREF(o);
5355 return -1;
5356 }
5357 Py_DECREF(o);
5358 }
5359 return 0;
5360}
5361
5362static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005363symtable_check_unoptimized(struct compiling *c,
5364 PySymtableEntryObject *ste,
5365 struct symbol_info *si)
5366{
5367 char buf[300];
5368
5369 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5370 || (ste->ste_nested && si->si_nimplicit)))
5371 return 0;
5372
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005373#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5374
5375#define ILLEGAL_IS "is a nested function"
5376
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005377#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005378"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005379
5380#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005381"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005382
5383#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005384"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005385"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005386
5387 /* XXX perhaps the linenos for these opt-breaking statements
5388 should be stored so the exception can point to them. */
5389
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005390 if (ste->ste_child_free) {
5391 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005392 PyOS_snprintf(buf, sizeof(buf),
5393 ILLEGAL_IMPORT_STAR,
5394 PyString_AS_STRING(ste->ste_name),
5395 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005396 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005397 PyOS_snprintf(buf, sizeof(buf),
5398 ILLEGAL_BARE_EXEC,
5399 PyString_AS_STRING(ste->ste_name),
5400 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005401 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005402 PyOS_snprintf(buf, sizeof(buf),
5403 ILLEGAL_EXEC_AND_IMPORT_STAR,
5404 PyString_AS_STRING(ste->ste_name),
5405 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005406 }
5407 } else {
5408 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005409 PyOS_snprintf(buf, sizeof(buf),
5410 ILLEGAL_IMPORT_STAR,
5411 PyString_AS_STRING(ste->ste_name),
5412 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005413 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005414 PyOS_snprintf(buf, sizeof(buf),
5415 ILLEGAL_BARE_EXEC,
5416 PyString_AS_STRING(ste->ste_name),
5417 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005418 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005419 PyOS_snprintf(buf, sizeof(buf),
5420 ILLEGAL_EXEC_AND_IMPORT_STAR,
5421 PyString_AS_STRING(ste->ste_name),
5422 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005423 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005424 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005425
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005426 PyErr_SetString(PyExc_SyntaxError, buf);
5427 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5428 ste->ste_opt_lineno);
5429 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005430}
5431
5432static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005433symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5434 struct symbol_info *si)
5435{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005436 if (c->c_future)
5437 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005438 if (ste->ste_generator)
5439 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005440 if (ste->ste_type != TYPE_MODULE)
5441 c->c_flags |= CO_NEWLOCALS;
5442 if (ste->ste_type == TYPE_FUNCTION) {
5443 c->c_nlocals = si->si_nlocals;
5444 if (ste->ste_optimized == 0)
5445 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005446 else if (ste->ste_optimized != OPT_EXEC)
5447 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005448 }
5449 return 0;
5450}
5451
5452static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005453symtable_error(struct symtable *st, int lineno)
5454{
5455 if (lineno == 0)
5456 lineno = st->st_cur->ste_lineno;
5457 PyErr_SyntaxLocation(st->st_filename, lineno);
5458 st->st_errors++;
5459 return -1;
5460}
5461
5462static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463symtable_load_symbols(struct compiling *c)
5464{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005466 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005467 PyObject *name, *varnames, *v;
5468 int i, flags, pos;
5469 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005470
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005471 v = NULL;
5472
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005473 if (symtable_init_compiling_symbols(c) < 0)
5474 goto fail;
5475 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005476 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005477 si.si_nlocals = PyList_GET_SIZE(varnames);
5478 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005479
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005480 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005482 if (v == NULL)
5483 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 if (PyDict_SetItem(c->c_locals,
5485 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005486 goto fail;
5487 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005488 }
5489
5490 /* XXX The cases below define the rules for whether a name is
5491 local or global. The logic could probably be clearer. */
5492 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005493 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5494 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005495
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005496 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005497 /* undo the original DEF_FREE */
5498 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005499
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005500 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005501 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005502 2. Free variables in methods that are also class
5503 variables or declared global.
5504 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005505 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005506 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005507
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005508 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005509 c->c_argcount--;
5510 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005511 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 c->c_argcount--;
5513 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005515 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005516 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005517 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005518 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005519 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005520 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005521 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005522 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005523 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5524 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005525 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005526 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005527 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005529 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005530 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005531 if (v == NULL)
5532 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005533 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005534 goto fail;
5535 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005536 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005538 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005539 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005540 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005541 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005542 if (v == NULL)
5543 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005544 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005545 goto fail;
5546 Py_DECREF(v);
5547 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005548 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005549 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005550 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005551 goto fail;
5552 if (st->st_nscopes != 1) {
5553 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005554 if (v == NULL)
5555 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005556 if (PyDict_SetItem(st->st_global,
5557 name, v))
5558 goto fail;
5559 Py_DECREF(v);
5560 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005561 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005562 }
5563 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005564 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5565
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005566 if (si.si_ncells > 1) { /* one cell is always in order */
5567 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5568 c->c_varnames, c->c_flags) < 0)
5569 return -1;
5570 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005571 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5572 return -1;
5573 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005574 fail:
5575 /* is this always the right thing to do? */
5576 Py_XDECREF(v);
5577 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578}
5579
5580static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005581symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005582{
5583 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005584
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005585 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005586 if (st == NULL)
5587 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005588 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005589
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005590 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005591 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005592 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005593 goto fail;
5594 if ((st->st_symbols = PyDict_New()) == NULL)
5595 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005597 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599 st->st_private = NULL;
5600 return st;
5601 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005602 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005603 return NULL;
5604}
5605
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005606void
5607PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608{
5609 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005610 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005611 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005612 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005613}
5614
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005615/* When the compiler exits a scope, it must should update the scope's
5616 free variable information with the list of free variables in its
5617 children.
5618
5619 Variables that are free in children and defined in the current
5620 scope are cellvars.
5621
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005622 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623 false), free variables in children that are not defined here are
5624 implicit globals.
5625
5626*/
5627
5628static int
5629symtable_update_free_vars(struct symtable *st)
5630{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005631 int i, j, def;
5632 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005633 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005634
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005635 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005636 def = DEF_FREE_CLASS;
5637 else
5638 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005639 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005640 int pos = 0;
5641
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005642 if (list && PyList_SetSlice(list, 0,
5643 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005644 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005645 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005646 PyList_GET_ITEM(ste->ste_children, i);
5647 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005648 int flags = PyInt_AS_LONG(o);
5649 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005650 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005651 if (list == NULL) {
5652 list = PyList_New(0);
5653 if (list == NULL)
5654 return -1;
5655 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005656 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005657 if (PyList_Append(list, name) < 0) {
5658 Py_DECREF(list);
5659 return -1;
5660 }
5661 }
5662 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005663 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005664 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005665 v = PyDict_GetItem(ste->ste_symbols, name);
5666 /* If a name N is declared global in scope A and
5667 referenced in scope B contained (perhaps
5668 indirectly) in A and there are no scopes
5669 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005670 is global in B. Unless A is a class scope,
5671 because class scopes are not considered for
5672 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005673 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005674 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005675 int flags = PyInt_AS_LONG(v);
5676 if (flags & DEF_GLOBAL) {
5677 symtable_undo_free(st, child->ste_id,
5678 name);
5679 continue;
5680 }
5681 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005682 if (ste->ste_nested) {
5683 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005684 name, def) < 0) {
5685 Py_DECREF(list);
5686 return -1;
5687 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005690 name) < 0) {
5691 Py_DECREF(list);
5692 return -1;
5693 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005694 }
5695 }
5696 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005697
5698 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 return 0;
5700}
5701
5702/* If the current scope is a non-nested class or if name is not
5703 defined in the current, non-nested scope, then it is an implicit
5704 global in all nested scopes.
5705*/
5706
5707static int
5708symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5709{
5710 PyObject *o;
5711 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005712 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005713
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005714 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005715 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005716 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005717 if (o == NULL)
5718 return symtable_undo_free(st, child, name);
5719 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005720
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005721 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005722 return symtable_undo_free(st, child, name);
5723 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005724 return symtable_add_def_o(st, ste->ste_symbols,
5725 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726}
5727
5728static int
5729symtable_undo_free(struct symtable *st, PyObject *id,
5730 PyObject *name)
5731{
5732 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005733 PyObject *info;
5734 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005736 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5737 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005739
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005740 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005741 if (info == NULL)
5742 return 0;
5743 v = PyInt_AS_LONG(info);
5744 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005745 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746 DEF_FREE_GLOBAL) < 0)
5747 return -1;
5748 } else
5749 /* If the name is defined here or declared global,
5750 then the recursion stops. */
5751 return 0;
5752
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5754 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005755 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005756 PyList_GET_ITEM(ste->ste_children, i);
5757 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758 if (x < 0)
5759 return x;
5760 }
5761 return 0;
5762}
5763
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005764/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5765 This reference is released when the scope is exited, via the DECREF
5766 in symtable_exit_scope().
5767*/
5768
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769static int
5770symtable_exit_scope(struct symtable *st)
5771{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005772 int end;
5773
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005774 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005775 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005776 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005778 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5779 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005780 if (PySequence_DelItem(st->st_stack, end) < 0)
5781 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005782 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005783}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005784
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005785static void
5786symtable_enter_scope(struct symtable *st, char *name, int type,
5787 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005788{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005789 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005790
5791 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005792 prev = st->st_cur;
5793 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005794 st->st_errors++;
5795 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005796 }
5797 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005798 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005799 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005800 if (st->st_cur == NULL) {
5801 st->st_errors++;
5802 return;
5803 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005804 if (strcmp(name, TOP) == 0)
5805 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005806 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005807 if (PyList_Append(prev->ste_children,
5808 (PyObject *)st->st_cur) < 0)
5809 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005810 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005811}
5812
5813static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005814symtable_lookup(struct symtable *st, char *name)
5815{
5816 char buffer[MANGLE_LEN];
5817 PyObject *v;
5818 int flags;
5819
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005820 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005821 name = buffer;
5822 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5823 if (v == NULL) {
5824 if (PyErr_Occurred())
5825 return -1;
5826 else
5827 return 0;
5828 }
5829
5830 flags = PyInt_AS_LONG(v);
5831 return flags;
5832}
5833
5834static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005835symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005836{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005837 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005838 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005839 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005840
Guido van Rossumb7164622002-08-16 02:48:11 +00005841 /* Warn about None, except inside a tuple (where the assignment
5842 code already issues a warning). */
5843 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5844 *name == 'N' && strcmp(name, "None") == 0)
5845 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005846 PyErr_SetString(PyExc_SyntaxError,
5847 "Invalid syntax. Assignment to None.");
5848 symtable_error(st, 0);
5849 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005850 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005851 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005852 name = buffer;
5853 if ((s = PyString_InternFromString(name)) == NULL)
5854 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005855 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5856 Py_DECREF(s);
5857 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005858}
5859
5860/* Must only be called with mangled names */
5861
5862static int
5863symtable_add_def_o(struct symtable *st, PyObject *dict,
5864 PyObject *name, int flag)
5865{
5866 PyObject *o;
5867 int val;
5868
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005869 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005870 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005871 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005872 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005873 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005874 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005875 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005876 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005877 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005878 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005879 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005880 if (o == NULL)
5881 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005882 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005883 Py_DECREF(o);
5884 return -1;
5885 }
5886 Py_DECREF(o);
5887
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005888 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005889 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005890 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005891 } else if (flag & DEF_GLOBAL) {
5892 /* XXX need to update DEF_GLOBAL for other flags too;
5893 perhaps only DEF_FREE_GLOBAL */
5894 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005895 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005896 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005897 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005898 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005899 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005900 if (o == NULL)
5901 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005902 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005903 Py_DECREF(o);
5904 return -1;
5905 }
5906 Py_DECREF(o);
5907 }
5908 return 0;
5909}
5910
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005911#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005912
Tim Peters08a898f2001-06-28 01:52:22 +00005913/* Look for a yield stmt under n. Return 1 if found, else 0.
5914 This hack is used to look inside "if 0:" blocks (which are normally
5915 ignored) in case those are the only places a yield occurs (so that this
5916 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005917static int
5918look_for_yield(node *n)
5919{
5920 int i;
5921
5922 for (i = 0; i < NCH(n); ++i) {
5923 node *kid = CHILD(n, i);
5924
5925 switch (TYPE(kid)) {
5926
5927 case classdef:
5928 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005929 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005930 /* Stuff in nested functions and classes can't make
5931 the parent a generator. */
5932 return 0;
5933
5934 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005935 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005936
5937 default:
5938 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005939 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005940 }
5941 }
5942 return 0;
5943}
5944
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005945static void
5946symtable_node(struct symtable *st, node *n)
5947{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005948 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005949
5950 loop:
5951 switch (TYPE(n)) {
5952 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005953 char *func_name;
5954 if (NCH(n) == 6)
5955 symtable_node(st, CHILD(n, 0));
5956 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005957 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005958 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005959 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005960 symtable_funcdef(st, n);
5961 symtable_exit_scope(st);
5962 break;
5963 }
5964 case lambdef:
5965 if (NCH(n) == 4)
5966 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005967 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005968 symtable_funcdef(st, n);
5969 symtable_exit_scope(st);
5970 break;
5971 case classdef: {
5972 char *tmp, *class_name = STR(CHILD(n, 1));
5973 symtable_add_def(st, class_name, DEF_LOCAL);
5974 if (TYPE(CHILD(n, 2)) == LPAR) {
5975 node *bases = CHILD(n, 3);
5976 int i;
5977 for (i = 0; i < NCH(bases); i += 2) {
5978 symtable_node(st, CHILD(bases, i));
5979 }
5980 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005981 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005982 tmp = st->st_private;
5983 st->st_private = class_name;
5984 symtable_node(st, CHILD(n, NCH(n) - 1));
5985 st->st_private = tmp;
5986 symtable_exit_scope(st);
5987 break;
5988 }
5989 case if_stmt:
5990 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005991 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5992 if (st->st_cur->ste_generator == 0)
5993 st->st_cur->ste_generator =
5994 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005995 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005996 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005997 symtable_node(st, CHILD(n, i + 1));
5998 symtable_node(st, CHILD(n, i + 3));
5999 }
6000 if (i + 2 < NCH(n))
6001 symtable_node(st, CHILD(n, i + 2));
6002 break;
6003 case global_stmt:
6004 symtable_global(st, n);
6005 break;
6006 case import_stmt:
6007 symtable_import(st, n);
6008 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006009 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006010 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 symtable_node(st, CHILD(n, 1));
6012 if (NCH(n) > 2)
6013 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006014 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006015 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006016 st->st_cur->ste_opt_lineno = n->n_lineno;
6017 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006018 if (NCH(n) > 4)
6019 symtable_node(st, CHILD(n, 5));
6020 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006021
6022 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006023 case assert_stmt:
6024 if (Py_OptimizeFlag)
6025 return;
6026 if (NCH(n) == 2) {
6027 n = CHILD(n, 1);
6028 goto loop;
6029 } else {
6030 symtable_node(st, CHILD(n, 1));
6031 n = CHILD(n, 3);
6032 goto loop;
6033 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 case except_clause:
6035 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006036 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 if (NCH(n) > 1) {
6038 n = CHILD(n, 1);
6039 goto loop;
6040 }
6041 break;
6042 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006043 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006044 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006045 case yield_stmt:
6046 st->st_cur->ste_generator = 1;
6047 n = CHILD(n, 1);
6048 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006049 case expr_stmt:
6050 if (NCH(n) == 1)
6051 n = CHILD(n, 0);
6052 else {
6053 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006054 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 symtable_node(st, CHILD(n, 2));
6056 break;
6057 } else {
6058 int i;
6059 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006060 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006061 n = CHILD(n, NCH(n) - 1);
6062 }
6063 }
6064 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006065 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006066 /* only occurs when there are multiple for loops
6067 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006068 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006069 if (TYPE(n) == list_for)
6070 symtable_list_for(st, n);
6071 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006072 REQ(n, list_if);
6073 symtable_node(st, CHILD(n, 1));
6074 if (NCH(n) == 3) {
6075 n = CHILD(n, 2);
6076 goto loop;
6077 }
6078 }
6079 break;
6080 case for_stmt:
6081 symtable_assign(st, CHILD(n, 1), 0);
6082 for (i = 3; i < NCH(n); ++i)
6083 if (TYPE(CHILD(n, i)) >= single_input)
6084 symtable_node(st, CHILD(n, i));
6085 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006086 case arglist:
6087 if (NCH(n) > 1)
6088 for (i = 0; i < NCH(n); ++i) {
6089 node *ch = CHILD(n, i);
6090 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6091 TYPE(CHILD(ch, 1)) == gen_for) {
6092 PyErr_SetString(PyExc_SyntaxError,
6093 "invalid syntax");
6094 symtable_error(st, n->n_lineno);
6095 return;
6096 }
6097 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006098 /* The remaining cases fall through to default except in
6099 special circumstances. This requires the individual cases
6100 to be coded with great care, even though they look like
6101 rather innocuous. Each case must double-check TYPE(n).
6102 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006103 case decorator:
6104 if (TYPE(n) == decorator) {
6105 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6106 node *name, *varname;
6107 name = CHILD(n, 1);
6108 REQ(name, dotted_name);
6109 varname = CHILD(name, 0);
6110 REQ(varname, NAME);
6111 symtable_add_use(st, STR(varname));
6112 }
6113 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006114 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006115 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006116 n = CHILD(n, 2);
6117 goto loop;
6118 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006119 else if (TYPE(n) == argument && NCH(n) == 2 &&
6120 TYPE(CHILD(n, 1)) == gen_for) {
6121 symtable_generator_expression(st, n);
6122 break;
6123 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006124 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006125 case listmaker:
6126 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006127 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006128 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006129 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006130 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006131 case testlist_gexp:
6132 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6133 symtable_generator_expression(st, n);
6134 break;
6135 }
6136 /* fall through */
6137
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006138 case atom:
6139 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6140 symtable_add_use(st, STR(CHILD(n, 0)));
6141 break;
6142 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006143 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006144 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006145 /* Walk over every non-token child with a special case
6146 for one child.
6147 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006148 if (NCH(n) == 1) {
6149 n = CHILD(n, 0);
6150 goto loop;
6151 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006152 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153 if (TYPE(CHILD(n, i)) >= single_input)
6154 symtable_node(st, CHILD(n, i));
6155 }
6156}
6157
6158static void
6159symtable_funcdef(struct symtable *st, node *n)
6160{
6161 node *body;
6162
6163 if (TYPE(n) == lambdef) {
6164 if (NCH(n) == 4)
6165 symtable_params(st, CHILD(n, 1));
6166 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006167 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 body = CHILD(n, NCH(n) - 1);
6169 symtable_node(st, body);
6170}
6171
6172/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006173 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006174 which are references in the defining scope. symtable_params()
6175 parses the parameter names, which are defined in the function's
6176 body.
6177
6178 varargslist:
6179 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6180 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6181*/
6182
6183static void
6184symtable_default_args(struct symtable *st, node *n)
6185{
6186 node *c;
6187 int i;
6188
6189 if (TYPE(n) == parameters) {
6190 n = CHILD(n, 1);
6191 if (TYPE(n) == RPAR)
6192 return;
6193 }
6194 REQ(n, varargslist);
6195 for (i = 0; i < NCH(n); i += 2) {
6196 c = CHILD(n, i);
6197 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6198 break;
6199 }
6200 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6201 symtable_node(st, CHILD(n, i));
6202 }
6203}
6204
6205static void
6206symtable_params(struct symtable *st, node *n)
6207{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006208 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006209 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006210
6211 if (TYPE(n) == parameters) {
6212 n = CHILD(n, 1);
6213 if (TYPE(n) == RPAR)
6214 return;
6215 }
6216 REQ(n, varargslist);
6217 for (i = 0; i < NCH(n); i += 2) {
6218 c = CHILD(n, i);
6219 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6220 ext = 1;
6221 break;
6222 }
6223 if (TYPE(c) == test) {
6224 continue;
6225 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006226 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006227 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006228 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006229 char nbuf[30];
6230 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006231 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006232 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006233 }
6234 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006235 if (ext) {
6236 c = CHILD(n, i);
6237 if (TYPE(c) == STAR) {
6238 i++;
6239 symtable_add_def(st, STR(CHILD(n, i)),
6240 DEF_PARAM | DEF_STAR);
6241 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006242 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006243 c = NULL;
6244 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006245 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006246 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006247 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006248 i++;
6249 symtable_add_def(st, STR(CHILD(n, i)),
6250 DEF_PARAM | DEF_DOUBLESTAR);
6251 }
6252 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006253 if (complex >= 0) {
6254 int j;
6255 for (j = 0; j <= complex; j++) {
6256 c = CHILD(n, j);
6257 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006258 c = CHILD(n, ++j);
6259 else if (TYPE(c) == EQUAL)
6260 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006261 if (TYPE(CHILD(c, 0)) == LPAR)
6262 symtable_params_fplist(st, CHILD(c, 1));
6263 }
6264 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006265}
6266
6267static void
6268symtable_params_fplist(struct symtable *st, node *n)
6269{
6270 int i;
6271 node *c;
6272
6273 REQ(n, fplist);
6274 for (i = 0; i < NCH(n); i += 2) {
6275 c = CHILD(n, i);
6276 REQ(c, fpdef);
6277 if (NCH(c) == 1)
6278 symtable_add_def(st, STR(CHILD(c, 0)),
6279 DEF_PARAM | DEF_INTUPLE);
6280 else
6281 symtable_params_fplist(st, CHILD(c, 1));
6282 }
6283
6284}
6285
6286static void
6287symtable_global(struct symtable *st, node *n)
6288{
6289 int i;
6290
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006291 /* XXX It might be helpful to warn about module-level global
6292 statements, but it's hard to tell the difference between
6293 module-level and a string passed to exec.
6294 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006295
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006296 for (i = 1; i < NCH(n); i += 2) {
6297 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006298 int flags;
6299
6300 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006301 if (flags < 0)
6302 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006303 if (flags && flags != DEF_GLOBAL) {
6304 char buf[500];
6305 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006306 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006307 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006308 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006309 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006310 }
6311 else {
6312 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006313 PyOS_snprintf(buf, sizeof(buf),
6314 GLOBAL_AFTER_ASSIGN,
6315 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006316 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006317 PyOS_snprintf(buf, sizeof(buf),
6318 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006319 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006320 }
6321 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006322 symtable_add_def(st, name, DEF_GLOBAL);
6323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006324}
6325
6326static void
6327symtable_list_comprehension(struct symtable *st, node *n)
6328{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006329 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006330 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006331
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006332 REQ(n, listmaker);
6333 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6334 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006335 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006336 symtable_list_for(st, CHILD(n, 1));
6337 symtable_node(st, CHILD(n, 0));
6338 --st->st_cur->ste_tmpname;
6339}
6340
6341static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006342symtable_generator_expression(struct symtable *st, node *n)
6343{
6344 /* testlist_gexp: test gen_for */
6345 REQ(CHILD(n, 0), test);
6346 REQ(CHILD(n, 1), gen_for);
6347
6348 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6349 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6350
6351 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6352
6353 symtable_gen_for(st, CHILD(n, 1), 1);
6354 symtable_node(st, CHILD(n, 0));
6355 symtable_exit_scope(st);
6356
6357 /* for outmost iterable precomputation */
6358 symtable_node(st, CHILD(CHILD(n, 1), 3));
6359}
6360
6361static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006362symtable_list_for(struct symtable *st, node *n)
6363{
6364 REQ(n, list_for);
6365 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006366 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006367 symtable_node(st, CHILD(n, 3));
6368 if (NCH(n) == 5)
6369 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006370}
6371
6372static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006373symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6374{
6375 REQ(n, gen_for);
6376
6377 /* gen_for: for v in test [gen_iter] */
6378 symtable_assign(st, CHILD(n, 1), 0);
6379 if (is_outmost)
6380 symtable_add_use(st, "[outmost-iterable]");
6381 else
6382 symtable_node(st, CHILD(n, 3));
6383
6384 if (NCH(n) == 5)
6385 symtable_gen_iter(st, CHILD(n, 4));
6386}
6387
6388static void
6389symtable_gen_iter(struct symtable *st, node *n)
6390{
6391 REQ(n, gen_iter);
6392
6393 n = CHILD(n, 0);
6394 if (TYPE(n) == gen_for)
6395 symtable_gen_for(st, n, 0);
6396 else {
6397 REQ(n, gen_if);
6398 symtable_node(st, CHILD(n, 1));
6399
6400 if (NCH(n) == 3)
6401 symtable_gen_iter(st, CHILD(n, 2));
6402 }
6403}
6404
6405static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006406symtable_import(struct symtable *st, node *n)
6407{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006408 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006409 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006410 /* import_stmt: import_name | import_from */
6411 n = CHILD(n, 0);
6412 if (TYPE(n) == import_from) {
6413 /* import_from: 'from' dotted_name 'import' ('*' |
6414 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006415 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006416 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006417 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6418 /* check for bogus imports */
6419 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6420 PyErr_SetString(PyExc_SyntaxError,
6421 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006422 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006423 return;
6424 }
6425 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006426 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6427 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006428 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006429 if (symtable_warn(st,
6430 "import * only allowed at module level") < 0)
6431 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006432 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006433 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006434 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006435 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006436 REQ(nn, import_as_names);
6437 for (i = 0; i < NCH(nn); i += 2) {
6438 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006439 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006440 symtable_assign(st, CHILD(c, 2),
6441 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006442 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006443 symtable_assign(st, CHILD(c, 0),
6444 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006445 }
6446 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006447 } else {
6448 /* 'import' dotted_as_names */
6449 nn = CHILD(n, 1);
6450 REQ(nn, dotted_as_names);
6451 for (i = 0; i < NCH(nn); i += 2)
6452 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006453 }
6454}
6455
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006456/* The third argument to symatble_assign() is a flag to be passed to
6457 symtable_add_def() if it is eventually called. The flag is useful
6458 to specify the particular type of assignment that should be
6459 recorded, e.g. an assignment caused by import.
6460 */
6461
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006462static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006463symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006464{
6465 node *tmp;
6466 int i;
6467
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006468 loop:
6469 switch (TYPE(n)) {
6470 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006471 /* invalid assignment, e.g. lambda x:x=2. The next
6472 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006473 return;
6474 case power:
6475 if (NCH(n) > 2) {
6476 for (i = 2; i < NCH(n); ++i)
6477 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6478 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006479 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006480 if (NCH(n) > 1) {
6481 symtable_node(st, CHILD(n, 0));
6482 symtable_node(st, CHILD(n, 1));
6483 } else {
6484 n = CHILD(n, 0);
6485 goto loop;
6486 }
6487 return;
6488 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006489 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6490 /* XXX This is an error, but the next pass
6491 will catch it. */
6492 return;
6493 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006494 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006495 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006496 }
6497 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006498 case testlist_gexp:
6499 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6500 /* XXX This is an error, but the next pass
6501 will catch it. */
6502 return;
6503 } else {
6504 for (i = 0; i < NCH(n); i += 2)
6505 symtable_assign(st, CHILD(n, i), def_flag);
6506 }
6507 return;
6508
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006509 case exprlist:
6510 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006511 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006512 if (NCH(n) == 1) {
6513 n = CHILD(n, 0);
6514 goto loop;
6515 }
6516 else {
6517 int i;
6518 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006519 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006520 return;
6521 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006522 case atom:
6523 tmp = CHILD(n, 0);
6524 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6525 n = CHILD(n, 1);
6526 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006527 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006528 if (strcmp(STR(tmp), "__debug__") == 0) {
6529 PyErr_SetString(PyExc_SyntaxError,
6530 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006531 symtable_error(st, n->n_lineno);
6532 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006533 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006534 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006535 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006536 return;
6537 case dotted_as_name:
6538 if (NCH(n) == 3)
6539 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006540 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006541 else
6542 symtable_add_def(st,
6543 STR(CHILD(CHILD(n,
6544 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006545 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006546 return;
6547 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006548 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006549 return;
6550 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006551 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006552 return;
6553 default:
6554 if (NCH(n) == 0)
6555 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006556 if (NCH(n) == 1) {
6557 n = CHILD(n, 0);
6558 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006559 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006560 /* Should only occur for errors like x + 1 = 1,
6561 which will be caught in the next pass. */
6562 for (i = 0; i < NCH(n); ++i)
6563 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006564 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006565 }
6566}