blob: 545042f87c0ab22ae9d74dfe67b223e6e1dd677c [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:
Armin Rigo664b43b2005-01-07 18:10:51 +0000471 /* XXX care is needed to fold this operation statically:
472 the result might depend on the run-time presence of the -Qnew flag */
473 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000474 case BINARY_TRUE_DIVIDE:
475 newconst = PyNumber_TrueDivide(v, w);
476 break;
477 case BINARY_FLOOR_DIVIDE:
478 newconst = PyNumber_FloorDivide(v, w);
479 break;
480 case BINARY_MODULO:
481 newconst = PyNumber_Remainder(v, w);
482 break;
483 case BINARY_ADD:
484 newconst = PyNumber_Add(v, w);
485 break;
486 case BINARY_SUBTRACT:
487 newconst = PyNumber_Subtract(v, w);
488 break;
489 case BINARY_SUBSCR:
490 newconst = PyObject_GetItem(v, w);
491 break;
492 case BINARY_LSHIFT:
493 newconst = PyNumber_Lshift(v, w);
494 break;
495 case BINARY_RSHIFT:
496 newconst = PyNumber_Rshift(v, w);
497 break;
498 case BINARY_AND:
499 newconst = PyNumber_And(v, w);
500 break;
501 case BINARY_XOR:
502 newconst = PyNumber_Xor(v, w);
503 break;
504 case BINARY_OR:
505 newconst = PyNumber_Or(v, w);
506 break;
507 default:
508 /* Called with an unknown opcode */
509 assert(0);
510 return 0;
511 }
512 if (newconst == NULL) {
513 PyErr_Clear();
514 return 0;
515 }
516
517 /* Append folded constant into consts table */
518 len_consts = PyList_GET_SIZE(consts);
519 if (PyList_Append(consts, newconst)) {
520 Py_DECREF(newconst);
521 return 0;
522 }
523 Py_DECREF(newconst);
524
525 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
526 memset(codestr, NOP, 4);
527 codestr[4] = LOAD_CONST;
528 SETARG(codestr, 4, len_consts);
529 return 1;
530}
531
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000532static unsigned int *
533markblocks(unsigned char *code, int len)
534{
535 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000536 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537
538 if (blocks == NULL)
539 return NULL;
540 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000541
542 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000543 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
544 opcode = code[i];
545 switch (opcode) {
546 case FOR_ITER:
547 case JUMP_FORWARD:
548 case JUMP_IF_FALSE:
549 case JUMP_IF_TRUE:
550 case JUMP_ABSOLUTE:
551 case CONTINUE_LOOP:
552 case SETUP_LOOP:
553 case SETUP_EXCEPT:
554 case SETUP_FINALLY:
555 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000556 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000557 break;
558 }
559 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000560 /* Build block numbers in the second pass */
561 for (i=0 ; i<len ; i++) {
562 blockcnt += blocks[i]; /* increment blockcnt over labels */
563 blocks[i] = blockcnt;
564 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000565 return blocks;
566}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000567
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000568/* Perform basic peephole optimizations to components of a code object.
569 The consts object should still be in list form to allow new constants
570 to be appended.
571
572 To keep the optimizer simple, it bails out (does nothing) for code
573 containing extended arguments or that has a length over 32,700. That
574 allows us to avoid overflow and sign issues. Likewise, it bails when
575 the lineno table has complex encoding for gaps >= 255.
576
577 Optimizations are restricted to simple transformations occuring within a
578 single basic block. All transformations keep the code size the same or
579 smaller. For those that reduce size, the gaps are initially filled with
580 NOPs. Later those NOPs are removed and the jump addresses retargeted in
581 a single pass. Line numbering is adjusted accordingly. */
582
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000583static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000584optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000585{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000586 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000587 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000588 unsigned char *codestr = NULL;
589 unsigned char *lineno;
590 int *addrmap = NULL;
591 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000592 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000593 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000594 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000595
Raymond Hettingereffb3932004-10-30 08:55:08 +0000596 /* Bail out if an exception is set */
597 if (PyErr_Occurred())
598 goto exitUnchanged;
599
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000600 /* Bypass optimization when the lineno table is too complex */
601 assert(PyString_Check(lineno_obj));
602 lineno = PyString_AS_STRING(lineno_obj);
603 tabsiz = PyString_GET_SIZE(lineno_obj);
604 if (memchr(lineno, 255, tabsiz) != NULL)
605 goto exitUnchanged;
606
Raymond Hettingera12fa142004-08-24 04:34:16 +0000607 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000608 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000609 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000610 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000611 goto exitUnchanged;
612
613 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000614 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000615 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000616 goto exitUnchanged;
617 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000618
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000619 /* Mapping to new jump targets after NOPs are removed */
620 addrmap = PyMem_Malloc(codelen * sizeof(int));
621 if (addrmap == NULL)
622 goto exitUnchanged;
623
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000624 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000625 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000626 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000627 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000628
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000629 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000630 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000631
632 lastlc = cumlc;
633 cumlc = 0;
634
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000635 switch (opcode) {
636
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000637 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000638 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000639 case UNARY_NOT:
640 if (codestr[i+1] != JUMP_IF_FALSE ||
641 codestr[i+4] != POP_TOP ||
642 !ISBASICBLOCK(blocks,i,5))
643 continue;
644 tgt = GETJUMPTGT(codestr, (i+1));
645 if (codestr[tgt] != POP_TOP)
646 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000647 j = GETARG(codestr, i+1) + 1;
648 codestr[i] = JUMP_IF_TRUE;
649 SETARG(codestr, i, j);
650 codestr[i+3] = POP_TOP;
651 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000652 break;
653
654 /* not a is b --> a is not b
655 not a in b --> a not in b
656 not a is not b --> a is b
657 not a not in b --> a in b */
658 case COMPARE_OP:
659 j = GETARG(codestr, i);
660 if (j < 6 || j > 9 ||
661 codestr[i+3] != UNARY_NOT ||
662 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000663 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000664 SETARG(codestr, i, (j^1));
665 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000666 break;
667
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000668 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
669 case LOAD_NAME:
670 case LOAD_GLOBAL:
671 j = GETARG(codestr, i);
672 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
673 if (name == NULL || strcmp(name, "None") != 0)
674 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000675 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
676 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000677 codestr[i] = LOAD_CONST;
678 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000679 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000680 break;
681 }
682 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000683 break;
684
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000685 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000686 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000687 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000688 j = GETARG(codestr, i);
689 if (codestr[i+3] != JUMP_IF_FALSE ||
690 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000691 !ISBASICBLOCK(blocks,i,7) ||
692 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000693 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000694 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000695 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000696 break;
697
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000698 /* Try to fold tuples of constants.
699 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000700 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
701 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000702 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000703 j = GETARG(codestr, i);
704 h = i - 3 * j;
705 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000706 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000707 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
708 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000709 assert(codestr[i] == LOAD_CONST);
710 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000711 break;
712 }
713 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000714 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000715 j = GETARG(codestr, i);
716 if (codestr[i+3] != UNPACK_SEQUENCE ||
717 !ISBASICBLOCK(blocks,i,6) ||
718 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000719 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000720 if (j == 1) {
721 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000722 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000723 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000724 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000725 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000726 codestr[i] = ROT_THREE;
727 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000728 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000729 }
730 break;
731
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000732 /* Fold binary ops on constants.
733 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
734 case BINARY_POWER:
735 case BINARY_MULTIPLY:
736 case BINARY_DIVIDE:
737 case BINARY_TRUE_DIVIDE:
738 case BINARY_FLOOR_DIVIDE:
739 case BINARY_MODULO:
740 case BINARY_ADD:
741 case BINARY_SUBTRACT:
742 case BINARY_SUBSCR:
743 case BINARY_LSHIFT:
744 case BINARY_RSHIFT:
745 case BINARY_AND:
746 case BINARY_XOR:
747 case BINARY_OR:
748 if (lastlc >= 2 &&
749 ISBASICBLOCK(blocks, i-6, 7) &&
750 fold_binops_on_constants(&codestr[i-6], consts)) {
751 i -= 2;
752 assert(codestr[i] == LOAD_CONST);
753 cumlc = 1;
754 }
755 break;
756
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000757 /* Simplify conditional jump to conditional jump where the
758 result of the first test implies the success of a similar
759 test or the failure of the opposite test.
760 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000761 "if a and b:"
762 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000763 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000764 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000765 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000766 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
767 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000768 */
769 case JUMP_IF_FALSE:
770 case JUMP_IF_TRUE:
771 tgt = GETJUMPTGT(codestr, i);
772 j = codestr[tgt];
773 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
774 if (j == opcode) {
775 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
776 SETARG(codestr, i, tgttgt);
777 } else {
778 tgt -= i;
779 SETARG(codestr, i, tgt);
780 }
781 break;
782 }
783 /* Intentional fallthrough */
784
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000785 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000786 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000787 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000788 case JUMP_ABSOLUTE:
789 case CONTINUE_LOOP:
790 case SETUP_LOOP:
791 case SETUP_EXCEPT:
792 case SETUP_FINALLY:
793 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000794 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000795 continue;
796 tgttgt = GETJUMPTGT(codestr, tgt);
797 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
798 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000799 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000800 tgttgt -= i + 3; /* Calc relative jump addr */
801 if (tgttgt < 0) /* No backward relative jumps */
802 continue;
803 codestr[i] = opcode;
804 SETARG(codestr, i, tgttgt);
805 break;
806
807 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000808 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000809
810 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
811 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000812 if (i+4 >= codelen ||
813 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000814 !ISBASICBLOCK(blocks,i,5))
815 continue;
816 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000817 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000818 }
819 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000820
821 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000822 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
823 addrmap[i] = i - nops;
824 if (codestr[i] == NOP)
825 nops++;
826 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000827 cum_orig_line = 0;
828 last_line = 0;
829 for (i=0 ; i < tabsiz ; i+=2) {
830 cum_orig_line += lineno[i];
831 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000832 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000833 lineno[i] =((unsigned char)(new_line - last_line));
834 last_line = new_line;
835 }
836
837 /* Remove NOPs and fixup jump targets */
838 for (i=0, h=0 ; i<codelen ; ) {
839 opcode = codestr[i];
840 switch (opcode) {
841 case NOP:
842 i++;
843 continue;
844
845 case JUMP_ABSOLUTE:
846 case CONTINUE_LOOP:
847 j = addrmap[GETARG(codestr, i)];
848 SETARG(codestr, i, j);
849 break;
850
851 case FOR_ITER:
852 case JUMP_FORWARD:
853 case JUMP_IF_FALSE:
854 case JUMP_IF_TRUE:
855 case SETUP_LOOP:
856 case SETUP_EXCEPT:
857 case SETUP_FINALLY:
858 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
859 SETARG(codestr, i, j);
860 break;
861 }
862 adj = CODESIZE(opcode);
863 while (adj--)
864 codestr[h++] = codestr[i++];
865 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000866 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000867
868 code = PyString_FromStringAndSize((char *)codestr, h);
869 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000870 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000871 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000872 return code;
873
874exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000875 if (blocks != NULL)
876 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000877 if (addrmap != NULL)
878 PyMem_Free(addrmap);
879 if (codestr != NULL)
880 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000881 Py_INCREF(code);
882 return code;
883}
884
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000885/* End: Peephole optimizations ----------------------------------------- */
886
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000888PyCode_New(int argcount, int nlocals, int stacksize, int flags,
889 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000890 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
891 PyObject *filename, PyObject *name, int firstlineno,
892 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000893{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000895 int i;
896 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000897 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000898 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899 consts == NULL || !PyTuple_Check(consts) ||
900 names == NULL || !PyTuple_Check(names) ||
901 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000902 freevars == NULL || !PyTuple_Check(freevars) ||
903 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 name == NULL || !PyString_Check(name) ||
905 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000906 lnotab == NULL || !PyString_Check(lnotab) ||
907 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000908 PyErr_BadInternalCall();
909 return NULL;
910 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000911 intern_strings(names);
912 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000913 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000914 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000915 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 for (i = PyTuple_Size(consts); --i >= 0; ) {
917 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000919 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000920 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000921 continue;
922 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000923 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000925 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000926 co->co_argcount = argcount;
927 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000928 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000929 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000930 Py_INCREF(code);
931 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000937 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000938 Py_INCREF(freevars);
939 co->co_freevars = freevars;
940 Py_INCREF(cellvars);
941 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000943 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000945 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000946 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000948 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000949 if (PyTuple_GET_SIZE(freevars) == 0 &&
950 PyTuple_GET_SIZE(cellvars) == 0)
951 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 }
953 return co;
954}
955
956
957/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000958
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959/* The compiler uses two passes to generate bytecodes. The first pass
960 builds the symbol table. The second pass generates the bytecode.
961
962 The first pass uses a single symtable struct. The second pass uses
963 a compiling struct for each code block. The compiling structs
964 share a reference to the symtable.
965
966 The two passes communicate via symtable_load_symbols() and via
967 is_local() and is_global(). The former initializes several slots
968 in the compiling struct: c_varnames, c_locals, c_nlocals,
969 c_argcount, c_globals, and c_flags.
970*/
971
Tim Peters2a7f3842001-06-09 09:26:21 +0000972/* All about c_lnotab.
973
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000974c_lnotab is an array of unsigned bytes disguised as a Python string. Since
975version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
976mapped to source code line #s via c_lnotab instead.
977
Tim Peters2a7f3842001-06-09 09:26:21 +0000978The array is conceptually a list of
979 (bytecode offset increment, line number increment)
980pairs. The details are important and delicate, best illustrated by example:
981
982 byte code offset source code line number
983 0 1
984 6 2
985 50 7
986 350 307
987 361 308
988
989The first trick is that these numbers aren't stored, only the increments
990from one row to the next (this doesn't really work, but it's a start):
991
992 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
993
994The second trick is that an unsigned byte can't hold negative values, or
995values larger than 255, so (a) there's a deep assumption that byte code
996offsets and their corresponding line #s both increase monotonically, and (b)
997if at least one column jumps by more than 255 from one row to the next, more
998than one pair is written to the table. In case #b, there's no way to know
999from looking at the table later how many were written. That's the delicate
1000part. A user of c_lnotab desiring to find the source line number
1001corresponding to a bytecode address A should do something like this
1002
1003 lineno = addr = 0
1004 for addr_incr, line_incr in c_lnotab:
1005 addr += addr_incr
1006 if addr > A:
1007 return lineno
1008 lineno += line_incr
1009
1010In order for this to work, when the addr field increments by more than 255,
1011the line # increment in each pair generated must be 0 until the remaining addr
1012increment is < 256. So, in the example above, com_set_lineno should not (as
1013was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1014255, 0, 45, 255, 0, 45.
1015*/
1016
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001017struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001018 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001020 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001022 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001023 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 PyObject *c_locals; /* dictionary (value=localID) */
1025 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001026 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001027 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001028 int c_nlocals; /* index of next local */
1029 int c_argcount; /* number of top-level arguments */
1030 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 int c_nexti; /* index into c_code */
1032 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001034 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001035 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001036 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001037 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001038 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001039 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001040 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001041 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001042 int c_stacklevel; /* Current stack level */
1043 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001044 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001046 int c_last_addr; /* last op addr seen and recorded in lnotab */
1047 int c_last_line; /* last line seen and recorded in lnotab */
1048 int c_lnotab_next; /* current length of lnotab */
1049 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001050 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001051 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001052 int c_nested; /* Is block nested funcdef or lamdef? */
1053 int c_closure; /* Is nested w/freevars? */
1054 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001055 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001056 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057};
1058
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001059static int
1060is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001061{
1062 if ((v & (USE | DEF_FREE))
1063 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1064 return 1;
1065 if (v & DEF_FREE_CLASS)
1066 return 1;
1067 return 0;
1068}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001069
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001070static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001071com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001072{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001073 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1074
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001075 if (c == NULL) {
1076 /* Error occurred via symtable call to
1077 is_constant_false */
1078 PyErr_SetString(exc, msg);
1079 return;
1080 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001081 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001082 if (c->c_lineno < 1 || c->c_interactive) {
1083 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001085 return;
1086 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001087 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001088 if (v == NULL)
1089 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001090
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001091 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001092 if (line == NULL) {
1093 Py_INCREF(Py_None);
1094 line = Py_None;
1095 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001096 if (exc == PyExc_SyntaxError) {
1097 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1098 Py_None, line);
1099 if (t == NULL)
1100 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001101 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001102 if (w == NULL)
1103 goto exit;
1104 PyErr_SetObject(exc, w);
1105 } else {
1106 /* Make sure additional exceptions are printed with
1107 file and line, also. */
1108 PyErr_SetObject(exc, v);
1109 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1110 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001111 exit:
1112 Py_XDECREF(t);
1113 Py_XDECREF(v);
1114 Py_XDECREF(w);
1115 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001116}
1117
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001118/* Interface to the block stack */
1119
1120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001121block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001122{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001123 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 com_error(c, PyExc_SystemError,
1125 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001126 }
1127 else {
1128 c->c_block[c->c_nblocks++] = type;
1129 }
1130}
1131
1132static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001133block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001134{
1135 if (c->c_nblocks > 0)
1136 c->c_nblocks--;
1137 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001139 }
1140}
1141
Guido van Rossum681d79a1995-07-18 14:51:37 +00001142/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001143
Martin v. Löwis95292d62002-12-11 14:04:59 +00001144static int issue_warning(const char *, const char *, int);
1145static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001146static void com_free(struct compiling *);
1147static void com_push(struct compiling *, int);
1148static void com_pop(struct compiling *, int);
1149static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001150static void com_node(struct compiling *, node *);
1151static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001152static void com_addbyte(struct compiling *, int);
1153static void com_addint(struct compiling *, int);
1154static void com_addoparg(struct compiling *, int, int);
1155static void com_addfwref(struct compiling *, int, int *);
1156static void com_backpatch(struct compiling *, int);
1157static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1158static int com_addconst(struct compiling *, PyObject *);
1159static int com_addname(struct compiling *, PyObject *);
1160static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001161static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001162static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001163static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001164static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001165static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001166static void com_assign(struct compiling *, node *, int, node *);
1167static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001168static int com_make_closure(struct compiling *c, PyCodeObject *co);
1169
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001170static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001171static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001172 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001173static PyObject *parsestrplus(struct compiling*, node *);
1174static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001175static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001176
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001177static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001178
1179/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001180static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001181static struct symtable *symtable_build(node *, PyFutureFeatures *,
1182 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001183static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001184static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001185static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001186static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001188static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001189
1190static void symtable_node(struct symtable *, node *);
1191static void symtable_funcdef(struct symtable *, node *);
1192static void symtable_default_args(struct symtable *, node *);
1193static void symtable_params(struct symtable *, node *);
1194static void symtable_params_fplist(struct symtable *, node *n);
1195static void symtable_global(struct symtable *, node *);
1196static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001197static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001198static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001199static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001200static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001201static void symtable_gen_for(struct symtable *, node *, int);
1202static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001203
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001204static int symtable_update_free_vars(struct symtable *);
1205static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1206static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1207
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001208/* helper */
1209static void
1210do_pad(int pad)
1211{
1212 int i;
1213 for (i = 0; i < pad; ++i)
1214 fprintf(stderr, " ");
1215}
1216
1217static void
1218dump(node *n, int pad, int depth)
1219{
1220 int i;
1221 if (depth == 0)
1222 return;
1223 do_pad(pad);
1224 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1225 if (depth > 0)
1226 depth--;
1227 for (i = 0; i < NCH(n); ++i)
1228 dump(CHILD(n, i), pad + 1, depth);
1229}
1230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001232com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001234 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1236 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001237 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001239 goto fail;
1240 if ((c->c_const_dict = PyDict_New()) == NULL)
1241 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001243 goto fail;
1244 if ((c->c_name_dict = PyDict_New()) == NULL)
1245 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001247 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1249 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001250 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001251 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001253 c->c_freevars = NULL;
1254 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001255 c->c_nlocals = 0;
1256 c->c_argcount = 0;
1257 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001258 c->c_nexti = 0;
1259 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001260 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001261 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001263 c->c_begin = 0;
1264 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001265 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001266 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001267 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001268 c->c_stacklevel = 0;
1269 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001270 c->c_firstlineno = 0;
1271 c->c_last_addr = 0;
1272 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001273 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001274 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001275 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001276 c->c_nested = 0;
1277 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001278 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001279 return 1;
1280
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001281 fail:
1282 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001283 return 0;
1284}
1285
1286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001287com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 Py_XDECREF(c->c_code);
1290 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001291 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001293 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 Py_XDECREF(c->c_globals);
1295 Py_XDECREF(c->c_locals);
1296 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001297 Py_XDECREF(c->c_freevars);
1298 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001300 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001301 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302}
1303
1304static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001305com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001306{
1307 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001308 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001309 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001310 /*
1311 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1312 c->c_filename, c->c_name, c->c_lineno,
1313 c->c_nexti, c->c_stacklevel, n);
1314 */
1315 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001316}
1317
1318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001319com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001320{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001321 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001322 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323 else
1324 c->c_stacklevel -= n;
1325}
1326
1327static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001328com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001329{
1330 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001332 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001334}
1335
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001336static int
1337com_check_size(PyObject **s, int offset)
1338{
1339 int len = PyString_GET_SIZE(*s);
1340 if (offset >= len)
1341 return _PyString_Resize(s, len * 2);
1342 return 0;
1343}
1344
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001346com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001348 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001349 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001350 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001351 if (com_check_size(&c->c_code, c->c_nexti)) {
1352 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001355 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356}
1357
1358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001361 com_addbyte(c, x & 0xff);
1362 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363}
1364
1365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001366com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001367{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001368 char *p;
1369 if (c->c_lnotab == NULL)
1370 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001371 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1372 c->c_errors++;
1373 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001374 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001375 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001376 *p++ = addr;
1377 *p++ = line;
1378 c->c_lnotab_next += 2;
1379}
1380
1381static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001382com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001383{
1384 c->c_lineno = lineno;
1385 if (c->c_firstlineno == 0) {
1386 c->c_firstlineno = c->c_last_line = lineno;
1387 }
1388 else {
1389 int incr_addr = c->c_nexti - c->c_last_addr;
1390 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001391 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001392 while (incr_addr > 255) {
1393 com_add_lnotab(c, 255, 0);
1394 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001395 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001396 while (incr_line > 255) {
1397 com_add_lnotab(c, incr_addr, 255);
1398 incr_line -=255;
1399 incr_addr = 0;
1400 }
1401 if (incr_addr > 0 || incr_line > 0)
1402 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001403 c->c_last_addr = c->c_nexti;
1404 c->c_last_line = lineno;
1405 }
1406}
1407
1408static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001409com_strip_lnotab(struct compiling *c)
1410{
1411 /* strip the last lnotab entry if no opcode were emitted.
1412 * This prevents a line number to be generated on a final
1413 * pass, like in the following example:
1414 *
1415 * if a:
1416 * print 5
1417 * else:
1418 * pass
1419 *
1420 * Without the fix, a line trace event would be generated
1421 * on the pass even if a is true (because of the implicit
1422 * return).
1423 */
1424 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1425 c->c_lnotab_next = c->c_lnotab_last;
1426 }
1427}
1428
1429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001430com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001431{
Fred Drakeef8ace32000-08-24 00:32:09 +00001432 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001433 if (extended_arg){
1434 com_addbyte(c, EXTENDED_ARG);
1435 com_addint(c, extended_arg);
1436 arg &= 0xffff;
1437 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001438 com_addbyte(c, op);
1439 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440}
1441
1442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001443com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444{
1445 /* Compile a forward reference for backpatching */
1446 int here;
1447 int anchor;
1448 com_addbyte(c, op);
1449 here = c->c_nexti;
1450 anchor = *p_anchor;
1451 *p_anchor = here;
1452 com_addint(c, anchor == 0 ? 0 : here - anchor);
1453}
1454
1455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001456com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001458 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001459 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001460 int dist;
1461 int prev;
1462 for (;;) {
1463 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001464 prev = code[anchor] + (code[anchor+1] << 8);
1465 dist = target - (anchor+2);
1466 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001467 dist >>= 8;
1468 code[anchor+1] = dist;
1469 dist >>= 8;
1470 if (dist) {
1471 com_error(c, PyExc_SystemError,
1472 "com_backpatch: offset too large");
1473 break;
1474 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001475 if (!prev)
1476 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 anchor -= prev;
1478 }
1479}
1480
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001481/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482
1483static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001484com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001486 PyObject *w, *t, *np=NULL;
1487 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001488
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001489 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001490 if (t == NULL)
1491 goto fail;
1492 w = PyDict_GetItem(dict, t);
1493 if (w != NULL) {
1494 n = PyInt_AsLong(w);
1495 } else {
1496 n = PyList_Size(list);
1497 np = PyInt_FromLong(n);
1498 if (np == NULL)
1499 goto fail;
1500 if (PyList_Append(list, v) != 0)
1501 goto fail;
1502 if (PyDict_SetItem(dict, t, np) != 0)
1503 goto fail;
1504 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001505 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001506 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001507 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001508 fail:
1509 Py_XDECREF(np);
1510 Py_XDECREF(t);
1511 c->c_errors++;
1512 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513}
1514
1515static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001516com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001518 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519}
1520
1521static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001522com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001524 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001525}
1526
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001527int
1528_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001529{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001530 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001531 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001532 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001533 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1534 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001535 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001536 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001537 return 0; /* Don't mangle __extremely_long_names */
1538 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1539 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001540 /* Strip leading underscores from class name */
1541 while (*p == '_')
1542 p++;
1543 if (*p == '\0')
1544 return 0; /* Don't mangle if class is just underscores */
1545 plen = strlen(p);
1546 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001547 plen = maxlen-nlen-2; /* Truncate class name if too long */
1548 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001549 buffer[0] = '_';
1550 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001551 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001552 return 1;
1553}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001554
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001555static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001556com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001557{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001559 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001560 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001561
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001562 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001563 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001564 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 c->c_errors++;
1566 i = 255;
1567 }
1568 else {
1569 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001572 com_addoparg(c, op, i);
1573}
1574
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001575#define NAME_LOCAL 0
1576#define NAME_GLOBAL 1
1577#define NAME_DEFAULT 2
1578#define NAME_CLOSURE 3
1579
1580static int
1581com_lookup_arg(PyObject *dict, PyObject *name)
1582{
1583 PyObject *v = PyDict_GetItem(dict, name);
1584 if (v == NULL)
1585 return -1;
1586 else
1587 return PyInt_AS_LONG(v);
1588}
1589
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001590static int
1591none_assignment_check(struct compiling *c, char *name, int assigning)
1592{
1593 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1594 char *msg;
1595 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001596 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001597 else
1598 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001599 com_error(c, PyExc_SyntaxError, msg);
1600 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001601 }
1602 return 0;
1603}
1604
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001605static void
1606com_addop_varname(struct compiling *c, int kind, char *name)
1607{
1608 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001609 int i, reftype;
1610 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001611 int op = STOP_CODE;
1612 char buffer[MANGLE_LEN];
1613
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001614 if (kind != VAR_LOAD &&
1615 none_assignment_check(c, name, kind == VAR_STORE))
1616 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001617 i = 255;
1618 goto done;
1619 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001620 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001621 name = buffer;
1622 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1623 c->c_errors++;
1624 i = 255;
1625 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001626 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001627
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001628 reftype = get_ref_type(c, name);
1629 switch (reftype) {
1630 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001631 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001632 scope = NAME_LOCAL;
1633 break;
1634 case GLOBAL_EXPLICIT:
1635 scope = NAME_GLOBAL;
1636 break;
1637 case GLOBAL_IMPLICIT:
1638 if (c->c_flags & CO_OPTIMIZED)
1639 scope = NAME_GLOBAL;
1640 break;
1641 case FREE:
1642 case CELL:
1643 scope = NAME_CLOSURE;
1644 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001645 }
1646
1647 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001648 if (scope == NAME_LOCAL)
1649 i = com_lookup_arg(c->c_locals, v);
1650 else if (reftype == FREE)
1651 i = com_lookup_arg(c->c_freevars, v);
1652 else if (reftype == CELL)
1653 i = com_lookup_arg(c->c_cellvars, v);
1654 if (i == -1) {
1655 c->c_errors++; /* XXX no exception set */
1656 i = 255;
1657 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001658 }
1659 Py_DECREF(v);
1660
1661 switch (kind) {
1662 case VAR_LOAD:
1663 switch (scope) {
1664 case NAME_LOCAL:
1665 op = LOAD_FAST;
1666 break;
1667 case NAME_GLOBAL:
1668 op = LOAD_GLOBAL;
1669 break;
1670 case NAME_DEFAULT:
1671 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001672 break;
1673 case NAME_CLOSURE:
1674 op = LOAD_DEREF;
1675 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001676 }
1677 break;
1678 case VAR_STORE:
1679 switch (scope) {
1680 case NAME_LOCAL:
1681 op = STORE_FAST;
1682 break;
1683 case NAME_GLOBAL:
1684 op = STORE_GLOBAL;
1685 break;
1686 case NAME_DEFAULT:
1687 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001688 break;
1689 case NAME_CLOSURE:
1690 op = STORE_DEREF;
1691 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001692 }
1693 break;
1694 case VAR_DELETE:
1695 switch (scope) {
1696 case NAME_LOCAL:
1697 op = DELETE_FAST;
1698 break;
1699 case NAME_GLOBAL:
1700 op = DELETE_GLOBAL;
1701 break;
1702 case NAME_DEFAULT:
1703 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001704 break;
1705 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001706 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001707 PyOS_snprintf(buf, sizeof(buf),
1708 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001709 com_error(c, PyExc_SyntaxError, buf);
1710 i = 255;
1711 break;
1712 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001713 }
1714 break;
1715 }
1716done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001717 com_addoparg(c, op, i);
1718}
1719
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001721com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001722{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001723 char *name;
1724 char buffer[1000];
1725 /* XXX it is possible to write this code without the 1000
1726 chars on the total length of dotted names, I just can't be
1727 bothered right now */
1728 if (TYPE(n) == STAR)
1729 name = "*";
1730 else if (TYPE(n) == dotted_name) {
1731 char *p = buffer;
1732 int i;
1733 name = buffer;
1734 for (i = 0; i < NCH(n); i += 2) {
1735 char *s = STR(CHILD(n, i));
1736 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001737 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001738 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001739 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001740 break;
1741 }
1742 if (p != buffer)
1743 *p++ = '.';
1744 strcpy(p, s);
1745 p = strchr(p, '\0');
1746 }
1747 }
1748 else {
1749 REQ(n, NAME);
1750 name = STR(n);
1751 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001752 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001753}
1754
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001756parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001757{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001758 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001759 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001760 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001761#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001762 int imflag;
1763#endif
1764
Guido van Rossum282914b1991-04-04 10:42:56 +00001765 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001766 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001767#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001768 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001769#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001770 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001772 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001774 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001775 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001776 }
1777 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001778 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001780 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001781 if (errno != 0)
1782 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001784 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001785 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001786#ifndef WITHOUT_COMPLEX
1787 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001788 Py_complex z;
1789 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001790 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001791 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001792 PyFPE_END_PROTECT(z)
1793 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001794 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001795 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001796#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001797 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001798 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001799 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001800 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001802 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001803}
1804
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001806decode_utf8(char **sPtr, char *end, char* encoding)
1807{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001808#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001809 Py_FatalError("decode_utf8 should not be called in this build.");
1810 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001811#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001812 PyObject *u, *v;
1813 char *s, *t;
1814 t = s = *sPtr;
1815 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1816 while (s < end && (*s & 0x80)) s++;
1817 *sPtr = s;
1818 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1819 if (u == NULL)
1820 return NULL;
1821 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1822 Py_DECREF(u);
1823 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001824#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001825}
1826
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001827/* compiler.transformer.Transformer.decode_literal depends on what
1828 might seem like minor details of this function -- changes here
1829 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001830static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001831parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001832{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001834 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001835 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001836 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001837 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001838 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001839 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001840
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001841 if (isalpha(quote) || quote == '_') {
1842 if (quote == 'u' || quote == 'U') {
1843 quote = *++s;
1844 unicode = 1;
1845 }
1846 if (quote == 'r' || quote == 'R') {
1847 quote = *++s;
1848 rawmode = 1;
1849 }
1850 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001851 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001853 return NULL;
1854 }
1855 s++;
1856 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001857 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001858 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001859 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001860 return NULL;
1861 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001862 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001864 return NULL;
1865 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001866 if (len >= 4 && s[0] == quote && s[1] == quote) {
1867 s += 2;
1868 len -= 2;
1869 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001871 return NULL;
1872 }
1873 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001874#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001875 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001876 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001877 char *buf;
1878 char *p;
1879 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001880 if (encoding == NULL) {
1881 buf = s;
1882 u = NULL;
1883 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1884 buf = s;
1885 u = NULL;
1886 } else {
1887 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1888 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1889 if (u == NULL)
1890 return NULL;
1891 p = buf = PyString_AsString(u);
1892 end = s + len;
1893 while (s < end) {
1894 if (*s == '\\') {
1895 *p++ = *s++;
1896 if (*s & 0x80) {
1897 strcpy(p, "u005c");
1898 p += 5;
1899 }
1900 }
1901 if (*s & 0x80) { /* XXX inefficient */
1902 char *r;
1903 int rn, i;
1904 w = decode_utf8(&s, end, "utf-16-be");
1905 if (w == NULL) {
1906 Py_DECREF(u);
1907 return NULL;
1908 }
1909 r = PyString_AsString(w);
1910 rn = PyString_Size(w);
1911 assert(rn % 2 == 0);
1912 for (i = 0; i < rn; i += 2) {
1913 sprintf(p, "\\u%02x%02x",
1914 r[i + 0] & 0xFF,
1915 r[i + 1] & 0xFF);
1916 p += 6;
1917 }
1918 Py_DECREF(w);
1919 } else {
1920 *p++ = *s++;
1921 }
1922 }
1923 len = p - buf;
1924 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001925 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001926 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001927 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001928 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1929 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001930 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001931 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001932 return v;
1933
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001934 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001935#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001936 need_encoding = (encoding != NULL &&
1937 strcmp(encoding, "utf-8") != 0 &&
1938 strcmp(encoding, "iso-8859-1") != 0);
1939 if (rawmode || strchr(s, '\\') == NULL) {
1940 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001941#ifndef Py_USING_UNICODE
1942 /* This should not happen - we never see any other
1943 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001944 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001945#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001946 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1947 if (u == NULL)
1948 return NULL;
1949 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1950 Py_DECREF(u);
1951 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001952#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001953 } else {
1954 return PyString_FromStringAndSize(s, len);
1955 }
1956 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001957
1958 v = PyString_DecodeEscape(s, len, NULL, unicode,
1959 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001960 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001961 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001962 return v;
1963}
1964
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001966parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001967{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001969 int i;
1970 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001971 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001972 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001973 for (i = 1; i < NCH(n); i++) {
1974 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001975 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001976 if (s == NULL)
1977 goto onError;
1978 if (PyString_Check(v) && PyString_Check(s)) {
1979 PyString_ConcatAndDel(&v, s);
1980 if (v == NULL)
1981 goto onError;
1982 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001983#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001984 else {
1985 PyObject *temp;
1986 temp = PyUnicode_Concat(v, s);
1987 Py_DECREF(s);
1988 if (temp == NULL)
1989 goto onError;
1990 Py_DECREF(v);
1991 v = temp;
1992 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001993#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001994 }
1995 }
1996 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001997
1998 onError:
1999 Py_XDECREF(v);
2000 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002001}
2002
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002003static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002004com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002005{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002006 int anchor = 0;
2007 int save_begin = c->c_begin;
2008
Raymond Hettinger354433a2004-05-19 08:20:33 +00002009 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002010 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002011 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002012 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002013 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002014 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002015 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002016 c->c_loops++;
2017 com_list_iter(c, n, e, t);
2018 c->c_loops--;
2019 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2020 c->c_begin = save_begin;
2021 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002022 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002023}
2024
2025static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002026com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2027{
2028 int break_anchor = 0;
2029 int anchor = 0;
2030 int save_begin = c->c_begin;
2031
2032 REQ(n, gen_for);
2033 /* gen_for: for v in test [gen_iter] */
2034
2035 com_addfwref(c, SETUP_LOOP, &break_anchor);
2036 block_push(c, SETUP_LOOP);
2037
2038 if (is_outmost) {
2039 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2040 com_push(c, 1);
2041 }
2042 else {
2043 com_node(c, CHILD(n, 3));
2044 com_addbyte(c, GET_ITER);
2045 }
2046
2047 c->c_begin = c->c_nexti;
2048 com_set_lineno(c, c->c_last_line);
2049 com_addfwref(c, FOR_ITER, &anchor);
2050 com_push(c, 1);
2051 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2052
2053 if (NCH(n) == 5)
2054 com_gen_iter(c, CHILD(n, 4), t);
2055 else {
2056 com_test(c, t);
2057 com_addbyte(c, YIELD_VALUE);
2058 com_pop(c, 1);
2059 }
2060
2061 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2062 c->c_begin = save_begin;
2063
2064 com_backpatch(c, anchor);
2065 com_pop(c, 1); /* FOR_ITER has popped this */
2066 com_addbyte(c, POP_BLOCK);
2067 block_pop(c, SETUP_LOOP);
2068 com_backpatch(c, break_anchor);
2069}
2070
2071static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002072com_list_if(struct compiling *c, node *n, node *e, char *t)
2073{
2074 int anchor = 0;
2075 int a = 0;
2076 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002077 com_node(c, CHILD(n, 1));
2078 com_addfwref(c, JUMP_IF_FALSE, &a);
2079 com_addbyte(c, POP_TOP);
2080 com_pop(c, 1);
2081 com_list_iter(c, n, e, t);
2082 com_addfwref(c, JUMP_FORWARD, &anchor);
2083 com_backpatch(c, a);
2084 /* We jump here with an extra entry which we now pop */
2085 com_addbyte(c, POP_TOP);
2086 com_backpatch(c, anchor);
2087}
2088
2089static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002090com_gen_if(struct compiling *c, node *n, node *t)
2091{
2092 /* gen_if: 'if' test [gen_iter] */
2093 int anchor = 0;
2094 int a=0;
2095
2096 com_node(c, CHILD(n, 1));
2097 com_addfwref(c, JUMP_IF_FALSE, &a);
2098 com_addbyte(c, POP_TOP);
2099 com_pop(c, 1);
2100
2101 if (NCH(n) == 3)
2102 com_gen_iter(c, CHILD(n, 2), t);
2103 else {
2104 com_test(c, t);
2105 com_addbyte(c, YIELD_VALUE);
2106 com_pop(c, 1);
2107 }
2108 com_addfwref(c, JUMP_FORWARD, &anchor);
2109 com_backpatch(c, a);
2110 /* We jump here with an extra entry which we now pop */
2111 com_addbyte(c, POP_TOP);
2112 com_backpatch(c, anchor);
2113}
2114
2115static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002116com_list_iter(struct compiling *c,
2117 node *p, /* parent of list_iter node */
2118 node *e, /* element expression node */
2119 char *t /* name of result list temp local */)
2120{
2121 /* list_iter is the last child in a listmaker, list_for, or list_if */
2122 node *n = CHILD(p, NCH(p)-1);
2123 if (TYPE(n) == list_iter) {
2124 n = CHILD(n, 0);
2125 switch (TYPE(n)) {
2126 case list_for:
2127 com_list_for(c, n, e, t);
2128 break;
2129 case list_if:
2130 com_list_if(c, n, e, t);
2131 break;
2132 default:
2133 com_error(c, PyExc_SystemError,
2134 "invalid list_iter node type");
2135 }
2136 }
2137 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002138 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002139 com_push(c, 1);
2140 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002141 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002142 com_pop(c, 2);
2143 }
2144}
2145
2146static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002147com_gen_iter(struct compiling *c, node *n, node *t)
2148{
2149 /* gen_iter: gen_for | gen_if */
2150 node *ch;
2151 REQ(n, gen_iter);
2152
2153 ch = CHILD(n, 0);
2154
2155 switch (TYPE(ch)) {
2156 case gen_for:
2157 com_gen_for(c, ch, t, 0);
2158 break;
2159 case gen_if:
2160 com_gen_if(c, ch, t);
2161 break;
2162 default:
2163 com_error(c, PyExc_SystemError,
2164 "invalid gen_iter node type");
2165 }
2166}
2167
2168static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002169com_list_comprehension(struct compiling *c, node *n)
2170{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002171 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002172 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002173
2174 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002175 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002176 com_addoparg(c, BUILD_LIST, 0);
2177 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2178 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002179 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002180 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002181 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002182 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002183 --c->c_tmpname;
2184}
2185
2186static void
2187com_listmaker(struct compiling *c, node *n)
2188{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002189 /* listmaker: test ( list_for | (',' test)* [','] ) */
2190 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002191 com_list_comprehension(c, n);
2192 else {
2193 int len = 0;
2194 int i;
2195 for (i = 0; i < NCH(n); i += 2, len++)
2196 com_node(c, CHILD(n, i));
2197 com_addoparg(c, BUILD_LIST, len);
2198 com_pop(c, len-1);
2199 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200}
2201
2202static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002203com_generator_expression(struct compiling *c, node *n)
2204{
2205 /* testlist_gexp: test gen_for */
2206 /* argument: test gen_for */
2207 PyCodeObject *co;
2208
2209 REQ(CHILD(n, 0), test);
2210 REQ(CHILD(n, 1), gen_for);
2211
2212 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2213 n->n_lineno);
2214 co = icompile(n, c);
2215 symtable_exit_scope(c->c_symtable);
2216
2217 if (co == NULL)
2218 c->c_errors++;
2219 else {
2220 int closure = com_make_closure(c, co);
2221 int i = com_addconst(c, (PyObject *)co);
2222
2223 com_addoparg(c, LOAD_CONST, i);
2224 com_push(c, 1);
2225 if (closure)
2226 com_addoparg(c, MAKE_CLOSURE, 0);
2227 else
2228 com_addoparg(c, MAKE_FUNCTION, 0);
2229
2230 com_test(c, CHILD(CHILD(n, 1), 3));
2231 com_addbyte(c, GET_ITER);
2232 com_addoparg(c, CALL_FUNCTION, 1);
2233 com_pop(c, 1);
2234
2235 Py_DECREF(co);
2236 }
2237}
2238
2239static void
2240com_testlist_gexp(struct compiling *c, node *n)
2241{
2242 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2243 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2244 com_generator_expression(c, n);
2245 else com_list(c, n, 0);
2246}
2247
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002248
Raymond Hettinger354433a2004-05-19 08:20:33 +00002249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002250com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002251{
2252 int i;
2253 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2254 for (i = 0; i+2 < NCH(n); i += 4) {
2255 /* We must arrange things just right for STORE_SUBSCR.
2256 It wants the stack to look like (value) (dict) (key) */
2257 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002259 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002260 com_node(c, CHILD(n, i+2)); /* value */
2261 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002262 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002263 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002264 }
2265}
2266
2267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269{
2270 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002271 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 int i;
2273 REQ(n, atom);
2274 ch = CHILD(n, 0);
2275 switch (TYPE(ch)) {
2276 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002277 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002278 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002279 com_push(c, 1);
2280 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002281 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002282 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002283 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002284 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
2288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002290 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002292 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002295 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002296 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297 break;
2298 case BACKQUOTE:
2299 com_node(c, CHILD(n, 1));
2300 com_addbyte(c, UNARY_CONVERT);
2301 break;
2302 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002303 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002304 i = 255;
2305 }
2306 else {
2307 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002309 }
2310 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002311 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002312 break;
2313 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002314 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002315 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 c->c_errors++;
2317 i = 255;
2318 }
2319 else {
2320 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 }
2323 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002324 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325 break;
2326 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002327 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 break;
2330 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 com_error(c, PyExc_SystemError,
2332 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 }
2334}
2335
2336static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002337com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338{
2339 if (NCH(n) == 1) {
2340 com_addbyte(c, op);
2341 }
2342 else if (NCH(n) == 2) {
2343 if (TYPE(CHILD(n, 0)) != COLON) {
2344 com_node(c, CHILD(n, 0));
2345 com_addbyte(c, op+1);
2346 }
2347 else {
2348 com_node(c, CHILD(n, 1));
2349 com_addbyte(c, op+2);
2350 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
2353 else {
2354 com_node(c, CHILD(n, 0));
2355 com_node(c, CHILD(n, 2));
2356 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002357 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 }
2359}
2360
Guido van Rossum635abd21997-01-06 22:56:52 +00002361static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002362com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2363{
2364 if (NCH(n) == 1) {
2365 com_addbyte(c, DUP_TOP);
2366 com_push(c, 1);
2367 com_addbyte(c, SLICE);
2368 com_node(c, augn);
2369 com_addbyte(c, opcode);
2370 com_pop(c, 1);
2371 com_addbyte(c, ROT_TWO);
2372 com_addbyte(c, STORE_SLICE);
2373 com_pop(c, 2);
2374 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2375 com_node(c, CHILD(n, 0));
2376 com_addoparg(c, DUP_TOPX, 2);
2377 com_push(c, 2);
2378 com_addbyte(c, SLICE+1);
2379 com_pop(c, 1);
2380 com_node(c, augn);
2381 com_addbyte(c, opcode);
2382 com_pop(c, 1);
2383 com_addbyte(c, ROT_THREE);
2384 com_addbyte(c, STORE_SLICE+1);
2385 com_pop(c, 3);
2386 } else if (NCH(n) == 2) {
2387 com_node(c, CHILD(n, 1));
2388 com_addoparg(c, DUP_TOPX, 2);
2389 com_push(c, 2);
2390 com_addbyte(c, SLICE+2);
2391 com_pop(c, 1);
2392 com_node(c, augn);
2393 com_addbyte(c, opcode);
2394 com_pop(c, 1);
2395 com_addbyte(c, ROT_THREE);
2396 com_addbyte(c, STORE_SLICE+2);
2397 com_pop(c, 3);
2398 } else {
2399 com_node(c, CHILD(n, 0));
2400 com_node(c, CHILD(n, 2));
2401 com_addoparg(c, DUP_TOPX, 3);
2402 com_push(c, 3);
2403 com_addbyte(c, SLICE+3);
2404 com_pop(c, 2);
2405 com_node(c, augn);
2406 com_addbyte(c, opcode);
2407 com_pop(c, 1);
2408 com_addbyte(c, ROT_FOUR);
2409 com_addbyte(c, STORE_SLICE+3);
2410 com_pop(c, 4);
2411 }
2412}
2413
2414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002415com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002416{
2417 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002418 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002419 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002420 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002422 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002423 }
2424 else {
2425 com_node(c, CHILD(n, 0));
2426 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002427 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002428 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002429 if (NCH(n) == 2) {
2430 com_generator_expression(c, n);
2431 return;
2432 }
2433
Guido van Rossumf10570b1995-07-07 22:53:21 +00002434 m = n;
2435 do {
2436 m = CHILD(m, 0);
2437 } while (NCH(m) == 1);
2438 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002439 /* f(lambda x: x[0] = 3) ends up getting parsed with
2440 * LHS test = lambda x: x[0], and RHS test = 3.
2441 * SF bug 132313 points out that complaining about a keyword
2442 * then is very confusing.
2443 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002445 TYPE(m) == lambdef ?
2446 "lambda cannot contain assignment" :
2447 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002448 }
2449 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002450 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002451 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002452 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002453 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002454 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002455 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002456 else if (*pkeywords == NULL) {
2457 c->c_errors++;
2458 Py_DECREF(v);
2459 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002460 if (PyDict_GetItem(*pkeywords, v) != NULL)
2461 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002462 "duplicate keyword argument");
2463 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002464 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002465 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002466 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002467 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002468 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002469 }
2470 }
2471 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002472}
2473
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476{
2477 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002478 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 }
2480 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002481 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002482 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002483 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002484 int star_flag = 0;
2485 int starstar_flag = 0;
2486 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002487 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002488 na = 0;
2489 nk = 0;
2490 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002491 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002492 if (TYPE(ch) == STAR ||
2493 TYPE(ch) == DOUBLESTAR)
2494 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002495 if (ch->n_lineno != lineno) {
2496 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002497 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002498 }
2499 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002500 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002501 na++;
2502 else
2503 nk++;
2504 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002505 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002506 while (i < NCH(n)) {
2507 node *tok = CHILD(n, i);
2508 node *ch = CHILD(n, i+1);
2509 i += 3;
2510 switch (TYPE(tok)) {
2511 case STAR: star_flag = 1; break;
2512 case DOUBLESTAR: starstar_flag = 1; break;
2513 }
2514 com_node(c, ch);
2515 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002516 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002517 com_error(c, PyExc_SyntaxError,
2518 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002519 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002520 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002521 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002522 star_flag + (starstar_flag << 1);
2523 else
2524 opcode = CALL_FUNCTION;
2525 com_addoparg(c, opcode, na | (nk << 8));
2526 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 }
2528}
2529
2530static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002531com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002532{
2533 com_addopname(c, LOAD_ATTR, n);
2534}
2535
2536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002537com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002538{
2539 int i=0;
2540 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002541 node *ch;
2542
2543 /* first argument */
2544 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002545 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002547 i++;
2548 }
2549 else {
2550 com_node(c, CHILD(n,i));
2551 i++;
2552 REQ(CHILD(n,i),COLON);
2553 i++;
2554 }
2555 /* second argument */
2556 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2557 com_node(c, CHILD(n,i));
2558 i++;
2559 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002560 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002561 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002562 com_push(c, 1);
2563 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002564 /* remaining arguments */
2565 for (; i < NCH(n); i++) {
2566 ns++;
2567 ch=CHILD(n,i);
2568 REQ(ch, sliceop);
2569 if (NCH(ch) == 1) {
2570 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002571 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002573 }
2574 else
2575 com_node(c, CHILD(ch,1));
2576 }
2577 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002578 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002579}
2580
2581static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002582com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002583{
2584 node *ch;
2585 REQ(n, subscript);
2586 ch = CHILD(n,0);
2587 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002589 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_push(c, 1);
2591 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002592 else {
2593 /* check for slice */
2594 if ((TYPE(ch) == COLON || NCH(n) > 1))
2595 com_sliceobj(c, n);
2596 else {
2597 REQ(ch, test);
2598 com_node(c, ch);
2599 }
2600 }
2601}
2602
2603static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002604com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002605{
2606 int i, op;
2607 REQ(n, subscriptlist);
2608 /* Check to make backward compatible slice behavior for '[i:j]' */
2609 if (NCH(n) == 1) {
2610 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002611 /* 'Basic' slice, should have exactly one colon. */
2612 if ((TYPE(CHILD(sub, 0)) == COLON
2613 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2614 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2615 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002616 switch (assigning) {
2617 case OP_DELETE:
2618 op = DELETE_SLICE;
2619 break;
2620 case OP_ASSIGN:
2621 op = STORE_SLICE;
2622 break;
2623 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002624 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002625 break;
2626 default:
2627 com_augassign_slice(c, sub, assigning, augn);
2628 return;
2629 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002630 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 if (op == STORE_SLICE)
2632 com_pop(c, 2);
2633 else if (op == DELETE_SLICE)
2634 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002635 return;
2636 }
2637 }
2638 /* Else normal subscriptlist. Compile each subscript. */
2639 for (i = 0; i < NCH(n); i += 2)
2640 com_subscript(c, CHILD(n, i));
2641 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002642 if (NCH(n) > 1) {
2643 i = (NCH(n)+1) / 2;
2644 com_addoparg(c, BUILD_TUPLE, i);
2645 com_pop(c, i-1);
2646 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002647 switch (assigning) {
2648 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 op = DELETE_SUBSCR;
2650 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002651 break;
2652 default:
2653 case OP_ASSIGN:
2654 op = STORE_SUBSCR;
2655 i = 3;
2656 break;
2657 case OP_APPLY:
2658 op = BINARY_SUBSCR;
2659 i = 1;
2660 break;
2661 }
2662 if (assigning > OP_APPLY) {
2663 com_addoparg(c, DUP_TOPX, 2);
2664 com_push(c, 2);
2665 com_addbyte(c, BINARY_SUBSCR);
2666 com_pop(c, 1);
2667 com_node(c, augn);
2668 com_addbyte(c, assigning);
2669 com_pop(c, 1);
2670 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002671 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002672 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002673 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002674}
2675
2676static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002677com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678{
2679 REQ(n, trailer);
2680 switch (TYPE(CHILD(n, 0))) {
2681 case LPAR:
2682 com_call_function(c, CHILD(n, 1));
2683 break;
2684 case DOT:
2685 com_select_member(c, CHILD(n, 1));
2686 break;
2687 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002688 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002689 break;
2690 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002691 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002692 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002693 }
2694}
2695
2696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002697com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002698{
2699 int i;
2700 REQ(n, power);
2701 com_atom(c, CHILD(n, 0));
2702 for (i = 1; i < NCH(n); i++) {
2703 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2704 com_factor(c, CHILD(n, i+1));
2705 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002707 break;
2708 }
2709 else
2710 com_apply_trailer(c, CHILD(n, i));
2711 }
2712}
2713
2714static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002715com_invert_constant(struct compiling *c, node *n)
2716{
2717 /* Compute the inverse of int and longs and use them directly,
2718 but be prepared to generate code for all other
2719 possibilities (invalid numbers, floats, complex).
2720 */
2721 PyObject *num, *inv = NULL;
2722 int i;
2723
2724 REQ(n, NUMBER);
2725 num = parsenumber(c, STR(n));
2726 if (num == NULL)
2727 i = 255;
2728 else {
2729 inv = PyNumber_Invert(num);
2730 if (inv == NULL) {
2731 PyErr_Clear();
2732 i = com_addconst(c, num);
2733 } else {
2734 i = com_addconst(c, inv);
2735 Py_DECREF(inv);
2736 }
2737 Py_DECREF(num);
2738 }
2739 com_addoparg(c, LOAD_CONST, i);
2740 com_push(c, 1);
2741 if (num != NULL && inv == NULL)
2742 com_addbyte(c, UNARY_INVERT);
2743}
2744
Tim Peters51e26512001-09-07 08:45:55 +00002745static int
2746is_float_zero(const char *p)
2747{
2748 int found_radix_point = 0;
2749 int ch;
2750 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2751 switch (ch) {
2752 case '0':
2753 /* no reason to believe it's not 0 -- continue */
2754 break;
2755
2756 case 'e': case 'E': case 'j': case 'J':
2757 /* If this was a hex constant, we already would have
2758 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2759 must be an exponent marker, and we haven't yet
2760 seen a non-zero digit, and it doesn't matter what
2761 the exponent is then. For 'j' or 'J' similarly,
2762 except that this is an imaginary 0 then. */
2763 return 1;
2764
2765 case '.':
2766 found_radix_point = 1;
2767 break;
2768
2769 default:
2770 return 0;
2771 }
2772 }
2773 return found_radix_point;
2774}
2775
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002777com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002779 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002780 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002782 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002783 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002784 approriate value as a constant. If the value is negative,
2785 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002786 negative in the 0th position -- unless we're doing unary minus
2787 of a floating zero! In that case the sign is significant, but
2788 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002789 */
2790 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002791 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002792 && TYPE((pfactor = CHILD(n, 1))) == factor
2793 && NCH(pfactor) == 1
2794 && TYPE((ppower = CHILD(pfactor, 0))) == power
2795 && NCH(ppower) == 1
2796 && TYPE((patom = CHILD(ppower, 0))) == atom
2797 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002798 && !(childtype == MINUS &&
2799 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002800 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002801 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002802 return;
2803 }
2804 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002805 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002806 if (s == NULL) {
2807 com_error(c, PyExc_MemoryError, "");
2808 com_addbyte(c, 255);
2809 return;
2810 }
2811 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002812 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002813 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002814 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002815 }
Tim Peters51e26512001-09-07 08:45:55 +00002816 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002817 }
2818 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002819 com_factor(c, CHILD(n, 1));
2820 com_addbyte(c, UNARY_POSITIVE);
2821 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002822 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002823 com_factor(c, CHILD(n, 1));
2824 com_addbyte(c, UNARY_NEGATIVE);
2825 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002826 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002827 com_factor(c, CHILD(n, 1));
2828 com_addbyte(c, UNARY_INVERT);
2829 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002831 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 }
2833}
2834
2835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002836com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002837{
2838 int i;
2839 int op;
2840 REQ(n, term);
2841 com_factor(c, CHILD(n, 0));
2842 for (i = 2; i < NCH(n); i += 2) {
2843 com_factor(c, CHILD(n, i));
2844 switch (TYPE(CHILD(n, i-1))) {
2845 case STAR:
2846 op = BINARY_MULTIPLY;
2847 break;
2848 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002849 if (c->c_flags & CO_FUTURE_DIVISION)
2850 op = BINARY_TRUE_DIVIDE;
2851 else
2852 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 break;
2854 case PERCENT:
2855 op = BINARY_MODULO;
2856 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002857 case DOUBLESLASH:
2858 op = BINARY_FLOOR_DIVIDE;
2859 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002862 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002863 op = 255;
2864 }
2865 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002866 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002867 }
2868}
2869
2870static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002871com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002872{
2873 int i;
2874 int op;
2875 REQ(n, arith_expr);
2876 com_term(c, CHILD(n, 0));
2877 for (i = 2; i < NCH(n); i += 2) {
2878 com_term(c, CHILD(n, i));
2879 switch (TYPE(CHILD(n, i-1))) {
2880 case PLUS:
2881 op = BINARY_ADD;
2882 break;
2883 case MINUS:
2884 op = BINARY_SUBTRACT;
2885 break;
2886 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002887 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002888 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002889 op = 255;
2890 }
2891 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002893 }
2894}
2895
2896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002897com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002898{
2899 int i;
2900 int op;
2901 REQ(n, shift_expr);
2902 com_arith_expr(c, CHILD(n, 0));
2903 for (i = 2; i < NCH(n); i += 2) {
2904 com_arith_expr(c, CHILD(n, i));
2905 switch (TYPE(CHILD(n, i-1))) {
2906 case LEFTSHIFT:
2907 op = BINARY_LSHIFT;
2908 break;
2909 case RIGHTSHIFT:
2910 op = BINARY_RSHIFT;
2911 break;
2912 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002913 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002914 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002915 op = 255;
2916 }
2917 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002918 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002919 }
2920}
2921
2922static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002923com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002924{
2925 int i;
2926 int op;
2927 REQ(n, and_expr);
2928 com_shift_expr(c, CHILD(n, 0));
2929 for (i = 2; i < NCH(n); i += 2) {
2930 com_shift_expr(c, CHILD(n, i));
2931 if (TYPE(CHILD(n, i-1)) == AMPER) {
2932 op = BINARY_AND;
2933 }
2934 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002935 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002936 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002937 op = 255;
2938 }
2939 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002940 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002941 }
2942}
2943
2944static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002945com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002946{
2947 int i;
2948 int op;
2949 REQ(n, xor_expr);
2950 com_and_expr(c, CHILD(n, 0));
2951 for (i = 2; i < NCH(n); i += 2) {
2952 com_and_expr(c, CHILD(n, i));
2953 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2954 op = BINARY_XOR;
2955 }
2956 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002957 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002958 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 op = 255;
2960 }
2961 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 }
2964}
2965
2966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968{
2969 int i;
2970 int op;
2971 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002972 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002974 com_xor_expr(c, CHILD(n, i));
2975 if (TYPE(CHILD(n, i-1)) == VBAR) {
2976 op = BINARY_OR;
2977 }
2978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002980 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981 op = 255;
2982 }
2983 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 }
2986}
2987
2988static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002989cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990{
2991 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002992 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2994 if (NCH(n) == 1) {
2995 n = CHILD(n, 0);
2996 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002997 case LESS: return PyCmp_LT;
2998 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002999 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003000 case LESSEQUAL: return PyCmp_LE;
3001 case GREATEREQUAL: return PyCmp_GE;
3002 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3003 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3004 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003005 }
3006 }
3007 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003010 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003012 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013 }
3014 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003015 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016}
3017
3018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003019com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020{
3021 int i;
3022 enum cmp_op op;
3023 int anchor;
3024 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3025 com_expr(c, CHILD(n, 0));
3026 if (NCH(n) == 1)
3027 return;
3028
3029 /****************************************************************
3030 The following code is generated for all but the last
3031 comparison in a chain:
3032
3033 label: on stack: opcode: jump to:
3034
3035 a <code to load b>
3036 a, b DUP_TOP
3037 a, b, b ROT_THREE
3038 b, a, b COMPARE_OP
3039 b, 0-or-1 JUMP_IF_FALSE L1
3040 b, 1 POP_TOP
3041 b
3042
3043 We are now ready to repeat this sequence for the next
3044 comparison in the chain.
3045
3046 For the last we generate:
3047
3048 b <code to load c>
3049 b, c COMPARE_OP
3050 0-or-1
3051
3052 If there were any jumps to L1 (i.e., there was more than one
3053 comparison), we generate:
3054
3055 0-or-1 JUMP_FORWARD L2
3056 L1: b, 0 ROT_TWO
3057 0, b POP_TOP
3058 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003059 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060 ****************************************************************/
3061
3062 anchor = 0;
3063
3064 for (i = 2; i < NCH(n); i += 2) {
3065 com_expr(c, CHILD(n, i));
3066 if (i+2 < NCH(n)) {
3067 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 com_addbyte(c, ROT_THREE);
3070 }
3071 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003072 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003073 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003074 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075 }
3076 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078 if (i+2 < NCH(n)) {
3079 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3080 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 }
3083 }
3084
3085 if (anchor) {
3086 int anchor2 = 0;
3087 com_addfwref(c, JUMP_FORWARD, &anchor2);
3088 com_backpatch(c, anchor);
3089 com_addbyte(c, ROT_TWO);
3090 com_addbyte(c, POP_TOP);
3091 com_backpatch(c, anchor2);
3092 }
3093}
3094
3095static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003096com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097{
3098 REQ(n, not_test); /* 'not' not_test | comparison */
3099 if (NCH(n) == 1) {
3100 com_comparison(c, CHILD(n, 0));
3101 }
3102 else {
3103 com_not_test(c, CHILD(n, 1));
3104 com_addbyte(c, UNARY_NOT);
3105 }
3106}
3107
3108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003109com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110{
3111 int i;
3112 int anchor;
3113 REQ(n, and_test); /* not_test ('and' not_test)* */
3114 anchor = 0;
3115 i = 0;
3116 for (;;) {
3117 com_not_test(c, CHILD(n, i));
3118 if ((i += 2) >= NCH(n))
3119 break;
3120 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3121 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003122 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 }
3124 if (anchor)
3125 com_backpatch(c, anchor);
3126}
3127
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003128static int
3129com_make_closure(struct compiling *c, PyCodeObject *co)
3130{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003131 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003132 if (free == 0)
3133 return 0;
3134 for (i = 0; i < free; ++i) {
3135 /* Bypass com_addop_varname because it will generate
3136 LOAD_DEREF but LOAD_CLOSURE is needed.
3137 */
3138 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3139 int arg, reftype;
3140
3141 /* Special case: If a class contains a method with a
3142 free variable that has the same name as a method,
3143 the name will be considered free *and* local in the
3144 class. It should be handled by the closure, as
3145 well as by the normal name loookup logic.
3146 */
3147 reftype = get_ref_type(c, PyString_AS_STRING(name));
3148 if (reftype == CELL)
3149 arg = com_lookup_arg(c->c_cellvars, name);
3150 else /* (reftype == FREE) */
3151 arg = com_lookup_arg(c->c_freevars, name);
3152 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003153 fprintf(stderr, "lookup %s in %s %d %d\n"
3154 "freevars of %s: %s\n",
3155 PyObject_REPR(name),
3156 c->c_name,
3157 reftype, arg,
3158 PyString_AS_STRING(co->co_name),
3159 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003160 Py_FatalError("com_make_closure()");
3161 }
3162 com_addoparg(c, LOAD_CLOSURE, arg);
3163
3164 }
3165 com_push(c, free);
3166 return 1;
3167}
3168
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003170com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003172 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003173 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003174 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003175 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003176 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003177 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3178 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003179 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003180 if (co == NULL) {
3181 c->c_errors++;
3182 return;
3183 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003184 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003185 i = com_addconst(c, (PyObject *)co);
3186 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003187 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003188 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003189 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003190 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003191 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003192 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003193 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003194 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003195 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003197 else {
3198 int anchor = 0;
3199 int i = 0;
3200 for (;;) {
3201 com_and_test(c, CHILD(n, i));
3202 if ((i += 2) >= NCH(n))
3203 break;
3204 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3205 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003207 }
3208 if (anchor)
3209 com_backpatch(c, anchor);
3210 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003211}
3212
3213static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003214com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215{
3216 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003217 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 com_node(c, CHILD(n, 0));
3219 }
3220 else {
3221 int i;
3222 int len;
3223 len = (NCH(n) + 1) / 2;
3224 for (i = 0; i < NCH(n); i += 2)
3225 com_node(c, CHILD(n, i));
3226 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003227 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 }
3229}
3230
3231
3232/* Begin of assignment compilation */
3233
Thomas Wouters434d0822000-08-24 20:11:32 +00003234
3235static void
3236com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3237{
3238 com_addbyte(c, DUP_TOP);
3239 com_push(c, 1);
3240 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003241 com_node(c, augn);
3242 com_addbyte(c, opcode);
3243 com_pop(c, 1);
3244 com_addbyte(c, ROT_TWO);
3245 com_addopname(c, STORE_ATTR, n);
3246 com_pop(c, 2);
3247}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248
3249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003250com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003251{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003252 if (none_assignment_check(c, STR(n), assigning))
3253 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003254 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003255 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256}
3257
3258static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003259com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261 REQ(n, trailer);
3262 switch (TYPE(CHILD(n, 0))) {
3263 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003264 if (assigning == OP_DELETE)
3265 com_error(c, PyExc_SyntaxError,
3266 "can't delete function call");
3267 else
3268 com_error(c, PyExc_SyntaxError,
3269 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 break;
3271 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003272 if (assigning > OP_APPLY)
3273 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3274 else
3275 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003276 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003277 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003278 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003279 break;
3280 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003281 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 }
3283}
3284
3285static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003286com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287{
3288 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003289 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3290 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 if (assigning) {
3293 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003294 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 com_push(c, i-1);
3296 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003298 com_assign(c, CHILD(n, i), assigning, NULL);
3299}
3300
3301static void
3302com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3303{
3304 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003305 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003306 com_push(c, 1);
3307 com_node(c, augn);
3308 com_addbyte(c, opcode);
3309 com_pop(c, 1);
3310 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311}
3312
3313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003315{
3316 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003317 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003318 if (assigning)
3319 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320}
3321
3322static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003323com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324{
3325 /* Loop to avoid trivial recursion */
3326 for (;;) {
3327 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003328
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329 case exprlist:
3330 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003331 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003332 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003334 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003335 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003336 "assign to generator expression not possible");
3337 return;
3338 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003339 if (assigning > OP_APPLY) {
3340 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003341 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003342 return;
3343 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003344 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 return;
3346 }
3347 n = CHILD(n, 0);
3348 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003349
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 case test:
3351 case and_test:
3352 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003355 case xor_expr:
3356 case and_expr:
3357 case shift_expr:
3358 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003360 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003362 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003363 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 return;
3365 }
3366 n = CHILD(n, 0);
3367 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003368
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003369 case power: /* atom trailer* ('**' power)*
3370 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003371 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003373 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 return;
3375 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003376 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377 int i;
3378 com_node(c, CHILD(n, 0));
3379 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003380 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003381 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003382 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003383 return;
3384 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 com_apply_trailer(c, CHILD(n, i));
3386 } /* NB i is still alive */
3387 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003388 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389 return;
3390 }
3391 n = CHILD(n, 0);
3392 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003393
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 case atom:
3395 switch (TYPE(CHILD(n, 0))) {
3396 case LPAR:
3397 n = CHILD(n, 1);
3398 if (TYPE(n) == RPAR) {
3399 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003400 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003401 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 return;
3403 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003404 if (assigning > OP_APPLY) {
3405 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003406 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003407 return;
3408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409 break;
3410 case LSQB:
3411 n = CHILD(n, 1);
3412 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003413 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003414 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003415 return;
3416 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003417 if (assigning > OP_APPLY) {
3418 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003419 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003420 return;
3421 }
3422 if (NCH(n) > 1
3423 && TYPE(CHILD(n, 1)) == list_for) {
3424 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003425 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003426 return;
3427 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003428 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429 return;
3430 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003431 if (assigning > OP_APPLY)
3432 com_augassign_name(c, CHILD(n, 0),
3433 assigning, augn);
3434 else
3435 com_assign_name(c, CHILD(n, 0),
3436 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 return;
3438 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003439 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003440 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441 return;
3442 }
3443 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003444
3445 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003446 com_error(c, PyExc_SyntaxError,
3447 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003448 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003449
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003451 com_error(c, PyExc_SystemError,
3452 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003454
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 }
3456 }
3457}
Guido van Rossum7c531111997-03-11 18:42:21 +00003458
Thomas Wouters434d0822000-08-24 20:11:32 +00003459static void
3460com_augassign(struct compiling *c, node *n)
3461{
3462 int opcode;
3463
3464 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3465 case '+': opcode = INPLACE_ADD; break;
3466 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003467 case '/':
3468 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3469 opcode = INPLACE_FLOOR_DIVIDE;
3470 else if (c->c_flags & CO_FUTURE_DIVISION)
3471 opcode = INPLACE_TRUE_DIVIDE;
3472 else
3473 opcode = INPLACE_DIVIDE;
3474 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003475 case '%': opcode = INPLACE_MODULO; break;
3476 case '<': opcode = INPLACE_LSHIFT; break;
3477 case '>': opcode = INPLACE_RSHIFT; break;
3478 case '&': opcode = INPLACE_AND; break;
3479 case '^': opcode = INPLACE_XOR; break;
3480 case '|': opcode = INPLACE_OR; break;
3481 case '*':
3482 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3483 opcode = INPLACE_POWER;
3484 else
3485 opcode = INPLACE_MULTIPLY;
3486 break;
3487 default:
3488 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3489 return;
3490 }
3491 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3492}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493
3494static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003495com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496{
Thomas Wouters434d0822000-08-24 20:11:32 +00003497 REQ(n, expr_stmt);
3498 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003499 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003500 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003501 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003502 if (NCH(n) == 1) {
3503 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003504 if (c->c_interactive)
3505 com_addbyte(c, PRINT_EXPR);
3506 else
3507 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003508 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003509 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003510 else if (TYPE(CHILD(n,1)) == augassign)
3511 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 else {
3513 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003514 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003515 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003517 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 com_push(c, 1);
3519 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003520 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003521 }
3522 }
3523}
3524
3525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003526com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003527{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003528 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003529 int i;
3530 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003531 if (Py_OptimizeFlag)
3532 return;
3533 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003534
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003535 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003536 raise AssertionError [, <message>]
3537
3538 where <message> is the second test, if present.
3539 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003540 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003541 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003542 com_addbyte(c, POP_TOP);
3543 com_pop(c, 1);
3544 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003545 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003546 com_push(c, 1);
3547 i = NCH(n)/2; /* Either 2 or 4 */
3548 if (i > 1)
3549 com_node(c, CHILD(n, 3));
3550 com_addoparg(c, RAISE_VARARGS, i);
3551 com_pop(c, i);
3552 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003553 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003554 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003555 com_addbyte(c, POP_TOP);
3556}
3557
3558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003559com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003561 int i = 1;
3562 node* stream = NULL;
3563
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003564 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003565
3566 /* are we using the extended print form? */
3567 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3568 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003569 com_node(c, stream);
3570 /* stack: [...] => [... stream] */
3571 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003572 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3573 i = 4;
3574 else
3575 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003576 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003577 for (; i < NCH(n); i += 2) {
3578 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003579 com_addbyte(c, DUP_TOP);
3580 /* stack: [stream] => [stream stream] */
3581 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003582 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003583 /* stack: [stream stream] => [stream stream obj] */
3584 com_addbyte(c, ROT_TWO);
3585 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003586 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003587 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003588 com_pop(c, 2);
3589 }
3590 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003591 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003592 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003593 com_addbyte(c, PRINT_ITEM);
3594 com_pop(c, 1);
3595 }
3596 }
3597 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003598 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003599 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003600 /* must pop the extra stream object off the stack */
3601 com_addbyte(c, POP_TOP);
3602 /* stack: [... stream] => [...] */
3603 com_pop(c, 1);
3604 }
3605 }
3606 else {
3607 if (stream != NULL) {
3608 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003609 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003610 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003611 com_pop(c, 1);
3612 }
3613 else
3614 com_addbyte(c, PRINT_NEWLINE);
3615 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003616}
3617
3618static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003619com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003620{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003621 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003622 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003623 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003624 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003625 if (c->c_flags & CO_GENERATOR) {
3626 if (NCH(n) > 1) {
3627 com_error(c, PyExc_SyntaxError,
3628 "'return' with argument inside generator");
3629 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003630 }
3631 if (NCH(n) < 2) {
3632 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003633 com_push(c, 1);
3634 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003635 else
3636 com_node(c, CHILD(n, 1));
3637 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003638 com_pop(c, 1);
3639}
3640
3641static void
3642com_yield_stmt(struct compiling *c, node *n)
3643{
Tim Peters95c80f82001-06-23 02:07:08 +00003644 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003645 REQ(n, yield_stmt); /* 'yield' testlist */
3646 if (!c->c_infunction) {
3647 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3648 }
Tim Peters95c80f82001-06-23 02:07:08 +00003649
3650 for (i = 0; i < c->c_nblocks; ++i) {
3651 if (c->c_block[i] == SETUP_FINALLY) {
3652 com_error(c, PyExc_SyntaxError,
3653 "'yield' not allowed in a 'try' block "
3654 "with a 'finally' clause");
3655 return;
3656 }
3657 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003658 com_node(c, CHILD(n, 1));
3659 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661}
3662
3663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003664com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003666 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003667 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3668 if (NCH(n) > 1) {
3669 com_node(c, CHILD(n, 1));
3670 if (NCH(n) > 3) {
3671 com_node(c, CHILD(n, 3));
3672 if (NCH(n) > 5)
3673 com_node(c, CHILD(n, 5));
3674 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003675 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 i = NCH(n)/2;
3677 com_addoparg(c, RAISE_VARARGS, i);
3678 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003679}
3680
3681static void
Thomas Wouters52152252000-08-17 22:55:00 +00003682com_from_import(struct compiling *c, node *n)
3683{
3684 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3685 com_push(c, 1);
3686 if (NCH(n) > 1) {
3687 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3688 com_error(c, PyExc_SyntaxError, "invalid syntax");
3689 return;
3690 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003691 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003692 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003693 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003694 com_pop(c, 1);
3695}
3696
3697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003700 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003701 int i;
3702 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003703 n = CHILD(n, 0);
3704 /* import_stmt: import_name | import_from */
3705 if (TYPE(n) == import_from) {
3706 /* 'from' dotted_name 'import' ('*' |
3707 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003708 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003709 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003710 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3711 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003712 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003713 else {
3714 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3715 TYPE(CHILD(n, 3)) != LPAR) {
3716 com_error(c, PyExc_SyntaxError,
3717 "trailing comma not allowed "
3718 "without surrounding parentheses");
3719 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003720 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003721 REQ(nn, import_as_names);
3722 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003723 for (i = 0; i < NCH(nn); i += 2) {
3724 PyObject *s = PyString_FromString(
3725 STR(CHILD(CHILD(nn, i), 0)));
3726 if (s == NULL) {
3727 Py_CLEAR(tup);
3728 break;
3729 } else
3730 PyTuple_SET_ITEM(tup, i / 2, s);
3731 }
3732 if (tup == NULL) {
3733 /* Assume that failue above was MemoryError */
3734 com_error(c, PyExc_MemoryError, "");
3735 return;
3736 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003737 }
3738 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003739 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003740 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003741 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003742 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003743 com_addbyte(c, IMPORT_STAR);
3744 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003745 for (i = 0; i < NCH(nn); i += 2)
3746 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003747 com_addbyte(c, POP_TOP);
3748 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750 }
3751 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003752 /* 'import' dotted_as_names */
3753 nn = CHILD(n, 1);
3754 REQ(nn, dotted_as_names);
3755 for (i = 0; i < NCH(nn); i += 2) {
3756 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003757 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003758 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003760 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003761 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003762 int j;
3763 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003764 com_error(c, PyExc_SyntaxError,
3765 "invalid syntax");
3766 return;
3767 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003768 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3769 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003770 CHILD(CHILD(subn, 0),
3771 j));
3772 com_addop_varname(c, VAR_STORE,
3773 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003774 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003775 com_addop_varname(c, VAR_STORE,
3776 STR(CHILD(CHILD(subn, 0),
3777 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 }
3780 }
3781}
3782
3783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003784com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003785{
3786 REQ(n, exec_stmt);
3787 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3788 com_node(c, CHILD(n, 1));
3789 if (NCH(n) >= 4)
3790 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003791 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003792 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003793 com_push(c, 1);
3794 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003795 if (NCH(n) >= 6)
3796 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003797 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003798 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003799 com_push(c, 1);
3800 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003801 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003802 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003803}
3804
Guido van Rossum7c531111997-03-11 18:42:21 +00003805static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003806is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003807{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003808 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003809 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003810 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003811
3812 /* Label to avoid tail recursion */
3813 next:
3814 switch (TYPE(n)) {
3815
3816 case suite:
3817 if (NCH(n) == 1) {
3818 n = CHILD(n, 0);
3819 goto next;
3820 }
3821 /* Fall through */
3822 case file_input:
3823 for (i = 0; i < NCH(n); i++) {
3824 node *ch = CHILD(n, i);
3825 if (TYPE(ch) == stmt) {
3826 n = ch;
3827 goto next;
3828 }
3829 }
3830 break;
3831
3832 case stmt:
3833 case simple_stmt:
3834 case small_stmt:
3835 n = CHILD(n, 0);
3836 goto next;
3837
3838 case expr_stmt:
3839 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003840 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003841 case test:
3842 case and_test:
3843 case not_test:
3844 case comparison:
3845 case expr:
3846 case xor_expr:
3847 case and_expr:
3848 case shift_expr:
3849 case arith_expr:
3850 case term:
3851 case factor:
3852 case power:
3853 case atom:
3854 if (NCH(n) == 1) {
3855 n = CHILD(n, 0);
3856 goto next;
3857 }
3858 break;
3859
3860 case NAME:
3861 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3862 return 1;
3863 break;
3864
3865 case NUMBER:
3866 v = parsenumber(c, STR(n));
3867 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003868 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003869 break;
3870 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 i = PyObject_IsTrue(v);
3872 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003873 return i == 0;
3874
3875 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003876 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003877 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003879 break;
3880 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 i = PyObject_IsTrue(v);
3882 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003883 return i == 0;
3884
3885 }
3886 return 0;
3887}
3888
Tim Peters08a898f2001-06-28 01:52:22 +00003889
3890/* Look under n for a return stmt with an expression.
3891 * This hack is used to find illegal returns under "if 0:" blocks in
3892 * functions already known to be generators (as determined by the symtable
3893 * pass).
3894 * Return the offending return node if found, else NULL.
3895 */
3896static node *
3897look_for_offending_return(node *n)
3898{
3899 int i;
3900
3901 for (i = 0; i < NCH(n); ++i) {
3902 node *kid = CHILD(n, i);
3903
3904 switch (TYPE(kid)) {
3905 case classdef:
3906 case funcdef:
3907 case lambdef:
3908 /* Stuff in nested functions & classes doesn't
3909 affect the code block we started in. */
3910 return NULL;
3911
3912 case return_stmt:
3913 if (NCH(kid) > 1)
3914 return kid;
3915 break;
3916
3917 default: {
3918 node *bad = look_for_offending_return(kid);
3919 if (bad != NULL)
3920 return bad;
3921 }
3922 }
3923 }
3924
3925 return NULL;
3926}
3927
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003928static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003929com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003930{
3931 int i;
3932 int anchor = 0;
3933 REQ(n, if_stmt);
3934 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3935 for (i = 0; i+3 < NCH(n); i+=4) {
3936 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003937 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003938 if (is_constant_false(c, ch)) {
3939 /* We're going to skip this block. However, if this
3940 is a generator, we have to check the dead code
3941 anyway to make sure there aren't any return stmts
3942 with expressions, in the same scope. */
3943 if (c->c_flags & CO_GENERATOR) {
3944 node *p = look_for_offending_return(n);
3945 if (p != NULL) {
3946 int savelineno = c->c_lineno;
3947 c->c_lineno = p->n_lineno;
3948 com_error(c, PyExc_SyntaxError,
3949 "'return' with argument "
3950 "inside generator");
3951 c->c_lineno = savelineno;
3952 }
3953 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003954 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003955 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003956 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003957 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003958 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959 com_addfwref(c, JUMP_IF_FALSE, &a);
3960 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003961 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962 com_node(c, CHILD(n, i+3));
3963 com_addfwref(c, JUMP_FORWARD, &anchor);
3964 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003965 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003966 com_addbyte(c, POP_TOP);
3967 }
3968 if (i+2 < NCH(n))
3969 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003970 if (anchor)
3971 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972}
3973
3974static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003975com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976{
3977 int break_anchor = 0;
3978 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003979 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003980 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3981 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003982 block_push(c, SETUP_LOOP);
3983 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003984 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003985 com_node(c, CHILD(n, 1));
3986 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3987 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003989 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003991 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003992 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3993 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003994 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003996 com_addbyte(c, POP_TOP);
3997 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003998 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999 if (NCH(n) > 4)
4000 com_node(c, CHILD(n, 6));
4001 com_backpatch(c, break_anchor);
4002}
4003
4004static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004005com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004006{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007 int break_anchor = 0;
4008 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004009 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004010 REQ(n, for_stmt);
4011 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4012 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004013 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004014 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004015 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004016 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004017 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004018 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004019 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004020 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004021 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004022 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004023 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004024 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4025 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004027 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004028 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004029 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004030 if (NCH(n) > 8)
4031 com_node(c, CHILD(n, 8));
4032 com_backpatch(c, break_anchor);
4033}
4034
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004035/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004036
4037 SETUP_FINALLY L
4038 <code for S>
4039 POP_BLOCK
4040 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004041 L: <code for Sf>
4042 END_FINALLY
4043
4044 The special instructions use the block stack. Each block
4045 stack entry contains the instruction that created it (here
4046 SETUP_FINALLY), the level of the value stack at the time the
4047 block stack entry was created, and a label (here L).
4048
4049 SETUP_FINALLY:
4050 Pushes the current value stack level and the label
4051 onto the block stack.
4052 POP_BLOCK:
4053 Pops en entry from the block stack, and pops the value
4054 stack until its level is the same as indicated on the
4055 block stack. (The label is ignored.)
4056 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004057 Pops a variable number of entries from the *value* stack
4058 and re-raises the exception they specify. The number of
4059 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004060
4061 The block stack is unwound when an exception is raised:
4062 when a SETUP_FINALLY entry is found, the exception is pushed
4063 onto the value stack (and the exception condition is cleared),
4064 and the interpreter jumps to the label gotten from the block
4065 stack.
4066
4067 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004068 (The contents of the value stack is shown in [], with the top
4069 at the right; 'tb' is trace-back info, 'val' the exception's
4070 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004071
4072 Value stack Label Instruction Argument
4073 [] SETUP_EXCEPT L1
4074 [] <code for S>
4075 [] POP_BLOCK
4076 [] JUMP_FORWARD L0
4077
Guido van Rossum3f5da241990-12-20 15:06:42 +00004078 [tb, val, exc] L1: DUP )
4079 [tb, val, exc, exc] <evaluate E1> )
4080 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4081 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4082 [tb, val, exc, 1] POP )
4083 [tb, val, exc] POP
4084 [tb, val] <assign to V1> (or POP if no V1)
4085 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004086 [] <code for S1>
4087 JUMP_FORWARD L0
4088
Guido van Rossum3f5da241990-12-20 15:06:42 +00004089 [tb, val, exc, 0] L2: POP
4090 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004091 .............................etc.......................
4092
Guido van Rossum3f5da241990-12-20 15:06:42 +00004093 [tb, val, exc, 0] Ln+1: POP
4094 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004095
4096 [] L0: <next statement>
4097
4098 Of course, parts are not generated if Vi or Ei is not present.
4099*/
4100
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004102com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004103{
4104 int except_anchor = 0;
4105 int end_anchor = 0;
4106 int else_anchor = 0;
4107 int i;
4108 node *ch;
4109
4110 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4111 block_push(c, SETUP_EXCEPT);
4112 com_node(c, CHILD(n, 2));
4113 com_addbyte(c, POP_BLOCK);
4114 block_pop(c, SETUP_EXCEPT);
4115 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4116 com_backpatch(c, except_anchor);
4117 for (i = 3;
4118 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4119 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004120 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004121 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004122 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004123 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004124 break;
4125 }
4126 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004127 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004128 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004129 if (NCH(ch) > 1) {
4130 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004131 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004132 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004133 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004135 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4136 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004138 }
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 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004142 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004144 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004145 com_pop(c, 1);
4146 }
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);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004149 com_node(c, CHILD(n, i+2));
4150 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4151 if (except_anchor) {
4152 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 /* We come in with [tb, val, exc, 0] on the
4154 stack; one pop and it's the same as
4155 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004156 com_addbyte(c, POP_TOP);
4157 }
4158 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004159 /* We actually come in here with [tb, val, exc] but the
4160 END_FINALLY will zap those and jump around.
4161 The c_stacklevel does not reflect them so we need not pop
4162 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004163 com_addbyte(c, END_FINALLY);
4164 com_backpatch(c, else_anchor);
4165 if (i < NCH(n))
4166 com_node(c, CHILD(n, i+2));
4167 com_backpatch(c, end_anchor);
4168}
4169
4170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004171com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172{
4173 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004174 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004175
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004176 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4177 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004178 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004179 com_addbyte(c, POP_BLOCK);
4180 block_pop(c, SETUP_FINALLY);
4181 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004182 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004183 /* While the generated code pushes only one item,
4184 the try-finally handling can enter here with
4185 up to three items. OK, here are the details:
4186 3 for an exception, 2 for RETURN, 1 for BREAK. */
4187 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004188 com_backpatch(c, finally_anchor);
4189 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004190 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004191 com_node(c, ch);
4192 com_addbyte(c, END_FINALLY);
4193 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004194 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004195}
4196
4197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004198com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004199{
4200 REQ(n, try_stmt);
4201 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4202 | 'try' ':' suite 'finally' ':' suite */
4203 if (TYPE(CHILD(n, 3)) != except_clause)
4204 com_try_finally(c, n);
4205 else
4206 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004207}
4208
Guido van Rossum8b993a91997-01-17 21:04:03 +00004209static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004210get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004211{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004212 int i;
4213
Guido van Rossum8b993a91997-01-17 21:04:03 +00004214 /* Label to avoid tail recursion */
4215 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004216 switch (TYPE(n)) {
4217
4218 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004219 if (NCH(n) == 1) {
4220 n = CHILD(n, 0);
4221 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004222 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004223 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004224 case file_input:
4225 for (i = 0; i < NCH(n); i++) {
4226 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004227 if (TYPE(ch) == stmt) {
4228 n = ch;
4229 goto next;
4230 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004231 }
4232 break;
4233
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004234 case stmt:
4235 case simple_stmt:
4236 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004237 n = CHILD(n, 0);
4238 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004239
4240 case expr_stmt:
4241 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004242 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004243 case test:
4244 case and_test:
4245 case not_test:
4246 case comparison:
4247 case expr:
4248 case xor_expr:
4249 case and_expr:
4250 case shift_expr:
4251 case arith_expr:
4252 case term:
4253 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004254 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004255 if (NCH(n) == 1) {
4256 n = CHILD(n, 0);
4257 goto next;
4258 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004259 break;
4260
4261 case atom:
4262 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004263 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004264 break;
4265
4266 }
4267 return NULL;
4268}
4269
Guido van Rossum79f25d91997-04-29 20:08:16 +00004270static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004271get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272{
Guido van Rossum541563e1999-01-28 15:08:09 +00004273 /* Don't generate doc-strings if run with -OO */
4274 if (Py_OptimizeFlag > 1)
4275 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004276 n = get_rawdocstring(n);
4277 if (n == NULL)
4278 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004279 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004280}
4281
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004283com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004284{
4285 REQ(n, suite);
4286 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4287 if (NCH(n) == 1) {
4288 com_node(c, CHILD(n, 0));
4289 }
4290 else {
4291 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004292 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004293 node *ch = CHILD(n, i);
4294 if (TYPE(ch) == stmt)
4295 com_node(c, ch);
4296 }
4297 }
4298}
4299
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004300/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004302com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004303{
4304 int i = c->c_nblocks;
4305 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4306 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4307 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004308 else if (i <= 0) {
4309 /* at the outer level */
4310 com_error(c, PyExc_SyntaxError,
4311 "'continue' not properly in loop");
4312 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004313 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004314 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004315 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004316 if (c->c_block[j] == SETUP_LOOP)
4317 break;
4318 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004319 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004320 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004321 for (; i > j; --i) {
4322 if (c->c_block[i] == SETUP_EXCEPT ||
4323 c->c_block[i] == SETUP_FINALLY) {
4324 com_addoparg(c, CONTINUE_LOOP,
4325 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004326 return;
4327 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004328 if (c->c_block[i] == END_FINALLY) {
4329 com_error(c, PyExc_SyntaxError,
4330 "'continue' not supported inside 'finally' clause");
4331 return;
4332 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004333 }
4334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004335 com_error(c, PyExc_SyntaxError,
4336 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004337 }
4338 /* XXX Could allow it inside a 'finally' clause
4339 XXX if we could pop the exception still on the stack */
4340}
4341
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004342/* Return the number of default values in the argument list.
4343
4344 If a non-default argument follows a default argument, set an
4345 exception and return -1.
4346*/
4347
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004348static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004349com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004350{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004351 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004352 if (TYPE(n) == lambdef) {
4353 /* lambdef: 'lambda' [varargslist] ':' test */
4354 n = CHILD(n, 1);
4355 }
4356 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004357 REQ(n, funcdef);
4358 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4359 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004360 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4361 n = CHILD(n, 1);
4362 }
4363 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004364 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004365 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004366 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004367 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4368 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004369 ndefs = 0;
4370 for (i = 0; i < nch; i++) {
4371 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004372 if (TYPE(CHILD(n, i)) == STAR ||
4373 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004374 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004375 i++;
4376 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004377 t = RPAR; /* Anything except EQUAL or COMMA */
4378 else
4379 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004380 if (t == EQUAL) {
4381 i++;
4382 ndefs++;
4383 com_node(c, CHILD(n, i));
4384 i++;
4385 if (i >= nch)
4386 break;
4387 t = TYPE(CHILD(n, i));
4388 }
4389 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004390 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004391 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004392 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004393 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004394 return -1;
4395 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004396 }
4397 if (t != COMMA)
4398 break;
4399 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004400 return ndefs;
4401}
4402
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004403static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004404com_decorator_name(struct compiling *c, node *n)
4405{
4406 /* dotted_name: NAME ('.' NAME)* */
4407
4408 int i, nch;
4409 node *varname;
4410
4411 REQ(n, dotted_name);
4412 nch = NCH(n);
4413 assert(nch >= 1 && nch % 2 == 1);
4414
4415 varname = CHILD(n, 0);
4416 REQ(varname, NAME);
4417 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004418 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004419
4420 for (i = 1; i < nch; i += 2) {
4421 node *attrname;
4422
4423 REQ(CHILD(n, i), DOT);
4424
4425 attrname = CHILD(n, i + 1);
4426 REQ(attrname, NAME);
4427 com_addop_name(c, LOAD_ATTR, STR(attrname));
4428 }
4429}
4430
4431static void
4432com_decorator(struct compiling *c, node *n)
4433{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004434 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004435 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004436 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004437 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004438 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004439 com_decorator_name(c, CHILD(n, 1));
4440
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004441 if (nch > 3) {
4442 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004443 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004444 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004445 com_call_function(c, CHILD(n, 3));
4446 }
4447}
4448
4449static int
4450com_decorators(struct compiling *c, node *n)
4451{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004452 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004453
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004454 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004455 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004456 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004457
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004458 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004459 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004460 REQ(ch, decorator);
4461
4462 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004463 }
4464
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004465 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004466}
4467
4468static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004469com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004470{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004471 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004472 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004473
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004474 REQ(n, funcdef);
4475 /* -6 -5 -4 -3 -2 -1
4476 funcdef: [decorators] 'def' NAME parameters ':' suite */
4477
4478 if (NCH(n) == 6)
4479 ndecorators = com_decorators(c, CHILD(n, 0));
4480 else
4481 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004482
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004483 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004484 if (ndefs < 0)
4485 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004486 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004487 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004488 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004489 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004490 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004491 c->c_errors++;
4492 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004493 int closure = com_make_closure(c, (PyCodeObject *)co);
4494 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004495 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004496 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004497 if (closure)
4498 com_addoparg(c, MAKE_CLOSURE, ndefs);
4499 else
4500 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004501 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004502
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004503 while (ndecorators > 0) {
4504 com_addoparg(c, CALL_FUNCTION, 1);
4505 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004506 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004507 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004508
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004509 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004510 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004511 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004512 }
4513}
4514
4515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004516com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004517{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004518 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004519 REQ(n, testlist);
4520 /* testlist: test (',' test)* [','] */
4521 for (i = 0; i < NCH(n); i += 2)
4522 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004523 i = (NCH(n)+1) / 2;
4524 com_addoparg(c, BUILD_TUPLE, i);
4525 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004526}
4527
4528static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004529com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004530{
Guido van Rossum25831651993-05-19 14:50:45 +00004531 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004532 PyObject *v;
4533 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004534 char *name;
4535
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004536 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004537 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004538 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004539 c->c_errors++;
4540 return;
4541 }
4542 /* Push the class name on the stack */
4543 i = com_addconst(c, v);
4544 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004545 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004546 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004547 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004548 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004549 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004550 com_push(c, 1);
4551 }
Guido van Rossum25831651993-05-19 14:50:45 +00004552 else
4553 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004554 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004555 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004556 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004557 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004558 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004559 c->c_errors++;
4560 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004561 int closure = com_make_closure(c, co);
4562 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004563 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004564 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004565 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004567 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004568 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004569 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004570 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004571 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004572 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004573 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004574 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004575 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004576 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004577}
4578
4579static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004580com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004581{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004582 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004583 if (c->c_errors)
4584 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004585 switch (TYPE(n)) {
4586
4587 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004588
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004589 case funcdef:
4590 com_funcdef(c, n);
4591 break;
4592 case classdef:
4593 com_classdef(c, n);
4594 break;
4595
4596 /* Trivial parse tree nodes */
4597
4598 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004599 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004600 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004601 n = CHILD(n, 0);
4602 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004603
4604 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004605 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004606 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004607 {
4608 int i;
4609 for (i = 0; i < NCH(n)-1; i += 2)
4610 com_node(c, CHILD(n, i));
4611 }
4612 break;
4613
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004614 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004615 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004616 n = CHILD(n, 0);
4617 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004618
4619 /* Statement nodes */
4620
4621 case expr_stmt:
4622 com_expr_stmt(c, n);
4623 break;
4624 case print_stmt:
4625 com_print_stmt(c, n);
4626 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004627 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004628 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004629 break;
4630 case pass_stmt:
4631 break;
4632 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004633 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004634 com_error(c, PyExc_SyntaxError,
4635 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004636 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004637 com_addbyte(c, BREAK_LOOP);
4638 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004639 case continue_stmt:
4640 com_continue_stmt(c, n);
4641 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004642 case return_stmt:
4643 com_return_stmt(c, n);
4644 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004645 case yield_stmt:
4646 com_yield_stmt(c, n);
4647 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648 case raise_stmt:
4649 com_raise_stmt(c, n);
4650 break;
4651 case import_stmt:
4652 com_import_stmt(c, n);
4653 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004654 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004655 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004656 case exec_stmt:
4657 com_exec_stmt(c, n);
4658 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004659 case assert_stmt:
4660 com_assert_stmt(c, n);
4661 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004662 case if_stmt:
4663 com_if_stmt(c, n);
4664 break;
4665 case while_stmt:
4666 com_while_stmt(c, n);
4667 break;
4668 case for_stmt:
4669 com_for_stmt(c, n);
4670 break;
4671 case try_stmt:
4672 com_try_stmt(c, n);
4673 break;
4674 case suite:
4675 com_suite(c, n);
4676 break;
4677
4678 /* Expression nodes */
4679
4680 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004681 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004682 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004683 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004684 break;
4685 case test:
4686 com_test(c, n);
4687 break;
4688 case and_test:
4689 com_and_test(c, n);
4690 break;
4691 case not_test:
4692 com_not_test(c, n);
4693 break;
4694 case comparison:
4695 com_comparison(c, n);
4696 break;
4697 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004698 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004699 break;
4700 case expr:
4701 com_expr(c, n);
4702 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004703 case xor_expr:
4704 com_xor_expr(c, n);
4705 break;
4706 case and_expr:
4707 com_and_expr(c, n);
4708 break;
4709 case shift_expr:
4710 com_shift_expr(c, n);
4711 break;
4712 case arith_expr:
4713 com_arith_expr(c, n);
4714 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004715 case term:
4716 com_term(c, n);
4717 break;
4718 case factor:
4719 com_factor(c, n);
4720 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004721 case power:
4722 com_power(c, n);
4723 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004724 case atom:
4725 com_atom(c, n);
4726 break;
4727
4728 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004729 com_error(c, PyExc_SystemError,
4730 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004731 }
4732}
4733
Tim Petersdbd9ba62000-07-09 03:09:57 +00004734static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004735
4736static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004737com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738{
4739 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4740 if (TYPE(CHILD(n, 0)) == LPAR)
4741 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004742 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004743 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004744 com_pop(c, 1);
4745 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004746}
4747
4748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004749com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004750{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004751 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004752 if (NCH(n) == 1) {
4753 com_fpdef(c, CHILD(n, 0));
4754 }
4755 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004756 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004757 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004758 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004759 for (i = 0; i < NCH(n); i += 2)
4760 com_fpdef(c, CHILD(n, i));
4761 }
4762}
4763
4764static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004765com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004766{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004767 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004768 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004769 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004770 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004771 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004772 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004773 nch = NCH(n);
4774 /* Enter all arguments in table of locals */
4775 for (i = 0, narg = 0; i < nch; i++) {
4776 node *ch = CHILD(n, i);
4777 node *fp;
4778 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004779 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004780 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4781 fp = CHILD(ch, 0);
4782 if (TYPE(fp) != NAME) {
4783 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4784 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004785 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004786 narg++;
4787 /* all name updates handled by symtable */
4788 if (++i >= nch)
4789 break;
4790 ch = CHILD(n, i);
4791 if (TYPE(ch) == EQUAL)
4792 i += 2;
4793 else
4794 REQ(ch, COMMA);
4795 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004796 if (complex) {
4797 /* Generate code for complex arguments only after
4798 having counted the simple arguments */
4799 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004800 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004801 node *ch = CHILD(n, i);
4802 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004803 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004804 break;
4805 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4806 fp = CHILD(ch, 0);
4807 if (TYPE(fp) != NAME) {
4808 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004809 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004810 com_fpdef(c, ch);
4811 }
4812 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004813 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004814 break;
4815 ch = CHILD(n, i);
4816 if (TYPE(ch) == EQUAL)
4817 i += 2;
4818 else
4819 REQ(ch, COMMA);
4820 }
4821 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004822}
4823
4824static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004825com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004826{
4827 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004828 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004829 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004830 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004831 if (doc != NULL) {
4832 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004833 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004834 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004835 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004837 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004839 for (i = 0; i < NCH(n); i++) {
4840 node *ch = CHILD(n, i);
4841 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4842 com_node(c, ch);
4843 }
4844}
4845
4846/* Top-level compile-node interface */
4847
4848static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004849compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004850{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004851 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004852 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004853 REQ(n, funcdef);
4854 /* -6 -5 -4 -3 -2 -1
4855 funcdef: [decorators] 'def' NAME parameters ':' suite */
4856 c->c_name = STR(RCHILD(n, -4));
4857 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004858 if (doc != NULL) {
4859 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004860 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004861 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004862 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004863 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004864 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004865 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004866 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004867 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004868 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004869 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004870 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004871 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004872 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4873 com_push(c, 1);
4874 com_addbyte(c, RETURN_VALUE);
4875 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004876}
4877
4878static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004879compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004880{
Guido van Rossum590baa41993-11-30 13:40:46 +00004881 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004882 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004883 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004884
4885 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004886 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004887 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004888 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004889 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004890 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004891 else
4892 ch = CHILD(n, 2);
4893 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004894 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004895 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004896}
4897
4898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004899compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004900{
4901 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004902 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004903 REQ(n, classdef);
4904 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4905 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004906 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004907 /* Initialize local __module__ from global __name__ */
4908 com_addop_name(c, LOAD_GLOBAL, "__name__");
4909 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004910 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004911 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004912 if (doc != NULL) {
4913 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004914 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004915 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004916 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004917 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004918 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004919 }
4920 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004921 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004922 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004923 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004924 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004925 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004926 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004927 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004928}
4929
4930static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004931compile_generator_expression(struct compiling *c, node *n)
4932{
4933 /* testlist_gexp: test gen_for */
4934 /* argument: test gen_for */
4935 REQ(CHILD(n, 0), test);
4936 REQ(CHILD(n, 1), gen_for);
4937
4938 c->c_name = "<generator expression>";
4939 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4940
4941 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4942 com_push(c, 1);
4943 com_addbyte(c, RETURN_VALUE);
4944 com_pop(c, 1);
4945}
4946
4947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004948compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004949{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004950 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004951
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004952 switch (TYPE(n)) {
4953
Guido van Rossum4c417781991-01-21 16:09:22 +00004954 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004955 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004956 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004957 n = CHILD(n, 0);
4958 if (TYPE(n) != NEWLINE)
4959 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004960 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004961 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4962 com_push(c, 1);
4963 com_addbyte(c, RETURN_VALUE);
4964 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004965 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004966 break;
4967
Guido van Rossum4c417781991-01-21 16:09:22 +00004968 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004969 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004970 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004971 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4972 com_push(c, 1);
4973 com_addbyte(c, RETURN_VALUE);
4974 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004975 break;
4976
Guido van Rossum590baa41993-11-30 13:40:46 +00004977 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004978 com_node(c, CHILD(n, 0));
4979 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004980 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004981 break;
4982
Guido van Rossum590baa41993-11-30 13:40:46 +00004983 case lambdef: /* anonymous function definition */
4984 compile_lambdef(c, n);
4985 break;
4986
Guido van Rossum4c417781991-01-21 16:09:22 +00004987 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004988 compile_funcdef(c, n);
4989 break;
4990
Guido van Rossum4c417781991-01-21 16:09:22 +00004991 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004992 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004993 break;
4994
Raymond Hettinger354433a2004-05-19 08:20:33 +00004995 case testlist_gexp: /* A generator expression */
4996 case argument: /* A generator expression */
4997 compile_generator_expression(c, n);
4998 break;
4999
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005000 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005001 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005002 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005003 }
5004}
5005
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005006static PyObject *
5007dict_keys_inorder(PyObject *dict, int offset)
5008{
5009 PyObject *tuple, *k, *v;
5010 int i, pos = 0, size = PyDict_Size(dict);
5011
5012 tuple = PyTuple_New(size);
5013 if (tuple == NULL)
5014 return NULL;
5015 while (PyDict_Next(dict, &pos, &k, &v)) {
5016 i = PyInt_AS_LONG(v);
5017 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005018 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005019 PyTuple_SET_ITEM(tuple, i - offset, k);
5020 }
5021 return tuple;
5022}
5023
Guido van Rossum79f25d91997-04-29 20:08:16 +00005024PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005025PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005026{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005027 return PyNode_CompileFlags(n, filename, NULL);
5028}
5029
5030PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005031PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005032{
5033 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005034}
5035
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005036struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005037PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005038{
5039 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005040 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005041
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005042 ff = PyNode_Future(n, filename);
5043 if (ff == NULL)
5044 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005045 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005046 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005047 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005048 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005049 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005050 return st;
5051}
5052
Guido van Rossum79f25d91997-04-29 20:08:16 +00005053static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005054icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005055{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005056 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005057}
5058
Guido van Rossum79f25d91997-04-29 20:08:16 +00005059static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005060jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005061 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005062{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005063 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005064 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005065 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005066 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005067 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5068 sc.c_encoding = "utf-8";
5069 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005070 sc.c_encoding = STR(n);
5071 n = CHILD(n, 0);
5072 } else {
5073 sc.c_encoding = NULL;
5074 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005075 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005076 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005077 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005078 /* c_symtable still points to parent's symbols */
5079 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005080 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005081 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005082 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005083 if (base->c_encoding != NULL) {
5084 assert(sc.c_encoding == NULL);
5085 sc.c_encoding = base->c_encoding;
5086 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005087 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005088 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005089 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005090 if (sc.c_future == NULL) {
5091 com_free(&sc);
5092 return NULL;
5093 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005094 if (flags) {
5095 int merged = sc.c_future->ff_features |
5096 flags->cf_flags;
5097 sc.c_future->ff_features = merged;
5098 flags->cf_flags = merged;
5099 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005100 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5101 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005102 com_free(&sc);
5103 return NULL;
5104 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005105 /* reset symbol table for second pass */
5106 sc.c_symtable->st_nscopes = 1;
5107 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005108 }
5109 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005110 if (symtable_load_symbols(&sc) < 0) {
5111 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005113 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005114 compile_node(&sc, n);
5115 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005116 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005117 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005118 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005119 names = PyList_AsTuple(sc.c_names);
5120 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005121 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5122 freevars = dict_keys_inorder(sc.c_freevars,
5123 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005124 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005125 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005126 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5127 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005128 if (!PyErr_Occurred())
5129 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005130 sc.c_nlocals,
5131 sc.c_maxstacklevel,
5132 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005133 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005134 consts,
5135 names,
5136 varnames,
5137 freevars,
5138 cellvars,
5139 filename,
5140 name,
5141 sc.c_firstlineno,
5142 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005143 Py_XDECREF(consts);
5144 Py_XDECREF(names);
5145 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005146 Py_XDECREF(freevars);
5147 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005148 Py_XDECREF(filename);
5149 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005150 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005151 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005152 else if (!PyErr_Occurred()) {
5153 /* This could happen if someone called PyErr_Clear() after an
5154 error was reported above. That's not supposed to happen,
5155 but I just plugged one case and I'm not sure there can't be
5156 others. In that case, raise SystemError so that at least
5157 it gets reported instead dumping core. */
5158 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5159 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005160 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005161 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005162 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005163 sc.c_symtable = NULL;
5164 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005165 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005166 return co;
5167}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005168
5169int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005170PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005171{
5172 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005173 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005174 int line = co->co_firstlineno;
5175 int addr = 0;
5176 while (--size >= 0) {
5177 addr += *p++;
5178 if (addr > addrq)
5179 break;
5180 line += *p++;
5181 }
5182 return line;
5183}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005184
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005185/* The test for LOCAL must come before the test for FREE in order to
5186 handle classes where name is both local and free. The local var is
5187 a method and the free var is a free var referenced within a method.
5188*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005189
5190static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005193 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005195
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005196 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5197 return CELL;
5198 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5199 return LOCAL;
5200 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5201 return FREE;
5202 v = PyDict_GetItemString(c->c_globals, name);
5203 if (v) {
5204 if (v == Py_None)
5205 return GLOBAL_EXPLICIT;
5206 else {
5207 return GLOBAL_IMPLICIT;
5208 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005210 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005211 "unknown scope for %.100s in %.100s(%s) "
5212 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5213 name, c->c_name,
5214 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5215 c->c_filename,
5216 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5217 PyObject_REPR(c->c_locals),
5218 PyObject_REPR(c->c_globals)
5219 );
5220
5221 Py_FatalError(buf);
5222 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223}
5224
Guido van Rossum207fda62001-03-02 03:30:41 +00005225/* Helper functions to issue warnings */
5226
5227static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005228issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005229{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005230 if (PyErr_Occurred()) {
5231 /* This can happen because symtable_node continues
5232 processing even after raising a SyntaxError.
5233 Calling PyErr_WarnExplicit now would clobber the
5234 pending exception; instead we fail and let that
5235 exception propagate.
5236 */
5237 return -1;
5238 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005239 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5240 lineno, NULL, NULL) < 0) {
5241 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5242 PyErr_SetString(PyExc_SyntaxError, msg);
5243 PyErr_SyntaxLocation(filename, lineno);
5244 }
5245 return -1;
5246 }
5247 return 0;
5248}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005249
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005250static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005251symtable_warn(struct symtable *st, char *msg)
5252{
Guido van Rossum207fda62001-03-02 03:30:41 +00005253 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005254 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005255 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005256 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005257 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005258}
5259
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005260/* Helper function for setting lineno and filename */
5261
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005262static struct symtable *
5263symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005264{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005265 struct symtable *st;
5266
5267 st = symtable_init();
5268 if (st == NULL)
5269 return NULL;
5270 st->st_future = ff;
5271 st->st_filename = filename;
5272 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5273 if (st->st_errors > 0)
5274 goto fail;
5275 symtable_node(st, n);
5276 if (st->st_errors > 0)
5277 goto fail;
5278 return st;
5279 fail:
5280 if (!PyErr_Occurred()) {
5281 /* This could happen because after a syntax error is
5282 detected, the symbol-table-building continues for
5283 a while, and PyErr_Clear() might erroneously be
5284 called during that process. One such case has been
5285 fixed, but there might be more (now or later).
5286 */
5287 PyErr_SetString(PyExc_SystemError, "lost exception");
5288 }
5289 st->st_future = NULL;
5290 st->st_filename = NULL;
5291 PySymtable_Free(st);
5292 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005293}
5294
5295static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005296symtable_init_compiling_symbols(struct compiling *c)
5297{
5298 PyObject *varnames;
5299
5300 varnames = c->c_symtable->st_cur->ste_varnames;
5301 if (varnames == NULL) {
5302 varnames = PyList_New(0);
5303 if (varnames == NULL)
5304 return -1;
5305 c->c_symtable->st_cur->ste_varnames = varnames;
5306 Py_INCREF(varnames);
5307 } else
5308 Py_INCREF(varnames);
5309 c->c_varnames = varnames;
5310
5311 c->c_globals = PyDict_New();
5312 if (c->c_globals == NULL)
5313 return -1;
5314 c->c_freevars = PyDict_New();
5315 if (c->c_freevars == NULL)
5316 return -1;
5317 c->c_cellvars = PyDict_New();
5318 if (c->c_cellvars == NULL)
5319 return -1;
5320 return 0;
5321}
5322
5323struct symbol_info {
5324 int si_nlocals;
5325 int si_ncells;
5326 int si_nfrees;
5327 int si_nimplicit;
5328};
5329
5330static void
5331symtable_init_info(struct symbol_info *si)
5332{
5333 si->si_nlocals = 0;
5334 si->si_ncells = 0;
5335 si->si_nfrees = 0;
5336 si->si_nimplicit = 0;
5337}
5338
5339static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005340symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005341 struct symbol_info *si)
5342{
5343 PyObject *dict, *v;
5344
5345 /* Seperate logic for DEF_FREE. If it occurs in a function,
5346 it indicates a local that we must allocate storage for (a
5347 cell var). If it occurs in a class, then the class has a
5348 method and a free variable with the same name.
5349 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005350 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005351 /* If it isn't declared locally, it can't be a cell. */
5352 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5353 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005354 v = PyInt_FromLong(si->si_ncells++);
5355 dict = c->c_cellvars;
5356 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005357 /* If it is free anyway, then there is no need to do
5358 anything here.
5359 */
5360 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005361 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005362 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005363 v = PyInt_FromLong(si->si_nfrees++);
5364 dict = c->c_freevars;
5365 }
5366 if (v == NULL)
5367 return -1;
5368 if (PyDict_SetItem(dict, name, v) < 0) {
5369 Py_DECREF(v);
5370 return -1;
5371 }
5372 Py_DECREF(v);
5373 return 0;
5374}
5375
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005376/* If a variable is a cell and an argument, make sure that appears in
5377 co_cellvars before any variable to its right in varnames.
5378*/
5379
5380
5381static int
5382symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5383 PyObject *varnames, int flags)
5384{
Tim Petersb39903b2003-03-24 17:22:24 +00005385 PyObject *v = NULL;
5386 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005387 int i, pos;
5388
5389 if (flags & CO_VARARGS)
5390 argcount++;
5391 if (flags & CO_VARKEYWORDS)
5392 argcount++;
5393 for (i = argcount; --i >= 0; ) {
5394 v = PyList_GET_ITEM(varnames, i);
5395 if (PyDict_GetItem(*cellvars, v)) {
5396 if (list == NULL) {
5397 list = PyList_New(1);
5398 if (list == NULL)
5399 return -1;
5400 PyList_SET_ITEM(list, 0, v);
5401 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005402 } else {
5403 if (PyList_Insert(list, 0, v) < 0) {
5404 Py_DECREF(list);
5405 return -1;
5406 }
5407 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005408 }
5409 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005410 if (list == NULL)
5411 return 0;
5412
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005413 /* There are cellvars that are also arguments. Create a dict
5414 to replace cellvars and put the args at the front.
5415 */
5416 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005417 if (d == NULL)
5418 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005419 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5420 v = PyInt_FromLong(i);
5421 if (v == NULL)
5422 goto fail;
5423 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5424 goto fail;
5425 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5426 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005427 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005428 }
5429 pos = 0;
5430 i = PyList_GET_SIZE(list);
5431 Py_DECREF(list);
5432 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5433 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005434 if (w == NULL)
5435 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005436 if (PyDict_SetItem(d, v, w) < 0) {
5437 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005438 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005439 goto fail;
5440 }
5441 Py_DECREF(w);
5442 }
5443 Py_DECREF(*cellvars);
5444 *cellvars = d;
5445 return 1;
5446 fail:
5447 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005448 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005449 return -1;
5450}
5451
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452static int
5453symtable_freevar_offsets(PyObject *freevars, int offset)
5454{
5455 PyObject *name, *v;
5456 int pos;
5457
5458 /* The cell vars are the first elements of the closure,
5459 followed by the free vars. Update the offsets in
5460 c_freevars to account for number of cellvars. */
5461 pos = 0;
5462 while (PyDict_Next(freevars, &pos, &name, &v)) {
5463 int i = PyInt_AS_LONG(v) + offset;
5464 PyObject *o = PyInt_FromLong(i);
5465 if (o == NULL)
5466 return -1;
5467 if (PyDict_SetItem(freevars, name, o) < 0) {
5468 Py_DECREF(o);
5469 return -1;
5470 }
5471 Py_DECREF(o);
5472 }
5473 return 0;
5474}
5475
5476static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005477symtable_check_unoptimized(struct compiling *c,
5478 PySymtableEntryObject *ste,
5479 struct symbol_info *si)
5480{
5481 char buf[300];
5482
5483 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5484 || (ste->ste_nested && si->si_nimplicit)))
5485 return 0;
5486
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005487#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5488
5489#define ILLEGAL_IS "is a nested function"
5490
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005491#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005492"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005493
5494#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005495"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005496
5497#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005498"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005499"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005500
5501 /* XXX perhaps the linenos for these opt-breaking statements
5502 should be stored so the exception can point to them. */
5503
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005504 if (ste->ste_child_free) {
5505 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005506 PyOS_snprintf(buf, sizeof(buf),
5507 ILLEGAL_IMPORT_STAR,
5508 PyString_AS_STRING(ste->ste_name),
5509 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005510 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005511 PyOS_snprintf(buf, sizeof(buf),
5512 ILLEGAL_BARE_EXEC,
5513 PyString_AS_STRING(ste->ste_name),
5514 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005515 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005516 PyOS_snprintf(buf, sizeof(buf),
5517 ILLEGAL_EXEC_AND_IMPORT_STAR,
5518 PyString_AS_STRING(ste->ste_name),
5519 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005520 }
5521 } else {
5522 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005523 PyOS_snprintf(buf, sizeof(buf),
5524 ILLEGAL_IMPORT_STAR,
5525 PyString_AS_STRING(ste->ste_name),
5526 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005527 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005528 PyOS_snprintf(buf, sizeof(buf),
5529 ILLEGAL_BARE_EXEC,
5530 PyString_AS_STRING(ste->ste_name),
5531 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005532 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005533 PyOS_snprintf(buf, sizeof(buf),
5534 ILLEGAL_EXEC_AND_IMPORT_STAR,
5535 PyString_AS_STRING(ste->ste_name),
5536 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005537 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005538 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005539
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005540 PyErr_SetString(PyExc_SyntaxError, buf);
5541 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5542 ste->ste_opt_lineno);
5543 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005544}
5545
5546static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005547symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5548 struct symbol_info *si)
5549{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005550 if (c->c_future)
5551 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005552 if (ste->ste_generator)
5553 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005554 if (ste->ste_type != TYPE_MODULE)
5555 c->c_flags |= CO_NEWLOCALS;
5556 if (ste->ste_type == TYPE_FUNCTION) {
5557 c->c_nlocals = si->si_nlocals;
5558 if (ste->ste_optimized == 0)
5559 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005560 else if (ste->ste_optimized != OPT_EXEC)
5561 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005562 }
5563 return 0;
5564}
5565
5566static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005567symtable_error(struct symtable *st, int lineno)
5568{
5569 if (lineno == 0)
5570 lineno = st->st_cur->ste_lineno;
5571 PyErr_SyntaxLocation(st->st_filename, lineno);
5572 st->st_errors++;
5573 return -1;
5574}
5575
5576static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005577symtable_load_symbols(struct compiling *c)
5578{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005580 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005581 PyObject *name, *varnames, *v;
5582 int i, flags, pos;
5583 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005584
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 v = NULL;
5586
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005587 if (symtable_init_compiling_symbols(c) < 0)
5588 goto fail;
5589 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005590 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005591 si.si_nlocals = PyList_GET_SIZE(varnames);
5592 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005593
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005594 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005595 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005596 if (v == NULL)
5597 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598 if (PyDict_SetItem(c->c_locals,
5599 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600 goto fail;
5601 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005602 }
5603
5604 /* XXX The cases below define the rules for whether a name is
5605 local or global. The logic could probably be clearer. */
5606 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005607 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5608 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005609
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005611 /* undo the original DEF_FREE */
5612 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005613
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005614 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005615 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005616 2. Free variables in methods that are also class
5617 variables or declared global.
5618 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005619 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005620 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005622 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623 c->c_argcount--;
5624 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005625 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626 c->c_argcount--;
5627 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005628 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005630 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005631 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005632 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005633 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005634 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005637 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5638 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005639 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005640 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005641 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005642 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005643 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005644 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005645 if (v == NULL)
5646 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005647 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 goto fail;
5649 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005650 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005651 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005652 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005653 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005654 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005655 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005656 if (v == NULL)
5657 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005658 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 goto fail;
5660 Py_DECREF(v);
5661 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005662 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005663 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005664 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005665 goto fail;
5666 if (st->st_nscopes != 1) {
5667 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005668 if (v == NULL)
5669 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005670 if (PyDict_SetItem(st->st_global,
5671 name, v))
5672 goto fail;
5673 Py_DECREF(v);
5674 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005675 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005676 }
5677 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005678 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5679
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005680 if (si.si_ncells > 1) { /* one cell is always in order */
5681 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5682 c->c_varnames, c->c_flags) < 0)
5683 return -1;
5684 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005685 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5686 return -1;
5687 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688 fail:
5689 /* is this always the right thing to do? */
5690 Py_XDECREF(v);
5691 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692}
5693
5694static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005695symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696{
5697 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005698
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005699 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005700 if (st == NULL)
5701 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005703
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005704 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005705 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005706 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005707 goto fail;
5708 if ((st->st_symbols = PyDict_New()) == NULL)
5709 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005711 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005712 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005713 st->st_private = NULL;
5714 return st;
5715 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005716 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 return NULL;
5718}
5719
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005720void
5721PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005722{
5723 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005725 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005726 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005727}
5728
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005729/* When the compiler exits a scope, it must should update the scope's
5730 free variable information with the list of free variables in its
5731 children.
5732
5733 Variables that are free in children and defined in the current
5734 scope are cellvars.
5735
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005736 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005737 false), free variables in children that are not defined here are
5738 implicit globals.
5739
5740*/
5741
5742static int
5743symtable_update_free_vars(struct symtable *st)
5744{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005745 int i, j, def;
5746 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005747 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005748
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005749 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005750 def = DEF_FREE_CLASS;
5751 else
5752 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 int pos = 0;
5755
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005756 if (list && PyList_SetSlice(list, 0,
5757 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005758 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005759 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005760 PyList_GET_ITEM(ste->ste_children, i);
5761 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005762 int flags = PyInt_AS_LONG(o);
5763 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005765 if (list == NULL) {
5766 list = PyList_New(0);
5767 if (list == NULL)
5768 return -1;
5769 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005770 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005771 if (PyList_Append(list, name) < 0) {
5772 Py_DECREF(list);
5773 return -1;
5774 }
5775 }
5776 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005777 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005778 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005779 v = PyDict_GetItem(ste->ste_symbols, name);
5780 /* If a name N is declared global in scope A and
5781 referenced in scope B contained (perhaps
5782 indirectly) in A and there are no scopes
5783 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005784 is global in B. Unless A is a class scope,
5785 because class scopes are not considered for
5786 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005787 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005788 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005789 int flags = PyInt_AS_LONG(v);
5790 if (flags & DEF_GLOBAL) {
5791 symtable_undo_free(st, child->ste_id,
5792 name);
5793 continue;
5794 }
5795 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005796 if (ste->ste_nested) {
5797 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005798 name, def) < 0) {
5799 Py_DECREF(list);
5800 return -1;
5801 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005802 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005803 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005804 name) < 0) {
5805 Py_DECREF(list);
5806 return -1;
5807 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005808 }
5809 }
5810 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005811
5812 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005813 return 0;
5814}
5815
5816/* If the current scope is a non-nested class or if name is not
5817 defined in the current, non-nested scope, then it is an implicit
5818 global in all nested scopes.
5819*/
5820
5821static int
5822symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5823{
5824 PyObject *o;
5825 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005826 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005827
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005828 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005829 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005830 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005831 if (o == NULL)
5832 return symtable_undo_free(st, child, name);
5833 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005834
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005835 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005836 return symtable_undo_free(st, child, name);
5837 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005838 return symtable_add_def_o(st, ste->ste_symbols,
5839 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005840}
5841
5842static int
5843symtable_undo_free(struct symtable *st, PyObject *id,
5844 PyObject *name)
5845{
5846 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005847 PyObject *info;
5848 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005849
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005850 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5851 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005852 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005853
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005854 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005855 if (info == NULL)
5856 return 0;
5857 v = PyInt_AS_LONG(info);
5858 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005859 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005860 DEF_FREE_GLOBAL) < 0)
5861 return -1;
5862 } else
5863 /* If the name is defined here or declared global,
5864 then the recursion stops. */
5865 return 0;
5866
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005867 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5868 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005869 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005870 PyList_GET_ITEM(ste->ste_children, i);
5871 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005872 if (x < 0)
5873 return x;
5874 }
5875 return 0;
5876}
5877
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005878/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5879 This reference is released when the scope is exited, via the DECREF
5880 in symtable_exit_scope().
5881*/
5882
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005883static int
5884symtable_exit_scope(struct symtable *st)
5885{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005886 int end;
5887
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005888 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005889 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005890 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005891 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005892 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5893 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005894 if (PySequence_DelItem(st->st_stack, end) < 0)
5895 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005896 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005897}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005898
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005899static void
5900symtable_enter_scope(struct symtable *st, char *name, int type,
5901 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005902{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005903 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904
5905 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005906 prev = st->st_cur;
5907 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005908 st->st_errors++;
5909 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005910 }
5911 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005912 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005913 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005914 if (st->st_cur == NULL) {
5915 st->st_errors++;
5916 return;
5917 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005918 if (strcmp(name, TOP) == 0)
5919 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005920 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005921 if (PyList_Append(prev->ste_children,
5922 (PyObject *)st->st_cur) < 0)
5923 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005924 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005925}
5926
5927static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005928symtable_lookup(struct symtable *st, char *name)
5929{
5930 char buffer[MANGLE_LEN];
5931 PyObject *v;
5932 int flags;
5933
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005934 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005935 name = buffer;
5936 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5937 if (v == NULL) {
5938 if (PyErr_Occurred())
5939 return -1;
5940 else
5941 return 0;
5942 }
5943
5944 flags = PyInt_AS_LONG(v);
5945 return flags;
5946}
5947
5948static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005949symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005950{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005951 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005952 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005953 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005954
Guido van Rossumb7164622002-08-16 02:48:11 +00005955 /* Warn about None, except inside a tuple (where the assignment
5956 code already issues a warning). */
5957 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5958 *name == 'N' && strcmp(name, "None") == 0)
5959 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005960 PyErr_SetString(PyExc_SyntaxError,
5961 "Invalid syntax. Assignment to None.");
5962 symtable_error(st, 0);
5963 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005964 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005965 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005966 name = buffer;
5967 if ((s = PyString_InternFromString(name)) == NULL)
5968 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005969 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5970 Py_DECREF(s);
5971 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005972}
5973
5974/* Must only be called with mangled names */
5975
5976static int
5977symtable_add_def_o(struct symtable *st, PyObject *dict,
5978 PyObject *name, int flag)
5979{
5980 PyObject *o;
5981 int val;
5982
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005983 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005984 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005985 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005986 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005987 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005988 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005989 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005990 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005992 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005993 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005994 if (o == NULL)
5995 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005996 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005997 Py_DECREF(o);
5998 return -1;
5999 }
6000 Py_DECREF(o);
6001
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006002 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006003 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006004 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006005 } else if (flag & DEF_GLOBAL) {
6006 /* XXX need to update DEF_GLOBAL for other flags too;
6007 perhaps only DEF_FREE_GLOBAL */
6008 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006009 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006010 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006012 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006013 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006014 if (o == NULL)
6015 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006016 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006017 Py_DECREF(o);
6018 return -1;
6019 }
6020 Py_DECREF(o);
6021 }
6022 return 0;
6023}
6024
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006025#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026
Tim Peters08a898f2001-06-28 01:52:22 +00006027/* Look for a yield stmt under n. Return 1 if found, else 0.
6028 This hack is used to look inside "if 0:" blocks (which are normally
6029 ignored) in case those are the only places a yield occurs (so that this
6030 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006031static int
6032look_for_yield(node *n)
6033{
6034 int i;
6035
6036 for (i = 0; i < NCH(n); ++i) {
6037 node *kid = CHILD(n, i);
6038
6039 switch (TYPE(kid)) {
6040
6041 case classdef:
6042 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006043 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006044 /* Stuff in nested functions and classes can't make
6045 the parent a generator. */
6046 return 0;
6047
6048 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006049 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006050
6051 default:
6052 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006053 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006054 }
6055 }
6056 return 0;
6057}
6058
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006059static void
6060symtable_node(struct symtable *st, node *n)
6061{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006062 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006063
6064 loop:
6065 switch (TYPE(n)) {
6066 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006067 char *func_name;
6068 if (NCH(n) == 6)
6069 symtable_node(st, CHILD(n, 0));
6070 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006071 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006072 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006073 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006074 symtable_funcdef(st, n);
6075 symtable_exit_scope(st);
6076 break;
6077 }
6078 case lambdef:
6079 if (NCH(n) == 4)
6080 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006081 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006082 symtable_funcdef(st, n);
6083 symtable_exit_scope(st);
6084 break;
6085 case classdef: {
6086 char *tmp, *class_name = STR(CHILD(n, 1));
6087 symtable_add_def(st, class_name, DEF_LOCAL);
6088 if (TYPE(CHILD(n, 2)) == LPAR) {
6089 node *bases = CHILD(n, 3);
6090 int i;
6091 for (i = 0; i < NCH(bases); i += 2) {
6092 symtable_node(st, CHILD(bases, i));
6093 }
6094 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006095 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006096 tmp = st->st_private;
6097 st->st_private = class_name;
6098 symtable_node(st, CHILD(n, NCH(n) - 1));
6099 st->st_private = tmp;
6100 symtable_exit_scope(st);
6101 break;
6102 }
6103 case if_stmt:
6104 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006105 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6106 if (st->st_cur->ste_generator == 0)
6107 st->st_cur->ste_generator =
6108 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006109 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006110 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006111 symtable_node(st, CHILD(n, i + 1));
6112 symtable_node(st, CHILD(n, i + 3));
6113 }
6114 if (i + 2 < NCH(n))
6115 symtable_node(st, CHILD(n, i + 2));
6116 break;
6117 case global_stmt:
6118 symtable_global(st, n);
6119 break;
6120 case import_stmt:
6121 symtable_import(st, n);
6122 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006123 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006124 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006125 symtable_node(st, CHILD(n, 1));
6126 if (NCH(n) > 2)
6127 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006128 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006129 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006130 st->st_cur->ste_opt_lineno = n->n_lineno;
6131 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006132 if (NCH(n) > 4)
6133 symtable_node(st, CHILD(n, 5));
6134 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006135
6136 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006137 case assert_stmt:
6138 if (Py_OptimizeFlag)
6139 return;
6140 if (NCH(n) == 2) {
6141 n = CHILD(n, 1);
6142 goto loop;
6143 } else {
6144 symtable_node(st, CHILD(n, 1));
6145 n = CHILD(n, 3);
6146 goto loop;
6147 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006148 case except_clause:
6149 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006150 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151 if (NCH(n) > 1) {
6152 n = CHILD(n, 1);
6153 goto loop;
6154 }
6155 break;
6156 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006157 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006158 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006159 case yield_stmt:
6160 st->st_cur->ste_generator = 1;
6161 n = CHILD(n, 1);
6162 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006163 case expr_stmt:
6164 if (NCH(n) == 1)
6165 n = CHILD(n, 0);
6166 else {
6167 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006168 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006169 symtable_node(st, CHILD(n, 2));
6170 break;
6171 } else {
6172 int i;
6173 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006174 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006175 n = CHILD(n, NCH(n) - 1);
6176 }
6177 }
6178 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006179 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006180 /* only occurs when there are multiple for loops
6181 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006182 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006183 if (TYPE(n) == list_for)
6184 symtable_list_for(st, n);
6185 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006186 REQ(n, list_if);
6187 symtable_node(st, CHILD(n, 1));
6188 if (NCH(n) == 3) {
6189 n = CHILD(n, 2);
6190 goto loop;
6191 }
6192 }
6193 break;
6194 case for_stmt:
6195 symtable_assign(st, CHILD(n, 1), 0);
6196 for (i = 3; i < NCH(n); ++i)
6197 if (TYPE(CHILD(n, i)) >= single_input)
6198 symtable_node(st, CHILD(n, i));
6199 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006200 case arglist:
6201 if (NCH(n) > 1)
6202 for (i = 0; i < NCH(n); ++i) {
6203 node *ch = CHILD(n, i);
6204 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6205 TYPE(CHILD(ch, 1)) == gen_for) {
6206 PyErr_SetString(PyExc_SyntaxError,
6207 "invalid syntax");
6208 symtable_error(st, n->n_lineno);
6209 return;
6210 }
6211 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006212 /* The remaining cases fall through to default except in
6213 special circumstances. This requires the individual cases
6214 to be coded with great care, even though they look like
6215 rather innocuous. Each case must double-check TYPE(n).
6216 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006217 case decorator:
6218 if (TYPE(n) == decorator) {
6219 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6220 node *name, *varname;
6221 name = CHILD(n, 1);
6222 REQ(name, dotted_name);
6223 varname = CHILD(name, 0);
6224 REQ(varname, NAME);
6225 symtable_add_use(st, STR(varname));
6226 }
6227 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006228 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006229 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006230 n = CHILD(n, 2);
6231 goto loop;
6232 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006233 else if (TYPE(n) == argument && NCH(n) == 2 &&
6234 TYPE(CHILD(n, 1)) == gen_for) {
6235 symtable_generator_expression(st, n);
6236 break;
6237 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006238 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006239 case listmaker:
6240 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006241 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006242 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006243 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006244 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006245 case testlist_gexp:
6246 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6247 symtable_generator_expression(st, n);
6248 break;
6249 }
6250 /* fall through */
6251
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006252 case atom:
6253 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6254 symtable_add_use(st, STR(CHILD(n, 0)));
6255 break;
6256 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006257 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006258 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006259 /* Walk over every non-token child with a special case
6260 for one child.
6261 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006262 if (NCH(n) == 1) {
6263 n = CHILD(n, 0);
6264 goto loop;
6265 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006266 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006267 if (TYPE(CHILD(n, i)) >= single_input)
6268 symtable_node(st, CHILD(n, i));
6269 }
6270}
6271
6272static void
6273symtable_funcdef(struct symtable *st, node *n)
6274{
6275 node *body;
6276
6277 if (TYPE(n) == lambdef) {
6278 if (NCH(n) == 4)
6279 symtable_params(st, CHILD(n, 1));
6280 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006281 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006282 body = CHILD(n, NCH(n) - 1);
6283 symtable_node(st, body);
6284}
6285
6286/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006287 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006288 which are references in the defining scope. symtable_params()
6289 parses the parameter names, which are defined in the function's
6290 body.
6291
6292 varargslist:
6293 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6294 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6295*/
6296
6297static void
6298symtable_default_args(struct symtable *st, node *n)
6299{
6300 node *c;
6301 int i;
6302
6303 if (TYPE(n) == parameters) {
6304 n = CHILD(n, 1);
6305 if (TYPE(n) == RPAR)
6306 return;
6307 }
6308 REQ(n, varargslist);
6309 for (i = 0; i < NCH(n); i += 2) {
6310 c = CHILD(n, i);
6311 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6312 break;
6313 }
6314 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6315 symtable_node(st, CHILD(n, i));
6316 }
6317}
6318
6319static void
6320symtable_params(struct symtable *st, node *n)
6321{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006322 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006323 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006324
6325 if (TYPE(n) == parameters) {
6326 n = CHILD(n, 1);
6327 if (TYPE(n) == RPAR)
6328 return;
6329 }
6330 REQ(n, varargslist);
6331 for (i = 0; i < NCH(n); i += 2) {
6332 c = CHILD(n, i);
6333 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6334 ext = 1;
6335 break;
6336 }
6337 if (TYPE(c) == test) {
6338 continue;
6339 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006340 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006341 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006342 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006343 char nbuf[30];
6344 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006345 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006346 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006347 }
6348 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006349 if (ext) {
6350 c = CHILD(n, i);
6351 if (TYPE(c) == STAR) {
6352 i++;
6353 symtable_add_def(st, STR(CHILD(n, i)),
6354 DEF_PARAM | DEF_STAR);
6355 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006356 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006357 c = NULL;
6358 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006359 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006360 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006361 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006362 i++;
6363 symtable_add_def(st, STR(CHILD(n, i)),
6364 DEF_PARAM | DEF_DOUBLESTAR);
6365 }
6366 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006367 if (complex >= 0) {
6368 int j;
6369 for (j = 0; j <= complex; j++) {
6370 c = CHILD(n, j);
6371 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006372 c = CHILD(n, ++j);
6373 else if (TYPE(c) == EQUAL)
6374 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006375 if (TYPE(CHILD(c, 0)) == LPAR)
6376 symtable_params_fplist(st, CHILD(c, 1));
6377 }
6378 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006379}
6380
6381static void
6382symtable_params_fplist(struct symtable *st, node *n)
6383{
6384 int i;
6385 node *c;
6386
6387 REQ(n, fplist);
6388 for (i = 0; i < NCH(n); i += 2) {
6389 c = CHILD(n, i);
6390 REQ(c, fpdef);
6391 if (NCH(c) == 1)
6392 symtable_add_def(st, STR(CHILD(c, 0)),
6393 DEF_PARAM | DEF_INTUPLE);
6394 else
6395 symtable_params_fplist(st, CHILD(c, 1));
6396 }
6397
6398}
6399
6400static void
6401symtable_global(struct symtable *st, node *n)
6402{
6403 int i;
6404
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006405 /* XXX It might be helpful to warn about module-level global
6406 statements, but it's hard to tell the difference between
6407 module-level and a string passed to exec.
6408 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006409
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006410 for (i = 1; i < NCH(n); i += 2) {
6411 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006412 int flags;
6413
6414 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006415 if (flags < 0)
6416 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006417 if (flags && flags != DEF_GLOBAL) {
6418 char buf[500];
6419 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006420 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006421 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006422 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006423 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006424 }
6425 else {
6426 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006427 PyOS_snprintf(buf, sizeof(buf),
6428 GLOBAL_AFTER_ASSIGN,
6429 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006430 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006431 PyOS_snprintf(buf, sizeof(buf),
6432 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006433 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006434 }
6435 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006436 symtable_add_def(st, name, DEF_GLOBAL);
6437 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006438}
6439
6440static void
6441symtable_list_comprehension(struct symtable *st, node *n)
6442{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006443 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006444 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006445
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006446 REQ(n, listmaker);
6447 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6448 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006449 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006450 symtable_list_for(st, CHILD(n, 1));
6451 symtable_node(st, CHILD(n, 0));
6452 --st->st_cur->ste_tmpname;
6453}
6454
6455static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006456symtable_generator_expression(struct symtable *st, node *n)
6457{
6458 /* testlist_gexp: test gen_for */
6459 REQ(CHILD(n, 0), test);
6460 REQ(CHILD(n, 1), gen_for);
6461
6462 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6463 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6464
6465 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6466
6467 symtable_gen_for(st, CHILD(n, 1), 1);
6468 symtable_node(st, CHILD(n, 0));
6469 symtable_exit_scope(st);
6470
6471 /* for outmost iterable precomputation */
6472 symtable_node(st, CHILD(CHILD(n, 1), 3));
6473}
6474
6475static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006476symtable_list_for(struct symtable *st, node *n)
6477{
6478 REQ(n, list_for);
6479 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006480 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006481 symtable_node(st, CHILD(n, 3));
6482 if (NCH(n) == 5)
6483 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006484}
6485
6486static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006487symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6488{
6489 REQ(n, gen_for);
6490
6491 /* gen_for: for v in test [gen_iter] */
6492 symtable_assign(st, CHILD(n, 1), 0);
6493 if (is_outmost)
6494 symtable_add_use(st, "[outmost-iterable]");
6495 else
6496 symtable_node(st, CHILD(n, 3));
6497
6498 if (NCH(n) == 5)
6499 symtable_gen_iter(st, CHILD(n, 4));
6500}
6501
6502static void
6503symtable_gen_iter(struct symtable *st, node *n)
6504{
6505 REQ(n, gen_iter);
6506
6507 n = CHILD(n, 0);
6508 if (TYPE(n) == gen_for)
6509 symtable_gen_for(st, n, 0);
6510 else {
6511 REQ(n, gen_if);
6512 symtable_node(st, CHILD(n, 1));
6513
6514 if (NCH(n) == 3)
6515 symtable_gen_iter(st, CHILD(n, 2));
6516 }
6517}
6518
6519static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006520symtable_import(struct symtable *st, node *n)
6521{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006522 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006523 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006524 /* import_stmt: import_name | import_from */
6525 n = CHILD(n, 0);
6526 if (TYPE(n) == import_from) {
6527 /* import_from: 'from' dotted_name 'import' ('*' |
6528 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006529 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006530 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006531 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6532 /* check for bogus imports */
6533 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6534 PyErr_SetString(PyExc_SyntaxError,
6535 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006536 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006537 return;
6538 }
6539 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006540 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6541 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006542 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006543 if (symtable_warn(st,
6544 "import * only allowed at module level") < 0)
6545 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006546 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006547 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006548 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006549 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006550 REQ(nn, import_as_names);
6551 for (i = 0; i < NCH(nn); i += 2) {
6552 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006553 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006554 symtable_assign(st, CHILD(c, 2),
6555 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006556 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006557 symtable_assign(st, CHILD(c, 0),
6558 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006559 }
6560 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006561 } else {
6562 /* 'import' dotted_as_names */
6563 nn = CHILD(n, 1);
6564 REQ(nn, dotted_as_names);
6565 for (i = 0; i < NCH(nn); i += 2)
6566 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006567 }
6568}
6569
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006570/* The third argument to symatble_assign() is a flag to be passed to
6571 symtable_add_def() if it is eventually called. The flag is useful
6572 to specify the particular type of assignment that should be
6573 recorded, e.g. an assignment caused by import.
6574 */
6575
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006576static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006577symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006578{
6579 node *tmp;
6580 int i;
6581
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006582 loop:
6583 switch (TYPE(n)) {
6584 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006585 /* invalid assignment, e.g. lambda x:x=2. The next
6586 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006587 return;
6588 case power:
6589 if (NCH(n) > 2) {
6590 for (i = 2; i < NCH(n); ++i)
6591 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6592 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006593 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006594 if (NCH(n) > 1) {
6595 symtable_node(st, CHILD(n, 0));
6596 symtable_node(st, CHILD(n, 1));
6597 } else {
6598 n = CHILD(n, 0);
6599 goto loop;
6600 }
6601 return;
6602 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006603 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6604 /* XXX This is an error, but the next pass
6605 will catch it. */
6606 return;
6607 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006608 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006609 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006610 }
6611 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006612 case testlist_gexp:
6613 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6614 /* XXX This is an error, but the next pass
6615 will catch it. */
6616 return;
6617 } else {
6618 for (i = 0; i < NCH(n); i += 2)
6619 symtable_assign(st, CHILD(n, i), def_flag);
6620 }
6621 return;
6622
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006623 case exprlist:
6624 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006625 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006626 if (NCH(n) == 1) {
6627 n = CHILD(n, 0);
6628 goto loop;
6629 }
6630 else {
6631 int i;
6632 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006633 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006634 return;
6635 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006636 case atom:
6637 tmp = CHILD(n, 0);
6638 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6639 n = CHILD(n, 1);
6640 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006641 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006642 if (strcmp(STR(tmp), "__debug__") == 0) {
6643 PyErr_SetString(PyExc_SyntaxError,
6644 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006645 symtable_error(st, n->n_lineno);
6646 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006647 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006648 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006649 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006650 return;
6651 case dotted_as_name:
6652 if (NCH(n) == 3)
6653 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006654 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006655 else
6656 symtable_add_def(st,
6657 STR(CHILD(CHILD(n,
6658 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006659 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006660 return;
6661 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006662 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006663 return;
6664 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006665 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006666 return;
6667 default:
6668 if (NCH(n) == 0)
6669 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006670 if (NCH(n) == 1) {
6671 n = CHILD(n, 0);
6672 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006673 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006674 /* Should only occur for errors like x + 1 = 1,
6675 which will be caught in the next pass. */
6676 for (i = 0; i < NCH(n); ++i)
6677 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006678 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006679 }
6680}