blob: 24ca440c3d56f1d2ade0353af70d9597acdca45c [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;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
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_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000383/* Begin: Peephole optimizations ----------------------------------------- */
384
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000385#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
386#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000387#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
388#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000389#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000390#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
391#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
392
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000393/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
394 with LOAD_CONST (c1, c2, ... cn).
395 The consts table must still be in list form so that the
396 new constant (c1, c2, ... cn) can be appended.
397 Called with codestr pointing to the first LOAD_CONST.
398 Bails out with no change if one or more of the LOAD_CONSTs is missing. */
399static int
400tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
401{
402 PyObject *newconst, *constant;
403 int i, arg, len_consts;
404
405 /* Pre-conditions */
406 assert(PyList_CheckExact(consts));
407 assert(codestr[0] == LOAD_CONST);
408 assert(codestr[n*3] == BUILD_TUPLE);
409 assert(GETARG(codestr, (n*3)) == n);
410
411 /* Verify chain of n load_constants */
412 for (i=0 ; i<n ; i++)
413 if (codestr[i*3] != LOAD_CONST)
414 return 0;
415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
420 for (i=0 ; i<n ; i++) {
421 arg = GETARG(codestr, (i*3));
422 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 */
428 len_consts = PyList_GET_SIZE(consts);
429 if (PyList_Append(consts, newconst)) {
430 Py_DECREF(newconst);
431 return 0;
432 }
433 Py_DECREF(newconst);
434
435 /* Write NOPs over old LOAD_CONSTS and
436 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
437 memset(codestr, NOP, n*3);
438 codestr[n*3] = LOAD_CONST;
439 SETARG(codestr, (n*3), len_consts);
440 return 1;
441}
442
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000443static unsigned int *
444markblocks(unsigned char *code, int len)
445{
446 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
447 int i,j, opcode, oldblock, newblock, blockcnt = 0;
448
449 if (blocks == NULL)
450 return NULL;
451 memset(blocks, 0, len*sizeof(int));
452 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
453 opcode = code[i];
454 switch (opcode) {
455 case FOR_ITER:
456 case JUMP_FORWARD:
457 case JUMP_IF_FALSE:
458 case JUMP_IF_TRUE:
459 case JUMP_ABSOLUTE:
460 case CONTINUE_LOOP:
461 case SETUP_LOOP:
462 case SETUP_EXCEPT:
463 case SETUP_FINALLY:
464 j = GETJUMPTGT(code, i);
465 oldblock = blocks[j];
466 newblock = ++blockcnt;
467 for (; j<len ; j++) {
468 if (blocks[j] != (unsigned)oldblock)
469 break;
470 blocks[j] = newblock;
471 }
472 break;
473 }
474 }
475 return blocks;
476}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000477
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000478/* Perform basic peephole optimizations to components of a code object.
479 The consts object should still be in list form to allow new constants
480 to be appended.
481
482 To keep the optimizer simple, it bails out (does nothing) for code
483 containing extended arguments or that has a length over 32,700. That
484 allows us to avoid overflow and sign issues. Likewise, it bails when
485 the lineno table has complex encoding for gaps >= 255.
486
487 Optimizations are restricted to simple transformations occuring within a
488 single basic block. All transformations keep the code size the same or
489 smaller. For those that reduce size, the gaps are initially filled with
490 NOPs. Later those NOPs are removed and the jump addresses retargeted in
491 a single pass. Line numbering is adjusted accordingly. */
492
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000493static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000494optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000495{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000496 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000498 unsigned char *codestr = NULL;
499 unsigned char *lineno;
500 int *addrmap = NULL;
501 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000502 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000503 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000504
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000505 /* Bypass optimization when the lineno table is too complex */
506 assert(PyString_Check(lineno_obj));
507 lineno = PyString_AS_STRING(lineno_obj);
508 tabsiz = PyString_GET_SIZE(lineno_obj);
509 if (memchr(lineno, 255, tabsiz) != NULL)
510 goto exitUnchanged;
511
Raymond Hettingera12fa142004-08-24 04:34:16 +0000512 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000513 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000514 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000515 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000516 goto exitUnchanged;
517
518 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000519 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000520 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000521 goto exitUnchanged;
522 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000523
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000524 /* Mapping to new jump targets after NOPs are removed */
525 addrmap = PyMem_Malloc(codelen * sizeof(int));
526 if (addrmap == NULL)
527 goto exitUnchanged;
528
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000529 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000530 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000531 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000532 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000533
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000534 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
535 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000536 opcode = codestr[i];
537 switch (opcode) {
538
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000539 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000540 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000541 case UNARY_NOT:
542 if (codestr[i+1] != JUMP_IF_FALSE ||
543 codestr[i+4] != POP_TOP ||
544 !ISBASICBLOCK(blocks,i,5))
545 continue;
546 tgt = GETJUMPTGT(codestr, (i+1));
547 if (codestr[tgt] != POP_TOP)
548 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000549 j = GETARG(codestr, i+1) + 1;
550 codestr[i] = JUMP_IF_TRUE;
551 SETARG(codestr, i, j);
552 codestr[i+3] = POP_TOP;
553 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000554 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000555 break;
556
557 /* not a is b --> a is not b
558 not a in b --> a not in b
559 not a is not b --> a is b
560 not a not in b --> a in b */
561 case COMPARE_OP:
562 j = GETARG(codestr, i);
563 if (j < 6 || j > 9 ||
564 codestr[i+3] != UNARY_NOT ||
565 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000566 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000567 SETARG(codestr, i, (j^1));
568 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000569 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000570 break;
571
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000572 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
573 case LOAD_NAME:
574 case LOAD_GLOBAL:
575 j = GETARG(codestr, i);
576 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
577 if (name == NULL || strcmp(name, "None") != 0)
578 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000579 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
580 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000581 codestr[i] = LOAD_CONST;
582 SETARG(codestr, i, j);
583 break;
584 }
585 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000586 break;
587
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000588 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000589 case LOAD_CONST:
590 j = GETARG(codestr, i);
591 if (codestr[i+3] != JUMP_IF_FALSE ||
592 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000593 !ISBASICBLOCK(blocks,i,7) ||
594 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000595 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000596 memset(codestr+i, NOP, 7);
597 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598 break;
599
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000600 /* Try to fold tuples of constants.
601 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000602 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
603 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000604 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000605 j = GETARG(codestr, i);
606 h = i - 3 * j;
607 if (h >= 0 &&
608 codestr[h] == LOAD_CONST &&
609 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
610 tuple_of_constants(&codestr[h], j, consts)) {
611 nops += 3 * j;
612 break;
613 }
614 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000615 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000616 j = GETARG(codestr, i);
617 if (codestr[i+3] != UNPACK_SEQUENCE ||
618 !ISBASICBLOCK(blocks,i,6) ||
619 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000620 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000621 if (j == 1) {
622 memset(codestr+i, NOP, 6);
623 nops += 6;
624 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000626 memset(codestr+i+1, NOP, 5);
627 nops += 5;
628 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000629 codestr[i] = ROT_THREE;
630 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000631 memset(codestr+i+2, NOP, 4);
632 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000633 }
634 break;
635
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000636 /* Simplify conditional jump to conditional jump where the
637 result of the first test implies the success of a similar
638 test or the failure of the opposite test.
639 Arises in code like:
640 "a and b or c"
641 "a and b and c"
642 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000643 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
644 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000645 */
646 case JUMP_IF_FALSE:
647 case JUMP_IF_TRUE:
648 tgt = GETJUMPTGT(codestr, i);
649 j = codestr[tgt];
650 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
651 if (j == opcode) {
652 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
653 SETARG(codestr, i, tgttgt);
654 } else {
655 tgt -= i;
656 SETARG(codestr, i, tgt);
657 }
658 break;
659 }
660 /* Intentional fallthrough */
661
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000662 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000663 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000664 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000665 case JUMP_ABSOLUTE:
666 case CONTINUE_LOOP:
667 case SETUP_LOOP:
668 case SETUP_EXCEPT:
669 case SETUP_FINALLY:
670 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000671 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 continue;
673 tgttgt = GETJUMPTGT(codestr, tgt);
674 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
675 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000676 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 tgttgt -= i + 3; /* Calc relative jump addr */
678 if (tgttgt < 0) /* No backward relative jumps */
679 continue;
680 codestr[i] = opcode;
681 SETARG(codestr, i, tgttgt);
682 break;
683
684 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000685 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000686
687 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
688 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000689 if (i+4 >= codelen ||
690 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000691 !ISBASICBLOCK(blocks,i,5))
692 continue;
693 memset(codestr+i+1, NOP, 4);
694 nops += 4;
695 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000696 }
697 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000698
699 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000700 cum_orig_line = 0;
701 last_line = 0;
702 for (i=0 ; i < tabsiz ; i+=2) {
703 cum_orig_line += lineno[i];
704 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000705 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000706 lineno[i] =((unsigned char)(new_line - last_line));
707 last_line = new_line;
708 }
709
710 /* Remove NOPs and fixup jump targets */
711 for (i=0, h=0 ; i<codelen ; ) {
712 opcode = codestr[i];
713 switch (opcode) {
714 case NOP:
715 i++;
716 continue;
717
718 case JUMP_ABSOLUTE:
719 case CONTINUE_LOOP:
720 j = addrmap[GETARG(codestr, i)];
721 SETARG(codestr, i, j);
722 break;
723
724 case FOR_ITER:
725 case JUMP_FORWARD:
726 case JUMP_IF_FALSE:
727 case JUMP_IF_TRUE:
728 case SETUP_LOOP:
729 case SETUP_EXCEPT:
730 case SETUP_FINALLY:
731 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
732 SETARG(codestr, i, j);
733 break;
734 }
735 adj = CODESIZE(opcode);
736 while (adj--)
737 codestr[h++] = codestr[i++];
738 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000739 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000740
741 code = PyString_FromStringAndSize((char *)codestr, h);
742 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000743 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000744 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000745 return code;
746
747exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000748 if (addrmap != NULL)
749 PyMem_Free(addrmap);
750 if (codestr != NULL)
751 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000752 Py_INCREF(code);
753 return code;
754}
755
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000756/* End: Peephole optimizations ----------------------------------------- */
757
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000759PyCode_New(int argcount, int nlocals, int stacksize, int flags,
760 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000761 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
762 PyObject *filename, PyObject *name, int firstlineno,
763 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000764{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766 int i;
767 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000768 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000769 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 consts == NULL || !PyTuple_Check(consts) ||
771 names == NULL || !PyTuple_Check(names) ||
772 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000773 freevars == NULL || !PyTuple_Check(freevars) ||
774 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 name == NULL || !PyString_Check(name) ||
776 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000777 lnotab == NULL || !PyString_Check(lnotab) ||
778 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000779 PyErr_BadInternalCall();
780 return NULL;
781 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000782 intern_strings(names);
783 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000784 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000785 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000786 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 for (i = PyTuple_Size(consts); --i >= 0; ) {
788 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000790 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000791 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000792 continue;
793 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000794 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000797 co->co_argcount = argcount;
798 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000799 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000800 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000801 Py_INCREF(code);
802 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000808 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000809 Py_INCREF(freevars);
810 co->co_freevars = freevars;
811 Py_INCREF(cellvars);
812 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000814 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000816 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000817 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000819 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000820 if (PyTuple_GET_SIZE(freevars) == 0 &&
821 PyTuple_GET_SIZE(cellvars) == 0)
822 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000823 }
824 return co;
825}
826
827
828/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000829
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000830/* The compiler uses two passes to generate bytecodes. The first pass
831 builds the symbol table. The second pass generates the bytecode.
832
833 The first pass uses a single symtable struct. The second pass uses
834 a compiling struct for each code block. The compiling structs
835 share a reference to the symtable.
836
837 The two passes communicate via symtable_load_symbols() and via
838 is_local() and is_global(). The former initializes several slots
839 in the compiling struct: c_varnames, c_locals, c_nlocals,
840 c_argcount, c_globals, and c_flags.
841*/
842
Tim Peters2a7f3842001-06-09 09:26:21 +0000843/* All about c_lnotab.
844
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000845c_lnotab is an array of unsigned bytes disguised as a Python string. Since
846version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
847mapped to source code line #s via c_lnotab instead.
848
Tim Peters2a7f3842001-06-09 09:26:21 +0000849The array is conceptually a list of
850 (bytecode offset increment, line number increment)
851pairs. The details are important and delicate, best illustrated by example:
852
853 byte code offset source code line number
854 0 1
855 6 2
856 50 7
857 350 307
858 361 308
859
860The first trick is that these numbers aren't stored, only the increments
861from one row to the next (this doesn't really work, but it's a start):
862
863 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
864
865The second trick is that an unsigned byte can't hold negative values, or
866values larger than 255, so (a) there's a deep assumption that byte code
867offsets and their corresponding line #s both increase monotonically, and (b)
868if at least one column jumps by more than 255 from one row to the next, more
869than one pair is written to the table. In case #b, there's no way to know
870from looking at the table later how many were written. That's the delicate
871part. A user of c_lnotab desiring to find the source line number
872corresponding to a bytecode address A should do something like this
873
874 lineno = addr = 0
875 for addr_incr, line_incr in c_lnotab:
876 addr += addr_incr
877 if addr > A:
878 return lineno
879 lineno += line_incr
880
881In order for this to work, when the addr field increments by more than 255,
882the line # increment in each pair generated must be 0 until the remaining addr
883increment is < 256. So, in the example above, com_set_lineno should not (as
884was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
885255, 0, 45, 255, 0, 45.
886*/
887
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000888struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000889 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000891 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000893 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000894 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyObject *c_locals; /* dictionary (value=localID) */
896 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000897 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000898 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000899 int c_nlocals; /* index of next local */
900 int c_argcount; /* number of top-level arguments */
901 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000902 int c_nexti; /* index into c_code */
903 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000904 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000905 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000907 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000908 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000909 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000910 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000911 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000912 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000913 int c_stacklevel; /* Current stack level */
914 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000915 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000917 int c_last_addr; /* last op addr seen and recorded in lnotab */
918 int c_last_line; /* last line seen and recorded in lnotab */
919 int c_lnotab_next; /* current length of lnotab */
920 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000921 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000922 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000923 int c_nested; /* Is block nested funcdef or lamdef? */
924 int c_closure; /* Is nested w/freevars? */
925 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000926 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000927 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928};
929
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000930static int
931is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000932{
933 if ((v & (USE | DEF_FREE))
934 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
935 return 1;
936 if (v & DEF_FREE_CLASS)
937 return 1;
938 return 0;
939}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000940
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000942com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000943{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000944 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
945
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000946 if (c == NULL) {
947 /* Error occurred via symtable call to
948 is_constant_false */
949 PyErr_SetString(exc, msg);
950 return;
951 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000952 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000953 if (c->c_lineno < 1 || c->c_interactive) {
954 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000956 return;
957 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000958 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000959 if (v == NULL)
960 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000961
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000962 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000963 if (line == NULL) {
964 Py_INCREF(Py_None);
965 line = Py_None;
966 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000967 if (exc == PyExc_SyntaxError) {
968 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
969 Py_None, line);
970 if (t == NULL)
971 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000972 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000973 if (w == NULL)
974 goto exit;
975 PyErr_SetObject(exc, w);
976 } else {
977 /* Make sure additional exceptions are printed with
978 file and line, also. */
979 PyErr_SetObject(exc, v);
980 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
981 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000982 exit:
983 Py_XDECREF(t);
984 Py_XDECREF(v);
985 Py_XDECREF(w);
986 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000987}
988
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000989/* Interface to the block stack */
990
991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000992block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000993{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000994 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 com_error(c, PyExc_SystemError,
996 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000997 }
998 else {
999 c->c_block[c->c_nblocks++] = type;
1000 }
1001}
1002
1003static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001004block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001005{
1006 if (c->c_nblocks > 0)
1007 c->c_nblocks--;
1008 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001010 }
1011}
1012
Guido van Rossum681d79a1995-07-18 14:51:37 +00001013/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001014
Martin v. Löwis95292d62002-12-11 14:04:59 +00001015static int issue_warning(const char *, const char *, int);
1016static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001017static void com_free(struct compiling *);
1018static void com_push(struct compiling *, int);
1019static void com_pop(struct compiling *, int);
1020static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001021static void com_node(struct compiling *, node *);
1022static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001023static void com_addbyte(struct compiling *, int);
1024static void com_addint(struct compiling *, int);
1025static void com_addoparg(struct compiling *, int, int);
1026static void com_addfwref(struct compiling *, int, int *);
1027static void com_backpatch(struct compiling *, int);
1028static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1029static int com_addconst(struct compiling *, PyObject *);
1030static int com_addname(struct compiling *, PyObject *);
1031static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001032static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001033static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001034static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001035static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001036static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001037static void com_assign(struct compiling *, node *, int, node *);
1038static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001039static int com_make_closure(struct compiling *c, PyCodeObject *co);
1040
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001041static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001042static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001043 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001044static PyObject *parsestrplus(struct compiling*, node *);
1045static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001046static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001048static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001049
1050/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001051static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001052static struct symtable *symtable_build(node *, PyFutureFeatures *,
1053 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001054static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001055static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001056static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001057static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001058static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001059static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060
1061static void symtable_node(struct symtable *, node *);
1062static void symtable_funcdef(struct symtable *, node *);
1063static void symtable_default_args(struct symtable *, node *);
1064static void symtable_params(struct symtable *, node *);
1065static void symtable_params_fplist(struct symtable *, node *n);
1066static void symtable_global(struct symtable *, node *);
1067static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001068static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001069static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001070static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001071static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001072static void symtable_gen_for(struct symtable *, node *, int);
1073static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001074
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001075static int symtable_update_free_vars(struct symtable *);
1076static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1077static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1078
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001079/* helper */
1080static void
1081do_pad(int pad)
1082{
1083 int i;
1084 for (i = 0; i < pad; ++i)
1085 fprintf(stderr, " ");
1086}
1087
1088static void
1089dump(node *n, int pad, int depth)
1090{
1091 int i;
1092 if (depth == 0)
1093 return;
1094 do_pad(pad);
1095 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1096 if (depth > 0)
1097 depth--;
1098 for (i = 0; i < NCH(n); ++i)
1099 dump(CHILD(n, i), pad + 1, depth);
1100}
1101
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001102static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001103com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001105 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1107 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001108 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001110 goto fail;
1111 if ((c->c_const_dict = PyDict_New()) == NULL)
1112 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001114 goto fail;
1115 if ((c->c_name_dict = PyDict_New()) == NULL)
1116 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001118 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1120 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001121 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001122 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001123 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001124 c->c_freevars = NULL;
1125 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001126 c->c_nlocals = 0;
1127 c->c_argcount = 0;
1128 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129 c->c_nexti = 0;
1130 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001131 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001132 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001133 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001134 c->c_begin = 0;
1135 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001136 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001137 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001138 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001139 c->c_stacklevel = 0;
1140 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001141 c->c_firstlineno = 0;
1142 c->c_last_addr = 0;
1143 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001144 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001145 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001146 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001147 c->c_nested = 0;
1148 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001149 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001150 return 1;
1151
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001152 fail:
1153 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154 return 0;
1155}
1156
1157static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001158com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001159{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 Py_XDECREF(c->c_code);
1161 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001162 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001164 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 Py_XDECREF(c->c_globals);
1166 Py_XDECREF(c->c_locals);
1167 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001168 Py_XDECREF(c->c_freevars);
1169 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001171 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001172 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173}
1174
1175static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001176com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001177{
1178 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001179 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001180 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001181 /*
1182 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1183 c->c_filename, c->c_name, c->c_lineno,
1184 c->c_nexti, c->c_stacklevel, n);
1185 */
1186 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187}
1188
1189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001191{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001192 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001194 else
1195 c->c_stacklevel -= n;
1196}
1197
1198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001199com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001200{
1201 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001203 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205}
1206
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001207static int
1208com_check_size(PyObject **s, int offset)
1209{
1210 int len = PyString_GET_SIZE(*s);
1211 if (offset >= len)
1212 return _PyString_Resize(s, len * 2);
1213 return 0;
1214}
1215
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001217com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001219 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001220 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001221 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001222 if (com_check_size(&c->c_code, c->c_nexti)) {
1223 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001226 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227}
1228
1229static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001230com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001231{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001232 com_addbyte(c, x & 0xff);
1233 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234}
1235
1236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001237com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001238{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001239 char *p;
1240 if (c->c_lnotab == NULL)
1241 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001242 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1243 c->c_errors++;
1244 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001245 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001246 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001247 *p++ = addr;
1248 *p++ = line;
1249 c->c_lnotab_next += 2;
1250}
1251
1252static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001253com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001254{
1255 c->c_lineno = lineno;
1256 if (c->c_firstlineno == 0) {
1257 c->c_firstlineno = c->c_last_line = lineno;
1258 }
1259 else {
1260 int incr_addr = c->c_nexti - c->c_last_addr;
1261 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001262 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001263 while (incr_addr > 255) {
1264 com_add_lnotab(c, 255, 0);
1265 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001266 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001267 while (incr_line > 255) {
1268 com_add_lnotab(c, incr_addr, 255);
1269 incr_line -=255;
1270 incr_addr = 0;
1271 }
1272 if (incr_addr > 0 || incr_line > 0)
1273 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001274 c->c_last_addr = c->c_nexti;
1275 c->c_last_line = lineno;
1276 }
1277}
1278
1279static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001280com_strip_lnotab(struct compiling *c)
1281{
1282 /* strip the last lnotab entry if no opcode were emitted.
1283 * This prevents a line number to be generated on a final
1284 * pass, like in the following example:
1285 *
1286 * if a:
1287 * print 5
1288 * else:
1289 * pass
1290 *
1291 * Without the fix, a line trace event would be generated
1292 * on the pass even if a is true (because of the implicit
1293 * return).
1294 */
1295 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1296 c->c_lnotab_next = c->c_lnotab_last;
1297 }
1298}
1299
1300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001301com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302{
Fred Drakeef8ace32000-08-24 00:32:09 +00001303 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001304 if (extended_arg){
1305 com_addbyte(c, EXTENDED_ARG);
1306 com_addint(c, extended_arg);
1307 arg &= 0xffff;
1308 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001309 com_addbyte(c, op);
1310 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001311}
1312
1313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001314com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001315{
1316 /* Compile a forward reference for backpatching */
1317 int here;
1318 int anchor;
1319 com_addbyte(c, op);
1320 here = c->c_nexti;
1321 anchor = *p_anchor;
1322 *p_anchor = here;
1323 com_addint(c, anchor == 0 ? 0 : here - anchor);
1324}
1325
1326static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001327com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001328{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001329 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001331 int dist;
1332 int prev;
1333 for (;;) {
1334 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001335 prev = code[anchor] + (code[anchor+1] << 8);
1336 dist = target - (anchor+2);
1337 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001338 dist >>= 8;
1339 code[anchor+1] = dist;
1340 dist >>= 8;
1341 if (dist) {
1342 com_error(c, PyExc_SystemError,
1343 "com_backpatch: offset too large");
1344 break;
1345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 if (!prev)
1347 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 anchor -= prev;
1349 }
1350}
1351
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001352/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353
1354static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001355com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001357 PyObject *w, *t, *np=NULL;
1358 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001360 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001361 if (t == NULL)
1362 goto fail;
1363 w = PyDict_GetItem(dict, t);
1364 if (w != NULL) {
1365 n = PyInt_AsLong(w);
1366 } else {
1367 n = PyList_Size(list);
1368 np = PyInt_FromLong(n);
1369 if (np == NULL)
1370 goto fail;
1371 if (PyList_Append(list, v) != 0)
1372 goto fail;
1373 if (PyDict_SetItem(dict, t, np) != 0)
1374 goto fail;
1375 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001376 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001377 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001378 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001379 fail:
1380 Py_XDECREF(np);
1381 Py_XDECREF(t);
1382 c->c_errors++;
1383 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001384}
1385
1386static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001387com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001388{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001389 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390}
1391
1392static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001393com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001395 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396}
1397
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001398int
1399_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001400{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001401 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001402 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001403 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001404 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1405 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001406 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001407 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001408 return 0; /* Don't mangle __extremely_long_names */
1409 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1410 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001411 /* Strip leading underscores from class name */
1412 while (*p == '_')
1413 p++;
1414 if (*p == '\0')
1415 return 0; /* Don't mangle if class is just underscores */
1416 plen = strlen(p);
1417 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001418 plen = maxlen-nlen-2; /* Truncate class name if too long */
1419 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001420 buffer[0] = '_';
1421 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001422 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001423 return 1;
1424}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001425
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001427com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001431 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001432
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001433 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001434 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001435 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436 c->c_errors++;
1437 i = 255;
1438 }
1439 else {
1440 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001443 com_addoparg(c, op, i);
1444}
1445
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001446#define NAME_LOCAL 0
1447#define NAME_GLOBAL 1
1448#define NAME_DEFAULT 2
1449#define NAME_CLOSURE 3
1450
1451static int
1452com_lookup_arg(PyObject *dict, PyObject *name)
1453{
1454 PyObject *v = PyDict_GetItem(dict, name);
1455 if (v == NULL)
1456 return -1;
1457 else
1458 return PyInt_AS_LONG(v);
1459}
1460
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001461static int
1462none_assignment_check(struct compiling *c, char *name, int assigning)
1463{
1464 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1465 char *msg;
1466 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001467 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001468 else
1469 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001470 com_error(c, PyExc_SyntaxError, msg);
1471 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001472 }
1473 return 0;
1474}
1475
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001476static void
1477com_addop_varname(struct compiling *c, int kind, char *name)
1478{
1479 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001480 int i, reftype;
1481 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001482 int op = STOP_CODE;
1483 char buffer[MANGLE_LEN];
1484
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001485 if (kind != VAR_LOAD &&
1486 none_assignment_check(c, name, kind == VAR_STORE))
1487 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001488 i = 255;
1489 goto done;
1490 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001491 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001492 name = buffer;
1493 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1494 c->c_errors++;
1495 i = 255;
1496 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001497 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001498
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001499 reftype = get_ref_type(c, name);
1500 switch (reftype) {
1501 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001502 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001503 scope = NAME_LOCAL;
1504 break;
1505 case GLOBAL_EXPLICIT:
1506 scope = NAME_GLOBAL;
1507 break;
1508 case GLOBAL_IMPLICIT:
1509 if (c->c_flags & CO_OPTIMIZED)
1510 scope = NAME_GLOBAL;
1511 break;
1512 case FREE:
1513 case CELL:
1514 scope = NAME_CLOSURE;
1515 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001516 }
1517
1518 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001519 if (scope == NAME_LOCAL)
1520 i = com_lookup_arg(c->c_locals, v);
1521 else if (reftype == FREE)
1522 i = com_lookup_arg(c->c_freevars, v);
1523 else if (reftype == CELL)
1524 i = com_lookup_arg(c->c_cellvars, v);
1525 if (i == -1) {
1526 c->c_errors++; /* XXX no exception set */
1527 i = 255;
1528 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001529 }
1530 Py_DECREF(v);
1531
1532 switch (kind) {
1533 case VAR_LOAD:
1534 switch (scope) {
1535 case NAME_LOCAL:
1536 op = LOAD_FAST;
1537 break;
1538 case NAME_GLOBAL:
1539 op = LOAD_GLOBAL;
1540 break;
1541 case NAME_DEFAULT:
1542 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001543 break;
1544 case NAME_CLOSURE:
1545 op = LOAD_DEREF;
1546 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001547 }
1548 break;
1549 case VAR_STORE:
1550 switch (scope) {
1551 case NAME_LOCAL:
1552 op = STORE_FAST;
1553 break;
1554 case NAME_GLOBAL:
1555 op = STORE_GLOBAL;
1556 break;
1557 case NAME_DEFAULT:
1558 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001559 break;
1560 case NAME_CLOSURE:
1561 op = STORE_DEREF;
1562 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001563 }
1564 break;
1565 case VAR_DELETE:
1566 switch (scope) {
1567 case NAME_LOCAL:
1568 op = DELETE_FAST;
1569 break;
1570 case NAME_GLOBAL:
1571 op = DELETE_GLOBAL;
1572 break;
1573 case NAME_DEFAULT:
1574 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001575 break;
1576 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001577 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001578 PyOS_snprintf(buf, sizeof(buf),
1579 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001580 com_error(c, PyExc_SyntaxError, buf);
1581 i = 255;
1582 break;
1583 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001584 }
1585 break;
1586 }
1587done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 com_addoparg(c, op, i);
1589}
1590
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001592com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001593{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001594 char *name;
1595 char buffer[1000];
1596 /* XXX it is possible to write this code without the 1000
1597 chars on the total length of dotted names, I just can't be
1598 bothered right now */
1599 if (TYPE(n) == STAR)
1600 name = "*";
1601 else if (TYPE(n) == dotted_name) {
1602 char *p = buffer;
1603 int i;
1604 name = buffer;
1605 for (i = 0; i < NCH(n); i += 2) {
1606 char *s = STR(CHILD(n, i));
1607 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001609 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001610 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001611 break;
1612 }
1613 if (p != buffer)
1614 *p++ = '.';
1615 strcpy(p, s);
1616 p = strchr(p, '\0');
1617 }
1618 }
1619 else {
1620 REQ(n, NAME);
1621 name = STR(n);
1622 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001624}
1625
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001627parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001629 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001631 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001632#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001633 int imflag;
1634#endif
1635
Guido van Rossum282914b1991-04-04 10:42:56 +00001636 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001637 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001638#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001639 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001640#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001641 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001643 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001645 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001646 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001647 }
1648 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001649 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001650 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001651 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001652 if (errno != 0)
1653 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001655 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001656 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001657#ifndef WITHOUT_COMPLEX
1658 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001659 Py_complex z;
1660 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001661 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001662 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001663 PyFPE_END_PROTECT(z)
1664 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001665 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001666 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001667#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001668 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001669 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001670 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001671 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001673 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001674}
1675
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001677decode_utf8(char **sPtr, char *end, char* encoding)
1678{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001679#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001680 Py_FatalError("decode_utf8 should not be called in this build.");
1681 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001682#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001683 PyObject *u, *v;
1684 char *s, *t;
1685 t = s = *sPtr;
1686 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1687 while (s < end && (*s & 0x80)) s++;
1688 *sPtr = s;
1689 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1690 if (u == NULL)
1691 return NULL;
1692 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1693 Py_DECREF(u);
1694 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001695#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001696}
1697
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001698/* compiler.transformer.Transformer.decode_literal depends on what
1699 might seem like minor details of this function -- changes here
1700 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001701static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001702parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001705 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001706 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001707 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001708 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001709 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001710 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001711
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001712 if (isalpha(quote) || quote == '_') {
1713 if (quote == 'u' || quote == 'U') {
1714 quote = *++s;
1715 unicode = 1;
1716 }
1717 if (quote == 'r' || quote == 'R') {
1718 quote = *++s;
1719 rawmode = 1;
1720 }
1721 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001722 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001724 return NULL;
1725 }
1726 s++;
1727 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001728 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001729 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001730 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001731 return NULL;
1732 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001733 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001734 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001735 return NULL;
1736 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001737 if (len >= 4 && s[0] == quote && s[1] == quote) {
1738 s += 2;
1739 len -= 2;
1740 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001742 return NULL;
1743 }
1744 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001745#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001746 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001747 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001748 char *buf;
1749 char *p;
1750 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001751 if (encoding == NULL) {
1752 buf = s;
1753 u = NULL;
1754 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1755 buf = s;
1756 u = NULL;
1757 } else {
1758 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1759 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1760 if (u == NULL)
1761 return NULL;
1762 p = buf = PyString_AsString(u);
1763 end = s + len;
1764 while (s < end) {
1765 if (*s == '\\') {
1766 *p++ = *s++;
1767 if (*s & 0x80) {
1768 strcpy(p, "u005c");
1769 p += 5;
1770 }
1771 }
1772 if (*s & 0x80) { /* XXX inefficient */
1773 char *r;
1774 int rn, i;
1775 w = decode_utf8(&s, end, "utf-16-be");
1776 if (w == NULL) {
1777 Py_DECREF(u);
1778 return NULL;
1779 }
1780 r = PyString_AsString(w);
1781 rn = PyString_Size(w);
1782 assert(rn % 2 == 0);
1783 for (i = 0; i < rn; i += 2) {
1784 sprintf(p, "\\u%02x%02x",
1785 r[i + 0] & 0xFF,
1786 r[i + 1] & 0xFF);
1787 p += 6;
1788 }
1789 Py_DECREF(w);
1790 } else {
1791 *p++ = *s++;
1792 }
1793 }
1794 len = p - buf;
1795 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001796 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001797 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001798 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001799 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1800 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001801 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001802 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001803 return v;
1804
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001805 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001806#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001807 need_encoding = (encoding != NULL &&
1808 strcmp(encoding, "utf-8") != 0 &&
1809 strcmp(encoding, "iso-8859-1") != 0);
1810 if (rawmode || strchr(s, '\\') == NULL) {
1811 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001812#ifndef Py_USING_UNICODE
1813 /* This should not happen - we never see any other
1814 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001815 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001816#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001817 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1818 if (u == NULL)
1819 return NULL;
1820 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1821 Py_DECREF(u);
1822 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001823#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001824 } else {
1825 return PyString_FromStringAndSize(s, len);
1826 }
1827 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001828
1829 v = PyString_DecodeEscape(s, len, NULL, unicode,
1830 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001831 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001832 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001833 return v;
1834}
1835
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001837parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001838{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001840 int i;
1841 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001842 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001843 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001844 for (i = 1; i < NCH(n); i++) {
1845 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001846 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001847 if (s == NULL)
1848 goto onError;
1849 if (PyString_Check(v) && PyString_Check(s)) {
1850 PyString_ConcatAndDel(&v, s);
1851 if (v == NULL)
1852 goto onError;
1853 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001854#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001855 else {
1856 PyObject *temp;
1857 temp = PyUnicode_Concat(v, s);
1858 Py_DECREF(s);
1859 if (temp == NULL)
1860 goto onError;
1861 Py_DECREF(v);
1862 v = temp;
1863 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001864#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001865 }
1866 }
1867 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001868
1869 onError:
1870 Py_XDECREF(v);
1871 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001872}
1873
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001875com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001877 int anchor = 0;
1878 int save_begin = c->c_begin;
1879
Raymond Hettinger354433a2004-05-19 08:20:33 +00001880 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001881 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001882 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001883 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001884 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001885 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001886 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001887 c->c_loops++;
1888 com_list_iter(c, n, e, t);
1889 c->c_loops--;
1890 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1891 c->c_begin = save_begin;
1892 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001893 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001894}
1895
1896static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001897com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1898{
1899 int break_anchor = 0;
1900 int anchor = 0;
1901 int save_begin = c->c_begin;
1902
1903 REQ(n, gen_for);
1904 /* gen_for: for v in test [gen_iter] */
1905
1906 com_addfwref(c, SETUP_LOOP, &break_anchor);
1907 block_push(c, SETUP_LOOP);
1908
1909 if (is_outmost) {
1910 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1911 com_push(c, 1);
1912 }
1913 else {
1914 com_node(c, CHILD(n, 3));
1915 com_addbyte(c, GET_ITER);
1916 }
1917
1918 c->c_begin = c->c_nexti;
1919 com_set_lineno(c, c->c_last_line);
1920 com_addfwref(c, FOR_ITER, &anchor);
1921 com_push(c, 1);
1922 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1923
1924 if (NCH(n) == 5)
1925 com_gen_iter(c, CHILD(n, 4), t);
1926 else {
1927 com_test(c, t);
1928 com_addbyte(c, YIELD_VALUE);
1929 com_pop(c, 1);
1930 }
1931
1932 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1933 c->c_begin = save_begin;
1934
1935 com_backpatch(c, anchor);
1936 com_pop(c, 1); /* FOR_ITER has popped this */
1937 com_addbyte(c, POP_BLOCK);
1938 block_pop(c, SETUP_LOOP);
1939 com_backpatch(c, break_anchor);
1940}
1941
1942static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001943com_list_if(struct compiling *c, node *n, node *e, char *t)
1944{
1945 int anchor = 0;
1946 int a = 0;
1947 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001948 com_node(c, CHILD(n, 1));
1949 com_addfwref(c, JUMP_IF_FALSE, &a);
1950 com_addbyte(c, POP_TOP);
1951 com_pop(c, 1);
1952 com_list_iter(c, n, e, t);
1953 com_addfwref(c, JUMP_FORWARD, &anchor);
1954 com_backpatch(c, a);
1955 /* We jump here with an extra entry which we now pop */
1956 com_addbyte(c, POP_TOP);
1957 com_backpatch(c, anchor);
1958}
1959
1960static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001961com_gen_if(struct compiling *c, node *n, node *t)
1962{
1963 /* gen_if: 'if' test [gen_iter] */
1964 int anchor = 0;
1965 int a=0;
1966
1967 com_node(c, CHILD(n, 1));
1968 com_addfwref(c, JUMP_IF_FALSE, &a);
1969 com_addbyte(c, POP_TOP);
1970 com_pop(c, 1);
1971
1972 if (NCH(n) == 3)
1973 com_gen_iter(c, CHILD(n, 2), t);
1974 else {
1975 com_test(c, t);
1976 com_addbyte(c, YIELD_VALUE);
1977 com_pop(c, 1);
1978 }
1979 com_addfwref(c, JUMP_FORWARD, &anchor);
1980 com_backpatch(c, a);
1981 /* We jump here with an extra entry which we now pop */
1982 com_addbyte(c, POP_TOP);
1983 com_backpatch(c, anchor);
1984}
1985
1986static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001987com_list_iter(struct compiling *c,
1988 node *p, /* parent of list_iter node */
1989 node *e, /* element expression node */
1990 char *t /* name of result list temp local */)
1991{
1992 /* list_iter is the last child in a listmaker, list_for, or list_if */
1993 node *n = CHILD(p, NCH(p)-1);
1994 if (TYPE(n) == list_iter) {
1995 n = CHILD(n, 0);
1996 switch (TYPE(n)) {
1997 case list_for:
1998 com_list_for(c, n, e, t);
1999 break;
2000 case list_if:
2001 com_list_if(c, n, e, t);
2002 break;
2003 default:
2004 com_error(c, PyExc_SystemError,
2005 "invalid list_iter node type");
2006 }
2007 }
2008 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002009 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002010 com_push(c, 1);
2011 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002012 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002013 com_pop(c, 2);
2014 }
2015}
2016
2017static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002018com_gen_iter(struct compiling *c, node *n, node *t)
2019{
2020 /* gen_iter: gen_for | gen_if */
2021 node *ch;
2022 REQ(n, gen_iter);
2023
2024 ch = CHILD(n, 0);
2025
2026 switch (TYPE(ch)) {
2027 case gen_for:
2028 com_gen_for(c, ch, t, 0);
2029 break;
2030 case gen_if:
2031 com_gen_if(c, ch, t);
2032 break;
2033 default:
2034 com_error(c, PyExc_SystemError,
2035 "invalid gen_iter node type");
2036 }
2037}
2038
2039static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002040com_list_comprehension(struct compiling *c, node *n)
2041{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002042 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002043 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002044
2045 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002046 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002047 com_addoparg(c, BUILD_LIST, 0);
2048 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2049 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002050 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002051 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002052 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002053 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002054 --c->c_tmpname;
2055}
2056
2057static void
2058com_listmaker(struct compiling *c, node *n)
2059{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002060 /* listmaker: test ( list_for | (',' test)* [','] ) */
2061 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002062 com_list_comprehension(c, n);
2063 else {
2064 int len = 0;
2065 int i;
2066 for (i = 0; i < NCH(n); i += 2, len++)
2067 com_node(c, CHILD(n, i));
2068 com_addoparg(c, BUILD_LIST, len);
2069 com_pop(c, len-1);
2070 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071}
2072
2073static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002074com_generator_expression(struct compiling *c, node *n)
2075{
2076 /* testlist_gexp: test gen_for */
2077 /* argument: test gen_for */
2078 PyCodeObject *co;
2079
2080 REQ(CHILD(n, 0), test);
2081 REQ(CHILD(n, 1), gen_for);
2082
2083 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2084 n->n_lineno);
2085 co = icompile(n, c);
2086 symtable_exit_scope(c->c_symtable);
2087
2088 if (co == NULL)
2089 c->c_errors++;
2090 else {
2091 int closure = com_make_closure(c, co);
2092 int i = com_addconst(c, (PyObject *)co);
2093
2094 com_addoparg(c, LOAD_CONST, i);
2095 com_push(c, 1);
2096 if (closure)
2097 com_addoparg(c, MAKE_CLOSURE, 0);
2098 else
2099 com_addoparg(c, MAKE_FUNCTION, 0);
2100
2101 com_test(c, CHILD(CHILD(n, 1), 3));
2102 com_addbyte(c, GET_ITER);
2103 com_addoparg(c, CALL_FUNCTION, 1);
2104 com_pop(c, 1);
2105
2106 Py_DECREF(co);
2107 }
2108}
2109
2110static void
2111com_testlist_gexp(struct compiling *c, node *n)
2112{
2113 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2114 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2115 com_generator_expression(c, n);
2116 else com_list(c, n, 0);
2117}
2118
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002119
Raymond Hettinger354433a2004-05-19 08:20:33 +00002120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002121com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002122{
2123 int i;
2124 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2125 for (i = 0; i+2 < NCH(n); i += 4) {
2126 /* We must arrange things just right for STORE_SUBSCR.
2127 It wants the stack to look like (value) (dict) (key) */
2128 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002129 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002130 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002131 com_node(c, CHILD(n, i+2)); /* value */
2132 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002133 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002134 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002135 }
2136}
2137
2138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002139com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140{
2141 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002143 int i;
2144 REQ(n, atom);
2145 ch = CHILD(n, 0);
2146 switch (TYPE(ch)) {
2147 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002148 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002149 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002150 com_push(c, 1);
2151 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002152 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002153 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002155 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002156 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002157 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 com_push(c, 1);
2159 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002160 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002161 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002163 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002166 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002167 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002168 break;
2169 case BACKQUOTE:
2170 com_node(c, CHILD(n, 1));
2171 com_addbyte(c, UNARY_CONVERT);
2172 break;
2173 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002174 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002175 i = 255;
2176 }
2177 else {
2178 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002180 }
2181 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002182 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002183 break;
2184 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002185 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002186 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002187 c->c_errors++;
2188 i = 255;
2189 }
2190 else {
2191 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 }
2194 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002195 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002196 break;
2197 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002198 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002199 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002200 break;
2201 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 com_error(c, PyExc_SystemError,
2203 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002204 }
2205}
2206
2207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002209{
2210 if (NCH(n) == 1) {
2211 com_addbyte(c, op);
2212 }
2213 else if (NCH(n) == 2) {
2214 if (TYPE(CHILD(n, 0)) != COLON) {
2215 com_node(c, CHILD(n, 0));
2216 com_addbyte(c, op+1);
2217 }
2218 else {
2219 com_node(c, CHILD(n, 1));
2220 com_addbyte(c, op+2);
2221 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002222 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002223 }
2224 else {
2225 com_node(c, CHILD(n, 0));
2226 com_node(c, CHILD(n, 2));
2227 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002228 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229 }
2230}
2231
Guido van Rossum635abd21997-01-06 22:56:52 +00002232static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002233com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2234{
2235 if (NCH(n) == 1) {
2236 com_addbyte(c, DUP_TOP);
2237 com_push(c, 1);
2238 com_addbyte(c, SLICE);
2239 com_node(c, augn);
2240 com_addbyte(c, opcode);
2241 com_pop(c, 1);
2242 com_addbyte(c, ROT_TWO);
2243 com_addbyte(c, STORE_SLICE);
2244 com_pop(c, 2);
2245 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2246 com_node(c, CHILD(n, 0));
2247 com_addoparg(c, DUP_TOPX, 2);
2248 com_push(c, 2);
2249 com_addbyte(c, SLICE+1);
2250 com_pop(c, 1);
2251 com_node(c, augn);
2252 com_addbyte(c, opcode);
2253 com_pop(c, 1);
2254 com_addbyte(c, ROT_THREE);
2255 com_addbyte(c, STORE_SLICE+1);
2256 com_pop(c, 3);
2257 } else if (NCH(n) == 2) {
2258 com_node(c, CHILD(n, 1));
2259 com_addoparg(c, DUP_TOPX, 2);
2260 com_push(c, 2);
2261 com_addbyte(c, SLICE+2);
2262 com_pop(c, 1);
2263 com_node(c, augn);
2264 com_addbyte(c, opcode);
2265 com_pop(c, 1);
2266 com_addbyte(c, ROT_THREE);
2267 com_addbyte(c, STORE_SLICE+2);
2268 com_pop(c, 3);
2269 } else {
2270 com_node(c, CHILD(n, 0));
2271 com_node(c, CHILD(n, 2));
2272 com_addoparg(c, DUP_TOPX, 3);
2273 com_push(c, 3);
2274 com_addbyte(c, SLICE+3);
2275 com_pop(c, 2);
2276 com_node(c, augn);
2277 com_addbyte(c, opcode);
2278 com_pop(c, 1);
2279 com_addbyte(c, ROT_FOUR);
2280 com_addbyte(c, STORE_SLICE+3);
2281 com_pop(c, 4);
2282 }
2283}
2284
2285static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002286com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002287{
2288 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002289 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002290 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002291 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002293 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002294 }
2295 else {
2296 com_node(c, CHILD(n, 0));
2297 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002298 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002299 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002300 if (NCH(n) == 2) {
2301 com_generator_expression(c, n);
2302 return;
2303 }
2304
Guido van Rossumf10570b1995-07-07 22:53:21 +00002305 m = n;
2306 do {
2307 m = CHILD(m, 0);
2308 } while (NCH(m) == 1);
2309 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002310 /* f(lambda x: x[0] = 3) ends up getting parsed with
2311 * LHS test = lambda x: x[0], and RHS test = 3.
2312 * SF bug 132313 points out that complaining about a keyword
2313 * then is very confusing.
2314 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002316 TYPE(m) == lambdef ?
2317 "lambda cannot contain assignment" :
2318 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002319 }
2320 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002322 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002323 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002325 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002326 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002327 else if (*pkeywords == NULL) {
2328 c->c_errors++;
2329 Py_DECREF(v);
2330 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 if (PyDict_GetItem(*pkeywords, v) != NULL)
2332 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002333 "duplicate keyword argument");
2334 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002335 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002336 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002337 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002340 }
2341 }
2342 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002343}
2344
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002346com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347{
2348 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002349 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002353 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002354 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002355 int star_flag = 0;
2356 int starstar_flag = 0;
2357 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002358 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002359 na = 0;
2360 nk = 0;
2361 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002362 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002363 if (TYPE(ch) == STAR ||
2364 TYPE(ch) == DOUBLESTAR)
2365 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002366 if (ch->n_lineno != lineno) {
2367 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002368 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002369 }
2370 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002371 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002372 na++;
2373 else
2374 nk++;
2375 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002377 while (i < NCH(n)) {
2378 node *tok = CHILD(n, i);
2379 node *ch = CHILD(n, i+1);
2380 i += 3;
2381 switch (TYPE(tok)) {
2382 case STAR: star_flag = 1; break;
2383 case DOUBLESTAR: starstar_flag = 1; break;
2384 }
2385 com_node(c, ch);
2386 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002387 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 com_error(c, PyExc_SyntaxError,
2389 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002390 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002391 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002392 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002393 star_flag + (starstar_flag << 1);
2394 else
2395 opcode = CALL_FUNCTION;
2396 com_addoparg(c, opcode, na | (nk << 8));
2397 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 }
2399}
2400
2401static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002402com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002403{
2404 com_addopname(c, LOAD_ATTR, n);
2405}
2406
2407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002408com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002409{
2410 int i=0;
2411 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002412 node *ch;
2413
2414 /* first argument */
2415 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002416 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002417 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002418 i++;
2419 }
2420 else {
2421 com_node(c, CHILD(n,i));
2422 i++;
2423 REQ(CHILD(n,i),COLON);
2424 i++;
2425 }
2426 /* second argument */
2427 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2428 com_node(c, CHILD(n,i));
2429 i++;
2430 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002431 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002432 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002433 com_push(c, 1);
2434 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002435 /* remaining arguments */
2436 for (; i < NCH(n); i++) {
2437 ns++;
2438 ch=CHILD(n,i);
2439 REQ(ch, sliceop);
2440 if (NCH(ch) == 1) {
2441 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002443 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002444 }
2445 else
2446 com_node(c, CHILD(ch,1));
2447 }
2448 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002449 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002450}
2451
2452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002453com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002454{
2455 node *ch;
2456 REQ(n, subscript);
2457 ch = CHILD(n,0);
2458 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002460 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_push(c, 1);
2462 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002463 else {
2464 /* check for slice */
2465 if ((TYPE(ch) == COLON || NCH(n) > 1))
2466 com_sliceobj(c, n);
2467 else {
2468 REQ(ch, test);
2469 com_node(c, ch);
2470 }
2471 }
2472}
2473
2474static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002475com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002476{
2477 int i, op;
2478 REQ(n, subscriptlist);
2479 /* Check to make backward compatible slice behavior for '[i:j]' */
2480 if (NCH(n) == 1) {
2481 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002482 /* 'Basic' slice, should have exactly one colon. */
2483 if ((TYPE(CHILD(sub, 0)) == COLON
2484 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2485 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2486 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002487 switch (assigning) {
2488 case OP_DELETE:
2489 op = DELETE_SLICE;
2490 break;
2491 case OP_ASSIGN:
2492 op = STORE_SLICE;
2493 break;
2494 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002495 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002496 break;
2497 default:
2498 com_augassign_slice(c, sub, assigning, augn);
2499 return;
2500 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002501 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002502 if (op == STORE_SLICE)
2503 com_pop(c, 2);
2504 else if (op == DELETE_SLICE)
2505 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002506 return;
2507 }
2508 }
2509 /* Else normal subscriptlist. Compile each subscript. */
2510 for (i = 0; i < NCH(n); i += 2)
2511 com_subscript(c, CHILD(n, i));
2512 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002513 if (NCH(n) > 1) {
2514 i = (NCH(n)+1) / 2;
2515 com_addoparg(c, BUILD_TUPLE, i);
2516 com_pop(c, i-1);
2517 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002518 switch (assigning) {
2519 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002520 op = DELETE_SUBSCR;
2521 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002522 break;
2523 default:
2524 case OP_ASSIGN:
2525 op = STORE_SUBSCR;
2526 i = 3;
2527 break;
2528 case OP_APPLY:
2529 op = BINARY_SUBSCR;
2530 i = 1;
2531 break;
2532 }
2533 if (assigning > OP_APPLY) {
2534 com_addoparg(c, DUP_TOPX, 2);
2535 com_push(c, 2);
2536 com_addbyte(c, BINARY_SUBSCR);
2537 com_pop(c, 1);
2538 com_node(c, augn);
2539 com_addbyte(c, assigning);
2540 com_pop(c, 1);
2541 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002542 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002543 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002544 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002545}
2546
2547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002548com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549{
2550 REQ(n, trailer);
2551 switch (TYPE(CHILD(n, 0))) {
2552 case LPAR:
2553 com_call_function(c, CHILD(n, 1));
2554 break;
2555 case DOT:
2556 com_select_member(c, CHILD(n, 1));
2557 break;
2558 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002559 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002560 break;
2561 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002562 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002563 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564 }
2565}
2566
2567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002569{
2570 int i;
2571 REQ(n, power);
2572 com_atom(c, CHILD(n, 0));
2573 for (i = 1; i < NCH(n); i++) {
2574 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2575 com_factor(c, CHILD(n, i+1));
2576 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002578 break;
2579 }
2580 else
2581 com_apply_trailer(c, CHILD(n, i));
2582 }
2583}
2584
2585static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002586com_invert_constant(struct compiling *c, node *n)
2587{
2588 /* Compute the inverse of int and longs and use them directly,
2589 but be prepared to generate code for all other
2590 possibilities (invalid numbers, floats, complex).
2591 */
2592 PyObject *num, *inv = NULL;
2593 int i;
2594
2595 REQ(n, NUMBER);
2596 num = parsenumber(c, STR(n));
2597 if (num == NULL)
2598 i = 255;
2599 else {
2600 inv = PyNumber_Invert(num);
2601 if (inv == NULL) {
2602 PyErr_Clear();
2603 i = com_addconst(c, num);
2604 } else {
2605 i = com_addconst(c, inv);
2606 Py_DECREF(inv);
2607 }
2608 Py_DECREF(num);
2609 }
2610 com_addoparg(c, LOAD_CONST, i);
2611 com_push(c, 1);
2612 if (num != NULL && inv == NULL)
2613 com_addbyte(c, UNARY_INVERT);
2614}
2615
Tim Peters51e26512001-09-07 08:45:55 +00002616static int
2617is_float_zero(const char *p)
2618{
2619 int found_radix_point = 0;
2620 int ch;
2621 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2622 switch (ch) {
2623 case '0':
2624 /* no reason to believe it's not 0 -- continue */
2625 break;
2626
2627 case 'e': case 'E': case 'j': case 'J':
2628 /* If this was a hex constant, we already would have
2629 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2630 must be an exponent marker, and we haven't yet
2631 seen a non-zero digit, and it doesn't matter what
2632 the exponent is then. For 'j' or 'J' similarly,
2633 except that this is an imaginary 0 then. */
2634 return 1;
2635
2636 case '.':
2637 found_radix_point = 1;
2638 break;
2639
2640 default:
2641 return 0;
2642 }
2643 }
2644 return found_radix_point;
2645}
2646
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002648com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002650 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002651 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002652 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002653 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002654 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002655 approriate value as a constant. If the value is negative,
2656 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002657 negative in the 0th position -- unless we're doing unary minus
2658 of a floating zero! In that case the sign is significant, but
2659 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002660 */
2661 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002662 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002663 && TYPE((pfactor = CHILD(n, 1))) == factor
2664 && NCH(pfactor) == 1
2665 && TYPE((ppower = CHILD(pfactor, 0))) == power
2666 && NCH(ppower) == 1
2667 && TYPE((patom = CHILD(ppower, 0))) == atom
2668 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002669 && !(childtype == MINUS &&
2670 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002671 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002672 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002673 return;
2674 }
2675 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002676 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002677 if (s == NULL) {
2678 com_error(c, PyExc_MemoryError, "");
2679 com_addbyte(c, 255);
2680 return;
2681 }
2682 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002683 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002684 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002685 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002686 }
Tim Peters51e26512001-09-07 08:45:55 +00002687 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002688 }
2689 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 com_factor(c, CHILD(n, 1));
2691 com_addbyte(c, UNARY_POSITIVE);
2692 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002693 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002694 com_factor(c, CHILD(n, 1));
2695 com_addbyte(c, UNARY_NEGATIVE);
2696 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002697 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002698 com_factor(c, CHILD(n, 1));
2699 com_addbyte(c, UNARY_INVERT);
2700 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002701 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002702 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704}
2705
2706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002707com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708{
2709 int i;
2710 int op;
2711 REQ(n, term);
2712 com_factor(c, CHILD(n, 0));
2713 for (i = 2; i < NCH(n); i += 2) {
2714 com_factor(c, CHILD(n, i));
2715 switch (TYPE(CHILD(n, i-1))) {
2716 case STAR:
2717 op = BINARY_MULTIPLY;
2718 break;
2719 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002720 if (c->c_flags & CO_FUTURE_DIVISION)
2721 op = BINARY_TRUE_DIVIDE;
2722 else
2723 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 break;
2725 case PERCENT:
2726 op = BINARY_MODULO;
2727 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002728 case DOUBLESLASH:
2729 op = BINARY_FLOOR_DIVIDE;
2730 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002731 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002732 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002733 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002734 op = 255;
2735 }
2736 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002737 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002738 }
2739}
2740
2741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002742com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002743{
2744 int i;
2745 int op;
2746 REQ(n, arith_expr);
2747 com_term(c, CHILD(n, 0));
2748 for (i = 2; i < NCH(n); i += 2) {
2749 com_term(c, CHILD(n, i));
2750 switch (TYPE(CHILD(n, i-1))) {
2751 case PLUS:
2752 op = BINARY_ADD;
2753 break;
2754 case MINUS:
2755 op = BINARY_SUBTRACT;
2756 break;
2757 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002758 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002759 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002760 op = 255;
2761 }
2762 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002764 }
2765}
2766
2767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002768com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002769{
2770 int i;
2771 int op;
2772 REQ(n, shift_expr);
2773 com_arith_expr(c, CHILD(n, 0));
2774 for (i = 2; i < NCH(n); i += 2) {
2775 com_arith_expr(c, CHILD(n, i));
2776 switch (TYPE(CHILD(n, i-1))) {
2777 case LEFTSHIFT:
2778 op = BINARY_LSHIFT;
2779 break;
2780 case RIGHTSHIFT:
2781 op = BINARY_RSHIFT;
2782 break;
2783 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002784 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002785 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002786 op = 255;
2787 }
2788 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002789 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002790 }
2791}
2792
2793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002795{
2796 int i;
2797 int op;
2798 REQ(n, and_expr);
2799 com_shift_expr(c, CHILD(n, 0));
2800 for (i = 2; i < NCH(n); i += 2) {
2801 com_shift_expr(c, CHILD(n, i));
2802 if (TYPE(CHILD(n, i-1)) == AMPER) {
2803 op = BINARY_AND;
2804 }
2805 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002806 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002807 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002808 op = 255;
2809 }
2810 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002811 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002812 }
2813}
2814
2815static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002816com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002817{
2818 int i;
2819 int op;
2820 REQ(n, xor_expr);
2821 com_and_expr(c, CHILD(n, 0));
2822 for (i = 2; i < NCH(n); i += 2) {
2823 com_and_expr(c, CHILD(n, i));
2824 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2825 op = BINARY_XOR;
2826 }
2827 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002828 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002829 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002830 op = 255;
2831 }
2832 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 }
2835}
2836
2837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002838com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002839{
2840 int i;
2841 int op;
2842 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002843 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002845 com_xor_expr(c, CHILD(n, i));
2846 if (TYPE(CHILD(n, i-1)) == VBAR) {
2847 op = BINARY_OR;
2848 }
2849 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002850 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002851 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002852 op = 255;
2853 }
2854 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002855 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002856 }
2857}
2858
2859static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002860cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002861{
2862 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002863 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2865 if (NCH(n) == 1) {
2866 n = CHILD(n, 0);
2867 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002868 case LESS: return PyCmp_LT;
2869 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002870 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002871 case LESSEQUAL: return PyCmp_LE;
2872 case GREATEREQUAL: return PyCmp_GE;
2873 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2874 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2875 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 }
2877 }
2878 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002879 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002881 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002883 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 }
2885 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002886 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887}
2888
2889static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002890com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002891{
2892 int i;
2893 enum cmp_op op;
2894 int anchor;
2895 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2896 com_expr(c, CHILD(n, 0));
2897 if (NCH(n) == 1)
2898 return;
2899
2900 /****************************************************************
2901 The following code is generated for all but the last
2902 comparison in a chain:
2903
2904 label: on stack: opcode: jump to:
2905
2906 a <code to load b>
2907 a, b DUP_TOP
2908 a, b, b ROT_THREE
2909 b, a, b COMPARE_OP
2910 b, 0-or-1 JUMP_IF_FALSE L1
2911 b, 1 POP_TOP
2912 b
2913
2914 We are now ready to repeat this sequence for the next
2915 comparison in the chain.
2916
2917 For the last we generate:
2918
2919 b <code to load c>
2920 b, c COMPARE_OP
2921 0-or-1
2922
2923 If there were any jumps to L1 (i.e., there was more than one
2924 comparison), we generate:
2925
2926 0-or-1 JUMP_FORWARD L2
2927 L1: b, 0 ROT_TWO
2928 0, b POP_TOP
2929 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002930 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002931 ****************************************************************/
2932
2933 anchor = 0;
2934
2935 for (i = 2; i < NCH(n); i += 2) {
2936 com_expr(c, CHILD(n, i));
2937 if (i+2 < NCH(n)) {
2938 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002939 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002940 com_addbyte(c, ROT_THREE);
2941 }
2942 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002943 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002944 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002945 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946 }
2947 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002948 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 if (i+2 < NCH(n)) {
2950 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2951 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002952 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953 }
2954 }
2955
2956 if (anchor) {
2957 int anchor2 = 0;
2958 com_addfwref(c, JUMP_FORWARD, &anchor2);
2959 com_backpatch(c, anchor);
2960 com_addbyte(c, ROT_TWO);
2961 com_addbyte(c, POP_TOP);
2962 com_backpatch(c, anchor2);
2963 }
2964}
2965
2966static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002967com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968{
2969 REQ(n, not_test); /* 'not' not_test | comparison */
2970 if (NCH(n) == 1) {
2971 com_comparison(c, CHILD(n, 0));
2972 }
2973 else {
2974 com_not_test(c, CHILD(n, 1));
2975 com_addbyte(c, UNARY_NOT);
2976 }
2977}
2978
2979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002981{
2982 int i;
2983 int anchor;
2984 REQ(n, and_test); /* not_test ('and' not_test)* */
2985 anchor = 0;
2986 i = 0;
2987 for (;;) {
2988 com_not_test(c, CHILD(n, i));
2989 if ((i += 2) >= NCH(n))
2990 break;
2991 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2992 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 }
2995 if (anchor)
2996 com_backpatch(c, anchor);
2997}
2998
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002999static int
3000com_make_closure(struct compiling *c, PyCodeObject *co)
3001{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003002 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003003 if (free == 0)
3004 return 0;
3005 for (i = 0; i < free; ++i) {
3006 /* Bypass com_addop_varname because it will generate
3007 LOAD_DEREF but LOAD_CLOSURE is needed.
3008 */
3009 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3010 int arg, reftype;
3011
3012 /* Special case: If a class contains a method with a
3013 free variable that has the same name as a method,
3014 the name will be considered free *and* local in the
3015 class. It should be handled by the closure, as
3016 well as by the normal name loookup logic.
3017 */
3018 reftype = get_ref_type(c, PyString_AS_STRING(name));
3019 if (reftype == CELL)
3020 arg = com_lookup_arg(c->c_cellvars, name);
3021 else /* (reftype == FREE) */
3022 arg = com_lookup_arg(c->c_freevars, name);
3023 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003024 fprintf(stderr, "lookup %s in %s %d %d\n"
3025 "freevars of %s: %s\n",
3026 PyObject_REPR(name),
3027 c->c_name,
3028 reftype, arg,
3029 PyString_AS_STRING(co->co_name),
3030 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003031 Py_FatalError("com_make_closure()");
3032 }
3033 com_addoparg(c, LOAD_CLOSURE, arg);
3034
3035 }
3036 com_push(c, free);
3037 return 1;
3038}
3039
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003041com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003044 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003045 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003046 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003047 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003048 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3049 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003050 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003051 if (co == NULL) {
3052 c->c_errors++;
3053 return;
3054 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003055 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003056 i = com_addconst(c, (PyObject *)co);
3057 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003058 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003059 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003060 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003061 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003062 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003063 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003064 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003065 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003066 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003068 else {
3069 int anchor = 0;
3070 int i = 0;
3071 for (;;) {
3072 com_and_test(c, CHILD(n, i));
3073 if ((i += 2) >= NCH(n))
3074 break;
3075 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3076 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003077 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003078 }
3079 if (anchor)
3080 com_backpatch(c, anchor);
3081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082}
3083
3084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003085com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086{
3087 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003088 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089 com_node(c, CHILD(n, 0));
3090 }
3091 else {
3092 int i;
3093 int len;
3094 len = (NCH(n) + 1) / 2;
3095 for (i = 0; i < NCH(n); i += 2)
3096 com_node(c, CHILD(n, i));
3097 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 }
3100}
3101
3102
3103/* Begin of assignment compilation */
3104
Thomas Wouters434d0822000-08-24 20:11:32 +00003105
3106static void
3107com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3108{
3109 com_addbyte(c, DUP_TOP);
3110 com_push(c, 1);
3111 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003112 com_node(c, augn);
3113 com_addbyte(c, opcode);
3114 com_pop(c, 1);
3115 com_addbyte(c, ROT_TWO);
3116 com_addopname(c, STORE_ATTR, n);
3117 com_pop(c, 2);
3118}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119
3120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003121com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003123 if (none_assignment_check(c, STR(n), assigning))
3124 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003125 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003126 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127}
3128
3129static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003130com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003131{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 REQ(n, trailer);
3133 switch (TYPE(CHILD(n, 0))) {
3134 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003135 if (assigning == OP_DELETE)
3136 com_error(c, PyExc_SyntaxError,
3137 "can't delete function call");
3138 else
3139 com_error(c, PyExc_SyntaxError,
3140 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 break;
3142 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003143 if (assigning > OP_APPLY)
3144 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3145 else
3146 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003148 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003149 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 break;
3151 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003152 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 }
3154}
3155
3156static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003157com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158{
3159 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003160 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3161 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003163 if (assigning) {
3164 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003165 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003166 com_push(c, i-1);
3167 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003169 com_assign(c, CHILD(n, i), assigning, NULL);
3170}
3171
3172static void
3173com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3174{
3175 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003176 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003177 com_push(c, 1);
3178 com_node(c, augn);
3179 com_addbyte(c, opcode);
3180 com_pop(c, 1);
3181 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182}
3183
3184static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003185com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186{
3187 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003188 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 if (assigning)
3190 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191}
3192
3193static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003194com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195{
3196 /* Loop to avoid trivial recursion */
3197 for (;;) {
3198 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003199
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200 case exprlist:
3201 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003202 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003203 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003205 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003206 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003207 "assign to generator expression not possible");
3208 return;
3209 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003210 if (assigning > OP_APPLY) {
3211 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003212 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003213 return;
3214 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003215 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003216 return;
3217 }
3218 n = CHILD(n, 0);
3219 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003220
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221 case test:
3222 case and_test:
3223 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003224 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003226 case xor_expr:
3227 case and_expr:
3228 case shift_expr:
3229 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003231 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003233 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003234 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 return;
3236 }
3237 n = CHILD(n, 0);
3238 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003239
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003240 case power: /* atom trailer* ('**' power)*
3241 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003242 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003243 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003244 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 return;
3246 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003247 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 int i;
3249 com_node(c, CHILD(n, 0));
3250 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003251 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003252 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003253 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003254 return;
3255 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003256 com_apply_trailer(c, CHILD(n, i));
3257 } /* NB i is still alive */
3258 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003259 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260 return;
3261 }
3262 n = CHILD(n, 0);
3263 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003264
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 case atom:
3266 switch (TYPE(CHILD(n, 0))) {
3267 case LPAR:
3268 n = CHILD(n, 1);
3269 if (TYPE(n) == RPAR) {
3270 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003271 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003272 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 return;
3274 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003275 if (assigning > OP_APPLY) {
3276 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003277 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003278 return;
3279 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 break;
3281 case LSQB:
3282 n = CHILD(n, 1);
3283 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003284 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003285 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 return;
3287 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003288 if (assigning > OP_APPLY) {
3289 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003290 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003291 return;
3292 }
3293 if (NCH(n) > 1
3294 && TYPE(CHILD(n, 1)) == list_for) {
3295 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003296 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003297 return;
3298 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003299 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 return;
3301 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003302 if (assigning > OP_APPLY)
3303 com_augassign_name(c, CHILD(n, 0),
3304 assigning, augn);
3305 else
3306 com_assign_name(c, CHILD(n, 0),
3307 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 return;
3309 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003310 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003311 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003312 return;
3313 }
3314 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003315
3316 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003317 com_error(c, PyExc_SyntaxError,
3318 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003319 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003320
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003322 com_error(c, PyExc_SystemError,
3323 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003325
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326 }
3327 }
3328}
Guido van Rossum7c531111997-03-11 18:42:21 +00003329
Thomas Wouters434d0822000-08-24 20:11:32 +00003330static void
3331com_augassign(struct compiling *c, node *n)
3332{
3333 int opcode;
3334
3335 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3336 case '+': opcode = INPLACE_ADD; break;
3337 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003338 case '/':
3339 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3340 opcode = INPLACE_FLOOR_DIVIDE;
3341 else if (c->c_flags & CO_FUTURE_DIVISION)
3342 opcode = INPLACE_TRUE_DIVIDE;
3343 else
3344 opcode = INPLACE_DIVIDE;
3345 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003346 case '%': opcode = INPLACE_MODULO; break;
3347 case '<': opcode = INPLACE_LSHIFT; break;
3348 case '>': opcode = INPLACE_RSHIFT; break;
3349 case '&': opcode = INPLACE_AND; break;
3350 case '^': opcode = INPLACE_XOR; break;
3351 case '|': opcode = INPLACE_OR; break;
3352 case '*':
3353 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3354 opcode = INPLACE_POWER;
3355 else
3356 opcode = INPLACE_MULTIPLY;
3357 break;
3358 default:
3359 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3360 return;
3361 }
3362 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3363}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364
3365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003366com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367{
Thomas Wouters434d0822000-08-24 20:11:32 +00003368 REQ(n, expr_stmt);
3369 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003370 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003371 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003372 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003373 if (NCH(n) == 1) {
3374 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003375 if (c->c_interactive)
3376 com_addbyte(c, PRINT_EXPR);
3377 else
3378 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003379 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003381 else if (TYPE(CHILD(n,1)) == augassign)
3382 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383 else {
3384 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003385 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003386 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003388 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 com_push(c, 1);
3390 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003391 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 }
3393 }
3394}
3395
3396static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003397com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003398{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003399 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003400 int i;
3401 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003402 if (Py_OptimizeFlag)
3403 return;
3404 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003405
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003406 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003407 raise AssertionError [, <message>]
3408
3409 where <message> is the second test, if present.
3410 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003411 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003412 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003413 com_addbyte(c, POP_TOP);
3414 com_pop(c, 1);
3415 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003416 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003417 com_push(c, 1);
3418 i = NCH(n)/2; /* Either 2 or 4 */
3419 if (i > 1)
3420 com_node(c, CHILD(n, 3));
3421 com_addoparg(c, RAISE_VARARGS, i);
3422 com_pop(c, i);
3423 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003424 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003425 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003426 com_addbyte(c, POP_TOP);
3427}
3428
3429static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003430com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003432 int i = 1;
3433 node* stream = NULL;
3434
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003435 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003436
3437 /* are we using the extended print form? */
3438 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3439 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003440 com_node(c, stream);
3441 /* stack: [...] => [... stream] */
3442 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003443 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3444 i = 4;
3445 else
3446 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003448 for (; i < NCH(n); i += 2) {
3449 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003450 com_addbyte(c, DUP_TOP);
3451 /* stack: [stream] => [stream stream] */
3452 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003453 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003454 /* stack: [stream stream] => [stream stream obj] */
3455 com_addbyte(c, ROT_TWO);
3456 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003457 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003458 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003459 com_pop(c, 2);
3460 }
3461 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003462 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003463 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003464 com_addbyte(c, PRINT_ITEM);
3465 com_pop(c, 1);
3466 }
3467 }
3468 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003469 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003470 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003471 /* must pop the extra stream object off the stack */
3472 com_addbyte(c, POP_TOP);
3473 /* stack: [... stream] => [...] */
3474 com_pop(c, 1);
3475 }
3476 }
3477 else {
3478 if (stream != NULL) {
3479 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003480 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003481 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003482 com_pop(c, 1);
3483 }
3484 else
3485 com_addbyte(c, PRINT_NEWLINE);
3486 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487}
3488
3489static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003490com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003492 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003493 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003494 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003495 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003496 if (c->c_flags & CO_GENERATOR) {
3497 if (NCH(n) > 1) {
3498 com_error(c, PyExc_SyntaxError,
3499 "'return' with argument inside generator");
3500 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003501 }
3502 if (NCH(n) < 2) {
3503 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003504 com_push(c, 1);
3505 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003506 else
3507 com_node(c, CHILD(n, 1));
3508 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003509 com_pop(c, 1);
3510}
3511
3512static void
3513com_yield_stmt(struct compiling *c, node *n)
3514{
Tim Peters95c80f82001-06-23 02:07:08 +00003515 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003516 REQ(n, yield_stmt); /* 'yield' testlist */
3517 if (!c->c_infunction) {
3518 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3519 }
Tim Peters95c80f82001-06-23 02:07:08 +00003520
3521 for (i = 0; i < c->c_nblocks; ++i) {
3522 if (c->c_block[i] == SETUP_FINALLY) {
3523 com_error(c, PyExc_SyntaxError,
3524 "'yield' not allowed in a 'try' block "
3525 "with a 'finally' clause");
3526 return;
3527 }
3528 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003529 com_node(c, CHILD(n, 1));
3530 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532}
3533
3534static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003535com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003536{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003538 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3539 if (NCH(n) > 1) {
3540 com_node(c, CHILD(n, 1));
3541 if (NCH(n) > 3) {
3542 com_node(c, CHILD(n, 3));
3543 if (NCH(n) > 5)
3544 com_node(c, CHILD(n, 5));
3545 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003546 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 i = NCH(n)/2;
3548 com_addoparg(c, RAISE_VARARGS, i);
3549 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550}
3551
3552static void
Thomas Wouters52152252000-08-17 22:55:00 +00003553com_from_import(struct compiling *c, node *n)
3554{
3555 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3556 com_push(c, 1);
3557 if (NCH(n) > 1) {
3558 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3559 com_error(c, PyExc_SyntaxError, "invalid syntax");
3560 return;
3561 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003562 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003563 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003564 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003565 com_pop(c, 1);
3566}
3567
3568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003569com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003571 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 int i;
3573 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003574 n = CHILD(n, 0);
3575 /* import_stmt: import_name | import_from */
3576 if (TYPE(n) == import_from) {
3577 /* 'from' dotted_name 'import' ('*' |
3578 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003579 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003580 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003581 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3582 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003583 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003584 else {
3585 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3586 TYPE(CHILD(n, 3)) != LPAR) {
3587 com_error(c, PyExc_SyntaxError,
3588 "trailing comma not allowed "
3589 "without surrounding parentheses");
3590 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003591 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003592 REQ(nn, import_as_names);
3593 tup = PyTuple_New((NCH(nn) + 1) / 2);
3594 for (i = 0; i < NCH(nn); i += 2)
3595 PyTuple_SET_ITEM(tup, i / 2,
3596 PyString_FromString(STR(
3597 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003598 }
3599 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003600 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003601 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003602 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003603 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003604 com_addbyte(c, IMPORT_STAR);
3605 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003606 for (i = 0; i < NCH(nn); i += 2)
3607 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003608 com_addbyte(c, POP_TOP);
3609 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003610 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 }
3612 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003613 /* 'import' dotted_as_names */
3614 nn = CHILD(n, 1);
3615 REQ(nn, dotted_as_names);
3616 for (i = 0; i < NCH(nn); i += 2) {
3617 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003618 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003619 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003621 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003622 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003623 int j;
3624 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003625 com_error(c, PyExc_SyntaxError,
3626 "invalid syntax");
3627 return;
3628 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003629 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3630 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003631 CHILD(CHILD(subn, 0),
3632 j));
3633 com_addop_varname(c, VAR_STORE,
3634 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003635 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003636 com_addop_varname(c, VAR_STORE,
3637 STR(CHILD(CHILD(subn, 0),
3638 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003639 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003640 }
3641 }
3642}
3643
3644static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003645com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003646{
3647 REQ(n, exec_stmt);
3648 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3649 com_node(c, CHILD(n, 1));
3650 if (NCH(n) >= 4)
3651 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003652 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 com_push(c, 1);
3655 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003656 if (NCH(n) >= 6)
3657 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003658 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003659 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 com_push(c, 1);
3661 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003662 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003663 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003664}
3665
Guido van Rossum7c531111997-03-11 18:42:21 +00003666static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003667is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003668{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003669 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003670 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003671 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003672
3673 /* Label to avoid tail recursion */
3674 next:
3675 switch (TYPE(n)) {
3676
3677 case suite:
3678 if (NCH(n) == 1) {
3679 n = CHILD(n, 0);
3680 goto next;
3681 }
3682 /* Fall through */
3683 case file_input:
3684 for (i = 0; i < NCH(n); i++) {
3685 node *ch = CHILD(n, i);
3686 if (TYPE(ch) == stmt) {
3687 n = ch;
3688 goto next;
3689 }
3690 }
3691 break;
3692
3693 case stmt:
3694 case simple_stmt:
3695 case small_stmt:
3696 n = CHILD(n, 0);
3697 goto next;
3698
3699 case expr_stmt:
3700 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003701 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003702 case test:
3703 case and_test:
3704 case not_test:
3705 case comparison:
3706 case expr:
3707 case xor_expr:
3708 case and_expr:
3709 case shift_expr:
3710 case arith_expr:
3711 case term:
3712 case factor:
3713 case power:
3714 case atom:
3715 if (NCH(n) == 1) {
3716 n = CHILD(n, 0);
3717 goto next;
3718 }
3719 break;
3720
3721 case NAME:
3722 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3723 return 1;
3724 break;
3725
3726 case NUMBER:
3727 v = parsenumber(c, STR(n));
3728 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003729 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003730 break;
3731 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003732 i = PyObject_IsTrue(v);
3733 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003734 return i == 0;
3735
3736 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003737 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003738 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003739 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003740 break;
3741 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003742 i = PyObject_IsTrue(v);
3743 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003744 return i == 0;
3745
3746 }
3747 return 0;
3748}
3749
Tim Peters08a898f2001-06-28 01:52:22 +00003750
3751/* Look under n for a return stmt with an expression.
3752 * This hack is used to find illegal returns under "if 0:" blocks in
3753 * functions already known to be generators (as determined by the symtable
3754 * pass).
3755 * Return the offending return node if found, else NULL.
3756 */
3757static node *
3758look_for_offending_return(node *n)
3759{
3760 int i;
3761
3762 for (i = 0; i < NCH(n); ++i) {
3763 node *kid = CHILD(n, i);
3764
3765 switch (TYPE(kid)) {
3766 case classdef:
3767 case funcdef:
3768 case lambdef:
3769 /* Stuff in nested functions & classes doesn't
3770 affect the code block we started in. */
3771 return NULL;
3772
3773 case return_stmt:
3774 if (NCH(kid) > 1)
3775 return kid;
3776 break;
3777
3778 default: {
3779 node *bad = look_for_offending_return(kid);
3780 if (bad != NULL)
3781 return bad;
3782 }
3783 }
3784 }
3785
3786 return NULL;
3787}
3788
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003790com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003791{
3792 int i;
3793 int anchor = 0;
3794 REQ(n, if_stmt);
3795 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3796 for (i = 0; i+3 < NCH(n); i+=4) {
3797 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003798 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003799 if (is_constant_false(c, ch)) {
3800 /* We're going to skip this block. However, if this
3801 is a generator, we have to check the dead code
3802 anyway to make sure there aren't any return stmts
3803 with expressions, in the same scope. */
3804 if (c->c_flags & CO_GENERATOR) {
3805 node *p = look_for_offending_return(n);
3806 if (p != NULL) {
3807 int savelineno = c->c_lineno;
3808 c->c_lineno = p->n_lineno;
3809 com_error(c, PyExc_SyntaxError,
3810 "'return' with argument "
3811 "inside generator");
3812 c->c_lineno = savelineno;
3813 }
3814 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003815 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003816 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003817 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003818 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003819 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003820 com_addfwref(c, JUMP_IF_FALSE, &a);
3821 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003823 com_node(c, CHILD(n, i+3));
3824 com_addfwref(c, JUMP_FORWARD, &anchor);
3825 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003826 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003827 com_addbyte(c, POP_TOP);
3828 }
3829 if (i+2 < NCH(n))
3830 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003831 if (anchor)
3832 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003833}
3834
3835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003836com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837{
3838 int break_anchor = 0;
3839 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003840 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003841 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3842 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003843 block_push(c, SETUP_LOOP);
3844 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003845 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003846 com_node(c, CHILD(n, 1));
3847 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3848 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003850 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003852 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003853 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3854 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003856 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857 com_addbyte(c, POP_TOP);
3858 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003859 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003860 if (NCH(n) > 4)
3861 com_node(c, CHILD(n, 6));
3862 com_backpatch(c, break_anchor);
3863}
3864
3865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003866com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003867{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 int break_anchor = 0;
3869 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003870 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003871 REQ(n, for_stmt);
3872 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3873 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003874 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003875 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003876 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003877 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003878 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003879 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003880 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003881 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003882 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003884 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003885 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3886 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003887 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003888 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003890 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 if (NCH(n) > 8)
3892 com_node(c, CHILD(n, 8));
3893 com_backpatch(c, break_anchor);
3894}
3895
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003896/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003897
3898 SETUP_FINALLY L
3899 <code for S>
3900 POP_BLOCK
3901 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003902 L: <code for Sf>
3903 END_FINALLY
3904
3905 The special instructions use the block stack. Each block
3906 stack entry contains the instruction that created it (here
3907 SETUP_FINALLY), the level of the value stack at the time the
3908 block stack entry was created, and a label (here L).
3909
3910 SETUP_FINALLY:
3911 Pushes the current value stack level and the label
3912 onto the block stack.
3913 POP_BLOCK:
3914 Pops en entry from the block stack, and pops the value
3915 stack until its level is the same as indicated on the
3916 block stack. (The label is ignored.)
3917 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003918 Pops a variable number of entries from the *value* stack
3919 and re-raises the exception they specify. The number of
3920 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003921
3922 The block stack is unwound when an exception is raised:
3923 when a SETUP_FINALLY entry is found, the exception is pushed
3924 onto the value stack (and the exception condition is cleared),
3925 and the interpreter jumps to the label gotten from the block
3926 stack.
3927
3928 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003929 (The contents of the value stack is shown in [], with the top
3930 at the right; 'tb' is trace-back info, 'val' the exception's
3931 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003932
3933 Value stack Label Instruction Argument
3934 [] SETUP_EXCEPT L1
3935 [] <code for S>
3936 [] POP_BLOCK
3937 [] JUMP_FORWARD L0
3938
Guido van Rossum3f5da241990-12-20 15:06:42 +00003939 [tb, val, exc] L1: DUP )
3940 [tb, val, exc, exc] <evaluate E1> )
3941 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3942 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3943 [tb, val, exc, 1] POP )
3944 [tb, val, exc] POP
3945 [tb, val] <assign to V1> (or POP if no V1)
3946 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003947 [] <code for S1>
3948 JUMP_FORWARD L0
3949
Guido van Rossum3f5da241990-12-20 15:06:42 +00003950 [tb, val, exc, 0] L2: POP
3951 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003952 .............................etc.......................
3953
Guido van Rossum3f5da241990-12-20 15:06:42 +00003954 [tb, val, exc, 0] Ln+1: POP
3955 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003956
3957 [] L0: <next statement>
3958
3959 Of course, parts are not generated if Vi or Ei is not present.
3960*/
3961
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003963com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003964{
3965 int except_anchor = 0;
3966 int end_anchor = 0;
3967 int else_anchor = 0;
3968 int i;
3969 node *ch;
3970
3971 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3972 block_push(c, SETUP_EXCEPT);
3973 com_node(c, CHILD(n, 2));
3974 com_addbyte(c, POP_BLOCK);
3975 block_pop(c, SETUP_EXCEPT);
3976 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3977 com_backpatch(c, except_anchor);
3978 for (i = 3;
3979 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3980 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003981 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003982 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003983 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003984 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003985 break;
3986 }
3987 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003988 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003989 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003990 if (NCH(ch) > 1) {
3991 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003992 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003993 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003994 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003996 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3997 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003998 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003999 }
4000 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004001 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004002 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004003 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004004 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004005 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 com_pop(c, 1);
4007 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004008 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004009 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004010 com_node(c, CHILD(n, i+2));
4011 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4012 if (except_anchor) {
4013 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004014 /* We come in with [tb, val, exc, 0] on the
4015 stack; one pop and it's the same as
4016 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004017 com_addbyte(c, POP_TOP);
4018 }
4019 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 /* We actually come in here with [tb, val, exc] but the
4021 END_FINALLY will zap those and jump around.
4022 The c_stacklevel does not reflect them so we need not pop
4023 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004024 com_addbyte(c, END_FINALLY);
4025 com_backpatch(c, else_anchor);
4026 if (i < NCH(n))
4027 com_node(c, CHILD(n, i+2));
4028 com_backpatch(c, end_anchor);
4029}
4030
4031static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004032com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004033{
4034 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004035 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004036
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004037 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4038 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004039 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004040 com_addbyte(c, POP_BLOCK);
4041 block_pop(c, SETUP_FINALLY);
4042 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004043 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004044 /* While the generated code pushes only one item,
4045 the try-finally handling can enter here with
4046 up to three items. OK, here are the details:
4047 3 for an exception, 2 for RETURN, 1 for BREAK. */
4048 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004049 com_backpatch(c, finally_anchor);
4050 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004051 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004052 com_node(c, ch);
4053 com_addbyte(c, END_FINALLY);
4054 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004055 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004056}
4057
4058static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004059com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004060{
4061 REQ(n, try_stmt);
4062 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4063 | 'try' ':' suite 'finally' ':' suite */
4064 if (TYPE(CHILD(n, 3)) != except_clause)
4065 com_try_finally(c, n);
4066 else
4067 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068}
4069
Guido van Rossum8b993a91997-01-17 21:04:03 +00004070static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004071get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004072{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004073 int i;
4074
Guido van Rossum8b993a91997-01-17 21:04:03 +00004075 /* Label to avoid tail recursion */
4076 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004077 switch (TYPE(n)) {
4078
4079 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080 if (NCH(n) == 1) {
4081 n = CHILD(n, 0);
4082 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004083 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004084 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004085 case file_input:
4086 for (i = 0; i < NCH(n); i++) {
4087 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004088 if (TYPE(ch) == stmt) {
4089 n = ch;
4090 goto next;
4091 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004092 }
4093 break;
4094
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004095 case stmt:
4096 case simple_stmt:
4097 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004098 n = CHILD(n, 0);
4099 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004100
4101 case expr_stmt:
4102 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004103 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004104 case test:
4105 case and_test:
4106 case not_test:
4107 case comparison:
4108 case expr:
4109 case xor_expr:
4110 case and_expr:
4111 case shift_expr:
4112 case arith_expr:
4113 case term:
4114 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004115 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004116 if (NCH(n) == 1) {
4117 n = CHILD(n, 0);
4118 goto next;
4119 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004120 break;
4121
4122 case atom:
4123 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004124 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004125 break;
4126
4127 }
4128 return NULL;
4129}
4130
Guido van Rossum79f25d91997-04-29 20:08:16 +00004131static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004132get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004133{
Guido van Rossum541563e1999-01-28 15:08:09 +00004134 /* Don't generate doc-strings if run with -OO */
4135 if (Py_OptimizeFlag > 1)
4136 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 n = get_rawdocstring(n);
4138 if (n == NULL)
4139 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004140 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004141}
4142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004143static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004144com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145{
4146 REQ(n, suite);
4147 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4148 if (NCH(n) == 1) {
4149 com_node(c, CHILD(n, 0));
4150 }
4151 else {
4152 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004153 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004154 node *ch = CHILD(n, i);
4155 if (TYPE(ch) == stmt)
4156 com_node(c, ch);
4157 }
4158 }
4159}
4160
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004161/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004162static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004163com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004164{
4165 int i = c->c_nblocks;
4166 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4167 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4168 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004169 else if (i <= 0) {
4170 /* at the outer level */
4171 com_error(c, PyExc_SyntaxError,
4172 "'continue' not properly in loop");
4173 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004174 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004175 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004176 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004177 if (c->c_block[j] == SETUP_LOOP)
4178 break;
4179 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004180 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004181 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004182 for (; i > j; --i) {
4183 if (c->c_block[i] == SETUP_EXCEPT ||
4184 c->c_block[i] == SETUP_FINALLY) {
4185 com_addoparg(c, CONTINUE_LOOP,
4186 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004187 return;
4188 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004189 if (c->c_block[i] == END_FINALLY) {
4190 com_error(c, PyExc_SyntaxError,
4191 "'continue' not supported inside 'finally' clause");
4192 return;
4193 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004194 }
4195 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004196 com_error(c, PyExc_SyntaxError,
4197 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004198 }
4199 /* XXX Could allow it inside a 'finally' clause
4200 XXX if we could pop the exception still on the stack */
4201}
4202
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004203/* Return the number of default values in the argument list.
4204
4205 If a non-default argument follows a default argument, set an
4206 exception and return -1.
4207*/
4208
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004209static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004210com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004211{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004212 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004213 if (TYPE(n) == lambdef) {
4214 /* lambdef: 'lambda' [varargslist] ':' test */
4215 n = CHILD(n, 1);
4216 }
4217 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004218 REQ(n, funcdef);
4219 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4220 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004221 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4222 n = CHILD(n, 1);
4223 }
4224 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004225 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004226 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004227 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004228 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4229 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004230 ndefs = 0;
4231 for (i = 0; i < nch; i++) {
4232 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004233 if (TYPE(CHILD(n, i)) == STAR ||
4234 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004235 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 i++;
4237 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004238 t = RPAR; /* Anything except EQUAL or COMMA */
4239 else
4240 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004241 if (t == EQUAL) {
4242 i++;
4243 ndefs++;
4244 com_node(c, CHILD(n, i));
4245 i++;
4246 if (i >= nch)
4247 break;
4248 t = TYPE(CHILD(n, i));
4249 }
4250 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004251 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004252 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004253 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004254 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004255 return -1;
4256 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004257 }
4258 if (t != COMMA)
4259 break;
4260 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004261 return ndefs;
4262}
4263
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004264static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004265com_decorator_name(struct compiling *c, node *n)
4266{
4267 /* dotted_name: NAME ('.' NAME)* */
4268
4269 int i, nch;
4270 node *varname;
4271
4272 REQ(n, dotted_name);
4273 nch = NCH(n);
4274 assert(nch >= 1 && nch % 2 == 1);
4275
4276 varname = CHILD(n, 0);
4277 REQ(varname, NAME);
4278 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004279 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004280
4281 for (i = 1; i < nch; i += 2) {
4282 node *attrname;
4283
4284 REQ(CHILD(n, i), DOT);
4285
4286 attrname = CHILD(n, i + 1);
4287 REQ(attrname, NAME);
4288 com_addop_name(c, LOAD_ATTR, STR(attrname));
4289 }
4290}
4291
4292static void
4293com_decorator(struct compiling *c, node *n)
4294{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004295 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004296 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004297 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004298 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004299 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004300 com_decorator_name(c, CHILD(n, 1));
4301
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004302 if (nch > 3) {
4303 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004304 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004305 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004306 com_call_function(c, CHILD(n, 3));
4307 }
4308}
4309
4310static int
4311com_decorators(struct compiling *c, node *n)
4312{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004313 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004314
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004315 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004316 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004317 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004318
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004319 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004320 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004321 REQ(ch, decorator);
4322
4323 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004324 }
4325
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004326 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004327}
4328
4329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004330com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004331{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004332 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004333 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004334
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004335 REQ(n, funcdef);
4336 /* -6 -5 -4 -3 -2 -1
4337 funcdef: [decorators] 'def' NAME parameters ':' suite */
4338
4339 if (NCH(n) == 6)
4340 ndecorators = com_decorators(c, CHILD(n, 0));
4341 else
4342 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004343
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004344 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004345 if (ndefs < 0)
4346 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004347 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004348 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004350 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004352 c->c_errors++;
4353 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004354 int closure = com_make_closure(c, (PyCodeObject *)co);
4355 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004357 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004358 if (closure)
4359 com_addoparg(c, MAKE_CLOSURE, ndefs);
4360 else
4361 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004362 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004363
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004364 while (ndecorators > 0) {
4365 com_addoparg(c, CALL_FUNCTION, 1);
4366 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004367 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004368 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004369
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004370 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004371 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004372 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004373 }
4374}
4375
4376static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004377com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004378{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004379 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004380 REQ(n, testlist);
4381 /* testlist: test (',' test)* [','] */
4382 for (i = 0; i < NCH(n); i += 2)
4383 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004384 i = (NCH(n)+1) / 2;
4385 com_addoparg(c, BUILD_TUPLE, i);
4386 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004387}
4388
4389static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004390com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004391{
Guido van Rossum25831651993-05-19 14:50:45 +00004392 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004393 PyObject *v;
4394 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004395 char *name;
4396
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004397 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004398 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004399 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004400 c->c_errors++;
4401 return;
4402 }
4403 /* Push the class name on the stack */
4404 i = com_addconst(c, v);
4405 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004406 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004407 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004408 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004409 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004410 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004411 com_push(c, 1);
4412 }
Guido van Rossum25831651993-05-19 14:50:45 +00004413 else
4414 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004415 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004416 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004417 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004419 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004420 c->c_errors++;
4421 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004422 int closure = com_make_closure(c, co);
4423 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004424 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004425 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004426 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004427 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004428 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004429 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004430 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004431 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004432 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004433 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004434 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004435 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004436 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004437 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004438}
4439
4440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004441com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004442{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004443 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004444 if (c->c_errors)
4445 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004446 switch (TYPE(n)) {
4447
4448 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004449
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004450 case funcdef:
4451 com_funcdef(c, n);
4452 break;
4453 case classdef:
4454 com_classdef(c, n);
4455 break;
4456
4457 /* Trivial parse tree nodes */
4458
4459 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004460 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004461 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004462 n = CHILD(n, 0);
4463 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004464
4465 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004466 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004467 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004468 {
4469 int i;
4470 for (i = 0; i < NCH(n)-1; i += 2)
4471 com_node(c, CHILD(n, i));
4472 }
4473 break;
4474
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004475 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004476 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004477 n = CHILD(n, 0);
4478 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004479
4480 /* Statement nodes */
4481
4482 case expr_stmt:
4483 com_expr_stmt(c, n);
4484 break;
4485 case print_stmt:
4486 com_print_stmt(c, n);
4487 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004488 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004489 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004490 break;
4491 case pass_stmt:
4492 break;
4493 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004494 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004495 com_error(c, PyExc_SyntaxError,
4496 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004498 com_addbyte(c, BREAK_LOOP);
4499 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004500 case continue_stmt:
4501 com_continue_stmt(c, n);
4502 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503 case return_stmt:
4504 com_return_stmt(c, n);
4505 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004506 case yield_stmt:
4507 com_yield_stmt(c, n);
4508 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004509 case raise_stmt:
4510 com_raise_stmt(c, n);
4511 break;
4512 case import_stmt:
4513 com_import_stmt(c, n);
4514 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004515 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004516 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004517 case exec_stmt:
4518 com_exec_stmt(c, n);
4519 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004520 case assert_stmt:
4521 com_assert_stmt(c, n);
4522 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004523 case if_stmt:
4524 com_if_stmt(c, n);
4525 break;
4526 case while_stmt:
4527 com_while_stmt(c, n);
4528 break;
4529 case for_stmt:
4530 com_for_stmt(c, n);
4531 break;
4532 case try_stmt:
4533 com_try_stmt(c, n);
4534 break;
4535 case suite:
4536 com_suite(c, n);
4537 break;
4538
4539 /* Expression nodes */
4540
4541 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004542 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004543 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004544 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004545 break;
4546 case test:
4547 com_test(c, n);
4548 break;
4549 case and_test:
4550 com_and_test(c, n);
4551 break;
4552 case not_test:
4553 com_not_test(c, n);
4554 break;
4555 case comparison:
4556 com_comparison(c, n);
4557 break;
4558 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004559 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004560 break;
4561 case expr:
4562 com_expr(c, n);
4563 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004564 case xor_expr:
4565 com_xor_expr(c, n);
4566 break;
4567 case and_expr:
4568 com_and_expr(c, n);
4569 break;
4570 case shift_expr:
4571 com_shift_expr(c, n);
4572 break;
4573 case arith_expr:
4574 com_arith_expr(c, n);
4575 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004576 case term:
4577 com_term(c, n);
4578 break;
4579 case factor:
4580 com_factor(c, n);
4581 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004582 case power:
4583 com_power(c, n);
4584 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004585 case atom:
4586 com_atom(c, n);
4587 break;
4588
4589 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004590 com_error(c, PyExc_SystemError,
4591 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004592 }
4593}
4594
Tim Petersdbd9ba62000-07-09 03:09:57 +00004595static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004596
4597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004598com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004599{
4600 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4601 if (TYPE(CHILD(n, 0)) == LPAR)
4602 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004603 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004605 com_pop(c, 1);
4606 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004607}
4608
4609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004610com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004611{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004612 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004613 if (NCH(n) == 1) {
4614 com_fpdef(c, CHILD(n, 0));
4615 }
4616 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004617 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004618 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004619 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004620 for (i = 0; i < NCH(n); i += 2)
4621 com_fpdef(c, CHILD(n, i));
4622 }
4623}
4624
4625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004626com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004627{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004628 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004629 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004630 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004631 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004632 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004633 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004634 nch = NCH(n);
4635 /* Enter all arguments in table of locals */
4636 for (i = 0, narg = 0; i < nch; i++) {
4637 node *ch = CHILD(n, i);
4638 node *fp;
4639 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004640 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004641 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4642 fp = CHILD(ch, 0);
4643 if (TYPE(fp) != NAME) {
4644 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4645 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004646 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004647 narg++;
4648 /* all name updates handled by symtable */
4649 if (++i >= nch)
4650 break;
4651 ch = CHILD(n, i);
4652 if (TYPE(ch) == EQUAL)
4653 i += 2;
4654 else
4655 REQ(ch, COMMA);
4656 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004657 if (complex) {
4658 /* Generate code for complex arguments only after
4659 having counted the simple arguments */
4660 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004661 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004662 node *ch = CHILD(n, i);
4663 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004664 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004665 break;
4666 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4667 fp = CHILD(ch, 0);
4668 if (TYPE(fp) != NAME) {
4669 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004670 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004671 com_fpdef(c, ch);
4672 }
4673 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004674 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004675 break;
4676 ch = CHILD(n, i);
4677 if (TYPE(ch) == EQUAL)
4678 i += 2;
4679 else
4680 REQ(ch, COMMA);
4681 }
4682 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004683}
4684
4685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004686com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004687{
4688 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004689 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004690 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004691 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004692 if (doc != NULL) {
4693 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004694 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004695 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004696 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004697 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004698 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004699 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004700 for (i = 0; i < NCH(n); i++) {
4701 node *ch = CHILD(n, i);
4702 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4703 com_node(c, ch);
4704 }
4705}
4706
4707/* Top-level compile-node interface */
4708
4709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004710compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004711{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004712 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004713 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004714 REQ(n, funcdef);
4715 /* -6 -5 -4 -3 -2 -1
4716 funcdef: [decorators] 'def' NAME parameters ':' suite */
4717 c->c_name = STR(RCHILD(n, -4));
4718 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004719 if (doc != NULL) {
4720 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004721 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004722 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004723 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004724 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004725 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004726 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004727 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004728 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004729 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004730 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004731 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004732 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004733 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4734 com_push(c, 1);
4735 com_addbyte(c, RETURN_VALUE);
4736 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004737}
4738
4739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004740compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004741{
Guido van Rossum590baa41993-11-30 13:40:46 +00004742 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004743 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004744 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004745
4746 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004747 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004748 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004749 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004750 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004751 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004752 else
4753 ch = CHILD(n, 2);
4754 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004755 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004756 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004757}
4758
4759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004760compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004761{
4762 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004763 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004764 REQ(n, classdef);
4765 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4766 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004767 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004768 /* Initialize local __module__ from global __name__ */
4769 com_addop_name(c, LOAD_GLOBAL, "__name__");
4770 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004771 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004772 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004773 if (doc != NULL) {
4774 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004775 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004776 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004777 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004779 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004780 }
4781 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004782 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004783 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004784 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004785 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004786 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004787 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004788 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004789}
4790
4791static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004792compile_generator_expression(struct compiling *c, node *n)
4793{
4794 /* testlist_gexp: test gen_for */
4795 /* argument: test gen_for */
4796 REQ(CHILD(n, 0), test);
4797 REQ(CHILD(n, 1), gen_for);
4798
4799 c->c_name = "<generator expression>";
4800 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4801
4802 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4803 com_push(c, 1);
4804 com_addbyte(c, RETURN_VALUE);
4805 com_pop(c, 1);
4806}
4807
4808static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004809compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004810{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004811 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004812
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004813 switch (TYPE(n)) {
4814
Guido van Rossum4c417781991-01-21 16:09:22 +00004815 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004816 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004817 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004818 n = CHILD(n, 0);
4819 if (TYPE(n) != NEWLINE)
4820 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004821 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004822 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4823 com_push(c, 1);
4824 com_addbyte(c, RETURN_VALUE);
4825 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004826 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004827 break;
4828
Guido van Rossum4c417781991-01-21 16:09:22 +00004829 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004830 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004831 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004832 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4833 com_push(c, 1);
4834 com_addbyte(c, RETURN_VALUE);
4835 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004836 break;
4837
Guido van Rossum590baa41993-11-30 13:40:46 +00004838 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004839 com_node(c, CHILD(n, 0));
4840 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004841 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004842 break;
4843
Guido van Rossum590baa41993-11-30 13:40:46 +00004844 case lambdef: /* anonymous function definition */
4845 compile_lambdef(c, n);
4846 break;
4847
Guido van Rossum4c417781991-01-21 16:09:22 +00004848 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004849 compile_funcdef(c, n);
4850 break;
4851
Guido van Rossum4c417781991-01-21 16:09:22 +00004852 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004853 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004854 break;
4855
Raymond Hettinger354433a2004-05-19 08:20:33 +00004856 case testlist_gexp: /* A generator expression */
4857 case argument: /* A generator expression */
4858 compile_generator_expression(c, n);
4859 break;
4860
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004861 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004862 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004863 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004864 }
4865}
4866
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867static PyObject *
4868dict_keys_inorder(PyObject *dict, int offset)
4869{
4870 PyObject *tuple, *k, *v;
4871 int i, pos = 0, size = PyDict_Size(dict);
4872
4873 tuple = PyTuple_New(size);
4874 if (tuple == NULL)
4875 return NULL;
4876 while (PyDict_Next(dict, &pos, &k, &v)) {
4877 i = PyInt_AS_LONG(v);
4878 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004879 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004880 PyTuple_SET_ITEM(tuple, i - offset, k);
4881 }
4882 return tuple;
4883}
4884
Guido van Rossum79f25d91997-04-29 20:08:16 +00004885PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004886PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004887{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004888 return PyNode_CompileFlags(n, filename, NULL);
4889}
4890
4891PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004892PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004893{
4894 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004895}
4896
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004897struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004898PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004899{
4900 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004901 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004902
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004903 ff = PyNode_Future(n, filename);
4904 if (ff == NULL)
4905 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004906 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004907 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004908 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004909 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004910 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004911 return st;
4912}
4913
Guido van Rossum79f25d91997-04-29 20:08:16 +00004914static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004915icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004916{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004917 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004918}
4919
Guido van Rossum79f25d91997-04-29 20:08:16 +00004920static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004921jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004922 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004923{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004924 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004925 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004926 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004927 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004928 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4929 sc.c_encoding = "utf-8";
4930 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004931 sc.c_encoding = STR(n);
4932 n = CHILD(n, 0);
4933 } else {
4934 sc.c_encoding = NULL;
4935 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004937 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004939 /* c_symtable still points to parent's symbols */
4940 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004941 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004942 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004943 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004944 if (base->c_encoding != NULL) {
4945 assert(sc.c_encoding == NULL);
4946 sc.c_encoding = base->c_encoding;
4947 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004949 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004950 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004951 if (sc.c_future == NULL) {
4952 com_free(&sc);
4953 return NULL;
4954 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004955 if (flags) {
4956 int merged = sc.c_future->ff_features |
4957 flags->cf_flags;
4958 sc.c_future->ff_features = merged;
4959 flags->cf_flags = merged;
4960 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004961 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4962 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004963 com_free(&sc);
4964 return NULL;
4965 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004966 /* reset symbol table for second pass */
4967 sc.c_symtable->st_nscopes = 1;
4968 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004969 }
4970 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004971 if (symtable_load_symbols(&sc) < 0) {
4972 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004974 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004975 compile_node(&sc, n);
4976 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004977 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004978 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004979 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004980 names = PyList_AsTuple(sc.c_names);
4981 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004982 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4983 freevars = dict_keys_inorder(sc.c_freevars,
4984 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004985 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004986 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00004987 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
4988 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004989 if (!PyErr_Occurred())
4990 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004991 sc.c_nlocals,
4992 sc.c_maxstacklevel,
4993 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004994 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004995 consts,
4996 names,
4997 varnames,
4998 freevars,
4999 cellvars,
5000 filename,
5001 name,
5002 sc.c_firstlineno,
5003 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005004 Py_XDECREF(consts);
5005 Py_XDECREF(names);
5006 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005007 Py_XDECREF(freevars);
5008 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005009 Py_XDECREF(filename);
5010 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005011 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005012 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005013 else if (!PyErr_Occurred()) {
5014 /* This could happen if someone called PyErr_Clear() after an
5015 error was reported above. That's not supposed to happen,
5016 but I just plugged one case and I'm not sure there can't be
5017 others. In that case, raise SystemError so that at least
5018 it gets reported instead dumping core. */
5019 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5020 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005021 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005022 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005023 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005024 sc.c_symtable = NULL;
5025 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005026 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005027 return co;
5028}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005029
5030int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005031PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005032{
5033 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005034 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005035 int line = co->co_firstlineno;
5036 int addr = 0;
5037 while (--size >= 0) {
5038 addr += *p++;
5039 if (addr > addrq)
5040 break;
5041 line += *p++;
5042 }
5043 return line;
5044}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005045
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005046/* The test for LOCAL must come before the test for FREE in order to
5047 handle classes where name is both local and free. The local var is
5048 a method and the free var is a free var referenced within a method.
5049*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005050
5051static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005052get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005053{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005054 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005056
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005057 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5058 return CELL;
5059 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5060 return LOCAL;
5061 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5062 return FREE;
5063 v = PyDict_GetItemString(c->c_globals, name);
5064 if (v) {
5065 if (v == Py_None)
5066 return GLOBAL_EXPLICIT;
5067 else {
5068 return GLOBAL_IMPLICIT;
5069 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005070 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005071 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005072 "unknown scope for %.100s in %.100s(%s) "
5073 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5074 name, c->c_name,
5075 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5076 c->c_filename,
5077 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5078 PyObject_REPR(c->c_locals),
5079 PyObject_REPR(c->c_globals)
5080 );
5081
5082 Py_FatalError(buf);
5083 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005084}
5085
Guido van Rossum207fda62001-03-02 03:30:41 +00005086/* Helper functions to issue warnings */
5087
5088static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005089issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005090{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005091 if (PyErr_Occurred()) {
5092 /* This can happen because symtable_node continues
5093 processing even after raising a SyntaxError.
5094 Calling PyErr_WarnExplicit now would clobber the
5095 pending exception; instead we fail and let that
5096 exception propagate.
5097 */
5098 return -1;
5099 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005100 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5101 lineno, NULL, NULL) < 0) {
5102 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5103 PyErr_SetString(PyExc_SyntaxError, msg);
5104 PyErr_SyntaxLocation(filename, lineno);
5105 }
5106 return -1;
5107 }
5108 return 0;
5109}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005110
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005111static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005112symtable_warn(struct symtable *st, char *msg)
5113{
Guido van Rossum207fda62001-03-02 03:30:41 +00005114 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005115 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005116 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005117 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005118 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005119}
5120
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005121/* Helper function for setting lineno and filename */
5122
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005123static struct symtable *
5124symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005126 struct symtable *st;
5127
5128 st = symtable_init();
5129 if (st == NULL)
5130 return NULL;
5131 st->st_future = ff;
5132 st->st_filename = filename;
5133 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5134 if (st->st_errors > 0)
5135 goto fail;
5136 symtable_node(st, n);
5137 if (st->st_errors > 0)
5138 goto fail;
5139 return st;
5140 fail:
5141 if (!PyErr_Occurred()) {
5142 /* This could happen because after a syntax error is
5143 detected, the symbol-table-building continues for
5144 a while, and PyErr_Clear() might erroneously be
5145 called during that process. One such case has been
5146 fixed, but there might be more (now or later).
5147 */
5148 PyErr_SetString(PyExc_SystemError, "lost exception");
5149 }
5150 st->st_future = NULL;
5151 st->st_filename = NULL;
5152 PySymtable_Free(st);
5153 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154}
5155
5156static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005157symtable_init_compiling_symbols(struct compiling *c)
5158{
5159 PyObject *varnames;
5160
5161 varnames = c->c_symtable->st_cur->ste_varnames;
5162 if (varnames == NULL) {
5163 varnames = PyList_New(0);
5164 if (varnames == NULL)
5165 return -1;
5166 c->c_symtable->st_cur->ste_varnames = varnames;
5167 Py_INCREF(varnames);
5168 } else
5169 Py_INCREF(varnames);
5170 c->c_varnames = varnames;
5171
5172 c->c_globals = PyDict_New();
5173 if (c->c_globals == NULL)
5174 return -1;
5175 c->c_freevars = PyDict_New();
5176 if (c->c_freevars == NULL)
5177 return -1;
5178 c->c_cellvars = PyDict_New();
5179 if (c->c_cellvars == NULL)
5180 return -1;
5181 return 0;
5182}
5183
5184struct symbol_info {
5185 int si_nlocals;
5186 int si_ncells;
5187 int si_nfrees;
5188 int si_nimplicit;
5189};
5190
5191static void
5192symtable_init_info(struct symbol_info *si)
5193{
5194 si->si_nlocals = 0;
5195 si->si_ncells = 0;
5196 si->si_nfrees = 0;
5197 si->si_nimplicit = 0;
5198}
5199
5200static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005201symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005202 struct symbol_info *si)
5203{
5204 PyObject *dict, *v;
5205
5206 /* Seperate logic for DEF_FREE. If it occurs in a function,
5207 it indicates a local that we must allocate storage for (a
5208 cell var). If it occurs in a class, then the class has a
5209 method and a free variable with the same name.
5210 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005211 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005212 /* If it isn't declared locally, it can't be a cell. */
5213 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5214 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005215 v = PyInt_FromLong(si->si_ncells++);
5216 dict = c->c_cellvars;
5217 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005218 /* If it is free anyway, then there is no need to do
5219 anything here.
5220 */
5221 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005222 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005223 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005224 v = PyInt_FromLong(si->si_nfrees++);
5225 dict = c->c_freevars;
5226 }
5227 if (v == NULL)
5228 return -1;
5229 if (PyDict_SetItem(dict, name, v) < 0) {
5230 Py_DECREF(v);
5231 return -1;
5232 }
5233 Py_DECREF(v);
5234 return 0;
5235}
5236
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005237/* If a variable is a cell and an argument, make sure that appears in
5238 co_cellvars before any variable to its right in varnames.
5239*/
5240
5241
5242static int
5243symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5244 PyObject *varnames, int flags)
5245{
Tim Petersb39903b2003-03-24 17:22:24 +00005246 PyObject *v = NULL;
5247 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005248 int i, pos;
5249
5250 if (flags & CO_VARARGS)
5251 argcount++;
5252 if (flags & CO_VARKEYWORDS)
5253 argcount++;
5254 for (i = argcount; --i >= 0; ) {
5255 v = PyList_GET_ITEM(varnames, i);
5256 if (PyDict_GetItem(*cellvars, v)) {
5257 if (list == NULL) {
5258 list = PyList_New(1);
5259 if (list == NULL)
5260 return -1;
5261 PyList_SET_ITEM(list, 0, v);
5262 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005263 } else {
5264 if (PyList_Insert(list, 0, v) < 0) {
5265 Py_DECREF(list);
5266 return -1;
5267 }
5268 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005269 }
5270 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005271 if (list == NULL)
5272 return 0;
5273
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005274 /* There are cellvars that are also arguments. Create a dict
5275 to replace cellvars and put the args at the front.
5276 */
5277 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005278 if (d == NULL)
5279 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005280 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5281 v = PyInt_FromLong(i);
5282 if (v == NULL)
5283 goto fail;
5284 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5285 goto fail;
5286 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5287 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005288 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005289 }
5290 pos = 0;
5291 i = PyList_GET_SIZE(list);
5292 Py_DECREF(list);
5293 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5294 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005295 if (w == NULL)
5296 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005297 if (PyDict_SetItem(d, v, w) < 0) {
5298 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005299 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005300 goto fail;
5301 }
5302 Py_DECREF(w);
5303 }
5304 Py_DECREF(*cellvars);
5305 *cellvars = d;
5306 return 1;
5307 fail:
5308 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005309 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005310 return -1;
5311}
5312
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005313static int
5314symtable_freevar_offsets(PyObject *freevars, int offset)
5315{
5316 PyObject *name, *v;
5317 int pos;
5318
5319 /* The cell vars are the first elements of the closure,
5320 followed by the free vars. Update the offsets in
5321 c_freevars to account for number of cellvars. */
5322 pos = 0;
5323 while (PyDict_Next(freevars, &pos, &name, &v)) {
5324 int i = PyInt_AS_LONG(v) + offset;
5325 PyObject *o = PyInt_FromLong(i);
5326 if (o == NULL)
5327 return -1;
5328 if (PyDict_SetItem(freevars, name, o) < 0) {
5329 Py_DECREF(o);
5330 return -1;
5331 }
5332 Py_DECREF(o);
5333 }
5334 return 0;
5335}
5336
5337static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005338symtable_check_unoptimized(struct compiling *c,
5339 PySymtableEntryObject *ste,
5340 struct symbol_info *si)
5341{
5342 char buf[300];
5343
5344 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5345 || (ste->ste_nested && si->si_nimplicit)))
5346 return 0;
5347
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005348#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5349
5350#define ILLEGAL_IS "is a nested function"
5351
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005352#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005353"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005354
5355#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005356"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005357
5358#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005359"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005360"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005361
5362 /* XXX perhaps the linenos for these opt-breaking statements
5363 should be stored so the exception can point to them. */
5364
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005365 if (ste->ste_child_free) {
5366 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005367 PyOS_snprintf(buf, sizeof(buf),
5368 ILLEGAL_IMPORT_STAR,
5369 PyString_AS_STRING(ste->ste_name),
5370 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005371 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005372 PyOS_snprintf(buf, sizeof(buf),
5373 ILLEGAL_BARE_EXEC,
5374 PyString_AS_STRING(ste->ste_name),
5375 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005376 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005377 PyOS_snprintf(buf, sizeof(buf),
5378 ILLEGAL_EXEC_AND_IMPORT_STAR,
5379 PyString_AS_STRING(ste->ste_name),
5380 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005381 }
5382 } else {
5383 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005384 PyOS_snprintf(buf, sizeof(buf),
5385 ILLEGAL_IMPORT_STAR,
5386 PyString_AS_STRING(ste->ste_name),
5387 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005388 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005389 PyOS_snprintf(buf, sizeof(buf),
5390 ILLEGAL_BARE_EXEC,
5391 PyString_AS_STRING(ste->ste_name),
5392 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005393 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005394 PyOS_snprintf(buf, sizeof(buf),
5395 ILLEGAL_EXEC_AND_IMPORT_STAR,
5396 PyString_AS_STRING(ste->ste_name),
5397 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005398 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005399 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005400
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005401 PyErr_SetString(PyExc_SyntaxError, buf);
5402 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5403 ste->ste_opt_lineno);
5404 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005405}
5406
5407static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005408symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5409 struct symbol_info *si)
5410{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005411 if (c->c_future)
5412 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005413 if (ste->ste_generator)
5414 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005415 if (ste->ste_type != TYPE_MODULE)
5416 c->c_flags |= CO_NEWLOCALS;
5417 if (ste->ste_type == TYPE_FUNCTION) {
5418 c->c_nlocals = si->si_nlocals;
5419 if (ste->ste_optimized == 0)
5420 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005421 else if (ste->ste_optimized != OPT_EXEC)
5422 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005423 }
5424 return 0;
5425}
5426
5427static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005428symtable_error(struct symtable *st, int lineno)
5429{
5430 if (lineno == 0)
5431 lineno = st->st_cur->ste_lineno;
5432 PyErr_SyntaxLocation(st->st_filename, lineno);
5433 st->st_errors++;
5434 return -1;
5435}
5436
5437static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005438symtable_load_symbols(struct compiling *c)
5439{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005440 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005441 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005442 PyObject *name, *varnames, *v;
5443 int i, flags, pos;
5444 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005445
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005446 v = NULL;
5447
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005448 if (symtable_init_compiling_symbols(c) < 0)
5449 goto fail;
5450 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005451 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452 si.si_nlocals = PyList_GET_SIZE(varnames);
5453 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005454
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005455 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005456 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005457 if (v == NULL)
5458 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459 if (PyDict_SetItem(c->c_locals,
5460 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005461 goto fail;
5462 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463 }
5464
5465 /* XXX The cases below define the rules for whether a name is
5466 local or global. The logic could probably be clearer. */
5467 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005468 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5469 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005470
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005471 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005472 /* undo the original DEF_FREE */
5473 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005475 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005476 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005477 2. Free variables in methods that are also class
5478 variables or declared global.
5479 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005480 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005481 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005482
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005483 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 c->c_argcount--;
5485 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005486 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005487 c->c_argcount--;
5488 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005489 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005491 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005492 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005493 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005494 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005495 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005497 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5499 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005500 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005501 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005502 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005505 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506 if (v == NULL)
5507 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005508 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509 goto fail;
5510 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005511 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005512 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005515 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005516 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517 if (v == NULL)
5518 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005519 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 goto fail;
5521 Py_DECREF(v);
5522 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005523 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005524 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005525 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005526 goto fail;
5527 if (st->st_nscopes != 1) {
5528 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005529 if (v == NULL)
5530 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005531 if (PyDict_SetItem(st->st_global,
5532 name, v))
5533 goto fail;
5534 Py_DECREF(v);
5535 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005536 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005537 }
5538 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005539 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5540
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005541 if (si.si_ncells > 1) { /* one cell is always in order */
5542 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5543 c->c_varnames, c->c_flags) < 0)
5544 return -1;
5545 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005546 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5547 return -1;
5548 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005549 fail:
5550 /* is this always the right thing to do? */
5551 Py_XDECREF(v);
5552 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005553}
5554
5555static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005556symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005557{
5558 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005559
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005560 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005561 if (st == NULL)
5562 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005564
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005565 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005566 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005568 goto fail;
5569 if ((st->st_symbols = PyDict_New()) == NULL)
5570 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005572 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005573 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574 st->st_private = NULL;
5575 return st;
5576 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005577 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578 return NULL;
5579}
5580
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005581void
5582PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583{
5584 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005586 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005587 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005588}
5589
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005590/* When the compiler exits a scope, it must should update the scope's
5591 free variable information with the list of free variables in its
5592 children.
5593
5594 Variables that are free in children and defined in the current
5595 scope are cellvars.
5596
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005597 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005598 false), free variables in children that are not defined here are
5599 implicit globals.
5600
5601*/
5602
5603static int
5604symtable_update_free_vars(struct symtable *st)
5605{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005606 int i, j, def;
5607 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005608 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005609
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005611 def = DEF_FREE_CLASS;
5612 else
5613 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005614 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005615 int pos = 0;
5616
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005617 if (list && PyList_SetSlice(list, 0,
5618 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005619 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005620 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005621 PyList_GET_ITEM(ste->ste_children, i);
5622 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005623 int flags = PyInt_AS_LONG(o);
5624 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005625 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005626 if (list == NULL) {
5627 list = PyList_New(0);
5628 if (list == NULL)
5629 return -1;
5630 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005631 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005632 if (PyList_Append(list, name) < 0) {
5633 Py_DECREF(list);
5634 return -1;
5635 }
5636 }
5637 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005638 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005639 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005640 v = PyDict_GetItem(ste->ste_symbols, name);
5641 /* If a name N is declared global in scope A and
5642 referenced in scope B contained (perhaps
5643 indirectly) in A and there are no scopes
5644 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005645 is global in B. Unless A is a class scope,
5646 because class scopes are not considered for
5647 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005648 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005649 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005650 int flags = PyInt_AS_LONG(v);
5651 if (flags & DEF_GLOBAL) {
5652 symtable_undo_free(st, child->ste_id,
5653 name);
5654 continue;
5655 }
5656 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005657 if (ste->ste_nested) {
5658 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005659 name, def) < 0) {
5660 Py_DECREF(list);
5661 return -1;
5662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005664 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005665 name) < 0) {
5666 Py_DECREF(list);
5667 return -1;
5668 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 }
5670 }
5671 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005672
5673 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005674 return 0;
5675}
5676
5677/* If the current scope is a non-nested class or if name is not
5678 defined in the current, non-nested scope, then it is an implicit
5679 global in all nested scopes.
5680*/
5681
5682static int
5683symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5684{
5685 PyObject *o;
5686 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005687 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005688
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005691 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 if (o == NULL)
5693 return symtable_undo_free(st, child, name);
5694 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005695
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005696 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005697 return symtable_undo_free(st, child, name);
5698 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005699 return symtable_add_def_o(st, ste->ste_symbols,
5700 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701}
5702
5703static int
5704symtable_undo_free(struct symtable *st, PyObject *id,
5705 PyObject *name)
5706{
5707 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005708 PyObject *info;
5709 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005710
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005711 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5712 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005713 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005714
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005715 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 if (info == NULL)
5717 return 0;
5718 v = PyInt_AS_LONG(info);
5719 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005720 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721 DEF_FREE_GLOBAL) < 0)
5722 return -1;
5723 } else
5724 /* If the name is defined here or declared global,
5725 then the recursion stops. */
5726 return 0;
5727
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005728 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5729 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005730 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005731 PyList_GET_ITEM(ste->ste_children, i);
5732 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005733 if (x < 0)
5734 return x;
5735 }
5736 return 0;
5737}
5738
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005739/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5740 This reference is released when the scope is exited, via the DECREF
5741 in symtable_exit_scope().
5742*/
5743
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744static int
5745symtable_exit_scope(struct symtable *st)
5746{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 int end;
5748
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005749 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005750 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005751 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5754 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005755 if (PySequence_DelItem(st->st_stack, end) < 0)
5756 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005757 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005759
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005760static void
5761symtable_enter_scope(struct symtable *st, char *name, int type,
5762 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005763{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005764 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765
5766 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005767 prev = st->st_cur;
5768 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005769 st->st_errors++;
5770 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005771 }
5772 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005773 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005774 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005775 if (st->st_cur == NULL) {
5776 st->st_errors++;
5777 return;
5778 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005779 if (strcmp(name, TOP) == 0)
5780 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005781 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005782 if (PyList_Append(prev->ste_children,
5783 (PyObject *)st->st_cur) < 0)
5784 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005785 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786}
5787
5788static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005789symtable_lookup(struct symtable *st, char *name)
5790{
5791 char buffer[MANGLE_LEN];
5792 PyObject *v;
5793 int flags;
5794
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005795 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005796 name = buffer;
5797 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5798 if (v == NULL) {
5799 if (PyErr_Occurred())
5800 return -1;
5801 else
5802 return 0;
5803 }
5804
5805 flags = PyInt_AS_LONG(v);
5806 return flags;
5807}
5808
5809static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005810symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005811{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005812 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005813 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005814 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005815
Guido van Rossumb7164622002-08-16 02:48:11 +00005816 /* Warn about None, except inside a tuple (where the assignment
5817 code already issues a warning). */
5818 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5819 *name == 'N' && strcmp(name, "None") == 0)
5820 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005821 PyErr_SetString(PyExc_SyntaxError,
5822 "Invalid syntax. Assignment to None.");
5823 symtable_error(st, 0);
5824 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005825 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005826 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005827 name = buffer;
5828 if ((s = PyString_InternFromString(name)) == NULL)
5829 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005830 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5831 Py_DECREF(s);
5832 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005833}
5834
5835/* Must only be called with mangled names */
5836
5837static int
5838symtable_add_def_o(struct symtable *st, PyObject *dict,
5839 PyObject *name, int flag)
5840{
5841 PyObject *o;
5842 int val;
5843
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005844 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005845 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005846 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005847 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005848 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005849 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005850 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005851 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005852 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005855 if (o == NULL)
5856 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005857 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005858 Py_DECREF(o);
5859 return -1;
5860 }
5861 Py_DECREF(o);
5862
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005863 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005864 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005865 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005866 } else if (flag & DEF_GLOBAL) {
5867 /* XXX need to update DEF_GLOBAL for other flags too;
5868 perhaps only DEF_FREE_GLOBAL */
5869 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005870 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005871 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005873 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005874 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005875 if (o == NULL)
5876 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005877 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005878 Py_DECREF(o);
5879 return -1;
5880 }
5881 Py_DECREF(o);
5882 }
5883 return 0;
5884}
5885
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005886#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005887
Tim Peters08a898f2001-06-28 01:52:22 +00005888/* Look for a yield stmt under n. Return 1 if found, else 0.
5889 This hack is used to look inside "if 0:" blocks (which are normally
5890 ignored) in case those are the only places a yield occurs (so that this
5891 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005892static int
5893look_for_yield(node *n)
5894{
5895 int i;
5896
5897 for (i = 0; i < NCH(n); ++i) {
5898 node *kid = CHILD(n, i);
5899
5900 switch (TYPE(kid)) {
5901
5902 case classdef:
5903 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005904 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005905 /* Stuff in nested functions and classes can't make
5906 the parent a generator. */
5907 return 0;
5908
5909 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005910 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005911
5912 default:
5913 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005914 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005915 }
5916 }
5917 return 0;
5918}
5919
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005920static void
5921symtable_node(struct symtable *st, node *n)
5922{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005923 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005924
5925 loop:
5926 switch (TYPE(n)) {
5927 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005928 char *func_name;
5929 if (NCH(n) == 6)
5930 symtable_node(st, CHILD(n, 0));
5931 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005932 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005933 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005934 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935 symtable_funcdef(st, n);
5936 symtable_exit_scope(st);
5937 break;
5938 }
5939 case lambdef:
5940 if (NCH(n) == 4)
5941 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005942 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005943 symtable_funcdef(st, n);
5944 symtable_exit_scope(st);
5945 break;
5946 case classdef: {
5947 char *tmp, *class_name = STR(CHILD(n, 1));
5948 symtable_add_def(st, class_name, DEF_LOCAL);
5949 if (TYPE(CHILD(n, 2)) == LPAR) {
5950 node *bases = CHILD(n, 3);
5951 int i;
5952 for (i = 0; i < NCH(bases); i += 2) {
5953 symtable_node(st, CHILD(bases, i));
5954 }
5955 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005956 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005957 tmp = st->st_private;
5958 st->st_private = class_name;
5959 symtable_node(st, CHILD(n, NCH(n) - 1));
5960 st->st_private = tmp;
5961 symtable_exit_scope(st);
5962 break;
5963 }
5964 case if_stmt:
5965 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005966 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5967 if (st->st_cur->ste_generator == 0)
5968 st->st_cur->ste_generator =
5969 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005970 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005971 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005972 symtable_node(st, CHILD(n, i + 1));
5973 symtable_node(st, CHILD(n, i + 3));
5974 }
5975 if (i + 2 < NCH(n))
5976 symtable_node(st, CHILD(n, i + 2));
5977 break;
5978 case global_stmt:
5979 symtable_global(st, n);
5980 break;
5981 case import_stmt:
5982 symtable_import(st, n);
5983 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005984 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005985 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005986 symtable_node(st, CHILD(n, 1));
5987 if (NCH(n) > 2)
5988 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005989 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005990 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005991 st->st_cur->ste_opt_lineno = n->n_lineno;
5992 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005993 if (NCH(n) > 4)
5994 symtable_node(st, CHILD(n, 5));
5995 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005996
5997 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005998 case assert_stmt:
5999 if (Py_OptimizeFlag)
6000 return;
6001 if (NCH(n) == 2) {
6002 n = CHILD(n, 1);
6003 goto loop;
6004 } else {
6005 symtable_node(st, CHILD(n, 1));
6006 n = CHILD(n, 3);
6007 goto loop;
6008 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006009 case except_clause:
6010 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006011 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006012 if (NCH(n) > 1) {
6013 n = CHILD(n, 1);
6014 goto loop;
6015 }
6016 break;
6017 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006018 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006020 case yield_stmt:
6021 st->st_cur->ste_generator = 1;
6022 n = CHILD(n, 1);
6023 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006024 case expr_stmt:
6025 if (NCH(n) == 1)
6026 n = CHILD(n, 0);
6027 else {
6028 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006029 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030 symtable_node(st, CHILD(n, 2));
6031 break;
6032 } else {
6033 int i;
6034 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006035 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006036 n = CHILD(n, NCH(n) - 1);
6037 }
6038 }
6039 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006040 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006041 /* only occurs when there are multiple for loops
6042 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006043 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006044 if (TYPE(n) == list_for)
6045 symtable_list_for(st, n);
6046 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006047 REQ(n, list_if);
6048 symtable_node(st, CHILD(n, 1));
6049 if (NCH(n) == 3) {
6050 n = CHILD(n, 2);
6051 goto loop;
6052 }
6053 }
6054 break;
6055 case for_stmt:
6056 symtable_assign(st, CHILD(n, 1), 0);
6057 for (i = 3; i < NCH(n); ++i)
6058 if (TYPE(CHILD(n, i)) >= single_input)
6059 symtable_node(st, CHILD(n, i));
6060 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006061 case arglist:
6062 if (NCH(n) > 1)
6063 for (i = 0; i < NCH(n); ++i) {
6064 node *ch = CHILD(n, i);
6065 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6066 TYPE(CHILD(ch, 1)) == gen_for) {
6067 PyErr_SetString(PyExc_SyntaxError,
6068 "invalid syntax");
6069 symtable_error(st, n->n_lineno);
6070 return;
6071 }
6072 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006073 /* The remaining cases fall through to default except in
6074 special circumstances. This requires the individual cases
6075 to be coded with great care, even though they look like
6076 rather innocuous. Each case must double-check TYPE(n).
6077 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006078 case decorator:
6079 if (TYPE(n) == decorator) {
6080 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6081 node *name, *varname;
6082 name = CHILD(n, 1);
6083 REQ(name, dotted_name);
6084 varname = CHILD(name, 0);
6085 REQ(varname, NAME);
6086 symtable_add_use(st, STR(varname));
6087 }
6088 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006089 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006090 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006091 n = CHILD(n, 2);
6092 goto loop;
6093 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006094 else if (TYPE(n) == argument && NCH(n) == 2 &&
6095 TYPE(CHILD(n, 1)) == gen_for) {
6096 symtable_generator_expression(st, n);
6097 break;
6098 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006099 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006100 case listmaker:
6101 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006102 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006103 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006104 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006105 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006106 case testlist_gexp:
6107 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6108 symtable_generator_expression(st, n);
6109 break;
6110 }
6111 /* fall through */
6112
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006113 case atom:
6114 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6115 symtable_add_use(st, STR(CHILD(n, 0)));
6116 break;
6117 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006118 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006119 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006120 /* Walk over every non-token child with a special case
6121 for one child.
6122 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006123 if (NCH(n) == 1) {
6124 n = CHILD(n, 0);
6125 goto loop;
6126 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006127 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 if (TYPE(CHILD(n, i)) >= single_input)
6129 symtable_node(st, CHILD(n, i));
6130 }
6131}
6132
6133static void
6134symtable_funcdef(struct symtable *st, node *n)
6135{
6136 node *body;
6137
6138 if (TYPE(n) == lambdef) {
6139 if (NCH(n) == 4)
6140 symtable_params(st, CHILD(n, 1));
6141 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006142 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006143 body = CHILD(n, NCH(n) - 1);
6144 symtable_node(st, body);
6145}
6146
6147/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006148 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006149 which are references in the defining scope. symtable_params()
6150 parses the parameter names, which are defined in the function's
6151 body.
6152
6153 varargslist:
6154 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6155 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6156*/
6157
6158static void
6159symtable_default_args(struct symtable *st, node *n)
6160{
6161 node *c;
6162 int i;
6163
6164 if (TYPE(n) == parameters) {
6165 n = CHILD(n, 1);
6166 if (TYPE(n) == RPAR)
6167 return;
6168 }
6169 REQ(n, varargslist);
6170 for (i = 0; i < NCH(n); i += 2) {
6171 c = CHILD(n, i);
6172 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6173 break;
6174 }
6175 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6176 symtable_node(st, CHILD(n, i));
6177 }
6178}
6179
6180static void
6181symtable_params(struct symtable *st, node *n)
6182{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006183 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006184 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006185
6186 if (TYPE(n) == parameters) {
6187 n = CHILD(n, 1);
6188 if (TYPE(n) == RPAR)
6189 return;
6190 }
6191 REQ(n, varargslist);
6192 for (i = 0; i < NCH(n); i += 2) {
6193 c = CHILD(n, i);
6194 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6195 ext = 1;
6196 break;
6197 }
6198 if (TYPE(c) == test) {
6199 continue;
6200 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006201 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006202 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006203 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006204 char nbuf[30];
6205 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006206 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006207 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006208 }
6209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006210 if (ext) {
6211 c = CHILD(n, i);
6212 if (TYPE(c) == STAR) {
6213 i++;
6214 symtable_add_def(st, STR(CHILD(n, i)),
6215 DEF_PARAM | DEF_STAR);
6216 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006217 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006218 c = NULL;
6219 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006220 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006222 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006223 i++;
6224 symtable_add_def(st, STR(CHILD(n, i)),
6225 DEF_PARAM | DEF_DOUBLESTAR);
6226 }
6227 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006228 if (complex >= 0) {
6229 int j;
6230 for (j = 0; j <= complex; j++) {
6231 c = CHILD(n, j);
6232 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006233 c = CHILD(n, ++j);
6234 else if (TYPE(c) == EQUAL)
6235 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006236 if (TYPE(CHILD(c, 0)) == LPAR)
6237 symtable_params_fplist(st, CHILD(c, 1));
6238 }
6239 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006240}
6241
6242static void
6243symtable_params_fplist(struct symtable *st, node *n)
6244{
6245 int i;
6246 node *c;
6247
6248 REQ(n, fplist);
6249 for (i = 0; i < NCH(n); i += 2) {
6250 c = CHILD(n, i);
6251 REQ(c, fpdef);
6252 if (NCH(c) == 1)
6253 symtable_add_def(st, STR(CHILD(c, 0)),
6254 DEF_PARAM | DEF_INTUPLE);
6255 else
6256 symtable_params_fplist(st, CHILD(c, 1));
6257 }
6258
6259}
6260
6261static void
6262symtable_global(struct symtable *st, node *n)
6263{
6264 int i;
6265
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006266 /* XXX It might be helpful to warn about module-level global
6267 statements, but it's hard to tell the difference between
6268 module-level and a string passed to exec.
6269 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006270
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006271 for (i = 1; i < NCH(n); i += 2) {
6272 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006273 int flags;
6274
6275 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006276 if (flags < 0)
6277 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006278 if (flags && flags != DEF_GLOBAL) {
6279 char buf[500];
6280 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006281 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006282 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006283 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006284 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006285 }
6286 else {
6287 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006288 PyOS_snprintf(buf, sizeof(buf),
6289 GLOBAL_AFTER_ASSIGN,
6290 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006291 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006292 PyOS_snprintf(buf, sizeof(buf),
6293 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006294 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006295 }
6296 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006297 symtable_add_def(st, name, DEF_GLOBAL);
6298 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006299}
6300
6301static void
6302symtable_list_comprehension(struct symtable *st, node *n)
6303{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006304 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006305 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006306
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006307 REQ(n, listmaker);
6308 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6309 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006310 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006311 symtable_list_for(st, CHILD(n, 1));
6312 symtable_node(st, CHILD(n, 0));
6313 --st->st_cur->ste_tmpname;
6314}
6315
6316static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006317symtable_generator_expression(struct symtable *st, node *n)
6318{
6319 /* testlist_gexp: test gen_for */
6320 REQ(CHILD(n, 0), test);
6321 REQ(CHILD(n, 1), gen_for);
6322
6323 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6324 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6325
6326 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6327
6328 symtable_gen_for(st, CHILD(n, 1), 1);
6329 symtable_node(st, CHILD(n, 0));
6330 symtable_exit_scope(st);
6331
6332 /* for outmost iterable precomputation */
6333 symtable_node(st, CHILD(CHILD(n, 1), 3));
6334}
6335
6336static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006337symtable_list_for(struct symtable *st, node *n)
6338{
6339 REQ(n, list_for);
6340 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006341 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006342 symtable_node(st, CHILD(n, 3));
6343 if (NCH(n) == 5)
6344 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006345}
6346
6347static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006348symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6349{
6350 REQ(n, gen_for);
6351
6352 /* gen_for: for v in test [gen_iter] */
6353 symtable_assign(st, CHILD(n, 1), 0);
6354 if (is_outmost)
6355 symtable_add_use(st, "[outmost-iterable]");
6356 else
6357 symtable_node(st, CHILD(n, 3));
6358
6359 if (NCH(n) == 5)
6360 symtable_gen_iter(st, CHILD(n, 4));
6361}
6362
6363static void
6364symtable_gen_iter(struct symtable *st, node *n)
6365{
6366 REQ(n, gen_iter);
6367
6368 n = CHILD(n, 0);
6369 if (TYPE(n) == gen_for)
6370 symtable_gen_for(st, n, 0);
6371 else {
6372 REQ(n, gen_if);
6373 symtable_node(st, CHILD(n, 1));
6374
6375 if (NCH(n) == 3)
6376 symtable_gen_iter(st, CHILD(n, 2));
6377 }
6378}
6379
6380static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006381symtable_import(struct symtable *st, node *n)
6382{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006383 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006384 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006385 /* import_stmt: import_name | import_from */
6386 n = CHILD(n, 0);
6387 if (TYPE(n) == import_from) {
6388 /* import_from: 'from' dotted_name 'import' ('*' |
6389 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006390 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006391 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006392 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6393 /* check for bogus imports */
6394 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6395 PyErr_SetString(PyExc_SyntaxError,
6396 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006397 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006398 return;
6399 }
6400 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006401 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6402 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006403 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006404 if (symtable_warn(st,
6405 "import * only allowed at module level") < 0)
6406 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006407 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006408 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006409 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006410 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006411 REQ(nn, import_as_names);
6412 for (i = 0; i < NCH(nn); i += 2) {
6413 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006414 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006415 symtable_assign(st, CHILD(c, 2),
6416 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006417 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006418 symtable_assign(st, CHILD(c, 0),
6419 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006420 }
6421 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006422 } else {
6423 /* 'import' dotted_as_names */
6424 nn = CHILD(n, 1);
6425 REQ(nn, dotted_as_names);
6426 for (i = 0; i < NCH(nn); i += 2)
6427 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006428 }
6429}
6430
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006431/* The third argument to symatble_assign() is a flag to be passed to
6432 symtable_add_def() if it is eventually called. The flag is useful
6433 to specify the particular type of assignment that should be
6434 recorded, e.g. an assignment caused by import.
6435 */
6436
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006437static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006438symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006439{
6440 node *tmp;
6441 int i;
6442
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006443 loop:
6444 switch (TYPE(n)) {
6445 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006446 /* invalid assignment, e.g. lambda x:x=2. The next
6447 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006448 return;
6449 case power:
6450 if (NCH(n) > 2) {
6451 for (i = 2; i < NCH(n); ++i)
6452 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6453 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006454 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006455 if (NCH(n) > 1) {
6456 symtable_node(st, CHILD(n, 0));
6457 symtable_node(st, CHILD(n, 1));
6458 } else {
6459 n = CHILD(n, 0);
6460 goto loop;
6461 }
6462 return;
6463 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006464 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6465 /* XXX This is an error, but the next pass
6466 will catch it. */
6467 return;
6468 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006469 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006470 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006471 }
6472 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006473 case testlist_gexp:
6474 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6475 /* XXX This is an error, but the next pass
6476 will catch it. */
6477 return;
6478 } else {
6479 for (i = 0; i < NCH(n); i += 2)
6480 symtable_assign(st, CHILD(n, i), def_flag);
6481 }
6482 return;
6483
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006484 case exprlist:
6485 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006486 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006487 if (NCH(n) == 1) {
6488 n = CHILD(n, 0);
6489 goto loop;
6490 }
6491 else {
6492 int i;
6493 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006494 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006495 return;
6496 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006497 case atom:
6498 tmp = CHILD(n, 0);
6499 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6500 n = CHILD(n, 1);
6501 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006502 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006503 if (strcmp(STR(tmp), "__debug__") == 0) {
6504 PyErr_SetString(PyExc_SyntaxError,
6505 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006506 symtable_error(st, n->n_lineno);
6507 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006508 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006509 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006510 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006511 return;
6512 case dotted_as_name:
6513 if (NCH(n) == 3)
6514 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006515 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006516 else
6517 symtable_add_def(st,
6518 STR(CHILD(CHILD(n,
6519 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006520 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006521 return;
6522 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006523 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006524 return;
6525 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006526 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006527 return;
6528 default:
6529 if (NCH(n) == 0)
6530 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006531 if (NCH(n) == 1) {
6532 n = CHILD(n, 0);
6533 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006534 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006535 /* Should only occur for errors like x + 1 = 1,
6536 which will be caught in the next pass. */
6537 for (i = 0; i < NCH(n); ++i)
6538 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006539 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006540 }
6541}