blob: 15c84361497702b989fc5c6a38572aa087a56316 [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 Hettingerc34f8672005-01-02 06:17:33 +0000442/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
443 with LOAD_CONST binop(c1,c2)
444 The consts table must still be in list form so that the
445 new constant can be appended.
446 Called with codestr pointing to the first LOAD_CONST.
447 Abandons the transformation if the folding fails (i.e. 1+'a'). */
448static int
449fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
450{
451 PyObject *newconst, *v, *w;
452 int len_consts, opcode;
453
454 /* Pre-conditions */
455 assert(PyList_CheckExact(consts));
456 assert(codestr[0] == LOAD_CONST);
457 assert(codestr[3] == LOAD_CONST);
458
459 /* Create new constant */
460 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
461 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
462 opcode = codestr[6];
463 switch (opcode) {
464 case BINARY_POWER:
465 newconst = PyNumber_Power(v, w, Py_None);
466 break;
467 case BINARY_MULTIPLY:
468 newconst = PyNumber_Multiply(v, w);
469 break;
470 case BINARY_DIVIDE:
471 if (!_Py_QnewFlag) {
472 newconst = PyNumber_Divide(v, w);
473 break;
474 }
475 /* -Qnew is in effect: fall through to
476 BINARY_TRUE_DIVIDE */
477 case BINARY_TRUE_DIVIDE:
478 newconst = PyNumber_TrueDivide(v, w);
479 break;
480 case BINARY_FLOOR_DIVIDE:
481 newconst = PyNumber_FloorDivide(v, w);
482 break;
483 case BINARY_MODULO:
484 newconst = PyNumber_Remainder(v, w);
485 break;
486 case BINARY_ADD:
487 newconst = PyNumber_Add(v, w);
488 break;
489 case BINARY_SUBTRACT:
490 newconst = PyNumber_Subtract(v, w);
491 break;
492 case BINARY_SUBSCR:
493 newconst = PyObject_GetItem(v, w);
494 break;
495 case BINARY_LSHIFT:
496 newconst = PyNumber_Lshift(v, w);
497 break;
498 case BINARY_RSHIFT:
499 newconst = PyNumber_Rshift(v, w);
500 break;
501 case BINARY_AND:
502 newconst = PyNumber_And(v, w);
503 break;
504 case BINARY_XOR:
505 newconst = PyNumber_Xor(v, w);
506 break;
507 case BINARY_OR:
508 newconst = PyNumber_Or(v, w);
509 break;
510 default:
511 /* Called with an unknown opcode */
512 assert(0);
513 return 0;
514 }
515 if (newconst == NULL) {
516 PyErr_Clear();
517 return 0;
518 }
519
520 /* Append folded constant into consts table */
521 len_consts = PyList_GET_SIZE(consts);
522 if (PyList_Append(consts, newconst)) {
523 Py_DECREF(newconst);
524 return 0;
525 }
526 Py_DECREF(newconst);
527
528 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
529 memset(codestr, NOP, 4);
530 codestr[4] = LOAD_CONST;
531 SETARG(codestr, 4, len_consts);
532 return 1;
533}
534
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000535static unsigned int *
536markblocks(unsigned char *code, int len)
537{
538 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000539 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000540
541 if (blocks == NULL)
542 return NULL;
543 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000544
545 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000546 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
547 opcode = code[i];
548 switch (opcode) {
549 case FOR_ITER:
550 case JUMP_FORWARD:
551 case JUMP_IF_FALSE:
552 case JUMP_IF_TRUE:
553 case JUMP_ABSOLUTE:
554 case CONTINUE_LOOP:
555 case SETUP_LOOP:
556 case SETUP_EXCEPT:
557 case SETUP_FINALLY:
558 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000559 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000560 break;
561 }
562 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000563 /* Build block numbers in the second pass */
564 for (i=0 ; i<len ; i++) {
565 blockcnt += blocks[i]; /* increment blockcnt over labels */
566 blocks[i] = blockcnt;
567 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000568 return blocks;
569}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000570
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000571/* Perform basic peephole optimizations to components of a code object.
572 The consts object should still be in list form to allow new constants
573 to be appended.
574
575 To keep the optimizer simple, it bails out (does nothing) for code
576 containing extended arguments or that has a length over 32,700. That
577 allows us to avoid overflow and sign issues. Likewise, it bails when
578 the lineno table has complex encoding for gaps >= 255.
579
580 Optimizations are restricted to simple transformations occuring within a
581 single basic block. All transformations keep the code size the same or
582 smaller. For those that reduce size, the gaps are initially filled with
583 NOPs. Later those NOPs are removed and the jump addresses retargeted in
584 a single pass. Line numbering is adjusted accordingly. */
585
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000586static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000587optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000588{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000589 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000590 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000591 unsigned char *codestr = NULL;
592 unsigned char *lineno;
593 int *addrmap = NULL;
594 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000595 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000596 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000597 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598
Raymond Hettingereffb3932004-10-30 08:55:08 +0000599 /* Bail out if an exception is set */
600 if (PyErr_Occurred())
601 goto exitUnchanged;
602
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000603 /* Bypass optimization when the lineno table is too complex */
604 assert(PyString_Check(lineno_obj));
605 lineno = PyString_AS_STRING(lineno_obj);
606 tabsiz = PyString_GET_SIZE(lineno_obj);
607 if (memchr(lineno, 255, tabsiz) != NULL)
608 goto exitUnchanged;
609
Raymond Hettingera12fa142004-08-24 04:34:16 +0000610 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000611 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000612 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000613 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000614 goto exitUnchanged;
615
616 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000617 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000618 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000619 goto exitUnchanged;
620 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000621
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000622 /* Mapping to new jump targets after NOPs are removed */
623 addrmap = PyMem_Malloc(codelen * sizeof(int));
624 if (addrmap == NULL)
625 goto exitUnchanged;
626
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000627 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000628 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000629 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000630 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000631
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000632 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000633 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000634
635 lastlc = cumlc;
636 cumlc = 0;
637
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000638 switch (opcode) {
639
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000640 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000641 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000642 case UNARY_NOT:
643 if (codestr[i+1] != JUMP_IF_FALSE ||
644 codestr[i+4] != POP_TOP ||
645 !ISBASICBLOCK(blocks,i,5))
646 continue;
647 tgt = GETJUMPTGT(codestr, (i+1));
648 if (codestr[tgt] != POP_TOP)
649 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000650 j = GETARG(codestr, i+1) + 1;
651 codestr[i] = JUMP_IF_TRUE;
652 SETARG(codestr, i, j);
653 codestr[i+3] = POP_TOP;
654 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000655 break;
656
657 /* not a is b --> a is not b
658 not a in b --> a not in b
659 not a is not b --> a is b
660 not a not in b --> a in b */
661 case COMPARE_OP:
662 j = GETARG(codestr, i);
663 if (j < 6 || j > 9 ||
664 codestr[i+3] != UNARY_NOT ||
665 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000666 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000667 SETARG(codestr, i, (j^1));
668 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000669 break;
670
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000671 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
672 case LOAD_NAME:
673 case LOAD_GLOBAL:
674 j = GETARG(codestr, i);
675 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
676 if (name == NULL || strcmp(name, "None") != 0)
677 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000678 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
679 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000680 codestr[i] = LOAD_CONST;
681 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000682 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000683 break;
684 }
685 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000686 break;
687
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000688 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000689 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000690 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000691 j = GETARG(codestr, i);
692 if (codestr[i+3] != JUMP_IF_FALSE ||
693 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000694 !ISBASICBLOCK(blocks,i,7) ||
695 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000696 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000697 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000698 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000699 break;
700
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000701 /* Try to fold tuples of constants.
702 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000703 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
704 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000705 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000706 j = GETARG(codestr, i);
707 h = i - 3 * j;
708 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000709 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000710 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
711 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000712 assert(codestr[i] == LOAD_CONST);
713 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000714 break;
715 }
716 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000717 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000718 j = GETARG(codestr, i);
719 if (codestr[i+3] != UNPACK_SEQUENCE ||
720 !ISBASICBLOCK(blocks,i,6) ||
721 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000722 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000723 if (j == 1) {
724 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000725 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000726 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000727 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000728 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000729 codestr[i] = ROT_THREE;
730 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000731 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000732 }
733 break;
734
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000735 /* Fold binary ops on constants.
736 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
737 case BINARY_POWER:
738 case BINARY_MULTIPLY:
739 case BINARY_DIVIDE:
740 case BINARY_TRUE_DIVIDE:
741 case BINARY_FLOOR_DIVIDE:
742 case BINARY_MODULO:
743 case BINARY_ADD:
744 case BINARY_SUBTRACT:
745 case BINARY_SUBSCR:
746 case BINARY_LSHIFT:
747 case BINARY_RSHIFT:
748 case BINARY_AND:
749 case BINARY_XOR:
750 case BINARY_OR:
751 if (lastlc >= 2 &&
752 ISBASICBLOCK(blocks, i-6, 7) &&
753 fold_binops_on_constants(&codestr[i-6], consts)) {
754 i -= 2;
755 assert(codestr[i] == LOAD_CONST);
756 cumlc = 1;
757 }
758 break;
759
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000760 /* Simplify conditional jump to conditional jump where the
761 result of the first test implies the success of a similar
762 test or the failure of the opposite test.
763 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000764 "if a and b:"
765 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000766 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000767 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000768 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000769 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
770 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000771 */
772 case JUMP_IF_FALSE:
773 case JUMP_IF_TRUE:
774 tgt = GETJUMPTGT(codestr, i);
775 j = codestr[tgt];
776 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
777 if (j == opcode) {
778 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
779 SETARG(codestr, i, tgttgt);
780 } else {
781 tgt -= i;
782 SETARG(codestr, i, tgt);
783 }
784 break;
785 }
786 /* Intentional fallthrough */
787
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000788 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000789 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000790 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000791 case JUMP_ABSOLUTE:
792 case CONTINUE_LOOP:
793 case SETUP_LOOP:
794 case SETUP_EXCEPT:
795 case SETUP_FINALLY:
796 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000797 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000798 continue;
799 tgttgt = GETJUMPTGT(codestr, tgt);
800 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
801 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000802 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000803 tgttgt -= i + 3; /* Calc relative jump addr */
804 if (tgttgt < 0) /* No backward relative jumps */
805 continue;
806 codestr[i] = opcode;
807 SETARG(codestr, i, tgttgt);
808 break;
809
810 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000811 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000812
813 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
814 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000815 if (i+4 >= codelen ||
816 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000817 !ISBASICBLOCK(blocks,i,5))
818 continue;
819 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000820 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000821 }
822 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000823
824 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000825 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
826 addrmap[i] = i - nops;
827 if (codestr[i] == NOP)
828 nops++;
829 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000830 cum_orig_line = 0;
831 last_line = 0;
832 for (i=0 ; i < tabsiz ; i+=2) {
833 cum_orig_line += lineno[i];
834 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000835 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000836 lineno[i] =((unsigned char)(new_line - last_line));
837 last_line = new_line;
838 }
839
840 /* Remove NOPs and fixup jump targets */
841 for (i=0, h=0 ; i<codelen ; ) {
842 opcode = codestr[i];
843 switch (opcode) {
844 case NOP:
845 i++;
846 continue;
847
848 case JUMP_ABSOLUTE:
849 case CONTINUE_LOOP:
850 j = addrmap[GETARG(codestr, i)];
851 SETARG(codestr, i, j);
852 break;
853
854 case FOR_ITER:
855 case JUMP_FORWARD:
856 case JUMP_IF_FALSE:
857 case JUMP_IF_TRUE:
858 case SETUP_LOOP:
859 case SETUP_EXCEPT:
860 case SETUP_FINALLY:
861 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
862 SETARG(codestr, i, j);
863 break;
864 }
865 adj = CODESIZE(opcode);
866 while (adj--)
867 codestr[h++] = codestr[i++];
868 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000869 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000870
871 code = PyString_FromStringAndSize((char *)codestr, h);
872 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000873 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000874 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000875 return code;
876
877exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000878 if (blocks != NULL)
879 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000880 if (addrmap != NULL)
881 PyMem_Free(addrmap);
882 if (codestr != NULL)
883 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000884 Py_INCREF(code);
885 return code;
886}
887
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000888/* End: Peephole optimizations ----------------------------------------- */
889
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000891PyCode_New(int argcount, int nlocals, int stacksize, int flags,
892 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000893 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
894 PyObject *filename, PyObject *name, int firstlineno,
895 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000896{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898 int i;
899 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000900 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000901 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 consts == NULL || !PyTuple_Check(consts) ||
903 names == NULL || !PyTuple_Check(names) ||
904 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000905 freevars == NULL || !PyTuple_Check(freevars) ||
906 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 name == NULL || !PyString_Check(name) ||
908 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000909 lnotab == NULL || !PyString_Check(lnotab) ||
910 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000911 PyErr_BadInternalCall();
912 return NULL;
913 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000914 intern_strings(names);
915 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000916 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000917 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000918 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 for (i = PyTuple_Size(consts); --i >= 0; ) {
920 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000922 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000923 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000924 continue;
925 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000926 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000929 co->co_argcount = argcount;
930 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000931 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000932 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000933 Py_INCREF(code);
934 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000936 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000940 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000941 Py_INCREF(freevars);
942 co->co_freevars = freevars;
943 Py_INCREF(cellvars);
944 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000946 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000948 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000949 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000951 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000952 if (PyTuple_GET_SIZE(freevars) == 0 &&
953 PyTuple_GET_SIZE(cellvars) == 0)
954 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955 }
956 return co;
957}
958
959
960/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000961
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000962/* The compiler uses two passes to generate bytecodes. The first pass
963 builds the symbol table. The second pass generates the bytecode.
964
965 The first pass uses a single symtable struct. The second pass uses
966 a compiling struct for each code block. The compiling structs
967 share a reference to the symtable.
968
969 The two passes communicate via symtable_load_symbols() and via
970 is_local() and is_global(). The former initializes several slots
971 in the compiling struct: c_varnames, c_locals, c_nlocals,
972 c_argcount, c_globals, and c_flags.
973*/
974
Tim Peters2a7f3842001-06-09 09:26:21 +0000975/* All about c_lnotab.
976
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000977c_lnotab is an array of unsigned bytes disguised as a Python string. Since
978version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
979mapped to source code line #s via c_lnotab instead.
980
Tim Peters2a7f3842001-06-09 09:26:21 +0000981The array is conceptually a list of
982 (bytecode offset increment, line number increment)
983pairs. The details are important and delicate, best illustrated by example:
984
985 byte code offset source code line number
986 0 1
987 6 2
988 50 7
989 350 307
990 361 308
991
992The first trick is that these numbers aren't stored, only the increments
993from one row to the next (this doesn't really work, but it's a start):
994
995 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
996
997The second trick is that an unsigned byte can't hold negative values, or
998values larger than 255, so (a) there's a deep assumption that byte code
999offsets and their corresponding line #s both increase monotonically, and (b)
1000if at least one column jumps by more than 255 from one row to the next, more
1001than one pair is written to the table. In case #b, there's no way to know
1002from looking at the table later how many were written. That's the delicate
1003part. A user of c_lnotab desiring to find the source line number
1004corresponding to a bytecode address A should do something like this
1005
1006 lineno = addr = 0
1007 for addr_incr, line_incr in c_lnotab:
1008 addr += addr_incr
1009 if addr > A:
1010 return lineno
1011 lineno += line_incr
1012
1013In order for this to work, when the addr field increments by more than 255,
1014the line # increment in each pair generated must be 0 until the remaining addr
1015increment is < 256. So, in the example above, com_set_lineno should not (as
1016was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1017255, 0, 45, 255, 0, 45.
1018*/
1019
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001021 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001023 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001025 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001026 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 PyObject *c_locals; /* dictionary (value=localID) */
1028 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001029 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001030 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001031 int c_nlocals; /* index of next local */
1032 int c_argcount; /* number of top-level arguments */
1033 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034 int c_nexti; /* index into c_code */
1035 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001036 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001037 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001038 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001039 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001040 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001041 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001042 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001043 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001044 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001045 int c_stacklevel; /* Current stack level */
1046 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001047 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001049 int c_last_addr; /* last op addr seen and recorded in lnotab */
1050 int c_last_line; /* last line seen and recorded in lnotab */
1051 int c_lnotab_next; /* current length of lnotab */
1052 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001053 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001054 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001055 int c_nested; /* Is block nested funcdef or lamdef? */
1056 int c_closure; /* Is nested w/freevars? */
1057 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001058 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001059 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060};
1061
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001062static int
1063is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001064{
1065 if ((v & (USE | DEF_FREE))
1066 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1067 return 1;
1068 if (v & DEF_FREE_CLASS)
1069 return 1;
1070 return 0;
1071}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001072
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001075{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001076 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1077
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001078 if (c == NULL) {
1079 /* Error occurred via symtable call to
1080 is_constant_false */
1081 PyErr_SetString(exc, msg);
1082 return;
1083 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001084 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001085 if (c->c_lineno < 1 || c->c_interactive) {
1086 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001088 return;
1089 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001090 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001091 if (v == NULL)
1092 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001093
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001094 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001095 if (line == NULL) {
1096 Py_INCREF(Py_None);
1097 line = Py_None;
1098 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001099 if (exc == PyExc_SyntaxError) {
1100 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1101 Py_None, line);
1102 if (t == NULL)
1103 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001104 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001105 if (w == NULL)
1106 goto exit;
1107 PyErr_SetObject(exc, w);
1108 } else {
1109 /* Make sure additional exceptions are printed with
1110 file and line, also. */
1111 PyErr_SetObject(exc, v);
1112 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1113 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001114 exit:
1115 Py_XDECREF(t);
1116 Py_XDECREF(v);
1117 Py_XDECREF(w);
1118 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001119}
1120
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001121/* Interface to the block stack */
1122
1123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001124block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001125{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001126 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 com_error(c, PyExc_SystemError,
1128 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001129 }
1130 else {
1131 c->c_block[c->c_nblocks++] = type;
1132 }
1133}
1134
1135static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001136block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001137{
1138 if (c->c_nblocks > 0)
1139 c->c_nblocks--;
1140 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001142 }
1143}
1144
Guido van Rossum681d79a1995-07-18 14:51:37 +00001145/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001146
Martin v. Löwis95292d62002-12-11 14:04:59 +00001147static int issue_warning(const char *, const char *, int);
1148static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001149static void com_free(struct compiling *);
1150static void com_push(struct compiling *, int);
1151static void com_pop(struct compiling *, int);
1152static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001153static void com_node(struct compiling *, node *);
1154static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001155static void com_addbyte(struct compiling *, int);
1156static void com_addint(struct compiling *, int);
1157static void com_addoparg(struct compiling *, int, int);
1158static void com_addfwref(struct compiling *, int, int *);
1159static void com_backpatch(struct compiling *, int);
1160static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1161static int com_addconst(struct compiling *, PyObject *);
1162static int com_addname(struct compiling *, PyObject *);
1163static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001164static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001165static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001166static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001167static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001168static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001169static void com_assign(struct compiling *, node *, int, node *);
1170static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001171static int com_make_closure(struct compiling *c, PyCodeObject *co);
1172
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001173static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001174static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001175 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001176static PyObject *parsestrplus(struct compiling*, node *);
1177static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001178static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001180static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001181
1182/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001183static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001184static struct symtable *symtable_build(node *, PyFutureFeatures *,
1185 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001186static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001187static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001188static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001189static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001190static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001191static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001192
1193static void symtable_node(struct symtable *, node *);
1194static void symtable_funcdef(struct symtable *, node *);
1195static void symtable_default_args(struct symtable *, node *);
1196static void symtable_params(struct symtable *, node *);
1197static void symtable_params_fplist(struct symtable *, node *n);
1198static void symtable_global(struct symtable *, node *);
1199static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001200static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001201static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001202static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001203static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001204static void symtable_gen_for(struct symtable *, node *, int);
1205static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001206
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001207static int symtable_update_free_vars(struct symtable *);
1208static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1209static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1210
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001211/* helper */
1212static void
1213do_pad(int pad)
1214{
1215 int i;
1216 for (i = 0; i < pad; ++i)
1217 fprintf(stderr, " ");
1218}
1219
1220static void
1221dump(node *n, int pad, int depth)
1222{
1223 int i;
1224 if (depth == 0)
1225 return;
1226 do_pad(pad);
1227 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1228 if (depth > 0)
1229 depth--;
1230 for (i = 0; i < NCH(n); ++i)
1231 dump(CHILD(n, i), pad + 1, depth);
1232}
1233
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001235com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001237 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1239 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001240 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001242 goto fail;
1243 if ((c->c_const_dict = PyDict_New()) == NULL)
1244 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001246 goto fail;
1247 if ((c->c_name_dict = PyDict_New()) == NULL)
1248 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001250 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1252 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001253 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001254 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001255 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001256 c->c_freevars = NULL;
1257 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001258 c->c_nlocals = 0;
1259 c->c_argcount = 0;
1260 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001261 c->c_nexti = 0;
1262 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001263 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001264 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001265 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001266 c->c_begin = 0;
1267 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001268 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001269 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001270 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001271 c->c_stacklevel = 0;
1272 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001273 c->c_firstlineno = 0;
1274 c->c_last_addr = 0;
1275 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001276 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001277 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001278 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001279 c->c_nested = 0;
1280 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001281 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001282 return 1;
1283
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001284 fail:
1285 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001286 return 0;
1287}
1288
1289static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001290com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001291{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 Py_XDECREF(c->c_code);
1293 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001294 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001296 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 Py_XDECREF(c->c_globals);
1298 Py_XDECREF(c->c_locals);
1299 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001300 Py_XDECREF(c->c_freevars);
1301 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001303 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001304 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305}
1306
1307static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001308com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001309{
1310 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001311 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001312 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001313 /*
1314 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1315 c->c_filename, c->c_name, c->c_lineno,
1316 c->c_nexti, c->c_stacklevel, n);
1317 */
1318 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001319}
1320
1321static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001322com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001324 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 else
1327 c->c_stacklevel -= n;
1328}
1329
1330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001331com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332{
1333 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001335 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337}
1338
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001339static int
1340com_check_size(PyObject **s, int offset)
1341{
1342 int len = PyString_GET_SIZE(*s);
1343 if (offset >= len)
1344 return _PyString_Resize(s, len * 2);
1345 return 0;
1346}
1347
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001349com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001351 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001352 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001353 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001354 if (com_check_size(&c->c_code, c->c_nexti)) {
1355 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001358 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359}
1360
1361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001362com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001364 com_addbyte(c, x & 0xff);
1365 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366}
1367
1368static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001369com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001370{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001371 char *p;
1372 if (c->c_lnotab == NULL)
1373 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001374 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1375 c->c_errors++;
1376 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001377 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001378 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001379 *p++ = addr;
1380 *p++ = line;
1381 c->c_lnotab_next += 2;
1382}
1383
1384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001385com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001386{
1387 c->c_lineno = lineno;
1388 if (c->c_firstlineno == 0) {
1389 c->c_firstlineno = c->c_last_line = lineno;
1390 }
1391 else {
1392 int incr_addr = c->c_nexti - c->c_last_addr;
1393 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001394 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001395 while (incr_addr > 255) {
1396 com_add_lnotab(c, 255, 0);
1397 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001398 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001399 while (incr_line > 255) {
1400 com_add_lnotab(c, incr_addr, 255);
1401 incr_line -=255;
1402 incr_addr = 0;
1403 }
1404 if (incr_addr > 0 || incr_line > 0)
1405 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001406 c->c_last_addr = c->c_nexti;
1407 c->c_last_line = lineno;
1408 }
1409}
1410
1411static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001412com_strip_lnotab(struct compiling *c)
1413{
1414 /* strip the last lnotab entry if no opcode were emitted.
1415 * This prevents a line number to be generated on a final
1416 * pass, like in the following example:
1417 *
1418 * if a:
1419 * print 5
1420 * else:
1421 * pass
1422 *
1423 * Without the fix, a line trace event would be generated
1424 * on the pass even if a is true (because of the implicit
1425 * return).
1426 */
1427 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1428 c->c_lnotab_next = c->c_lnotab_last;
1429 }
1430}
1431
1432static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001433com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434{
Fred Drakeef8ace32000-08-24 00:32:09 +00001435 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001436 if (extended_arg){
1437 com_addbyte(c, EXTENDED_ARG);
1438 com_addint(c, extended_arg);
1439 arg &= 0xffff;
1440 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001441 com_addbyte(c, op);
1442 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443}
1444
1445static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001446com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001447{
1448 /* Compile a forward reference for backpatching */
1449 int here;
1450 int anchor;
1451 com_addbyte(c, op);
1452 here = c->c_nexti;
1453 anchor = *p_anchor;
1454 *p_anchor = here;
1455 com_addint(c, anchor == 0 ? 0 : here - anchor);
1456}
1457
1458static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001459com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001461 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001462 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001463 int dist;
1464 int prev;
1465 for (;;) {
1466 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001467 prev = code[anchor] + (code[anchor+1] << 8);
1468 dist = target - (anchor+2);
1469 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001470 dist >>= 8;
1471 code[anchor+1] = dist;
1472 dist >>= 8;
1473 if (dist) {
1474 com_error(c, PyExc_SystemError,
1475 "com_backpatch: offset too large");
1476 break;
1477 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001478 if (!prev)
1479 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001480 anchor -= prev;
1481 }
1482}
1483
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001484/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485
1486static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001487com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001489 PyObject *w, *t, *np=NULL;
1490 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001491
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001492 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001493 if (t == NULL)
1494 goto fail;
1495 w = PyDict_GetItem(dict, t);
1496 if (w != NULL) {
1497 n = PyInt_AsLong(w);
1498 } else {
1499 n = PyList_Size(list);
1500 np = PyInt_FromLong(n);
1501 if (np == NULL)
1502 goto fail;
1503 if (PyList_Append(list, v) != 0)
1504 goto fail;
1505 if (PyDict_SetItem(dict, t, np) != 0)
1506 goto fail;
1507 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001508 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001509 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001510 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001511 fail:
1512 Py_XDECREF(np);
1513 Py_XDECREF(t);
1514 c->c_errors++;
1515 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516}
1517
1518static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001519com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001521 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522}
1523
1524static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001525com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001527 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528}
1529
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001530int
1531_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001532{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001533 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001534 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001535 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001536 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1537 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001538 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001539 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001540 return 0; /* Don't mangle __extremely_long_names */
1541 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1542 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001543 /* Strip leading underscores from class name */
1544 while (*p == '_')
1545 p++;
1546 if (*p == '\0')
1547 return 0; /* Don't mangle if class is just underscores */
1548 plen = strlen(p);
1549 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001550 plen = maxlen-nlen-2; /* Truncate class name if too long */
1551 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001552 buffer[0] = '_';
1553 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001554 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001555 return 1;
1556}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001557
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001558static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001559com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001560{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001563 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001564
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001565 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001566 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001567 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568 c->c_errors++;
1569 i = 255;
1570 }
1571 else {
1572 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001575 com_addoparg(c, op, i);
1576}
1577
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001578#define NAME_LOCAL 0
1579#define NAME_GLOBAL 1
1580#define NAME_DEFAULT 2
1581#define NAME_CLOSURE 3
1582
1583static int
1584com_lookup_arg(PyObject *dict, PyObject *name)
1585{
1586 PyObject *v = PyDict_GetItem(dict, name);
1587 if (v == NULL)
1588 return -1;
1589 else
1590 return PyInt_AS_LONG(v);
1591}
1592
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001593static int
1594none_assignment_check(struct compiling *c, char *name, int assigning)
1595{
1596 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1597 char *msg;
1598 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001599 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001600 else
1601 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001602 com_error(c, PyExc_SyntaxError, msg);
1603 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001604 }
1605 return 0;
1606}
1607
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001608static void
1609com_addop_varname(struct compiling *c, int kind, char *name)
1610{
1611 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001612 int i, reftype;
1613 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001614 int op = STOP_CODE;
1615 char buffer[MANGLE_LEN];
1616
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001617 if (kind != VAR_LOAD &&
1618 none_assignment_check(c, name, kind == VAR_STORE))
1619 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001620 i = 255;
1621 goto done;
1622 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001623 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001624 name = buffer;
1625 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1626 c->c_errors++;
1627 i = 255;
1628 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001629 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001630
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001631 reftype = get_ref_type(c, name);
1632 switch (reftype) {
1633 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001634 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001635 scope = NAME_LOCAL;
1636 break;
1637 case GLOBAL_EXPLICIT:
1638 scope = NAME_GLOBAL;
1639 break;
1640 case GLOBAL_IMPLICIT:
1641 if (c->c_flags & CO_OPTIMIZED)
1642 scope = NAME_GLOBAL;
1643 break;
1644 case FREE:
1645 case CELL:
1646 scope = NAME_CLOSURE;
1647 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001648 }
1649
1650 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001651 if (scope == NAME_LOCAL)
1652 i = com_lookup_arg(c->c_locals, v);
1653 else if (reftype == FREE)
1654 i = com_lookup_arg(c->c_freevars, v);
1655 else if (reftype == CELL)
1656 i = com_lookup_arg(c->c_cellvars, v);
1657 if (i == -1) {
1658 c->c_errors++; /* XXX no exception set */
1659 i = 255;
1660 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001661 }
1662 Py_DECREF(v);
1663
1664 switch (kind) {
1665 case VAR_LOAD:
1666 switch (scope) {
1667 case NAME_LOCAL:
1668 op = LOAD_FAST;
1669 break;
1670 case NAME_GLOBAL:
1671 op = LOAD_GLOBAL;
1672 break;
1673 case NAME_DEFAULT:
1674 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001675 break;
1676 case NAME_CLOSURE:
1677 op = LOAD_DEREF;
1678 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001679 }
1680 break;
1681 case VAR_STORE:
1682 switch (scope) {
1683 case NAME_LOCAL:
1684 op = STORE_FAST;
1685 break;
1686 case NAME_GLOBAL:
1687 op = STORE_GLOBAL;
1688 break;
1689 case NAME_DEFAULT:
1690 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001691 break;
1692 case NAME_CLOSURE:
1693 op = STORE_DEREF;
1694 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001695 }
1696 break;
1697 case VAR_DELETE:
1698 switch (scope) {
1699 case NAME_LOCAL:
1700 op = DELETE_FAST;
1701 break;
1702 case NAME_GLOBAL:
1703 op = DELETE_GLOBAL;
1704 break;
1705 case NAME_DEFAULT:
1706 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001707 break;
1708 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001709 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001710 PyOS_snprintf(buf, sizeof(buf),
1711 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001712 com_error(c, PyExc_SyntaxError, buf);
1713 i = 255;
1714 break;
1715 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001716 }
1717 break;
1718 }
1719done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001720 com_addoparg(c, op, i);
1721}
1722
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001723static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001724com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001725{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001726 char *name;
1727 char buffer[1000];
1728 /* XXX it is possible to write this code without the 1000
1729 chars on the total length of dotted names, I just can't be
1730 bothered right now */
1731 if (TYPE(n) == STAR)
1732 name = "*";
1733 else if (TYPE(n) == dotted_name) {
1734 char *p = buffer;
1735 int i;
1736 name = buffer;
1737 for (i = 0; i < NCH(n); i += 2) {
1738 char *s = STR(CHILD(n, i));
1739 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001740 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001741 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001742 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001743 break;
1744 }
1745 if (p != buffer)
1746 *p++ = '.';
1747 strcpy(p, s);
1748 p = strchr(p, '\0');
1749 }
1750 }
1751 else {
1752 REQ(n, NAME);
1753 name = STR(n);
1754 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001755 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001756}
1757
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001759parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001760{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001761 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001762 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001763 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001764#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001765 int imflag;
1766#endif
1767
Guido van Rossum282914b1991-04-04 10:42:56 +00001768 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001769 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001770#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001771 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001772#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001773 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001775 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001777 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001778 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001779 }
1780 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001781 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001783 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001784 if (errno != 0)
1785 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001787 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001788 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001789#ifndef WITHOUT_COMPLEX
1790 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001791 Py_complex z;
1792 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001793 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001794 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001795 PyFPE_END_PROTECT(z)
1796 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001797 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001798 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001799#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001800 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001801 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001802 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001803 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001805 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806}
1807
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001809decode_utf8(char **sPtr, char *end, char* encoding)
1810{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001811#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001812 Py_FatalError("decode_utf8 should not be called in this build.");
1813 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001814#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001815 PyObject *u, *v;
1816 char *s, *t;
1817 t = s = *sPtr;
1818 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1819 while (s < end && (*s & 0x80)) s++;
1820 *sPtr = s;
1821 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1822 if (u == NULL)
1823 return NULL;
1824 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1825 Py_DECREF(u);
1826 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001827#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001828}
1829
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001830/* compiler.transformer.Transformer.decode_literal depends on what
1831 might seem like minor details of this function -- changes here
1832 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001833static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001834parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001837 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001838 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001839 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001840 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001841 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001842 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001843
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001844 if (isalpha(quote) || quote == '_') {
1845 if (quote == 'u' || quote == 'U') {
1846 quote = *++s;
1847 unicode = 1;
1848 }
1849 if (quote == 'r' || quote == 'R') {
1850 quote = *++s;
1851 rawmode = 1;
1852 }
1853 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001854 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001856 return NULL;
1857 }
1858 s++;
1859 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001860 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001861 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001862 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001863 return NULL;
1864 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001865 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001867 return NULL;
1868 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001869 if (len >= 4 && s[0] == quote && s[1] == quote) {
1870 s += 2;
1871 len -= 2;
1872 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001874 return NULL;
1875 }
1876 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001877#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001878 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001879 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001880 char *buf;
1881 char *p;
1882 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001883 if (encoding == NULL) {
1884 buf = s;
1885 u = NULL;
1886 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1887 buf = s;
1888 u = NULL;
1889 } else {
1890 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1891 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1892 if (u == NULL)
1893 return NULL;
1894 p = buf = PyString_AsString(u);
1895 end = s + len;
1896 while (s < end) {
1897 if (*s == '\\') {
1898 *p++ = *s++;
1899 if (*s & 0x80) {
1900 strcpy(p, "u005c");
1901 p += 5;
1902 }
1903 }
1904 if (*s & 0x80) { /* XXX inefficient */
1905 char *r;
1906 int rn, i;
1907 w = decode_utf8(&s, end, "utf-16-be");
1908 if (w == NULL) {
1909 Py_DECREF(u);
1910 return NULL;
1911 }
1912 r = PyString_AsString(w);
1913 rn = PyString_Size(w);
1914 assert(rn % 2 == 0);
1915 for (i = 0; i < rn; i += 2) {
1916 sprintf(p, "\\u%02x%02x",
1917 r[i + 0] & 0xFF,
1918 r[i + 1] & 0xFF);
1919 p += 6;
1920 }
1921 Py_DECREF(w);
1922 } else {
1923 *p++ = *s++;
1924 }
1925 }
1926 len = p - buf;
1927 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001928 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001929 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001930 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001931 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1932 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001933 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001934 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001935 return v;
1936
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001937 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001938#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001939 need_encoding = (encoding != NULL &&
1940 strcmp(encoding, "utf-8") != 0 &&
1941 strcmp(encoding, "iso-8859-1") != 0);
1942 if (rawmode || strchr(s, '\\') == NULL) {
1943 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001944#ifndef Py_USING_UNICODE
1945 /* This should not happen - we never see any other
1946 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001947 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001948#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001949 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1950 if (u == NULL)
1951 return NULL;
1952 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1953 Py_DECREF(u);
1954 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001955#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001956 } else {
1957 return PyString_FromStringAndSize(s, len);
1958 }
1959 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001960
1961 v = PyString_DecodeEscape(s, len, NULL, unicode,
1962 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001963 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001964 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965 return v;
1966}
1967
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001969parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001970{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001972 int i;
1973 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001974 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001975 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001976 for (i = 1; i < NCH(n); i++) {
1977 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001978 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001979 if (s == NULL)
1980 goto onError;
1981 if (PyString_Check(v) && PyString_Check(s)) {
1982 PyString_ConcatAndDel(&v, s);
1983 if (v == NULL)
1984 goto onError;
1985 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001986#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001987 else {
1988 PyObject *temp;
1989 temp = PyUnicode_Concat(v, s);
1990 Py_DECREF(s);
1991 if (temp == NULL)
1992 goto onError;
1993 Py_DECREF(v);
1994 v = temp;
1995 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001996#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001997 }
1998 }
1999 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002000
2001 onError:
2002 Py_XDECREF(v);
2003 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002004}
2005
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002007com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002008{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002009 int anchor = 0;
2010 int save_begin = c->c_begin;
2011
Raymond Hettinger354433a2004-05-19 08:20:33 +00002012 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002013 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002014 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002015 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002016 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002017 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002018 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002019 c->c_loops++;
2020 com_list_iter(c, n, e, t);
2021 c->c_loops--;
2022 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2023 c->c_begin = save_begin;
2024 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002025 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002026}
2027
2028static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002029com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2030{
2031 int break_anchor = 0;
2032 int anchor = 0;
2033 int save_begin = c->c_begin;
2034
2035 REQ(n, gen_for);
2036 /* gen_for: for v in test [gen_iter] */
2037
2038 com_addfwref(c, SETUP_LOOP, &break_anchor);
2039 block_push(c, SETUP_LOOP);
2040
2041 if (is_outmost) {
2042 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2043 com_push(c, 1);
2044 }
2045 else {
2046 com_node(c, CHILD(n, 3));
2047 com_addbyte(c, GET_ITER);
2048 }
2049
2050 c->c_begin = c->c_nexti;
2051 com_set_lineno(c, c->c_last_line);
2052 com_addfwref(c, FOR_ITER, &anchor);
2053 com_push(c, 1);
2054 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2055
2056 if (NCH(n) == 5)
2057 com_gen_iter(c, CHILD(n, 4), t);
2058 else {
2059 com_test(c, t);
2060 com_addbyte(c, YIELD_VALUE);
2061 com_pop(c, 1);
2062 }
2063
2064 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2065 c->c_begin = save_begin;
2066
2067 com_backpatch(c, anchor);
2068 com_pop(c, 1); /* FOR_ITER has popped this */
2069 com_addbyte(c, POP_BLOCK);
2070 block_pop(c, SETUP_LOOP);
2071 com_backpatch(c, break_anchor);
2072}
2073
2074static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002075com_list_if(struct compiling *c, node *n, node *e, char *t)
2076{
2077 int anchor = 0;
2078 int a = 0;
2079 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002080 com_node(c, CHILD(n, 1));
2081 com_addfwref(c, JUMP_IF_FALSE, &a);
2082 com_addbyte(c, POP_TOP);
2083 com_pop(c, 1);
2084 com_list_iter(c, n, e, t);
2085 com_addfwref(c, JUMP_FORWARD, &anchor);
2086 com_backpatch(c, a);
2087 /* We jump here with an extra entry which we now pop */
2088 com_addbyte(c, POP_TOP);
2089 com_backpatch(c, anchor);
2090}
2091
2092static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002093com_gen_if(struct compiling *c, node *n, node *t)
2094{
2095 /* gen_if: 'if' test [gen_iter] */
2096 int anchor = 0;
2097 int a=0;
2098
2099 com_node(c, CHILD(n, 1));
2100 com_addfwref(c, JUMP_IF_FALSE, &a);
2101 com_addbyte(c, POP_TOP);
2102 com_pop(c, 1);
2103
2104 if (NCH(n) == 3)
2105 com_gen_iter(c, CHILD(n, 2), t);
2106 else {
2107 com_test(c, t);
2108 com_addbyte(c, YIELD_VALUE);
2109 com_pop(c, 1);
2110 }
2111 com_addfwref(c, JUMP_FORWARD, &anchor);
2112 com_backpatch(c, a);
2113 /* We jump here with an extra entry which we now pop */
2114 com_addbyte(c, POP_TOP);
2115 com_backpatch(c, anchor);
2116}
2117
2118static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002119com_list_iter(struct compiling *c,
2120 node *p, /* parent of list_iter node */
2121 node *e, /* element expression node */
2122 char *t /* name of result list temp local */)
2123{
2124 /* list_iter is the last child in a listmaker, list_for, or list_if */
2125 node *n = CHILD(p, NCH(p)-1);
2126 if (TYPE(n) == list_iter) {
2127 n = CHILD(n, 0);
2128 switch (TYPE(n)) {
2129 case list_for:
2130 com_list_for(c, n, e, t);
2131 break;
2132 case list_if:
2133 com_list_if(c, n, e, t);
2134 break;
2135 default:
2136 com_error(c, PyExc_SystemError,
2137 "invalid list_iter node type");
2138 }
2139 }
2140 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002141 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002142 com_push(c, 1);
2143 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002144 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002145 com_pop(c, 2);
2146 }
2147}
2148
2149static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002150com_gen_iter(struct compiling *c, node *n, node *t)
2151{
2152 /* gen_iter: gen_for | gen_if */
2153 node *ch;
2154 REQ(n, gen_iter);
2155
2156 ch = CHILD(n, 0);
2157
2158 switch (TYPE(ch)) {
2159 case gen_for:
2160 com_gen_for(c, ch, t, 0);
2161 break;
2162 case gen_if:
2163 com_gen_if(c, ch, t);
2164 break;
2165 default:
2166 com_error(c, PyExc_SystemError,
2167 "invalid gen_iter node type");
2168 }
2169}
2170
2171static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002172com_list_comprehension(struct compiling *c, node *n)
2173{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002174 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002175 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002176
2177 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002178 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002179 com_addoparg(c, BUILD_LIST, 0);
2180 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2181 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002182 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002183 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002184 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002185 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002186 --c->c_tmpname;
2187}
2188
2189static void
2190com_listmaker(struct compiling *c, node *n)
2191{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002192 /* listmaker: test ( list_for | (',' test)* [','] ) */
2193 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002194 com_list_comprehension(c, n);
2195 else {
2196 int len = 0;
2197 int i;
2198 for (i = 0; i < NCH(n); i += 2, len++)
2199 com_node(c, CHILD(n, i));
2200 com_addoparg(c, BUILD_LIST, len);
2201 com_pop(c, len-1);
2202 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203}
2204
2205static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002206com_generator_expression(struct compiling *c, node *n)
2207{
2208 /* testlist_gexp: test gen_for */
2209 /* argument: test gen_for */
2210 PyCodeObject *co;
2211
2212 REQ(CHILD(n, 0), test);
2213 REQ(CHILD(n, 1), gen_for);
2214
2215 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2216 n->n_lineno);
2217 co = icompile(n, c);
2218 symtable_exit_scope(c->c_symtable);
2219
2220 if (co == NULL)
2221 c->c_errors++;
2222 else {
2223 int closure = com_make_closure(c, co);
2224 int i = com_addconst(c, (PyObject *)co);
2225
2226 com_addoparg(c, LOAD_CONST, i);
2227 com_push(c, 1);
2228 if (closure)
2229 com_addoparg(c, MAKE_CLOSURE, 0);
2230 else
2231 com_addoparg(c, MAKE_FUNCTION, 0);
2232
2233 com_test(c, CHILD(CHILD(n, 1), 3));
2234 com_addbyte(c, GET_ITER);
2235 com_addoparg(c, CALL_FUNCTION, 1);
2236 com_pop(c, 1);
2237
2238 Py_DECREF(co);
2239 }
2240}
2241
2242static void
2243com_testlist_gexp(struct compiling *c, node *n)
2244{
2245 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2246 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2247 com_generator_expression(c, n);
2248 else com_list(c, n, 0);
2249}
2250
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002251
Raymond Hettinger354433a2004-05-19 08:20:33 +00002252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002253com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002254{
2255 int i;
2256 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2257 for (i = 0; i+2 < NCH(n); i += 4) {
2258 /* We must arrange things just right for STORE_SUBSCR.
2259 It wants the stack to look like (value) (dict) (key) */
2260 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002261 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002262 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002263 com_node(c, CHILD(n, i+2)); /* value */
2264 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002265 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002266 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002267 }
2268}
2269
2270static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002271com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272{
2273 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002275 int i;
2276 REQ(n, atom);
2277 ch = CHILD(n, 0);
2278 switch (TYPE(ch)) {
2279 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002280 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002282 com_push(c, 1);
2283 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002284 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002285 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002287 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002288 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002290 com_push(c, 1);
2291 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002293 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002294 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002295 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002298 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002299 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 break;
2301 case BACKQUOTE:
2302 com_node(c, CHILD(n, 1));
2303 com_addbyte(c, UNARY_CONVERT);
2304 break;
2305 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002306 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 i = 255;
2308 }
2309 else {
2310 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002311 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 }
2313 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002314 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 break;
2316 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002317 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002318 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 c->c_errors++;
2320 i = 255;
2321 }
2322 else {
2323 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 }
2326 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002328 break;
2329 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002330 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002331 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 break;
2333 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 com_error(c, PyExc_SystemError,
2335 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002336 }
2337}
2338
2339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002340com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341{
2342 if (NCH(n) == 1) {
2343 com_addbyte(c, op);
2344 }
2345 else if (NCH(n) == 2) {
2346 if (TYPE(CHILD(n, 0)) != COLON) {
2347 com_node(c, CHILD(n, 0));
2348 com_addbyte(c, op+1);
2349 }
2350 else {
2351 com_node(c, CHILD(n, 1));
2352 com_addbyte(c, op+2);
2353 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 }
2356 else {
2357 com_node(c, CHILD(n, 0));
2358 com_node(c, CHILD(n, 2));
2359 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 }
2362}
2363
Guido van Rossum635abd21997-01-06 22:56:52 +00002364static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002365com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2366{
2367 if (NCH(n) == 1) {
2368 com_addbyte(c, DUP_TOP);
2369 com_push(c, 1);
2370 com_addbyte(c, SLICE);
2371 com_node(c, augn);
2372 com_addbyte(c, opcode);
2373 com_pop(c, 1);
2374 com_addbyte(c, ROT_TWO);
2375 com_addbyte(c, STORE_SLICE);
2376 com_pop(c, 2);
2377 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2378 com_node(c, CHILD(n, 0));
2379 com_addoparg(c, DUP_TOPX, 2);
2380 com_push(c, 2);
2381 com_addbyte(c, SLICE+1);
2382 com_pop(c, 1);
2383 com_node(c, augn);
2384 com_addbyte(c, opcode);
2385 com_pop(c, 1);
2386 com_addbyte(c, ROT_THREE);
2387 com_addbyte(c, STORE_SLICE+1);
2388 com_pop(c, 3);
2389 } else if (NCH(n) == 2) {
2390 com_node(c, CHILD(n, 1));
2391 com_addoparg(c, DUP_TOPX, 2);
2392 com_push(c, 2);
2393 com_addbyte(c, SLICE+2);
2394 com_pop(c, 1);
2395 com_node(c, augn);
2396 com_addbyte(c, opcode);
2397 com_pop(c, 1);
2398 com_addbyte(c, ROT_THREE);
2399 com_addbyte(c, STORE_SLICE+2);
2400 com_pop(c, 3);
2401 } else {
2402 com_node(c, CHILD(n, 0));
2403 com_node(c, CHILD(n, 2));
2404 com_addoparg(c, DUP_TOPX, 3);
2405 com_push(c, 3);
2406 com_addbyte(c, SLICE+3);
2407 com_pop(c, 2);
2408 com_node(c, augn);
2409 com_addbyte(c, opcode);
2410 com_pop(c, 1);
2411 com_addbyte(c, ROT_FOUR);
2412 com_addbyte(c, STORE_SLICE+3);
2413 com_pop(c, 4);
2414 }
2415}
2416
2417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002418com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002419{
2420 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002421 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002422 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002423 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002424 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002425 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002426 }
2427 else {
2428 com_node(c, CHILD(n, 0));
2429 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002430 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002431 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002432 if (NCH(n) == 2) {
2433 com_generator_expression(c, n);
2434 return;
2435 }
2436
Guido van Rossumf10570b1995-07-07 22:53:21 +00002437 m = n;
2438 do {
2439 m = CHILD(m, 0);
2440 } while (NCH(m) == 1);
2441 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002442 /* f(lambda x: x[0] = 3) ends up getting parsed with
2443 * LHS test = lambda x: x[0], and RHS test = 3.
2444 * SF bug 132313 points out that complaining about a keyword
2445 * then is very confusing.
2446 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002447 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002448 TYPE(m) == lambdef ?
2449 "lambda cannot contain assignment" :
2450 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002451 }
2452 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002453 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002454 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002455 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002456 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002457 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002458 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002459 else if (*pkeywords == NULL) {
2460 c->c_errors++;
2461 Py_DECREF(v);
2462 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002463 if (PyDict_GetItem(*pkeywords, v) != NULL)
2464 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002465 "duplicate keyword argument");
2466 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002467 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002468 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002469 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002470 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002471 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002472 }
2473 }
2474 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002475}
2476
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479{
2480 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002481 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 }
2483 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002485 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002486 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002487 int star_flag = 0;
2488 int starstar_flag = 0;
2489 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002490 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002491 na = 0;
2492 nk = 0;
2493 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002494 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002495 if (TYPE(ch) == STAR ||
2496 TYPE(ch) == DOUBLESTAR)
2497 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002498 if (ch->n_lineno != lineno) {
2499 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002500 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002501 }
2502 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002503 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002504 na++;
2505 else
2506 nk++;
2507 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002508 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002509 while (i < NCH(n)) {
2510 node *tok = CHILD(n, i);
2511 node *ch = CHILD(n, i+1);
2512 i += 3;
2513 switch (TYPE(tok)) {
2514 case STAR: star_flag = 1; break;
2515 case DOUBLESTAR: starstar_flag = 1; break;
2516 }
2517 com_node(c, ch);
2518 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002519 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002520 com_error(c, PyExc_SyntaxError,
2521 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002522 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002523 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002524 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002525 star_flag + (starstar_flag << 1);
2526 else
2527 opcode = CALL_FUNCTION;
2528 com_addoparg(c, opcode, na | (nk << 8));
2529 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 }
2531}
2532
2533static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002534com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535{
2536 com_addopname(c, LOAD_ATTR, n);
2537}
2538
2539static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002540com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002541{
2542 int i=0;
2543 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002544 node *ch;
2545
2546 /* first argument */
2547 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002548 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002549 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002550 i++;
2551 }
2552 else {
2553 com_node(c, CHILD(n,i));
2554 i++;
2555 REQ(CHILD(n,i),COLON);
2556 i++;
2557 }
2558 /* second argument */
2559 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2560 com_node(c, CHILD(n,i));
2561 i++;
2562 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002564 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002565 com_push(c, 1);
2566 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002567 /* remaining arguments */
2568 for (; i < NCH(n); i++) {
2569 ns++;
2570 ch=CHILD(n,i);
2571 REQ(ch, sliceop);
2572 if (NCH(ch) == 1) {
2573 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002574 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002575 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002576 }
2577 else
2578 com_node(c, CHILD(ch,1));
2579 }
2580 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002581 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002582}
2583
2584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002585com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002586{
2587 node *ch;
2588 REQ(n, subscript);
2589 ch = CHILD(n,0);
2590 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002591 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002592 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002593 com_push(c, 1);
2594 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002595 else {
2596 /* check for slice */
2597 if ((TYPE(ch) == COLON || NCH(n) > 1))
2598 com_sliceobj(c, n);
2599 else {
2600 REQ(ch, test);
2601 com_node(c, ch);
2602 }
2603 }
2604}
2605
2606static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002607com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002608{
2609 int i, op;
2610 REQ(n, subscriptlist);
2611 /* Check to make backward compatible slice behavior for '[i:j]' */
2612 if (NCH(n) == 1) {
2613 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002614 /* 'Basic' slice, should have exactly one colon. */
2615 if ((TYPE(CHILD(sub, 0)) == COLON
2616 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2617 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2618 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002619 switch (assigning) {
2620 case OP_DELETE:
2621 op = DELETE_SLICE;
2622 break;
2623 case OP_ASSIGN:
2624 op = STORE_SLICE;
2625 break;
2626 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002627 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002628 break;
2629 default:
2630 com_augassign_slice(c, sub, assigning, augn);
2631 return;
2632 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002633 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002634 if (op == STORE_SLICE)
2635 com_pop(c, 2);
2636 else if (op == DELETE_SLICE)
2637 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002638 return;
2639 }
2640 }
2641 /* Else normal subscriptlist. Compile each subscript. */
2642 for (i = 0; i < NCH(n); i += 2)
2643 com_subscript(c, CHILD(n, i));
2644 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 if (NCH(n) > 1) {
2646 i = (NCH(n)+1) / 2;
2647 com_addoparg(c, BUILD_TUPLE, i);
2648 com_pop(c, i-1);
2649 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002650 switch (assigning) {
2651 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 op = DELETE_SUBSCR;
2653 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002654 break;
2655 default:
2656 case OP_ASSIGN:
2657 op = STORE_SUBSCR;
2658 i = 3;
2659 break;
2660 case OP_APPLY:
2661 op = BINARY_SUBSCR;
2662 i = 1;
2663 break;
2664 }
2665 if (assigning > OP_APPLY) {
2666 com_addoparg(c, DUP_TOPX, 2);
2667 com_push(c, 2);
2668 com_addbyte(c, BINARY_SUBSCR);
2669 com_pop(c, 1);
2670 com_node(c, augn);
2671 com_addbyte(c, assigning);
2672 com_pop(c, 1);
2673 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002674 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002675 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002676 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002677}
2678
2679static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002680com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002681{
2682 REQ(n, trailer);
2683 switch (TYPE(CHILD(n, 0))) {
2684 case LPAR:
2685 com_call_function(c, CHILD(n, 1));
2686 break;
2687 case DOT:
2688 com_select_member(c, CHILD(n, 1));
2689 break;
2690 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002691 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 break;
2693 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002694 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002695 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 }
2697}
2698
2699static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002700com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002701{
2702 int i;
2703 REQ(n, power);
2704 com_atom(c, CHILD(n, 0));
2705 for (i = 1; i < NCH(n); i++) {
2706 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2707 com_factor(c, CHILD(n, i+1));
2708 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002709 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002710 break;
2711 }
2712 else
2713 com_apply_trailer(c, CHILD(n, i));
2714 }
2715}
2716
2717static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002718com_invert_constant(struct compiling *c, node *n)
2719{
2720 /* Compute the inverse of int and longs and use them directly,
2721 but be prepared to generate code for all other
2722 possibilities (invalid numbers, floats, complex).
2723 */
2724 PyObject *num, *inv = NULL;
2725 int i;
2726
2727 REQ(n, NUMBER);
2728 num = parsenumber(c, STR(n));
2729 if (num == NULL)
2730 i = 255;
2731 else {
2732 inv = PyNumber_Invert(num);
2733 if (inv == NULL) {
2734 PyErr_Clear();
2735 i = com_addconst(c, num);
2736 } else {
2737 i = com_addconst(c, inv);
2738 Py_DECREF(inv);
2739 }
2740 Py_DECREF(num);
2741 }
2742 com_addoparg(c, LOAD_CONST, i);
2743 com_push(c, 1);
2744 if (num != NULL && inv == NULL)
2745 com_addbyte(c, UNARY_INVERT);
2746}
2747
Tim Peters51e26512001-09-07 08:45:55 +00002748static int
2749is_float_zero(const char *p)
2750{
2751 int found_radix_point = 0;
2752 int ch;
2753 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2754 switch (ch) {
2755 case '0':
2756 /* no reason to believe it's not 0 -- continue */
2757 break;
2758
2759 case 'e': case 'E': case 'j': case 'J':
2760 /* If this was a hex constant, we already would have
2761 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2762 must be an exponent marker, and we haven't yet
2763 seen a non-zero digit, and it doesn't matter what
2764 the exponent is then. For 'j' or 'J' similarly,
2765 except that this is an imaginary 0 then. */
2766 return 1;
2767
2768 case '.':
2769 found_radix_point = 1;
2770 break;
2771
2772 default:
2773 return 0;
2774 }
2775 }
2776 return found_radix_point;
2777}
2778
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002779static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002780com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002782 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002783 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002784 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002785 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002786 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002787 approriate value as a constant. If the value is negative,
2788 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002789 negative in the 0th position -- unless we're doing unary minus
2790 of a floating zero! In that case the sign is significant, but
2791 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002792 */
2793 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002794 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002795 && TYPE((pfactor = CHILD(n, 1))) == factor
2796 && NCH(pfactor) == 1
2797 && TYPE((ppower = CHILD(pfactor, 0))) == power
2798 && NCH(ppower) == 1
2799 && TYPE((patom = CHILD(ppower, 0))) == atom
2800 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002801 && !(childtype == MINUS &&
2802 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002803 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002804 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002805 return;
2806 }
2807 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002808 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002809 if (s == NULL) {
2810 com_error(c, PyExc_MemoryError, "");
2811 com_addbyte(c, 255);
2812 return;
2813 }
2814 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002815 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002816 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002817 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002818 }
Tim Peters51e26512001-09-07 08:45:55 +00002819 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002820 }
2821 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002822 com_factor(c, CHILD(n, 1));
2823 com_addbyte(c, UNARY_POSITIVE);
2824 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002825 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002826 com_factor(c, CHILD(n, 1));
2827 com_addbyte(c, UNARY_NEGATIVE);
2828 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002829 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002830 com_factor(c, CHILD(n, 1));
2831 com_addbyte(c, UNARY_INVERT);
2832 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002834 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835 }
2836}
2837
2838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002839com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840{
2841 int i;
2842 int op;
2843 REQ(n, term);
2844 com_factor(c, CHILD(n, 0));
2845 for (i = 2; i < NCH(n); i += 2) {
2846 com_factor(c, CHILD(n, i));
2847 switch (TYPE(CHILD(n, i-1))) {
2848 case STAR:
2849 op = BINARY_MULTIPLY;
2850 break;
2851 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002852 if (c->c_flags & CO_FUTURE_DIVISION)
2853 op = BINARY_TRUE_DIVIDE;
2854 else
2855 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 break;
2857 case PERCENT:
2858 op = BINARY_MODULO;
2859 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002860 case DOUBLESLASH:
2861 op = BINARY_FLOOR_DIVIDE;
2862 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002864 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002865 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002866 op = 255;
2867 }
2868 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002870 }
2871}
2872
2873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002875{
2876 int i;
2877 int op;
2878 REQ(n, arith_expr);
2879 com_term(c, CHILD(n, 0));
2880 for (i = 2; i < NCH(n); i += 2) {
2881 com_term(c, CHILD(n, i));
2882 switch (TYPE(CHILD(n, i-1))) {
2883 case PLUS:
2884 op = BINARY_ADD;
2885 break;
2886 case MINUS:
2887 op = BINARY_SUBTRACT;
2888 break;
2889 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002890 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002891 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002892 op = 255;
2893 }
2894 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002895 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002896 }
2897}
2898
2899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002901{
2902 int i;
2903 int op;
2904 REQ(n, shift_expr);
2905 com_arith_expr(c, CHILD(n, 0));
2906 for (i = 2; i < NCH(n); i += 2) {
2907 com_arith_expr(c, CHILD(n, i));
2908 switch (TYPE(CHILD(n, i-1))) {
2909 case LEFTSHIFT:
2910 op = BINARY_LSHIFT;
2911 break;
2912 case RIGHTSHIFT:
2913 op = BINARY_RSHIFT;
2914 break;
2915 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002916 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002917 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002918 op = 255;
2919 }
2920 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002921 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002922 }
2923}
2924
2925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002926com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002927{
2928 int i;
2929 int op;
2930 REQ(n, and_expr);
2931 com_shift_expr(c, CHILD(n, 0));
2932 for (i = 2; i < NCH(n); i += 2) {
2933 com_shift_expr(c, CHILD(n, i));
2934 if (TYPE(CHILD(n, i-1)) == AMPER) {
2935 op = BINARY_AND;
2936 }
2937 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002938 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002939 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002940 op = 255;
2941 }
2942 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002943 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002944 }
2945}
2946
2947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002948com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002949{
2950 int i;
2951 int op;
2952 REQ(n, xor_expr);
2953 com_and_expr(c, CHILD(n, 0));
2954 for (i = 2; i < NCH(n); i += 2) {
2955 com_and_expr(c, CHILD(n, i));
2956 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2957 op = BINARY_XOR;
2958 }
2959 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002960 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002961 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962 op = 255;
2963 }
2964 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002966 }
2967}
2968
2969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002970com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002971{
2972 int i;
2973 int op;
2974 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002975 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002977 com_xor_expr(c, CHILD(n, i));
2978 if (TYPE(CHILD(n, i-1)) == VBAR) {
2979 op = BINARY_OR;
2980 }
2981 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002982 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002983 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 op = 255;
2985 }
2986 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002987 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 }
2989}
2990
2991static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002992cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993{
2994 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002995 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2997 if (NCH(n) == 1) {
2998 n = CHILD(n, 0);
2999 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003000 case LESS: return PyCmp_LT;
3001 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003002 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003003 case LESSEQUAL: return PyCmp_LE;
3004 case GREATEREQUAL: return PyCmp_GE;
3005 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3006 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3007 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008 }
3009 }
3010 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003013 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003014 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003015 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 }
3017 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003018 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019}
3020
3021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003022com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023{
3024 int i;
3025 enum cmp_op op;
3026 int anchor;
3027 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3028 com_expr(c, CHILD(n, 0));
3029 if (NCH(n) == 1)
3030 return;
3031
3032 /****************************************************************
3033 The following code is generated for all but the last
3034 comparison in a chain:
3035
3036 label: on stack: opcode: jump to:
3037
3038 a <code to load b>
3039 a, b DUP_TOP
3040 a, b, b ROT_THREE
3041 b, a, b COMPARE_OP
3042 b, 0-or-1 JUMP_IF_FALSE L1
3043 b, 1 POP_TOP
3044 b
3045
3046 We are now ready to repeat this sequence for the next
3047 comparison in the chain.
3048
3049 For the last we generate:
3050
3051 b <code to load c>
3052 b, c COMPARE_OP
3053 0-or-1
3054
3055 If there were any jumps to L1 (i.e., there was more than one
3056 comparison), we generate:
3057
3058 0-or-1 JUMP_FORWARD L2
3059 L1: b, 0 ROT_TWO
3060 0, b POP_TOP
3061 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003062 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063 ****************************************************************/
3064
3065 anchor = 0;
3066
3067 for (i = 2; i < NCH(n); i += 2) {
3068 com_expr(c, CHILD(n, i));
3069 if (i+2 < NCH(n)) {
3070 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003071 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 com_addbyte(c, ROT_THREE);
3073 }
3074 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003075 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003076 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003077 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078 }
3079 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003081 if (i+2 < NCH(n)) {
3082 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3083 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 }
3086 }
3087
3088 if (anchor) {
3089 int anchor2 = 0;
3090 com_addfwref(c, JUMP_FORWARD, &anchor2);
3091 com_backpatch(c, anchor);
3092 com_addbyte(c, ROT_TWO);
3093 com_addbyte(c, POP_TOP);
3094 com_backpatch(c, anchor2);
3095 }
3096}
3097
3098static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003099com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100{
3101 REQ(n, not_test); /* 'not' not_test | comparison */
3102 if (NCH(n) == 1) {
3103 com_comparison(c, CHILD(n, 0));
3104 }
3105 else {
3106 com_not_test(c, CHILD(n, 1));
3107 com_addbyte(c, UNARY_NOT);
3108 }
3109}
3110
3111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003112com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
3114 int i;
3115 int anchor;
3116 REQ(n, and_test); /* not_test ('and' not_test)* */
3117 anchor = 0;
3118 i = 0;
3119 for (;;) {
3120 com_not_test(c, CHILD(n, i));
3121 if ((i += 2) >= NCH(n))
3122 break;
3123 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3124 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 }
3127 if (anchor)
3128 com_backpatch(c, anchor);
3129}
3130
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003131static int
3132com_make_closure(struct compiling *c, PyCodeObject *co)
3133{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003134 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003135 if (free == 0)
3136 return 0;
3137 for (i = 0; i < free; ++i) {
3138 /* Bypass com_addop_varname because it will generate
3139 LOAD_DEREF but LOAD_CLOSURE is needed.
3140 */
3141 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3142 int arg, reftype;
3143
3144 /* Special case: If a class contains a method with a
3145 free variable that has the same name as a method,
3146 the name will be considered free *and* local in the
3147 class. It should be handled by the closure, as
3148 well as by the normal name loookup logic.
3149 */
3150 reftype = get_ref_type(c, PyString_AS_STRING(name));
3151 if (reftype == CELL)
3152 arg = com_lookup_arg(c->c_cellvars, name);
3153 else /* (reftype == FREE) */
3154 arg = com_lookup_arg(c->c_freevars, name);
3155 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003156 fprintf(stderr, "lookup %s in %s %d %d\n"
3157 "freevars of %s: %s\n",
3158 PyObject_REPR(name),
3159 c->c_name,
3160 reftype, arg,
3161 PyString_AS_STRING(co->co_name),
3162 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003163 Py_FatalError("com_make_closure()");
3164 }
3165 com_addoparg(c, LOAD_CLOSURE, arg);
3166
3167 }
3168 com_push(c, free);
3169 return 1;
3170}
3171
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003173com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003175 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003176 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003177 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003178 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003179 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003180 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3181 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003182 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003183 if (co == NULL) {
3184 c->c_errors++;
3185 return;
3186 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003187 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003188 i = com_addconst(c, (PyObject *)co);
3189 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003190 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003191 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003192 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003193 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003194 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003195 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003196 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003197 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003200 else {
3201 int anchor = 0;
3202 int i = 0;
3203 for (;;) {
3204 com_and_test(c, CHILD(n, i));
3205 if ((i += 2) >= NCH(n))
3206 break;
3207 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3208 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003209 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003210 }
3211 if (anchor)
3212 com_backpatch(c, anchor);
3213 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214}
3215
3216static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003217com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218{
3219 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003220 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221 com_node(c, CHILD(n, 0));
3222 }
3223 else {
3224 int i;
3225 int len;
3226 len = (NCH(n) + 1) / 2;
3227 for (i = 0; i < NCH(n); i += 2)
3228 com_node(c, CHILD(n, i));
3229 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003230 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 }
3232}
3233
3234
3235/* Begin of assignment compilation */
3236
Thomas Wouters434d0822000-08-24 20:11:32 +00003237
3238static void
3239com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3240{
3241 com_addbyte(c, DUP_TOP);
3242 com_push(c, 1);
3243 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003244 com_node(c, augn);
3245 com_addbyte(c, opcode);
3246 com_pop(c, 1);
3247 com_addbyte(c, ROT_TWO);
3248 com_addopname(c, STORE_ATTR, n);
3249 com_pop(c, 2);
3250}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251
3252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003253com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003255 if (none_assignment_check(c, STR(n), assigning))
3256 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259}
3260
3261static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003262com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003263{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 REQ(n, trailer);
3265 switch (TYPE(CHILD(n, 0))) {
3266 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003267 if (assigning == OP_DELETE)
3268 com_error(c, PyExc_SyntaxError,
3269 "can't delete function call");
3270 else
3271 com_error(c, PyExc_SyntaxError,
3272 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 break;
3274 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003275 if (assigning > OP_APPLY)
3276 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3277 else
3278 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003280 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003281 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 break;
3283 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003284 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 }
3286}
3287
3288static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003289com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290{
3291 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003292 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3293 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 if (assigning) {
3296 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003297 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003298 com_push(c, i-1);
3299 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003301 com_assign(c, CHILD(n, i), assigning, NULL);
3302}
3303
3304static void
3305com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3306{
3307 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003308 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003309 com_push(c, 1);
3310 com_node(c, augn);
3311 com_addbyte(c, opcode);
3312 com_pop(c, 1);
3313 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314}
3315
3316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318{
3319 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003320 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003321 if (assigning)
3322 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323}
3324
3325static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003326com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327{
3328 /* Loop to avoid trivial recursion */
3329 for (;;) {
3330 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003331
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332 case exprlist:
3333 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003334 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003335 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003337 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003338 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003339 "assign to generator expression not possible");
3340 return;
3341 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003342 if (assigning > OP_APPLY) {
3343 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003344 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003345 return;
3346 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003347 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 return;
3349 }
3350 n = CHILD(n, 0);
3351 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003352
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 case test:
3354 case and_test:
3355 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003357 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003358 case xor_expr:
3359 case and_expr:
3360 case shift_expr:
3361 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003363 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003365 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003366 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 return;
3368 }
3369 n = CHILD(n, 0);
3370 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003371
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003372 case power: /* atom trailer* ('**' power)*
3373 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003374 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003375 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003376 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 return;
3378 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003379 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 int i;
3381 com_node(c, CHILD(n, 0));
3382 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003383 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003384 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003385 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003386 return;
3387 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 com_apply_trailer(c, CHILD(n, i));
3389 } /* NB i is still alive */
3390 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003391 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 return;
3393 }
3394 n = CHILD(n, 0);
3395 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003396
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397 case atom:
3398 switch (TYPE(CHILD(n, 0))) {
3399 case LPAR:
3400 n = CHILD(n, 1);
3401 if (TYPE(n) == RPAR) {
3402 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003403 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003404 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405 return;
3406 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003407 if (assigning > OP_APPLY) {
3408 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003409 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003410 return;
3411 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 break;
3413 case LSQB:
3414 n = CHILD(n, 1);
3415 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003417 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 return;
3419 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003420 if (assigning > OP_APPLY) {
3421 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003422 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003423 return;
3424 }
3425 if (NCH(n) > 1
3426 && TYPE(CHILD(n, 1)) == list_for) {
3427 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003428 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003429 return;
3430 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003431 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 return;
3433 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003434 if (assigning > OP_APPLY)
3435 com_augassign_name(c, CHILD(n, 0),
3436 assigning, augn);
3437 else
3438 com_assign_name(c, CHILD(n, 0),
3439 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 return;
3441 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003442 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003443 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 return;
3445 }
3446 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003447
3448 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003449 com_error(c, PyExc_SyntaxError,
3450 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003451 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003452
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003454 com_error(c, PyExc_SystemError,
3455 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003457
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458 }
3459 }
3460}
Guido van Rossum7c531111997-03-11 18:42:21 +00003461
Thomas Wouters434d0822000-08-24 20:11:32 +00003462static void
3463com_augassign(struct compiling *c, node *n)
3464{
3465 int opcode;
3466
3467 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3468 case '+': opcode = INPLACE_ADD; break;
3469 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003470 case '/':
3471 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3472 opcode = INPLACE_FLOOR_DIVIDE;
3473 else if (c->c_flags & CO_FUTURE_DIVISION)
3474 opcode = INPLACE_TRUE_DIVIDE;
3475 else
3476 opcode = INPLACE_DIVIDE;
3477 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003478 case '%': opcode = INPLACE_MODULO; break;
3479 case '<': opcode = INPLACE_LSHIFT; break;
3480 case '>': opcode = INPLACE_RSHIFT; break;
3481 case '&': opcode = INPLACE_AND; break;
3482 case '^': opcode = INPLACE_XOR; break;
3483 case '|': opcode = INPLACE_OR; break;
3484 case '*':
3485 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3486 opcode = INPLACE_POWER;
3487 else
3488 opcode = INPLACE_MULTIPLY;
3489 break;
3490 default:
3491 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3492 return;
3493 }
3494 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3495}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496
3497static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003498com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499{
Thomas Wouters434d0822000-08-24 20:11:32 +00003500 REQ(n, expr_stmt);
3501 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003502 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003503 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003504 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003505 if (NCH(n) == 1) {
3506 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003507 if (c->c_interactive)
3508 com_addbyte(c, PRINT_EXPR);
3509 else
3510 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003513 else if (TYPE(CHILD(n,1)) == augassign)
3514 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003515 else {
3516 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003517 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003518 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003521 com_push(c, 1);
3522 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003523 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 }
3525 }
3526}
3527
3528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003529com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003530{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003531 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003532 int i;
3533 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003534 if (Py_OptimizeFlag)
3535 return;
3536 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003537
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003538 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003539 raise AssertionError [, <message>]
3540
3541 where <message> is the second test, if present.
3542 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003543 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003544 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003545 com_addbyte(c, POP_TOP);
3546 com_pop(c, 1);
3547 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003548 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003549 com_push(c, 1);
3550 i = NCH(n)/2; /* Either 2 or 4 */
3551 if (i > 1)
3552 com_node(c, CHILD(n, 3));
3553 com_addoparg(c, RAISE_VARARGS, i);
3554 com_pop(c, i);
3555 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003556 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003557 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003558 com_addbyte(c, POP_TOP);
3559}
3560
3561static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003562com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003563{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003564 int i = 1;
3565 node* stream = NULL;
3566
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003567 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003568
3569 /* are we using the extended print form? */
3570 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3571 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003572 com_node(c, stream);
3573 /* stack: [...] => [... stream] */
3574 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003575 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3576 i = 4;
3577 else
3578 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003579 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003580 for (; i < NCH(n); i += 2) {
3581 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003582 com_addbyte(c, DUP_TOP);
3583 /* stack: [stream] => [stream stream] */
3584 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003585 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003586 /* stack: [stream stream] => [stream stream obj] */
3587 com_addbyte(c, ROT_TWO);
3588 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003589 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003590 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003591 com_pop(c, 2);
3592 }
3593 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003594 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003595 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003596 com_addbyte(c, PRINT_ITEM);
3597 com_pop(c, 1);
3598 }
3599 }
3600 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003601 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003602 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003603 /* must pop the extra stream object off the stack */
3604 com_addbyte(c, POP_TOP);
3605 /* stack: [... stream] => [...] */
3606 com_pop(c, 1);
3607 }
3608 }
3609 else {
3610 if (stream != NULL) {
3611 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003612 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003613 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003614 com_pop(c, 1);
3615 }
3616 else
3617 com_addbyte(c, PRINT_NEWLINE);
3618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003619}
3620
3621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003624 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003625 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003626 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003627 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003628 if (c->c_flags & CO_GENERATOR) {
3629 if (NCH(n) > 1) {
3630 com_error(c, PyExc_SyntaxError,
3631 "'return' with argument inside generator");
3632 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003633 }
3634 if (NCH(n) < 2) {
3635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003636 com_push(c, 1);
3637 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003638 else
3639 com_node(c, CHILD(n, 1));
3640 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003641 com_pop(c, 1);
3642}
3643
3644static void
3645com_yield_stmt(struct compiling *c, node *n)
3646{
Tim Peters95c80f82001-06-23 02:07:08 +00003647 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003648 REQ(n, yield_stmt); /* 'yield' testlist */
3649 if (!c->c_infunction) {
3650 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3651 }
Tim Peters95c80f82001-06-23 02:07:08 +00003652
3653 for (i = 0; i < c->c_nblocks; ++i) {
3654 if (c->c_block[i] == SETUP_FINALLY) {
3655 com_error(c, PyExc_SyntaxError,
3656 "'yield' not allowed in a 'try' block "
3657 "with a 'finally' clause");
3658 return;
3659 }
3660 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003661 com_node(c, CHILD(n, 1));
3662 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003664}
3665
3666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003667com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003668{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003669 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003670 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3671 if (NCH(n) > 1) {
3672 com_node(c, CHILD(n, 1));
3673 if (NCH(n) > 3) {
3674 com_node(c, CHILD(n, 3));
3675 if (NCH(n) > 5)
3676 com_node(c, CHILD(n, 5));
3677 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003678 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003679 i = NCH(n)/2;
3680 com_addoparg(c, RAISE_VARARGS, i);
3681 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682}
3683
3684static void
Thomas Wouters52152252000-08-17 22:55:00 +00003685com_from_import(struct compiling *c, node *n)
3686{
3687 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3688 com_push(c, 1);
3689 if (NCH(n) > 1) {
3690 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3691 com_error(c, PyExc_SyntaxError, "invalid syntax");
3692 return;
3693 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003694 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003695 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003696 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003697 com_pop(c, 1);
3698}
3699
3700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003703 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003704 int i;
3705 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003706 n = CHILD(n, 0);
3707 /* import_stmt: import_name | import_from */
3708 if (TYPE(n) == import_from) {
3709 /* 'from' dotted_name 'import' ('*' |
3710 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003711 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003712 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003713 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3714 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003715 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003716 else {
3717 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3718 TYPE(CHILD(n, 3)) != LPAR) {
3719 com_error(c, PyExc_SyntaxError,
3720 "trailing comma not allowed "
3721 "without surrounding parentheses");
3722 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003723 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003724 REQ(nn, import_as_names);
3725 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003726 for (i = 0; i < NCH(nn); i += 2) {
3727 PyObject *s = PyString_FromString(
3728 STR(CHILD(CHILD(nn, i), 0)));
3729 if (s == NULL) {
3730 Py_CLEAR(tup);
3731 break;
3732 } else
3733 PyTuple_SET_ITEM(tup, i / 2, s);
3734 }
3735 if (tup == NULL) {
3736 /* Assume that failue above was MemoryError */
3737 com_error(c, PyExc_MemoryError, "");
3738 return;
3739 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003740 }
3741 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003742 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003743 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003744 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003745 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003746 com_addbyte(c, IMPORT_STAR);
3747 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003748 for (i = 0; i < NCH(nn); i += 2)
3749 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003750 com_addbyte(c, POP_TOP);
3751 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003752 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 }
3754 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003755 /* 'import' dotted_as_names */
3756 nn = CHILD(n, 1);
3757 REQ(nn, dotted_as_names);
3758 for (i = 0; i < NCH(nn); i += 2) {
3759 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003760 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003761 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003763 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003764 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003765 int j;
3766 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003767 com_error(c, PyExc_SyntaxError,
3768 "invalid syntax");
3769 return;
3770 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003771 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3772 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003773 CHILD(CHILD(subn, 0),
3774 j));
3775 com_addop_varname(c, VAR_STORE,
3776 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003777 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003778 com_addop_varname(c, VAR_STORE,
3779 STR(CHILD(CHILD(subn, 0),
3780 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003781 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 }
3783 }
3784}
3785
3786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003787com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003788{
3789 REQ(n, exec_stmt);
3790 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3791 com_node(c, CHILD(n, 1));
3792 if (NCH(n) >= 4)
3793 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003794 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003795 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 com_push(c, 1);
3797 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003798 if (NCH(n) >= 6)
3799 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003800 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003801 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003802 com_push(c, 1);
3803 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003804 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003805 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003806}
3807
Guido van Rossum7c531111997-03-11 18:42:21 +00003808static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003809is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003810{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003811 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003812 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003813 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003814
3815 /* Label to avoid tail recursion */
3816 next:
3817 switch (TYPE(n)) {
3818
3819 case suite:
3820 if (NCH(n) == 1) {
3821 n = CHILD(n, 0);
3822 goto next;
3823 }
3824 /* Fall through */
3825 case file_input:
3826 for (i = 0; i < NCH(n); i++) {
3827 node *ch = CHILD(n, i);
3828 if (TYPE(ch) == stmt) {
3829 n = ch;
3830 goto next;
3831 }
3832 }
3833 break;
3834
3835 case stmt:
3836 case simple_stmt:
3837 case small_stmt:
3838 n = CHILD(n, 0);
3839 goto next;
3840
3841 case expr_stmt:
3842 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003843 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003844 case test:
3845 case and_test:
3846 case not_test:
3847 case comparison:
3848 case expr:
3849 case xor_expr:
3850 case and_expr:
3851 case shift_expr:
3852 case arith_expr:
3853 case term:
3854 case factor:
3855 case power:
3856 case atom:
3857 if (NCH(n) == 1) {
3858 n = CHILD(n, 0);
3859 goto next;
3860 }
3861 break;
3862
3863 case NAME:
3864 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3865 return 1;
3866 break;
3867
3868 case NUMBER:
3869 v = parsenumber(c, STR(n));
3870 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003872 break;
3873 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003874 i = PyObject_IsTrue(v);
3875 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003876 return i == 0;
3877
3878 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003879 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003880 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003882 break;
3883 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003884 i = PyObject_IsTrue(v);
3885 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003886 return i == 0;
3887
3888 }
3889 return 0;
3890}
3891
Tim Peters08a898f2001-06-28 01:52:22 +00003892
3893/* Look under n for a return stmt with an expression.
3894 * This hack is used to find illegal returns under "if 0:" blocks in
3895 * functions already known to be generators (as determined by the symtable
3896 * pass).
3897 * Return the offending return node if found, else NULL.
3898 */
3899static node *
3900look_for_offending_return(node *n)
3901{
3902 int i;
3903
3904 for (i = 0; i < NCH(n); ++i) {
3905 node *kid = CHILD(n, i);
3906
3907 switch (TYPE(kid)) {
3908 case classdef:
3909 case funcdef:
3910 case lambdef:
3911 /* Stuff in nested functions & classes doesn't
3912 affect the code block we started in. */
3913 return NULL;
3914
3915 case return_stmt:
3916 if (NCH(kid) > 1)
3917 return kid;
3918 break;
3919
3920 default: {
3921 node *bad = look_for_offending_return(kid);
3922 if (bad != NULL)
3923 return bad;
3924 }
3925 }
3926 }
3927
3928 return NULL;
3929}
3930
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003931static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003932com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003933{
3934 int i;
3935 int anchor = 0;
3936 REQ(n, if_stmt);
3937 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3938 for (i = 0; i+3 < NCH(n); i+=4) {
3939 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003940 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003941 if (is_constant_false(c, ch)) {
3942 /* We're going to skip this block. However, if this
3943 is a generator, we have to check the dead code
3944 anyway to make sure there aren't any return stmts
3945 with expressions, in the same scope. */
3946 if (c->c_flags & CO_GENERATOR) {
3947 node *p = look_for_offending_return(n);
3948 if (p != NULL) {
3949 int savelineno = c->c_lineno;
3950 c->c_lineno = p->n_lineno;
3951 com_error(c, PyExc_SyntaxError,
3952 "'return' with argument "
3953 "inside generator");
3954 c->c_lineno = savelineno;
3955 }
3956 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003957 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003958 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003959 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003960 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003961 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962 com_addfwref(c, JUMP_IF_FALSE, &a);
3963 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003964 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003965 com_node(c, CHILD(n, i+3));
3966 com_addfwref(c, JUMP_FORWARD, &anchor);
3967 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003968 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 com_addbyte(c, POP_TOP);
3970 }
3971 if (i+2 < NCH(n))
3972 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003973 if (anchor)
3974 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975}
3976
3977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979{
3980 int break_anchor = 0;
3981 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003982 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003983 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3984 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003985 block_push(c, SETUP_LOOP);
3986 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003987 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003988 com_node(c, CHILD(n, 1));
3989 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3990 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003992 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003994 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003995 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3996 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003998 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999 com_addbyte(c, POP_TOP);
4000 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004001 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 if (NCH(n) > 4)
4003 com_node(c, CHILD(n, 6));
4004 com_backpatch(c, break_anchor);
4005}
4006
4007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004008com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004010 int break_anchor = 0;
4011 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004012 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004013 REQ(n, for_stmt);
4014 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4015 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004016 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004018 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004019 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004020 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004021 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004023 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004024 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004026 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004027 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4028 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004030 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004032 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004033 if (NCH(n) > 8)
4034 com_node(c, CHILD(n, 8));
4035 com_backpatch(c, break_anchor);
4036}
4037
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004038/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004039
4040 SETUP_FINALLY L
4041 <code for S>
4042 POP_BLOCK
4043 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004044 L: <code for Sf>
4045 END_FINALLY
4046
4047 The special instructions use the block stack. Each block
4048 stack entry contains the instruction that created it (here
4049 SETUP_FINALLY), the level of the value stack at the time the
4050 block stack entry was created, and a label (here L).
4051
4052 SETUP_FINALLY:
4053 Pushes the current value stack level and the label
4054 onto the block stack.
4055 POP_BLOCK:
4056 Pops en entry from the block stack, and pops the value
4057 stack until its level is the same as indicated on the
4058 block stack. (The label is ignored.)
4059 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004060 Pops a variable number of entries from the *value* stack
4061 and re-raises the exception they specify. The number of
4062 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004063
4064 The block stack is unwound when an exception is raised:
4065 when a SETUP_FINALLY entry is found, the exception is pushed
4066 onto the value stack (and the exception condition is cleared),
4067 and the interpreter jumps to the label gotten from the block
4068 stack.
4069
4070 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004071 (The contents of the value stack is shown in [], with the top
4072 at the right; 'tb' is trace-back info, 'val' the exception's
4073 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004074
4075 Value stack Label Instruction Argument
4076 [] SETUP_EXCEPT L1
4077 [] <code for S>
4078 [] POP_BLOCK
4079 [] JUMP_FORWARD L0
4080
Guido van Rossum3f5da241990-12-20 15:06:42 +00004081 [tb, val, exc] L1: DUP )
4082 [tb, val, exc, exc] <evaluate E1> )
4083 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4084 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4085 [tb, val, exc, 1] POP )
4086 [tb, val, exc] POP
4087 [tb, val] <assign to V1> (or POP if no V1)
4088 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004089 [] <code for S1>
4090 JUMP_FORWARD L0
4091
Guido van Rossum3f5da241990-12-20 15:06:42 +00004092 [tb, val, exc, 0] L2: POP
4093 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004094 .............................etc.......................
4095
Guido van Rossum3f5da241990-12-20 15:06:42 +00004096 [tb, val, exc, 0] Ln+1: POP
4097 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004098
4099 [] L0: <next statement>
4100
4101 Of course, parts are not generated if Vi or Ei is not present.
4102*/
4103
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004105com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004106{
4107 int except_anchor = 0;
4108 int end_anchor = 0;
4109 int else_anchor = 0;
4110 int i;
4111 node *ch;
4112
4113 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4114 block_push(c, SETUP_EXCEPT);
4115 com_node(c, CHILD(n, 2));
4116 com_addbyte(c, POP_BLOCK);
4117 block_pop(c, SETUP_EXCEPT);
4118 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4119 com_backpatch(c, except_anchor);
4120 for (i = 3;
4121 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4122 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004123 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004124 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004125 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004126 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004127 break;
4128 }
4129 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004130 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004131 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004132 if (NCH(ch) > 1) {
4133 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004135 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004136 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004138 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4139 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004140 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004141 }
4142 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004144 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004145 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004146 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004147 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004148 com_pop(c, 1);
4149 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004150 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004152 com_node(c, CHILD(n, i+2));
4153 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4154 if (except_anchor) {
4155 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004156 /* We come in with [tb, val, exc, 0] on the
4157 stack; one pop and it's the same as
4158 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004159 com_addbyte(c, POP_TOP);
4160 }
4161 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 /* We actually come in here with [tb, val, exc] but the
4163 END_FINALLY will zap those and jump around.
4164 The c_stacklevel does not reflect them so we need not pop
4165 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004166 com_addbyte(c, END_FINALLY);
4167 com_backpatch(c, else_anchor);
4168 if (i < NCH(n))
4169 com_node(c, CHILD(n, i+2));
4170 com_backpatch(c, end_anchor);
4171}
4172
4173static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004174com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175{
4176 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004177 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004178
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004179 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4180 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004181 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004182 com_addbyte(c, POP_BLOCK);
4183 block_pop(c, SETUP_FINALLY);
4184 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004185 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004186 /* While the generated code pushes only one item,
4187 the try-finally handling can enter here with
4188 up to three items. OK, here are the details:
4189 3 for an exception, 2 for RETURN, 1 for BREAK. */
4190 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004191 com_backpatch(c, finally_anchor);
4192 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004193 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004194 com_node(c, ch);
4195 com_addbyte(c, END_FINALLY);
4196 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004197 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004198}
4199
4200static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004201com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004202{
4203 REQ(n, try_stmt);
4204 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4205 | 'try' ':' suite 'finally' ':' suite */
4206 if (TYPE(CHILD(n, 3)) != except_clause)
4207 com_try_finally(c, n);
4208 else
4209 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004210}
4211
Guido van Rossum8b993a91997-01-17 21:04:03 +00004212static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004213get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004214{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004215 int i;
4216
Guido van Rossum8b993a91997-01-17 21:04:03 +00004217 /* Label to avoid tail recursion */
4218 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004219 switch (TYPE(n)) {
4220
4221 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 if (NCH(n) == 1) {
4223 n = CHILD(n, 0);
4224 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004225 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004226 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004227 case file_input:
4228 for (i = 0; i < NCH(n); i++) {
4229 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004230 if (TYPE(ch) == stmt) {
4231 n = ch;
4232 goto next;
4233 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004234 }
4235 break;
4236
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004237 case stmt:
4238 case simple_stmt:
4239 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004240 n = CHILD(n, 0);
4241 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004242
4243 case expr_stmt:
4244 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004245 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004246 case test:
4247 case and_test:
4248 case not_test:
4249 case comparison:
4250 case expr:
4251 case xor_expr:
4252 case and_expr:
4253 case shift_expr:
4254 case arith_expr:
4255 case term:
4256 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004257 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004258 if (NCH(n) == 1) {
4259 n = CHILD(n, 0);
4260 goto next;
4261 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004262 break;
4263
4264 case atom:
4265 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004266 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004267 break;
4268
4269 }
4270 return NULL;
4271}
4272
Guido van Rossum79f25d91997-04-29 20:08:16 +00004273static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004274get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004275{
Guido van Rossum541563e1999-01-28 15:08:09 +00004276 /* Don't generate doc-strings if run with -OO */
4277 if (Py_OptimizeFlag > 1)
4278 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004279 n = get_rawdocstring(n);
4280 if (n == NULL)
4281 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004282 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004283}
4284
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004286com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004287{
4288 REQ(n, suite);
4289 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4290 if (NCH(n) == 1) {
4291 com_node(c, CHILD(n, 0));
4292 }
4293 else {
4294 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004295 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296 node *ch = CHILD(n, i);
4297 if (TYPE(ch) == stmt)
4298 com_node(c, ch);
4299 }
4300 }
4301}
4302
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004303/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004305com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004306{
4307 int i = c->c_nblocks;
4308 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4309 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4310 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004311 else if (i <= 0) {
4312 /* at the outer level */
4313 com_error(c, PyExc_SyntaxError,
4314 "'continue' not properly in loop");
4315 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004316 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004317 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004318 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004319 if (c->c_block[j] == SETUP_LOOP)
4320 break;
4321 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004322 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004323 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004324 for (; i > j; --i) {
4325 if (c->c_block[i] == SETUP_EXCEPT ||
4326 c->c_block[i] == SETUP_FINALLY) {
4327 com_addoparg(c, CONTINUE_LOOP,
4328 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004329 return;
4330 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004331 if (c->c_block[i] == END_FINALLY) {
4332 com_error(c, PyExc_SyntaxError,
4333 "'continue' not supported inside 'finally' clause");
4334 return;
4335 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004336 }
4337 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004338 com_error(c, PyExc_SyntaxError,
4339 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004340 }
4341 /* XXX Could allow it inside a 'finally' clause
4342 XXX if we could pop the exception still on the stack */
4343}
4344
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004345/* Return the number of default values in the argument list.
4346
4347 If a non-default argument follows a default argument, set an
4348 exception and return -1.
4349*/
4350
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004351static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004352com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004353{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004354 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004355 if (TYPE(n) == lambdef) {
4356 /* lambdef: 'lambda' [varargslist] ':' test */
4357 n = CHILD(n, 1);
4358 }
4359 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004360 REQ(n, funcdef);
4361 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4362 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004363 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4364 n = CHILD(n, 1);
4365 }
4366 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004367 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004368 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004369 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004370 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4371 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004372 ndefs = 0;
4373 for (i = 0; i < nch; i++) {
4374 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004375 if (TYPE(CHILD(n, i)) == STAR ||
4376 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004377 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004378 i++;
4379 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004380 t = RPAR; /* Anything except EQUAL or COMMA */
4381 else
4382 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004383 if (t == EQUAL) {
4384 i++;
4385 ndefs++;
4386 com_node(c, CHILD(n, i));
4387 i++;
4388 if (i >= nch)
4389 break;
4390 t = TYPE(CHILD(n, i));
4391 }
4392 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004393 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004394 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004395 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004396 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004397 return -1;
4398 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004399 }
4400 if (t != COMMA)
4401 break;
4402 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004403 return ndefs;
4404}
4405
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004406static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004407com_decorator_name(struct compiling *c, node *n)
4408{
4409 /* dotted_name: NAME ('.' NAME)* */
4410
4411 int i, nch;
4412 node *varname;
4413
4414 REQ(n, dotted_name);
4415 nch = NCH(n);
4416 assert(nch >= 1 && nch % 2 == 1);
4417
4418 varname = CHILD(n, 0);
4419 REQ(varname, NAME);
4420 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004421 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004422
4423 for (i = 1; i < nch; i += 2) {
4424 node *attrname;
4425
4426 REQ(CHILD(n, i), DOT);
4427
4428 attrname = CHILD(n, i + 1);
4429 REQ(attrname, NAME);
4430 com_addop_name(c, LOAD_ATTR, STR(attrname));
4431 }
4432}
4433
4434static void
4435com_decorator(struct compiling *c, node *n)
4436{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004437 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004438 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004439 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004440 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004441 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004442 com_decorator_name(c, CHILD(n, 1));
4443
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004444 if (nch > 3) {
4445 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004446 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004447 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004448 com_call_function(c, CHILD(n, 3));
4449 }
4450}
4451
4452static int
4453com_decorators(struct compiling *c, node *n)
4454{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004455 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004456
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004457 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004458 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004459 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004460
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004461 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004462 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004463 REQ(ch, decorator);
4464
4465 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004466 }
4467
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004468 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004469}
4470
4471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004472com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004473{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004474 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004475 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004476
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004477 REQ(n, funcdef);
4478 /* -6 -5 -4 -3 -2 -1
4479 funcdef: [decorators] 'def' NAME parameters ':' suite */
4480
4481 if (NCH(n) == 6)
4482 ndecorators = com_decorators(c, CHILD(n, 0));
4483 else
4484 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004485
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004486 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004487 if (ndefs < 0)
4488 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004489 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004490 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004491 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004492 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004493 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004494 c->c_errors++;
4495 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004496 int closure = com_make_closure(c, (PyCodeObject *)co);
4497 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004498 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004499 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500 if (closure)
4501 com_addoparg(c, MAKE_CLOSURE, ndefs);
4502 else
4503 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004504 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004505
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004506 while (ndecorators > 0) {
4507 com_addoparg(c, CALL_FUNCTION, 1);
4508 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004509 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004510 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004511
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004512 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004513 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004514 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515 }
4516}
4517
4518static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004519com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004520{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004521 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004522 REQ(n, testlist);
4523 /* testlist: test (',' test)* [','] */
4524 for (i = 0; i < NCH(n); i += 2)
4525 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004526 i = (NCH(n)+1) / 2;
4527 com_addoparg(c, BUILD_TUPLE, i);
4528 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004529}
4530
4531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004532com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004533{
Guido van Rossum25831651993-05-19 14:50:45 +00004534 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004535 PyObject *v;
4536 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004537 char *name;
4538
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004539 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004540 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004541 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004542 c->c_errors++;
4543 return;
4544 }
4545 /* Push the class name on the stack */
4546 i = com_addconst(c, v);
4547 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004548 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004549 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004550 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004551 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004552 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004553 com_push(c, 1);
4554 }
Guido van Rossum25831651993-05-19 14:50:45 +00004555 else
4556 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004558 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004559 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004560 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004562 c->c_errors++;
4563 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004564 int closure = com_make_closure(c, co);
4565 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004566 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004567 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004568 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004569 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004570 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004571 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004572 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004573 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004574 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004575 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004576 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004577 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004578 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004579 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004580}
4581
4582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004583com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004584{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004585 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004586 if (c->c_errors)
4587 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004588 switch (TYPE(n)) {
4589
4590 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004591
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004592 case funcdef:
4593 com_funcdef(c, n);
4594 break;
4595 case classdef:
4596 com_classdef(c, n);
4597 break;
4598
4599 /* Trivial parse tree nodes */
4600
4601 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004602 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004603 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 n = CHILD(n, 0);
4605 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004606
4607 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004608 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004609 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004610 {
4611 int i;
4612 for (i = 0; i < NCH(n)-1; i += 2)
4613 com_node(c, CHILD(n, i));
4614 }
4615 break;
4616
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004618 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 n = CHILD(n, 0);
4620 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004621
4622 /* Statement nodes */
4623
4624 case expr_stmt:
4625 com_expr_stmt(c, n);
4626 break;
4627 case print_stmt:
4628 com_print_stmt(c, n);
4629 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004630 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004631 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004632 break;
4633 case pass_stmt:
4634 break;
4635 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004636 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004637 com_error(c, PyExc_SyntaxError,
4638 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004640 com_addbyte(c, BREAK_LOOP);
4641 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004642 case continue_stmt:
4643 com_continue_stmt(c, n);
4644 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004645 case return_stmt:
4646 com_return_stmt(c, n);
4647 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004648 case yield_stmt:
4649 com_yield_stmt(c, n);
4650 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004651 case raise_stmt:
4652 com_raise_stmt(c, n);
4653 break;
4654 case import_stmt:
4655 com_import_stmt(c, n);
4656 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004657 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004658 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004659 case exec_stmt:
4660 com_exec_stmt(c, n);
4661 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004662 case assert_stmt:
4663 com_assert_stmt(c, n);
4664 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004665 case if_stmt:
4666 com_if_stmt(c, n);
4667 break;
4668 case while_stmt:
4669 com_while_stmt(c, n);
4670 break;
4671 case for_stmt:
4672 com_for_stmt(c, n);
4673 break;
4674 case try_stmt:
4675 com_try_stmt(c, n);
4676 break;
4677 case suite:
4678 com_suite(c, n);
4679 break;
4680
4681 /* Expression nodes */
4682
4683 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004684 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004685 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004686 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004687 break;
4688 case test:
4689 com_test(c, n);
4690 break;
4691 case and_test:
4692 com_and_test(c, n);
4693 break;
4694 case not_test:
4695 com_not_test(c, n);
4696 break;
4697 case comparison:
4698 com_comparison(c, n);
4699 break;
4700 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004701 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004702 break;
4703 case expr:
4704 com_expr(c, n);
4705 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004706 case xor_expr:
4707 com_xor_expr(c, n);
4708 break;
4709 case and_expr:
4710 com_and_expr(c, n);
4711 break;
4712 case shift_expr:
4713 com_shift_expr(c, n);
4714 break;
4715 case arith_expr:
4716 com_arith_expr(c, n);
4717 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004718 case term:
4719 com_term(c, n);
4720 break;
4721 case factor:
4722 com_factor(c, n);
4723 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004724 case power:
4725 com_power(c, n);
4726 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004727 case atom:
4728 com_atom(c, n);
4729 break;
4730
4731 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004732 com_error(c, PyExc_SystemError,
4733 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004734 }
4735}
4736
Tim Petersdbd9ba62000-07-09 03:09:57 +00004737static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738
4739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004740com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741{
4742 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4743 if (TYPE(CHILD(n, 0)) == LPAR)
4744 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004745 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004746 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004747 com_pop(c, 1);
4748 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004749}
4750
4751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004752com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004753{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004754 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004755 if (NCH(n) == 1) {
4756 com_fpdef(c, CHILD(n, 0));
4757 }
4758 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004759 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004760 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004761 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004762 for (i = 0; i < NCH(n); i += 2)
4763 com_fpdef(c, CHILD(n, i));
4764 }
4765}
4766
4767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004768com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004769{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004770 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004771 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004772 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004773 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004774 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004775 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004776 nch = NCH(n);
4777 /* Enter all arguments in table of locals */
4778 for (i = 0, narg = 0; i < nch; i++) {
4779 node *ch = CHILD(n, i);
4780 node *fp;
4781 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004782 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004783 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4784 fp = CHILD(ch, 0);
4785 if (TYPE(fp) != NAME) {
4786 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4787 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004788 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004789 narg++;
4790 /* all name updates handled by symtable */
4791 if (++i >= nch)
4792 break;
4793 ch = CHILD(n, i);
4794 if (TYPE(ch) == EQUAL)
4795 i += 2;
4796 else
4797 REQ(ch, COMMA);
4798 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004799 if (complex) {
4800 /* Generate code for complex arguments only after
4801 having counted the simple arguments */
4802 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004803 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004804 node *ch = CHILD(n, i);
4805 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004806 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004807 break;
4808 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4809 fp = CHILD(ch, 0);
4810 if (TYPE(fp) != NAME) {
4811 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004812 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004813 com_fpdef(c, ch);
4814 }
4815 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004816 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004817 break;
4818 ch = CHILD(n, i);
4819 if (TYPE(ch) == EQUAL)
4820 i += 2;
4821 else
4822 REQ(ch, COMMA);
4823 }
4824 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004825}
4826
4827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004828com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004829{
4830 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004831 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004832 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004833 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004834 if (doc != NULL) {
4835 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004836 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004837 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004838 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004839 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004840 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004841 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004842 for (i = 0; i < NCH(n); i++) {
4843 node *ch = CHILD(n, i);
4844 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4845 com_node(c, ch);
4846 }
4847}
4848
4849/* Top-level compile-node interface */
4850
4851static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004852compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004853{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004854 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004855 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004856 REQ(n, funcdef);
4857 /* -6 -5 -4 -3 -2 -1
4858 funcdef: [decorators] 'def' NAME parameters ':' suite */
4859 c->c_name = STR(RCHILD(n, -4));
4860 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004861 if (doc != NULL) {
4862 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004863 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004864 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004865 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004866 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004867 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004868 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004869 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004870 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004871 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004872 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004873 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004874 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004875 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4876 com_push(c, 1);
4877 com_addbyte(c, RETURN_VALUE);
4878 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004879}
4880
4881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004882compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004883{
Guido van Rossum590baa41993-11-30 13:40:46 +00004884 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004885 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004886 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004887
4888 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004889 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004890 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004891 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004892 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004893 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004894 else
4895 ch = CHILD(n, 2);
4896 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004897 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004898 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004899}
4900
4901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004902compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004903{
4904 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004905 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004906 REQ(n, classdef);
4907 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4908 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004909 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004910 /* Initialize local __module__ from global __name__ */
4911 com_addop_name(c, LOAD_GLOBAL, "__name__");
4912 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004913 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004914 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004915 if (doc != NULL) {
4916 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004917 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004918 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004919 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004920 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004921 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004922 }
4923 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004924 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004925 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004926 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004927 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004928 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004929 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004930 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004931}
4932
4933static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004934compile_generator_expression(struct compiling *c, node *n)
4935{
4936 /* testlist_gexp: test gen_for */
4937 /* argument: test gen_for */
4938 REQ(CHILD(n, 0), test);
4939 REQ(CHILD(n, 1), gen_for);
4940
4941 c->c_name = "<generator expression>";
4942 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4943
4944 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4945 com_push(c, 1);
4946 com_addbyte(c, RETURN_VALUE);
4947 com_pop(c, 1);
4948}
4949
4950static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004951compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004952{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004953 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004954
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004955 switch (TYPE(n)) {
4956
Guido van Rossum4c417781991-01-21 16:09:22 +00004957 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004958 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004959 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004960 n = CHILD(n, 0);
4961 if (TYPE(n) != NEWLINE)
4962 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004963 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004964 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4965 com_push(c, 1);
4966 com_addbyte(c, RETURN_VALUE);
4967 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004968 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004969 break;
4970
Guido van Rossum4c417781991-01-21 16:09:22 +00004971 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004972 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004973 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004974 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4975 com_push(c, 1);
4976 com_addbyte(c, RETURN_VALUE);
4977 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004978 break;
4979
Guido van Rossum590baa41993-11-30 13:40:46 +00004980 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004981 com_node(c, CHILD(n, 0));
4982 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004983 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004984 break;
4985
Guido van Rossum590baa41993-11-30 13:40:46 +00004986 case lambdef: /* anonymous function definition */
4987 compile_lambdef(c, n);
4988 break;
4989
Guido van Rossum4c417781991-01-21 16:09:22 +00004990 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004991 compile_funcdef(c, n);
4992 break;
4993
Guido van Rossum4c417781991-01-21 16:09:22 +00004994 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004995 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004996 break;
4997
Raymond Hettinger354433a2004-05-19 08:20:33 +00004998 case testlist_gexp: /* A generator expression */
4999 case argument: /* A generator expression */
5000 compile_generator_expression(c, n);
5001 break;
5002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005003 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005004 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005005 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005006 }
5007}
5008
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009static PyObject *
5010dict_keys_inorder(PyObject *dict, int offset)
5011{
5012 PyObject *tuple, *k, *v;
5013 int i, pos = 0, size = PyDict_Size(dict);
5014
5015 tuple = PyTuple_New(size);
5016 if (tuple == NULL)
5017 return NULL;
5018 while (PyDict_Next(dict, &pos, &k, &v)) {
5019 i = PyInt_AS_LONG(v);
5020 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005021 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005022 PyTuple_SET_ITEM(tuple, i - offset, k);
5023 }
5024 return tuple;
5025}
5026
Guido van Rossum79f25d91997-04-29 20:08:16 +00005027PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005028PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005029{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005030 return PyNode_CompileFlags(n, filename, NULL);
5031}
5032
5033PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005034PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005035{
5036 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005037}
5038
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005039struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005040PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005041{
5042 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005043 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005044
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005045 ff = PyNode_Future(n, filename);
5046 if (ff == NULL)
5047 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005048 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005049 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005050 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005051 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005052 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005053 return st;
5054}
5055
Guido van Rossum79f25d91997-04-29 20:08:16 +00005056static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005057icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005058{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005059 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005060}
5061
Guido van Rossum79f25d91997-04-29 20:08:16 +00005062static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005063jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005064 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005065{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005066 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005067 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005068 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005069 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005070 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5071 sc.c_encoding = "utf-8";
5072 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005073 sc.c_encoding = STR(n);
5074 n = CHILD(n, 0);
5075 } else {
5076 sc.c_encoding = NULL;
5077 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005078 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005079 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005080 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 /* c_symtable still points to parent's symbols */
5082 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005083 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005084 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005085 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005086 if (base->c_encoding != NULL) {
5087 assert(sc.c_encoding == NULL);
5088 sc.c_encoding = base->c_encoding;
5089 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005090 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005091 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005092 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005093 if (sc.c_future == NULL) {
5094 com_free(&sc);
5095 return NULL;
5096 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005097 if (flags) {
5098 int merged = sc.c_future->ff_features |
5099 flags->cf_flags;
5100 sc.c_future->ff_features = merged;
5101 flags->cf_flags = merged;
5102 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005103 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5104 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005105 com_free(&sc);
5106 return NULL;
5107 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005108 /* reset symbol table for second pass */
5109 sc.c_symtable->st_nscopes = 1;
5110 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005111 }
5112 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005113 if (symtable_load_symbols(&sc) < 0) {
5114 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005115 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005116 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005117 compile_node(&sc, n);
5118 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005119 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005120 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005121 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005122 names = PyList_AsTuple(sc.c_names);
5123 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005124 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5125 freevars = dict_keys_inorder(sc.c_freevars,
5126 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005127 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005128 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005129 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5130 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005131 if (!PyErr_Occurred())
5132 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005133 sc.c_nlocals,
5134 sc.c_maxstacklevel,
5135 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005136 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005137 consts,
5138 names,
5139 varnames,
5140 freevars,
5141 cellvars,
5142 filename,
5143 name,
5144 sc.c_firstlineno,
5145 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005146 Py_XDECREF(consts);
5147 Py_XDECREF(names);
5148 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005149 Py_XDECREF(freevars);
5150 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005151 Py_XDECREF(filename);
5152 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005153 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005154 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005155 else if (!PyErr_Occurred()) {
5156 /* This could happen if someone called PyErr_Clear() after an
5157 error was reported above. That's not supposed to happen,
5158 but I just plugged one case and I'm not sure there can't be
5159 others. In that case, raise SystemError so that at least
5160 it gets reported instead dumping core. */
5161 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5162 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005163 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005164 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005165 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005166 sc.c_symtable = NULL;
5167 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005168 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005169 return co;
5170}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005171
5172int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005173PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005174{
5175 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005176 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005177 int line = co->co_firstlineno;
5178 int addr = 0;
5179 while (--size >= 0) {
5180 addr += *p++;
5181 if (addr > addrq)
5182 break;
5183 line += *p++;
5184 }
5185 return line;
5186}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005188/* The test for LOCAL must come before the test for FREE in order to
5189 handle classes where name is both local and free. The local var is
5190 a method and the free var is a free var referenced within a method.
5191*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192
5193static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005194get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005195{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005196 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005198
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005199 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5200 return CELL;
5201 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5202 return LOCAL;
5203 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5204 return FREE;
5205 v = PyDict_GetItemString(c->c_globals, name);
5206 if (v) {
5207 if (v == Py_None)
5208 return GLOBAL_EXPLICIT;
5209 else {
5210 return GLOBAL_IMPLICIT;
5211 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005213 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005214 "unknown scope for %.100s in %.100s(%s) "
5215 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5216 name, c->c_name,
5217 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5218 c->c_filename,
5219 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5220 PyObject_REPR(c->c_locals),
5221 PyObject_REPR(c->c_globals)
5222 );
5223
5224 Py_FatalError(buf);
5225 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005226}
5227
Guido van Rossum207fda62001-03-02 03:30:41 +00005228/* Helper functions to issue warnings */
5229
5230static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005231issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005232{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005233 if (PyErr_Occurred()) {
5234 /* This can happen because symtable_node continues
5235 processing even after raising a SyntaxError.
5236 Calling PyErr_WarnExplicit now would clobber the
5237 pending exception; instead we fail and let that
5238 exception propagate.
5239 */
5240 return -1;
5241 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005242 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5243 lineno, NULL, NULL) < 0) {
5244 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5245 PyErr_SetString(PyExc_SyntaxError, msg);
5246 PyErr_SyntaxLocation(filename, lineno);
5247 }
5248 return -1;
5249 }
5250 return 0;
5251}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005252
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005253static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005254symtable_warn(struct symtable *st, char *msg)
5255{
Guido van Rossum207fda62001-03-02 03:30:41 +00005256 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005257 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005258 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005259 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005260 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005261}
5262
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005263/* Helper function for setting lineno and filename */
5264
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005265static struct symtable *
5266symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005267{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005268 struct symtable *st;
5269
5270 st = symtable_init();
5271 if (st == NULL)
5272 return NULL;
5273 st->st_future = ff;
5274 st->st_filename = filename;
5275 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5276 if (st->st_errors > 0)
5277 goto fail;
5278 symtable_node(st, n);
5279 if (st->st_errors > 0)
5280 goto fail;
5281 return st;
5282 fail:
5283 if (!PyErr_Occurred()) {
5284 /* This could happen because after a syntax error is
5285 detected, the symbol-table-building continues for
5286 a while, and PyErr_Clear() might erroneously be
5287 called during that process. One such case has been
5288 fixed, but there might be more (now or later).
5289 */
5290 PyErr_SetString(PyExc_SystemError, "lost exception");
5291 }
5292 st->st_future = NULL;
5293 st->st_filename = NULL;
5294 PySymtable_Free(st);
5295 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005296}
5297
5298static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005299symtable_init_compiling_symbols(struct compiling *c)
5300{
5301 PyObject *varnames;
5302
5303 varnames = c->c_symtable->st_cur->ste_varnames;
5304 if (varnames == NULL) {
5305 varnames = PyList_New(0);
5306 if (varnames == NULL)
5307 return -1;
5308 c->c_symtable->st_cur->ste_varnames = varnames;
5309 Py_INCREF(varnames);
5310 } else
5311 Py_INCREF(varnames);
5312 c->c_varnames = varnames;
5313
5314 c->c_globals = PyDict_New();
5315 if (c->c_globals == NULL)
5316 return -1;
5317 c->c_freevars = PyDict_New();
5318 if (c->c_freevars == NULL)
5319 return -1;
5320 c->c_cellvars = PyDict_New();
5321 if (c->c_cellvars == NULL)
5322 return -1;
5323 return 0;
5324}
5325
5326struct symbol_info {
5327 int si_nlocals;
5328 int si_ncells;
5329 int si_nfrees;
5330 int si_nimplicit;
5331};
5332
5333static void
5334symtable_init_info(struct symbol_info *si)
5335{
5336 si->si_nlocals = 0;
5337 si->si_ncells = 0;
5338 si->si_nfrees = 0;
5339 si->si_nimplicit = 0;
5340}
5341
5342static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005343symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005344 struct symbol_info *si)
5345{
5346 PyObject *dict, *v;
5347
5348 /* Seperate logic for DEF_FREE. If it occurs in a function,
5349 it indicates a local that we must allocate storage for (a
5350 cell var). If it occurs in a class, then the class has a
5351 method and a free variable with the same name.
5352 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005353 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005354 /* If it isn't declared locally, it can't be a cell. */
5355 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5356 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005357 v = PyInt_FromLong(si->si_ncells++);
5358 dict = c->c_cellvars;
5359 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005360 /* If it is free anyway, then there is no need to do
5361 anything here.
5362 */
5363 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005364 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005365 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005366 v = PyInt_FromLong(si->si_nfrees++);
5367 dict = c->c_freevars;
5368 }
5369 if (v == NULL)
5370 return -1;
5371 if (PyDict_SetItem(dict, name, v) < 0) {
5372 Py_DECREF(v);
5373 return -1;
5374 }
5375 Py_DECREF(v);
5376 return 0;
5377}
5378
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005379/* If a variable is a cell and an argument, make sure that appears in
5380 co_cellvars before any variable to its right in varnames.
5381*/
5382
5383
5384static int
5385symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5386 PyObject *varnames, int flags)
5387{
Tim Petersb39903b2003-03-24 17:22:24 +00005388 PyObject *v = NULL;
5389 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005390 int i, pos;
5391
5392 if (flags & CO_VARARGS)
5393 argcount++;
5394 if (flags & CO_VARKEYWORDS)
5395 argcount++;
5396 for (i = argcount; --i >= 0; ) {
5397 v = PyList_GET_ITEM(varnames, i);
5398 if (PyDict_GetItem(*cellvars, v)) {
5399 if (list == NULL) {
5400 list = PyList_New(1);
5401 if (list == NULL)
5402 return -1;
5403 PyList_SET_ITEM(list, 0, v);
5404 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005405 } else {
5406 if (PyList_Insert(list, 0, v) < 0) {
5407 Py_DECREF(list);
5408 return -1;
5409 }
5410 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005411 }
5412 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005413 if (list == NULL)
5414 return 0;
5415
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005416 /* There are cellvars that are also arguments. Create a dict
5417 to replace cellvars and put the args at the front.
5418 */
5419 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005420 if (d == NULL)
5421 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005422 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5423 v = PyInt_FromLong(i);
5424 if (v == NULL)
5425 goto fail;
5426 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5427 goto fail;
5428 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5429 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005430 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005431 }
5432 pos = 0;
5433 i = PyList_GET_SIZE(list);
5434 Py_DECREF(list);
5435 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5436 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005437 if (w == NULL)
5438 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005439 if (PyDict_SetItem(d, v, w) < 0) {
5440 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005441 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005442 goto fail;
5443 }
5444 Py_DECREF(w);
5445 }
5446 Py_DECREF(*cellvars);
5447 *cellvars = d;
5448 return 1;
5449 fail:
5450 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005451 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005452 return -1;
5453}
5454
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005455static int
5456symtable_freevar_offsets(PyObject *freevars, int offset)
5457{
5458 PyObject *name, *v;
5459 int pos;
5460
5461 /* The cell vars are the first elements of the closure,
5462 followed by the free vars. Update the offsets in
5463 c_freevars to account for number of cellvars. */
5464 pos = 0;
5465 while (PyDict_Next(freevars, &pos, &name, &v)) {
5466 int i = PyInt_AS_LONG(v) + offset;
5467 PyObject *o = PyInt_FromLong(i);
5468 if (o == NULL)
5469 return -1;
5470 if (PyDict_SetItem(freevars, name, o) < 0) {
5471 Py_DECREF(o);
5472 return -1;
5473 }
5474 Py_DECREF(o);
5475 }
5476 return 0;
5477}
5478
5479static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005480symtable_check_unoptimized(struct compiling *c,
5481 PySymtableEntryObject *ste,
5482 struct symbol_info *si)
5483{
5484 char buf[300];
5485
5486 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5487 || (ste->ste_nested && si->si_nimplicit)))
5488 return 0;
5489
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005490#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5491
5492#define ILLEGAL_IS "is a nested function"
5493
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005494#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005495"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005496
5497#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005498"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005499
5500#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005501"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005502"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005503
5504 /* XXX perhaps the linenos for these opt-breaking statements
5505 should be stored so the exception can point to them. */
5506
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005507 if (ste->ste_child_free) {
5508 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005509 PyOS_snprintf(buf, sizeof(buf),
5510 ILLEGAL_IMPORT_STAR,
5511 PyString_AS_STRING(ste->ste_name),
5512 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005513 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005514 PyOS_snprintf(buf, sizeof(buf),
5515 ILLEGAL_BARE_EXEC,
5516 PyString_AS_STRING(ste->ste_name),
5517 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005518 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005519 PyOS_snprintf(buf, sizeof(buf),
5520 ILLEGAL_EXEC_AND_IMPORT_STAR,
5521 PyString_AS_STRING(ste->ste_name),
5522 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005523 }
5524 } else {
5525 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005526 PyOS_snprintf(buf, sizeof(buf),
5527 ILLEGAL_IMPORT_STAR,
5528 PyString_AS_STRING(ste->ste_name),
5529 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005530 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005531 PyOS_snprintf(buf, sizeof(buf),
5532 ILLEGAL_BARE_EXEC,
5533 PyString_AS_STRING(ste->ste_name),
5534 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005535 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005536 PyOS_snprintf(buf, sizeof(buf),
5537 ILLEGAL_EXEC_AND_IMPORT_STAR,
5538 PyString_AS_STRING(ste->ste_name),
5539 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005540 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005541 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005542
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005543 PyErr_SetString(PyExc_SyntaxError, buf);
5544 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5545 ste->ste_opt_lineno);
5546 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005547}
5548
5549static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005550symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5551 struct symbol_info *si)
5552{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005553 if (c->c_future)
5554 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005555 if (ste->ste_generator)
5556 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005557 if (ste->ste_type != TYPE_MODULE)
5558 c->c_flags |= CO_NEWLOCALS;
5559 if (ste->ste_type == TYPE_FUNCTION) {
5560 c->c_nlocals = si->si_nlocals;
5561 if (ste->ste_optimized == 0)
5562 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005563 else if (ste->ste_optimized != OPT_EXEC)
5564 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005565 }
5566 return 0;
5567}
5568
5569static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005570symtable_error(struct symtable *st, int lineno)
5571{
5572 if (lineno == 0)
5573 lineno = st->st_cur->ste_lineno;
5574 PyErr_SyntaxLocation(st->st_filename, lineno);
5575 st->st_errors++;
5576 return -1;
5577}
5578
5579static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005580symtable_load_symbols(struct compiling *c)
5581{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005582 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005583 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005584 PyObject *name, *varnames, *v;
5585 int i, flags, pos;
5586 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005588 v = NULL;
5589
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005590 if (symtable_init_compiling_symbols(c) < 0)
5591 goto fail;
5592 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005593 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005594 si.si_nlocals = PyList_GET_SIZE(varnames);
5595 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005597 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005599 if (v == NULL)
5600 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601 if (PyDict_SetItem(c->c_locals,
5602 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603 goto fail;
5604 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 }
5606
5607 /* XXX The cases below define the rules for whether a name is
5608 local or global. The logic could probably be clearer. */
5609 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5611 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005612
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005613 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005614 /* undo the original DEF_FREE */
5615 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005617 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005618 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005619 2. Free variables in methods that are also class
5620 variables or declared global.
5621 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005622 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005623 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005625 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626 c->c_argcount--;
5627 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005628 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 c->c_argcount--;
5630 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005631 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005632 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005633 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005634 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005635 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005636 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005637 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005639 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005640 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5641 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005642 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005643 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005644 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005645 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005646 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005647 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 if (v == NULL)
5649 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005650 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005651 goto fail;
5652 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005653 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005654 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005655 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005656 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005657 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005658 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 if (v == NULL)
5660 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005661 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 goto fail;
5663 Py_DECREF(v);
5664 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005665 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005666 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005667 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005668 goto fail;
5669 if (st->st_nscopes != 1) {
5670 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005671 if (v == NULL)
5672 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005673 if (PyDict_SetItem(st->st_global,
5674 name, v))
5675 goto fail;
5676 Py_DECREF(v);
5677 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005679 }
5680 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005681 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5682
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005683 if (si.si_ncells > 1) { /* one cell is always in order */
5684 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5685 c->c_varnames, c->c_flags) < 0)
5686 return -1;
5687 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005688 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5689 return -1;
5690 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005691 fail:
5692 /* is this always the right thing to do? */
5693 Py_XDECREF(v);
5694 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695}
5696
5697static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005698symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005699{
5700 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005701
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005702 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005703 if (st == NULL)
5704 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005705 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005706
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005707 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005708 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005709 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 goto fail;
5711 if ((st->st_symbols = PyDict_New()) == NULL)
5712 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005713 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005714 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005715 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005716 st->st_private = NULL;
5717 return st;
5718 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005719 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 return NULL;
5721}
5722
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005723void
5724PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005725{
5726 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005727 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005728 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005729 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005730}
5731
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732/* When the compiler exits a scope, it must should update the scope's
5733 free variable information with the list of free variables in its
5734 children.
5735
5736 Variables that are free in children and defined in the current
5737 scope are cellvars.
5738
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005739 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005740 false), free variables in children that are not defined here are
5741 implicit globals.
5742
5743*/
5744
5745static int
5746symtable_update_free_vars(struct symtable *st)
5747{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005748 int i, j, def;
5749 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005750 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005751
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005752 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005753 def = DEF_FREE_CLASS;
5754 else
5755 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005756 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 int pos = 0;
5758
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005759 if (list && PyList_SetSlice(list, 0,
5760 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005761 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005762 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005763 PyList_GET_ITEM(ste->ste_children, i);
5764 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005765 int flags = PyInt_AS_LONG(o);
5766 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005768 if (list == NULL) {
5769 list = PyList_New(0);
5770 if (list == NULL)
5771 return -1;
5772 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005773 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005774 if (PyList_Append(list, name) < 0) {
5775 Py_DECREF(list);
5776 return -1;
5777 }
5778 }
5779 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005780 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005781 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005782 v = PyDict_GetItem(ste->ste_symbols, name);
5783 /* If a name N is declared global in scope A and
5784 referenced in scope B contained (perhaps
5785 indirectly) in A and there are no scopes
5786 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005787 is global in B. Unless A is a class scope,
5788 because class scopes are not considered for
5789 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005790 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005791 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005792 int flags = PyInt_AS_LONG(v);
5793 if (flags & DEF_GLOBAL) {
5794 symtable_undo_free(st, child->ste_id,
5795 name);
5796 continue;
5797 }
5798 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005799 if (ste->ste_nested) {
5800 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005801 name, def) < 0) {
5802 Py_DECREF(list);
5803 return -1;
5804 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005805 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005806 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005807 name) < 0) {
5808 Py_DECREF(list);
5809 return -1;
5810 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005811 }
5812 }
5813 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005814
5815 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005816 return 0;
5817}
5818
5819/* If the current scope is a non-nested class or if name is not
5820 defined in the current, non-nested scope, then it is an implicit
5821 global in all nested scopes.
5822*/
5823
5824static int
5825symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5826{
5827 PyObject *o;
5828 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005829 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005830
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005831 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005832 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005833 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005834 if (o == NULL)
5835 return symtable_undo_free(st, child, name);
5836 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005837
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005838 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005839 return symtable_undo_free(st, child, name);
5840 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005841 return symtable_add_def_o(st, ste->ste_symbols,
5842 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843}
5844
5845static int
5846symtable_undo_free(struct symtable *st, PyObject *id,
5847 PyObject *name)
5848{
5849 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005850 PyObject *info;
5851 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005852
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005853 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5854 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005855 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005856
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005857 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005858 if (info == NULL)
5859 return 0;
5860 v = PyInt_AS_LONG(info);
5861 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005862 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005863 DEF_FREE_GLOBAL) < 0)
5864 return -1;
5865 } else
5866 /* If the name is defined here or declared global,
5867 then the recursion stops. */
5868 return 0;
5869
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005870 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5871 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005872 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005873 PyList_GET_ITEM(ste->ste_children, i);
5874 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005875 if (x < 0)
5876 return x;
5877 }
5878 return 0;
5879}
5880
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005881/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5882 This reference is released when the scope is exited, via the DECREF
5883 in symtable_exit_scope().
5884*/
5885
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005886static int
5887symtable_exit_scope(struct symtable *st)
5888{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005889 int end;
5890
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005891 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005892 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005893 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005894 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005895 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5896 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005897 if (PySequence_DelItem(st->st_stack, end) < 0)
5898 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005899 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005900}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005901
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005902static void
5903symtable_enter_scope(struct symtable *st, char *name, int type,
5904 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005905{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005906 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005907
5908 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005909 prev = st->st_cur;
5910 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005911 st->st_errors++;
5912 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005913 }
5914 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005915 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005916 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005917 if (st->st_cur == NULL) {
5918 st->st_errors++;
5919 return;
5920 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005921 if (strcmp(name, TOP) == 0)
5922 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005923 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005924 if (PyList_Append(prev->ste_children,
5925 (PyObject *)st->st_cur) < 0)
5926 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005927 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005928}
5929
5930static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005931symtable_lookup(struct symtable *st, char *name)
5932{
5933 char buffer[MANGLE_LEN];
5934 PyObject *v;
5935 int flags;
5936
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005937 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005938 name = buffer;
5939 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5940 if (v == NULL) {
5941 if (PyErr_Occurred())
5942 return -1;
5943 else
5944 return 0;
5945 }
5946
5947 flags = PyInt_AS_LONG(v);
5948 return flags;
5949}
5950
5951static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005952symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005953{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005954 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005955 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005956 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005957
Guido van Rossumb7164622002-08-16 02:48:11 +00005958 /* Warn about None, except inside a tuple (where the assignment
5959 code already issues a warning). */
5960 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5961 *name == 'N' && strcmp(name, "None") == 0)
5962 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005963 PyErr_SetString(PyExc_SyntaxError,
5964 "Invalid syntax. Assignment to None.");
5965 symtable_error(st, 0);
5966 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005967 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005968 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005969 name = buffer;
5970 if ((s = PyString_InternFromString(name)) == NULL)
5971 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005972 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5973 Py_DECREF(s);
5974 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005975}
5976
5977/* Must only be called with mangled names */
5978
5979static int
5980symtable_add_def_o(struct symtable *st, PyObject *dict,
5981 PyObject *name, int flag)
5982{
5983 PyObject *o;
5984 int val;
5985
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005986 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005987 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005988 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005989 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005990 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005991 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005992 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005993 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005994 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005995 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005996 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005997 if (o == NULL)
5998 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005999 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006000 Py_DECREF(o);
6001 return -1;
6002 }
6003 Py_DECREF(o);
6004
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006005 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006006 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006007 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006008 } else if (flag & DEF_GLOBAL) {
6009 /* XXX need to update DEF_GLOBAL for other flags too;
6010 perhaps only DEF_FREE_GLOBAL */
6011 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006012 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006013 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006015 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006016 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006017 if (o == NULL)
6018 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006019 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006020 Py_DECREF(o);
6021 return -1;
6022 }
6023 Py_DECREF(o);
6024 }
6025 return 0;
6026}
6027
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006028#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029
Tim Peters08a898f2001-06-28 01:52:22 +00006030/* Look for a yield stmt under n. Return 1 if found, else 0.
6031 This hack is used to look inside "if 0:" blocks (which are normally
6032 ignored) in case those are the only places a yield occurs (so that this
6033 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006034static int
6035look_for_yield(node *n)
6036{
6037 int i;
6038
6039 for (i = 0; i < NCH(n); ++i) {
6040 node *kid = CHILD(n, i);
6041
6042 switch (TYPE(kid)) {
6043
6044 case classdef:
6045 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006046 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006047 /* Stuff in nested functions and classes can't make
6048 the parent a generator. */
6049 return 0;
6050
6051 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006052 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006053
6054 default:
6055 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006056 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006057 }
6058 }
6059 return 0;
6060}
6061
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006062static void
6063symtable_node(struct symtable *st, node *n)
6064{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006065 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066
6067 loop:
6068 switch (TYPE(n)) {
6069 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006070 char *func_name;
6071 if (NCH(n) == 6)
6072 symtable_node(st, CHILD(n, 0));
6073 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006074 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006075 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006076 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006077 symtable_funcdef(st, n);
6078 symtable_exit_scope(st);
6079 break;
6080 }
6081 case lambdef:
6082 if (NCH(n) == 4)
6083 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006084 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006085 symtable_funcdef(st, n);
6086 symtable_exit_scope(st);
6087 break;
6088 case classdef: {
6089 char *tmp, *class_name = STR(CHILD(n, 1));
6090 symtable_add_def(st, class_name, DEF_LOCAL);
6091 if (TYPE(CHILD(n, 2)) == LPAR) {
6092 node *bases = CHILD(n, 3);
6093 int i;
6094 for (i = 0; i < NCH(bases); i += 2) {
6095 symtable_node(st, CHILD(bases, i));
6096 }
6097 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006098 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006099 tmp = st->st_private;
6100 st->st_private = class_name;
6101 symtable_node(st, CHILD(n, NCH(n) - 1));
6102 st->st_private = tmp;
6103 symtable_exit_scope(st);
6104 break;
6105 }
6106 case if_stmt:
6107 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006108 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6109 if (st->st_cur->ste_generator == 0)
6110 st->st_cur->ste_generator =
6111 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006112 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006113 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006114 symtable_node(st, CHILD(n, i + 1));
6115 symtable_node(st, CHILD(n, i + 3));
6116 }
6117 if (i + 2 < NCH(n))
6118 symtable_node(st, CHILD(n, i + 2));
6119 break;
6120 case global_stmt:
6121 symtable_global(st, n);
6122 break;
6123 case import_stmt:
6124 symtable_import(st, n);
6125 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006126 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006127 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 symtable_node(st, CHILD(n, 1));
6129 if (NCH(n) > 2)
6130 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006131 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006132 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006133 st->st_cur->ste_opt_lineno = n->n_lineno;
6134 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006135 if (NCH(n) > 4)
6136 symtable_node(st, CHILD(n, 5));
6137 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006138
6139 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006140 case assert_stmt:
6141 if (Py_OptimizeFlag)
6142 return;
6143 if (NCH(n) == 2) {
6144 n = CHILD(n, 1);
6145 goto loop;
6146 } else {
6147 symtable_node(st, CHILD(n, 1));
6148 n = CHILD(n, 3);
6149 goto loop;
6150 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151 case except_clause:
6152 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006153 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006154 if (NCH(n) > 1) {
6155 n = CHILD(n, 1);
6156 goto loop;
6157 }
6158 break;
6159 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006160 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006162 case yield_stmt:
6163 st->st_cur->ste_generator = 1;
6164 n = CHILD(n, 1);
6165 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006166 case expr_stmt:
6167 if (NCH(n) == 1)
6168 n = CHILD(n, 0);
6169 else {
6170 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006171 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006172 symtable_node(st, CHILD(n, 2));
6173 break;
6174 } else {
6175 int i;
6176 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006177 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006178 n = CHILD(n, NCH(n) - 1);
6179 }
6180 }
6181 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006182 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006183 /* only occurs when there are multiple for loops
6184 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006185 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006186 if (TYPE(n) == list_for)
6187 symtable_list_for(st, n);
6188 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006189 REQ(n, list_if);
6190 symtable_node(st, CHILD(n, 1));
6191 if (NCH(n) == 3) {
6192 n = CHILD(n, 2);
6193 goto loop;
6194 }
6195 }
6196 break;
6197 case for_stmt:
6198 symtable_assign(st, CHILD(n, 1), 0);
6199 for (i = 3; i < NCH(n); ++i)
6200 if (TYPE(CHILD(n, i)) >= single_input)
6201 symtable_node(st, CHILD(n, i));
6202 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006203 case arglist:
6204 if (NCH(n) > 1)
6205 for (i = 0; i < NCH(n); ++i) {
6206 node *ch = CHILD(n, i);
6207 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6208 TYPE(CHILD(ch, 1)) == gen_for) {
6209 PyErr_SetString(PyExc_SyntaxError,
6210 "invalid syntax");
6211 symtable_error(st, n->n_lineno);
6212 return;
6213 }
6214 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006215 /* The remaining cases fall through to default except in
6216 special circumstances. This requires the individual cases
6217 to be coded with great care, even though they look like
6218 rather innocuous. Each case must double-check TYPE(n).
6219 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006220 case decorator:
6221 if (TYPE(n) == decorator) {
6222 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6223 node *name, *varname;
6224 name = CHILD(n, 1);
6225 REQ(name, dotted_name);
6226 varname = CHILD(name, 0);
6227 REQ(varname, NAME);
6228 symtable_add_use(st, STR(varname));
6229 }
6230 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006231 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006232 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006233 n = CHILD(n, 2);
6234 goto loop;
6235 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006236 else if (TYPE(n) == argument && NCH(n) == 2 &&
6237 TYPE(CHILD(n, 1)) == gen_for) {
6238 symtable_generator_expression(st, n);
6239 break;
6240 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006241 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006242 case listmaker:
6243 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006244 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006245 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006246 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006247 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006248 case testlist_gexp:
6249 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6250 symtable_generator_expression(st, n);
6251 break;
6252 }
6253 /* fall through */
6254
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006255 case atom:
6256 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6257 symtable_add_use(st, STR(CHILD(n, 0)));
6258 break;
6259 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006260 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006261 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006262 /* Walk over every non-token child with a special case
6263 for one child.
6264 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006265 if (NCH(n) == 1) {
6266 n = CHILD(n, 0);
6267 goto loop;
6268 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006269 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006270 if (TYPE(CHILD(n, i)) >= single_input)
6271 symtable_node(st, CHILD(n, i));
6272 }
6273}
6274
6275static void
6276symtable_funcdef(struct symtable *st, node *n)
6277{
6278 node *body;
6279
6280 if (TYPE(n) == lambdef) {
6281 if (NCH(n) == 4)
6282 symtable_params(st, CHILD(n, 1));
6283 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006284 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006285 body = CHILD(n, NCH(n) - 1);
6286 symtable_node(st, body);
6287}
6288
6289/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006290 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006291 which are references in the defining scope. symtable_params()
6292 parses the parameter names, which are defined in the function's
6293 body.
6294
6295 varargslist:
6296 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6297 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6298*/
6299
6300static void
6301symtable_default_args(struct symtable *st, node *n)
6302{
6303 node *c;
6304 int i;
6305
6306 if (TYPE(n) == parameters) {
6307 n = CHILD(n, 1);
6308 if (TYPE(n) == RPAR)
6309 return;
6310 }
6311 REQ(n, varargslist);
6312 for (i = 0; i < NCH(n); i += 2) {
6313 c = CHILD(n, i);
6314 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6315 break;
6316 }
6317 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6318 symtable_node(st, CHILD(n, i));
6319 }
6320}
6321
6322static void
6323symtable_params(struct symtable *st, node *n)
6324{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006325 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006326 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006327
6328 if (TYPE(n) == parameters) {
6329 n = CHILD(n, 1);
6330 if (TYPE(n) == RPAR)
6331 return;
6332 }
6333 REQ(n, varargslist);
6334 for (i = 0; i < NCH(n); i += 2) {
6335 c = CHILD(n, i);
6336 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6337 ext = 1;
6338 break;
6339 }
6340 if (TYPE(c) == test) {
6341 continue;
6342 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006343 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006344 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006345 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006346 char nbuf[30];
6347 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006348 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006349 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006350 }
6351 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006352 if (ext) {
6353 c = CHILD(n, i);
6354 if (TYPE(c) == STAR) {
6355 i++;
6356 symtable_add_def(st, STR(CHILD(n, i)),
6357 DEF_PARAM | DEF_STAR);
6358 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006359 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006360 c = NULL;
6361 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006362 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006363 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006364 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006365 i++;
6366 symtable_add_def(st, STR(CHILD(n, i)),
6367 DEF_PARAM | DEF_DOUBLESTAR);
6368 }
6369 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006370 if (complex >= 0) {
6371 int j;
6372 for (j = 0; j <= complex; j++) {
6373 c = CHILD(n, j);
6374 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006375 c = CHILD(n, ++j);
6376 else if (TYPE(c) == EQUAL)
6377 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006378 if (TYPE(CHILD(c, 0)) == LPAR)
6379 symtable_params_fplist(st, CHILD(c, 1));
6380 }
6381 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006382}
6383
6384static void
6385symtable_params_fplist(struct symtable *st, node *n)
6386{
6387 int i;
6388 node *c;
6389
6390 REQ(n, fplist);
6391 for (i = 0; i < NCH(n); i += 2) {
6392 c = CHILD(n, i);
6393 REQ(c, fpdef);
6394 if (NCH(c) == 1)
6395 symtable_add_def(st, STR(CHILD(c, 0)),
6396 DEF_PARAM | DEF_INTUPLE);
6397 else
6398 symtable_params_fplist(st, CHILD(c, 1));
6399 }
6400
6401}
6402
6403static void
6404symtable_global(struct symtable *st, node *n)
6405{
6406 int i;
6407
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006408 /* XXX It might be helpful to warn about module-level global
6409 statements, but it's hard to tell the difference between
6410 module-level and a string passed to exec.
6411 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006412
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006413 for (i = 1; i < NCH(n); i += 2) {
6414 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006415 int flags;
6416
6417 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006418 if (flags < 0)
6419 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006420 if (flags && flags != DEF_GLOBAL) {
6421 char buf[500];
6422 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006423 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006424 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006425 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006426 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006427 }
6428 else {
6429 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006430 PyOS_snprintf(buf, sizeof(buf),
6431 GLOBAL_AFTER_ASSIGN,
6432 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006433 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006434 PyOS_snprintf(buf, sizeof(buf),
6435 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006436 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006437 }
6438 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006439 symtable_add_def(st, name, DEF_GLOBAL);
6440 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006441}
6442
6443static void
6444symtable_list_comprehension(struct symtable *st, node *n)
6445{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006446 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006447 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006448
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006449 REQ(n, listmaker);
6450 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6451 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006452 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006453 symtable_list_for(st, CHILD(n, 1));
6454 symtable_node(st, CHILD(n, 0));
6455 --st->st_cur->ste_tmpname;
6456}
6457
6458static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006459symtable_generator_expression(struct symtable *st, node *n)
6460{
6461 /* testlist_gexp: test gen_for */
6462 REQ(CHILD(n, 0), test);
6463 REQ(CHILD(n, 1), gen_for);
6464
6465 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6466 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6467
6468 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6469
6470 symtable_gen_for(st, CHILD(n, 1), 1);
6471 symtable_node(st, CHILD(n, 0));
6472 symtable_exit_scope(st);
6473
6474 /* for outmost iterable precomputation */
6475 symtable_node(st, CHILD(CHILD(n, 1), 3));
6476}
6477
6478static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006479symtable_list_for(struct symtable *st, node *n)
6480{
6481 REQ(n, list_for);
6482 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006483 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006484 symtable_node(st, CHILD(n, 3));
6485 if (NCH(n) == 5)
6486 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006487}
6488
6489static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006490symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6491{
6492 REQ(n, gen_for);
6493
6494 /* gen_for: for v in test [gen_iter] */
6495 symtable_assign(st, CHILD(n, 1), 0);
6496 if (is_outmost)
6497 symtable_add_use(st, "[outmost-iterable]");
6498 else
6499 symtable_node(st, CHILD(n, 3));
6500
6501 if (NCH(n) == 5)
6502 symtable_gen_iter(st, CHILD(n, 4));
6503}
6504
6505static void
6506symtable_gen_iter(struct symtable *st, node *n)
6507{
6508 REQ(n, gen_iter);
6509
6510 n = CHILD(n, 0);
6511 if (TYPE(n) == gen_for)
6512 symtable_gen_for(st, n, 0);
6513 else {
6514 REQ(n, gen_if);
6515 symtable_node(st, CHILD(n, 1));
6516
6517 if (NCH(n) == 3)
6518 symtable_gen_iter(st, CHILD(n, 2));
6519 }
6520}
6521
6522static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006523symtable_import(struct symtable *st, node *n)
6524{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006525 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006526 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006527 /* import_stmt: import_name | import_from */
6528 n = CHILD(n, 0);
6529 if (TYPE(n) == import_from) {
6530 /* import_from: 'from' dotted_name 'import' ('*' |
6531 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006532 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006533 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006534 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6535 /* check for bogus imports */
6536 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6537 PyErr_SetString(PyExc_SyntaxError,
6538 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006539 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006540 return;
6541 }
6542 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006543 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6544 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006545 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006546 if (symtable_warn(st,
6547 "import * only allowed at module level") < 0)
6548 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006549 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006550 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006551 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006552 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006553 REQ(nn, import_as_names);
6554 for (i = 0; i < NCH(nn); i += 2) {
6555 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006556 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006557 symtable_assign(st, CHILD(c, 2),
6558 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006559 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006560 symtable_assign(st, CHILD(c, 0),
6561 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006562 }
6563 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006564 } else {
6565 /* 'import' dotted_as_names */
6566 nn = CHILD(n, 1);
6567 REQ(nn, dotted_as_names);
6568 for (i = 0; i < NCH(nn); i += 2)
6569 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006570 }
6571}
6572
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006573/* The third argument to symatble_assign() is a flag to be passed to
6574 symtable_add_def() if it is eventually called. The flag is useful
6575 to specify the particular type of assignment that should be
6576 recorded, e.g. an assignment caused by import.
6577 */
6578
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006579static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006580symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006581{
6582 node *tmp;
6583 int i;
6584
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006585 loop:
6586 switch (TYPE(n)) {
6587 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006588 /* invalid assignment, e.g. lambda x:x=2. The next
6589 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006590 return;
6591 case power:
6592 if (NCH(n) > 2) {
6593 for (i = 2; i < NCH(n); ++i)
6594 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6595 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006596 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006597 if (NCH(n) > 1) {
6598 symtable_node(st, CHILD(n, 0));
6599 symtable_node(st, CHILD(n, 1));
6600 } else {
6601 n = CHILD(n, 0);
6602 goto loop;
6603 }
6604 return;
6605 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006606 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6607 /* XXX This is an error, but the next pass
6608 will catch it. */
6609 return;
6610 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006611 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006612 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006613 }
6614 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006615 case testlist_gexp:
6616 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6617 /* XXX This is an error, but the next pass
6618 will catch it. */
6619 return;
6620 } else {
6621 for (i = 0; i < NCH(n); i += 2)
6622 symtable_assign(st, CHILD(n, i), def_flag);
6623 }
6624 return;
6625
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006626 case exprlist:
6627 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006628 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006629 if (NCH(n) == 1) {
6630 n = CHILD(n, 0);
6631 goto loop;
6632 }
6633 else {
6634 int i;
6635 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006636 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006637 return;
6638 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006639 case atom:
6640 tmp = CHILD(n, 0);
6641 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6642 n = CHILD(n, 1);
6643 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006644 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006645 if (strcmp(STR(tmp), "__debug__") == 0) {
6646 PyErr_SetString(PyExc_SyntaxError,
6647 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006648 symtable_error(st, n->n_lineno);
6649 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006650 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006651 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006652 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006653 return;
6654 case dotted_as_name:
6655 if (NCH(n) == 3)
6656 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006657 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006658 else
6659 symtable_add_def(st,
6660 STR(CHILD(CHILD(n,
6661 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006662 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006663 return;
6664 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006665 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006666 return;
6667 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006668 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006669 return;
6670 default:
6671 if (NCH(n) == 0)
6672 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006673 if (NCH(n) == 1) {
6674 n = CHILD(n, 0);
6675 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006676 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006677 /* Should only occur for errors like x + 1 = 1,
6678 which will be caught in the next pass. */
6679 for (i = 0; i < NCH(n); ++i)
6680 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006681 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006682 }
6683}