blob: 79620c209fe39908f9262a2a9d5fd070cd06432c [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 Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
429 int i, j, codelen;
430 int tgt, tgttgt, opcode;
431 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000432 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000433 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000434
435 /* Make a modifiable copy of the code string */
436 if (!PyString_Check(code))
437 goto exitUnchanged;
438 codelen = PyString_Size(code);
439 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000440 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000441 goto exitUnchanged;
442 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000443
444 /* Avoid situations where jump retargeting could overflow */
445 if (codelen > 65000)
446 goto exitUnchanged;
447
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000448 blocks = markblocks(codestr, codelen);
449 if (blocks == NULL) {
450 PyMem_Free(codestr);
451 goto exitUnchanged;
452 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000453 assert(PyTuple_Check(consts));
454
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000455 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000456 opcode = codestr[i];
457 switch (opcode) {
458
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000459 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
460 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000461 case UNARY_NOT:
462 if (codestr[i+1] != JUMP_IF_FALSE ||
463 codestr[i+4] != POP_TOP ||
464 !ISBASICBLOCK(blocks,i,5))
465 continue;
466 tgt = GETJUMPTGT(codestr, (i+1));
467 if (codestr[tgt] != POP_TOP)
468 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000469 j = GETARG(codestr, i+1) + 1;
470 codestr[i] = JUMP_IF_TRUE;
471 SETARG(codestr, i, j);
472 codestr[i+3] = POP_TOP;
473 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000474 break;
475
476 /* not a is b --> a is not b
477 not a in b --> a not in b
478 not a is not b --> a is b
479 not a not in b --> a in b */
480 case COMPARE_OP:
481 j = GETARG(codestr, i);
482 if (j < 6 || j > 9 ||
483 codestr[i+3] != UNARY_NOT ||
484 !ISBASICBLOCK(blocks,i,4))
485 continue;
486 SETARG(codestr, i, (j^1));
487 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000488 break;
489
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000490 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
491 case LOAD_NAME:
492 case LOAD_GLOBAL:
493 j = GETARG(codestr, i);
494 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
495 if (name == NULL || strcmp(name, "None") != 0)
496 continue;
497 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
498 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
499 codestr[i] = LOAD_CONST;
500 SETARG(codestr, i, j);
501 break;
502 }
503 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000504 break;
505
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000506 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
507 Note, only the first opcode is changed, the others still
508 perform normally if they happen to be jump targets. */
509 case LOAD_CONST:
510 j = GETARG(codestr, i);
511 if (codestr[i+3] != JUMP_IF_FALSE ||
512 codestr[i+6] != POP_TOP ||
513 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
514 continue;
515 codestr[i] = JUMP_FORWARD;
516 SETARG(codestr, i, 4);
517 break;
518
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000519 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
520 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
521 case BUILD_TUPLE:
522 case BUILD_LIST:
523 if (codestr[i+3] != UNPACK_SEQUENCE)
524 continue;
525 if (!ISBASICBLOCK(blocks,i,6))
526 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000527 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000528 GETARG(codestr, i+3) == 2) {
529 codestr[i] = ROT_TWO;
530 codestr[i+1] = JUMP_FORWARD;
531 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000532 codestr[i+4] = NOP;
533 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000534 continue;
535 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000536 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537 GETARG(codestr, i+3) == 3) {
538 codestr[i] = ROT_THREE;
539 codestr[i+1] = ROT_TWO;
540 codestr[i+2] = JUMP_FORWARD;
541 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000542 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000543 }
544 break;
545
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000546 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000547 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000548 case JUMP_FORWARD:
549 case JUMP_IF_FALSE:
550 case JUMP_IF_TRUE:
551 case JUMP_ABSOLUTE:
552 case CONTINUE_LOOP:
553 case SETUP_LOOP:
554 case SETUP_EXCEPT:
555 case SETUP_FINALLY:
556 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000557 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000558 continue;
559 tgttgt = GETJUMPTGT(codestr, tgt);
560 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
561 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000562 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000563 tgttgt -= i + 3; /* Calc relative jump addr */
564 if (tgttgt < 0) /* No backward relative jumps */
565 continue;
566 codestr[i] = opcode;
567 SETARG(codestr, i, tgttgt);
568 break;
569
570 case EXTENDED_ARG:
571 PyMem_Free(codestr);
572 goto exitUnchanged;
573 }
574 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000575 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000576 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000577 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000578 return code;
579
580exitUnchanged:
581 Py_INCREF(code);
582 return code;
583}
584
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000586PyCode_New(int argcount, int nlocals, int stacksize, int flags,
587 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000588 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
589 PyObject *filename, PyObject *name, int firstlineno,
590 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593 int i;
594 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000595 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000596 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 consts == NULL || !PyTuple_Check(consts) ||
598 names == NULL || !PyTuple_Check(names) ||
599 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000600 freevars == NULL || !PyTuple_Check(freevars) ||
601 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 name == NULL || !PyString_Check(name) ||
603 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000604 lnotab == NULL || !PyString_Check(lnotab) ||
605 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000606 PyErr_BadInternalCall();
607 return NULL;
608 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000609 intern_strings(names);
610 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000611 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000613 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 for (i = PyTuple_Size(consts); --i >= 0; ) {
615 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000617 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000618 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000619 continue;
620 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000624 co->co_argcount = argcount;
625 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000626 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000627 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000628 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000634 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000635 Py_INCREF(freevars);
636 co->co_freevars = freevars;
637 Py_INCREF(cellvars);
638 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000640 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000643 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000645 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000646 if (PyTuple_GET_SIZE(freevars) == 0 &&
647 PyTuple_GET_SIZE(cellvars) == 0)
648 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 }
650 return co;
651}
652
653
654/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000656/* The compiler uses two passes to generate bytecodes. The first pass
657 builds the symbol table. The second pass generates the bytecode.
658
659 The first pass uses a single symtable struct. The second pass uses
660 a compiling struct for each code block. The compiling structs
661 share a reference to the symtable.
662
663 The two passes communicate via symtable_load_symbols() and via
664 is_local() and is_global(). The former initializes several slots
665 in the compiling struct: c_varnames, c_locals, c_nlocals,
666 c_argcount, c_globals, and c_flags.
667*/
668
Tim Peters2a7f3842001-06-09 09:26:21 +0000669/* All about c_lnotab.
670
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000671c_lnotab is an array of unsigned bytes disguised as a Python string. Since
672version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
673mapped to source code line #s via c_lnotab instead.
674
Tim Peters2a7f3842001-06-09 09:26:21 +0000675The array is conceptually a list of
676 (bytecode offset increment, line number increment)
677pairs. The details are important and delicate, best illustrated by example:
678
679 byte code offset source code line number
680 0 1
681 6 2
682 50 7
683 350 307
684 361 308
685
686The first trick is that these numbers aren't stored, only the increments
687from one row to the next (this doesn't really work, but it's a start):
688
689 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
690
691The second trick is that an unsigned byte can't hold negative values, or
692values larger than 255, so (a) there's a deep assumption that byte code
693offsets and their corresponding line #s both increase monotonically, and (b)
694if at least one column jumps by more than 255 from one row to the next, more
695than one pair is written to the table. In case #b, there's no way to know
696from looking at the table later how many were written. That's the delicate
697part. A user of c_lnotab desiring to find the source line number
698corresponding to a bytecode address A should do something like this
699
700 lineno = addr = 0
701 for addr_incr, line_incr in c_lnotab:
702 addr += addr_incr
703 if addr > A:
704 return lineno
705 lineno += line_incr
706
707In order for this to work, when the addr field increments by more than 255,
708the line # increment in each pair generated must be 0 until the remaining addr
709increment is < 256. So, in the example above, com_set_lineno should not (as
710was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
711255, 0, 45, 255, 0, 45.
712*/
713
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000715 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000717 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000719 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000720 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 PyObject *c_locals; /* dictionary (value=localID) */
722 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000724 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000725 int c_nlocals; /* index of next local */
726 int c_argcount; /* number of top-level arguments */
727 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 int c_nexti; /* index into c_code */
729 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000730 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000731 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000732 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000733 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000734 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000735 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000736 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000737 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000738 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000739 int c_stacklevel; /* Current stack level */
740 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000741 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000743 int c_last_addr; /* last op addr seen and recorded in lnotab */
744 int c_last_line; /* last line seen and recorded in lnotab */
745 int c_lnotab_next; /* current length of lnotab */
746 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000748 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000749 int c_nested; /* Is block nested funcdef or lamdef? */
750 int c_closure; /* Is nested w/freevars? */
751 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000752 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000753 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754};
755
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000756static int
757is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000758{
759 if ((v & (USE | DEF_FREE))
760 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
761 return 1;
762 if (v & DEF_FREE_CLASS)
763 return 1;
764 return 0;
765}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000766
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000769{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000770 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
771
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772 if (c == NULL) {
773 /* Error occurred via symtable call to
774 is_constant_false */
775 PyErr_SetString(exc, msg);
776 return;
777 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000778 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000779 if (c->c_lineno < 1 || c->c_interactive) {
780 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000782 return;
783 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000784 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000785 if (v == NULL)
786 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000787
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000788 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000789 if (line == NULL) {
790 Py_INCREF(Py_None);
791 line = Py_None;
792 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000793 if (exc == PyExc_SyntaxError) {
794 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
795 Py_None, line);
796 if (t == NULL)
797 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000798 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000799 if (w == NULL)
800 goto exit;
801 PyErr_SetObject(exc, w);
802 } else {
803 /* Make sure additional exceptions are printed with
804 file and line, also. */
805 PyErr_SetObject(exc, v);
806 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
807 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000808 exit:
809 Py_XDECREF(t);
810 Py_XDECREF(v);
811 Py_XDECREF(w);
812 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000813}
814
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000815/* Interface to the block stack */
816
817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000818block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000819{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000820 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 com_error(c, PyExc_SystemError,
822 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000823 }
824 else {
825 c->c_block[c->c_nblocks++] = type;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000831{
832 if (c->c_nblocks > 0)
833 c->c_nblocks--;
834 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000836 }
837}
838
Guido van Rossum681d79a1995-07-18 14:51:37 +0000839/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000840
Martin v. Löwis95292d62002-12-11 14:04:59 +0000841static int issue_warning(const char *, const char *, int);
842static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000843static void com_free(struct compiling *);
844static void com_push(struct compiling *, int);
845static void com_pop(struct compiling *, int);
846static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000847static void com_node(struct compiling *, node *);
848static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000849static void com_addbyte(struct compiling *, int);
850static void com_addint(struct compiling *, int);
851static void com_addoparg(struct compiling *, int, int);
852static void com_addfwref(struct compiling *, int, int *);
853static void com_backpatch(struct compiling *, int);
854static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
855static int com_addconst(struct compiling *, PyObject *);
856static int com_addname(struct compiling *, PyObject *);
857static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000858static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000859static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000860static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000861static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000862static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000863static void com_assign(struct compiling *, node *, int, node *);
864static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000865static int com_make_closure(struct compiling *c, PyCodeObject *co);
866
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000867static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000868static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000869 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000870static PyObject *parsestrplus(struct compiling*, node *);
871static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000872static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000874static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000875
876/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000877static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000878static struct symtable *symtable_build(node *, PyFutureFeatures *,
879 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000880static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000881static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000882static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000885static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000886
887static void symtable_node(struct symtable *, node *);
888static void symtable_funcdef(struct symtable *, node *);
889static void symtable_default_args(struct symtable *, node *);
890static void symtable_params(struct symtable *, node *);
891static void symtable_params_fplist(struct symtable *, node *n);
892static void symtable_global(struct symtable *, node *);
893static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000894static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000895static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000896static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000897static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000898static void symtable_gen_for(struct symtable *, node *, int);
899static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000900
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000901static int symtable_update_free_vars(struct symtable *);
902static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
903static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
904
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905/* helper */
906static void
907do_pad(int pad)
908{
909 int i;
910 for (i = 0; i < pad; ++i)
911 fprintf(stderr, " ");
912}
913
914static void
915dump(node *n, int pad, int depth)
916{
917 int i;
918 if (depth == 0)
919 return;
920 do_pad(pad);
921 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
922 if (depth > 0)
923 depth--;
924 for (i = 0; i < NCH(n); ++i)
925 dump(CHILD(n, i), pad + 1, depth);
926}
927
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000929com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000931 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
933 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000934 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000936 goto fail;
937 if ((c->c_const_dict = PyDict_New()) == NULL)
938 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000940 goto fail;
941 if ((c->c_name_dict = PyDict_New()) == NULL)
942 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000944 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
946 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000947 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000949 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000950 c->c_freevars = NULL;
951 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000952 c->c_nlocals = 0;
953 c->c_argcount = 0;
954 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955 c->c_nexti = 0;
956 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000957 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000958 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000960 c->c_begin = 0;
961 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000964 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000965 c->c_stacklevel = 0;
966 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000967 c->c_firstlineno = 0;
968 c->c_last_addr = 0;
969 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000970 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000971 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000972 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000973 c->c_nested = 0;
974 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 return 1;
977
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000978 fail:
979 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980 return 0;
981}
982
983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000984com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 Py_XDECREF(c->c_code);
987 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000988 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000990 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 Py_XDECREF(c->c_globals);
992 Py_XDECREF(c->c_locals);
993 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000994 Py_XDECREF(c->c_freevars);
995 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000997 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000998 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000999}
1000
1001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001002com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001003{
1004 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001005 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001006 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001007 /*
1008 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1009 c->c_filename, c->c_name, c->c_lineno,
1010 c->c_nexti, c->c_stacklevel, n);
1011 */
1012 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001013}
1014
1015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001016com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001017{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001018 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001019 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 else
1021 c->c_stacklevel -= n;
1022}
1023
1024static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001025com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
1027 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001029 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031}
1032
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001033static int
1034com_check_size(PyObject **s, int offset)
1035{
1036 int len = PyString_GET_SIZE(*s);
1037 if (offset >= len)
1038 return _PyString_Resize(s, len * 2);
1039 return 0;
1040}
1041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001043com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001045 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001046 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001047 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001048 if (com_check_size(&c->c_code, c->c_nexti)) {
1049 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001052 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053}
1054
1055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001056com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001058 com_addbyte(c, x & 0xff);
1059 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060}
1061
1062static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001063com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001064{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001065 char *p;
1066 if (c->c_lnotab == NULL)
1067 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001068 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1069 c->c_errors++;
1070 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001071 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001072 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001073 *p++ = addr;
1074 *p++ = line;
1075 c->c_lnotab_next += 2;
1076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001080{
1081 c->c_lineno = lineno;
1082 if (c->c_firstlineno == 0) {
1083 c->c_firstlineno = c->c_last_line = lineno;
1084 }
1085 else {
1086 int incr_addr = c->c_nexti - c->c_last_addr;
1087 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001088 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001089 while (incr_addr > 255) {
1090 com_add_lnotab(c, 255, 0);
1091 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001092 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001093 while (incr_line > 255) {
1094 com_add_lnotab(c, incr_addr, 255);
1095 incr_line -=255;
1096 incr_addr = 0;
1097 }
1098 if (incr_addr > 0 || incr_line > 0)
1099 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001100 c->c_last_addr = c->c_nexti;
1101 c->c_last_line = lineno;
1102 }
1103}
1104
1105static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001106com_strip_lnotab(struct compiling *c)
1107{
1108 /* strip the last lnotab entry if no opcode were emitted.
1109 * This prevents a line number to be generated on a final
1110 * pass, like in the following example:
1111 *
1112 * if a:
1113 * print 5
1114 * else:
1115 * pass
1116 *
1117 * Without the fix, a line trace event would be generated
1118 * on the pass even if a is true (because of the implicit
1119 * return).
1120 */
1121 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1122 c->c_lnotab_next = c->c_lnotab_last;
1123 }
1124}
1125
1126static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001127com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128{
Fred Drakeef8ace32000-08-24 00:32:09 +00001129 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001130 if (extended_arg){
1131 com_addbyte(c, EXTENDED_ARG);
1132 com_addint(c, extended_arg);
1133 arg &= 0xffff;
1134 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001135 com_addbyte(c, op);
1136 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137}
1138
1139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
1142 /* Compile a forward reference for backpatching */
1143 int here;
1144 int anchor;
1145 com_addbyte(c, op);
1146 here = c->c_nexti;
1147 anchor = *p_anchor;
1148 *p_anchor = here;
1149 com_addint(c, anchor == 0 ? 0 : here - anchor);
1150}
1151
1152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001153com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001155 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 int dist;
1158 int prev;
1159 for (;;) {
1160 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001161 prev = code[anchor] + (code[anchor+1] << 8);
1162 dist = target - (anchor+2);
1163 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001164 dist >>= 8;
1165 code[anchor+1] = dist;
1166 dist >>= 8;
1167 if (dist) {
1168 com_error(c, PyExc_SystemError,
1169 "com_backpatch: offset too large");
1170 break;
1171 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 if (!prev)
1173 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 anchor -= prev;
1175 }
1176}
1177
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001178/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179
1180static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001181com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001183 PyObject *w, *t, *np=NULL;
1184 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001185
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001186 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001187 if (t == NULL)
1188 goto fail;
1189 w = PyDict_GetItem(dict, t);
1190 if (w != NULL) {
1191 n = PyInt_AsLong(w);
1192 } else {
1193 n = PyList_Size(list);
1194 np = PyInt_FromLong(n);
1195 if (np == NULL)
1196 goto fail;
1197 if (PyList_Append(list, v) != 0)
1198 goto fail;
1199 if (PyDict_SetItem(dict, t, np) != 0)
1200 goto fail;
1201 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001202 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001203 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001204 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001205 fail:
1206 Py_XDECREF(np);
1207 Py_XDECREF(t);
1208 c->c_errors++;
1209 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210}
1211
1212static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001213com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001215 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216}
1217
1218static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001219com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001221 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222}
1223
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001224int
1225_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001226{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001227 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001228 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001229 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001230 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1231 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001232 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001233 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001234 return 0; /* Don't mangle __extremely_long_names */
1235 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1236 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001237 /* Strip leading underscores from class name */
1238 while (*p == '_')
1239 p++;
1240 if (*p == '\0')
1241 return 0; /* Don't mangle if class is just underscores */
1242 plen = strlen(p);
1243 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001244 plen = maxlen-nlen-2; /* Truncate class name if too long */
1245 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001246 buffer[0] = '_';
1247 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001248 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001249 return 1;
1250}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001251
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001253com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001257 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001258
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001259 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001260 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001261 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 c->c_errors++;
1263 i = 255;
1264 }
1265 else {
1266 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001269 com_addoparg(c, op, i);
1270}
1271
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001272#define NAME_LOCAL 0
1273#define NAME_GLOBAL 1
1274#define NAME_DEFAULT 2
1275#define NAME_CLOSURE 3
1276
1277static int
1278com_lookup_arg(PyObject *dict, PyObject *name)
1279{
1280 PyObject *v = PyDict_GetItem(dict, name);
1281 if (v == NULL)
1282 return -1;
1283 else
1284 return PyInt_AS_LONG(v);
1285}
1286
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001287static int
1288none_assignment_check(struct compiling *c, char *name, int assigning)
1289{
1290 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1291 char *msg;
1292 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001293 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001294 else
1295 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001296 com_error(c, PyExc_SyntaxError, msg);
1297 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001298 }
1299 return 0;
1300}
1301
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001302static void
1303com_addop_varname(struct compiling *c, int kind, char *name)
1304{
1305 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001306 int i, reftype;
1307 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001308 int op = STOP_CODE;
1309 char buffer[MANGLE_LEN];
1310
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001311 if (kind != VAR_LOAD &&
1312 none_assignment_check(c, name, kind == VAR_STORE))
1313 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001314 i = 255;
1315 goto done;
1316 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001317 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001318 name = buffer;
1319 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1320 c->c_errors++;
1321 i = 255;
1322 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001324
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001325 reftype = get_ref_type(c, name);
1326 switch (reftype) {
1327 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001328 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001329 scope = NAME_LOCAL;
1330 break;
1331 case GLOBAL_EXPLICIT:
1332 scope = NAME_GLOBAL;
1333 break;
1334 case GLOBAL_IMPLICIT:
1335 if (c->c_flags & CO_OPTIMIZED)
1336 scope = NAME_GLOBAL;
1337 break;
1338 case FREE:
1339 case CELL:
1340 scope = NAME_CLOSURE;
1341 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001342 }
1343
1344 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001345 if (scope == NAME_LOCAL)
1346 i = com_lookup_arg(c->c_locals, v);
1347 else if (reftype == FREE)
1348 i = com_lookup_arg(c->c_freevars, v);
1349 else if (reftype == CELL)
1350 i = com_lookup_arg(c->c_cellvars, v);
1351 if (i == -1) {
1352 c->c_errors++; /* XXX no exception set */
1353 i = 255;
1354 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001355 }
1356 Py_DECREF(v);
1357
1358 switch (kind) {
1359 case VAR_LOAD:
1360 switch (scope) {
1361 case NAME_LOCAL:
1362 op = LOAD_FAST;
1363 break;
1364 case NAME_GLOBAL:
1365 op = LOAD_GLOBAL;
1366 break;
1367 case NAME_DEFAULT:
1368 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001369 break;
1370 case NAME_CLOSURE:
1371 op = LOAD_DEREF;
1372 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001373 }
1374 break;
1375 case VAR_STORE:
1376 switch (scope) {
1377 case NAME_LOCAL:
1378 op = STORE_FAST;
1379 break;
1380 case NAME_GLOBAL:
1381 op = STORE_GLOBAL;
1382 break;
1383 case NAME_DEFAULT:
1384 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001385 break;
1386 case NAME_CLOSURE:
1387 op = STORE_DEREF;
1388 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001389 }
1390 break;
1391 case VAR_DELETE:
1392 switch (scope) {
1393 case NAME_LOCAL:
1394 op = DELETE_FAST;
1395 break;
1396 case NAME_GLOBAL:
1397 op = DELETE_GLOBAL;
1398 break;
1399 case NAME_DEFAULT:
1400 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001401 break;
1402 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001403 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001404 PyOS_snprintf(buf, sizeof(buf),
1405 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001406 com_error(c, PyExc_SyntaxError, buf);
1407 i = 255;
1408 break;
1409 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001410 }
1411 break;
1412 }
1413done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 com_addoparg(c, op, i);
1415}
1416
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001419{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001420 char *name;
1421 char buffer[1000];
1422 /* XXX it is possible to write this code without the 1000
1423 chars on the total length of dotted names, I just can't be
1424 bothered right now */
1425 if (TYPE(n) == STAR)
1426 name = "*";
1427 else if (TYPE(n) == dotted_name) {
1428 char *p = buffer;
1429 int i;
1430 name = buffer;
1431 for (i = 0; i < NCH(n); i += 2) {
1432 char *s = STR(CHILD(n, i));
1433 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001435 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001436 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001437 break;
1438 }
1439 if (p != buffer)
1440 *p++ = '.';
1441 strcpy(p, s);
1442 p = strchr(p, '\0');
1443 }
1444 }
1445 else {
1446 REQ(n, NAME);
1447 name = STR(n);
1448 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001449 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001450}
1451
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001453parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001455 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001457 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001458#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001459 int imflag;
1460#endif
1461
Guido van Rossum282914b1991-04-04 10:42:56 +00001462 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001463 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001464#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001465 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001466#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001467 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001469 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001471 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001472 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001473 }
1474 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001475 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001477 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001478 if (errno != 0)
1479 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001481 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001482 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001483#ifndef WITHOUT_COMPLEX
1484 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001485 Py_complex z;
1486 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001487 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001488 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001489 PyFPE_END_PROTECT(z)
1490 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001491 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001492 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001493#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001494 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001495 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001496 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001497 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001499 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500}
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001503decode_utf8(char **sPtr, char *end, char* encoding)
1504{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001505#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001506 Py_FatalError("decode_utf8 should not be called in this build.");
1507 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001508#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001509 PyObject *u, *v;
1510 char *s, *t;
1511 t = s = *sPtr;
1512 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1513 while (s < end && (*s & 0x80)) s++;
1514 *sPtr = s;
1515 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1516 if (u == NULL)
1517 return NULL;
1518 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1519 Py_DECREF(u);
1520 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001521#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001522}
1523
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001524/* compiler.transformer.Transformer.decode_literal depends on what
1525 might seem like minor details of this function -- changes here
1526 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001527static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001528parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001531 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001532 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001533 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001534 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001535 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001536 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001537
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001538 if (isalpha(quote) || quote == '_') {
1539 if (quote == 'u' || quote == 'U') {
1540 quote = *++s;
1541 unicode = 1;
1542 }
1543 if (quote == 'r' || quote == 'R') {
1544 quote = *++s;
1545 rawmode = 1;
1546 }
1547 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001548 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001549 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 return NULL;
1551 }
1552 s++;
1553 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001554 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001555 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001556 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001557 return NULL;
1558 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001559 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 return NULL;
1562 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001563 if (len >= 4 && s[0] == quote && s[1] == quote) {
1564 s += 2;
1565 len -= 2;
1566 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001568 return NULL;
1569 }
1570 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001571#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001572 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001573 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001574 char *buf;
1575 char *p;
1576 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001577 if (encoding == NULL) {
1578 buf = s;
1579 u = NULL;
1580 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1581 buf = s;
1582 u = NULL;
1583 } else {
1584 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1585 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1586 if (u == NULL)
1587 return NULL;
1588 p = buf = PyString_AsString(u);
1589 end = s + len;
1590 while (s < end) {
1591 if (*s == '\\') {
1592 *p++ = *s++;
1593 if (*s & 0x80) {
1594 strcpy(p, "u005c");
1595 p += 5;
1596 }
1597 }
1598 if (*s & 0x80) { /* XXX inefficient */
1599 char *r;
1600 int rn, i;
1601 w = decode_utf8(&s, end, "utf-16-be");
1602 if (w == NULL) {
1603 Py_DECREF(u);
1604 return NULL;
1605 }
1606 r = PyString_AsString(w);
1607 rn = PyString_Size(w);
1608 assert(rn % 2 == 0);
1609 for (i = 0; i < rn; i += 2) {
1610 sprintf(p, "\\u%02x%02x",
1611 r[i + 0] & 0xFF,
1612 r[i + 1] & 0xFF);
1613 p += 6;
1614 }
1615 Py_DECREF(w);
1616 } else {
1617 *p++ = *s++;
1618 }
1619 }
1620 len = p - buf;
1621 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001622 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001623 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001624 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001625 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1626 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001627 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001628 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001629 return v;
1630
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001631 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001632#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001633 need_encoding = (encoding != NULL &&
1634 strcmp(encoding, "utf-8") != 0 &&
1635 strcmp(encoding, "iso-8859-1") != 0);
1636 if (rawmode || strchr(s, '\\') == NULL) {
1637 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001638#ifndef Py_USING_UNICODE
1639 /* This should not happen - we never see any other
1640 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001641 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001642#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001643 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1644 if (u == NULL)
1645 return NULL;
1646 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1647 Py_DECREF(u);
1648 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001649#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001650 } else {
1651 return PyString_FromStringAndSize(s, len);
1652 }
1653 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001654
1655 v = PyString_DecodeEscape(s, len, NULL, unicode,
1656 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001657 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001658 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 return v;
1660}
1661
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001663parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001664{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001666 int i;
1667 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001668 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001669 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001670 for (i = 1; i < NCH(n); i++) {
1671 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001672 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001673 if (s == NULL)
1674 goto onError;
1675 if (PyString_Check(v) && PyString_Check(s)) {
1676 PyString_ConcatAndDel(&v, s);
1677 if (v == NULL)
1678 goto onError;
1679 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001680#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001681 else {
1682 PyObject *temp;
1683 temp = PyUnicode_Concat(v, s);
1684 Py_DECREF(s);
1685 if (temp == NULL)
1686 goto onError;
1687 Py_DECREF(v);
1688 v = temp;
1689 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001690#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001691 }
1692 }
1693 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001694
1695 onError:
1696 Py_XDECREF(v);
1697 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001698}
1699
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001701com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001703 int anchor = 0;
1704 int save_begin = c->c_begin;
1705
Raymond Hettinger354433a2004-05-19 08:20:33 +00001706 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001707 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001708 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001709 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001710 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001711 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001712 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001713 c->c_loops++;
1714 com_list_iter(c, n, e, t);
1715 c->c_loops--;
1716 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1717 c->c_begin = save_begin;
1718 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001719 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001720}
1721
1722static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001723com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1724{
1725 int break_anchor = 0;
1726 int anchor = 0;
1727 int save_begin = c->c_begin;
1728
1729 REQ(n, gen_for);
1730 /* gen_for: for v in test [gen_iter] */
1731
1732 com_addfwref(c, SETUP_LOOP, &break_anchor);
1733 block_push(c, SETUP_LOOP);
1734
1735 if (is_outmost) {
1736 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1737 com_push(c, 1);
1738 }
1739 else {
1740 com_node(c, CHILD(n, 3));
1741 com_addbyte(c, GET_ITER);
1742 }
1743
1744 c->c_begin = c->c_nexti;
1745 com_set_lineno(c, c->c_last_line);
1746 com_addfwref(c, FOR_ITER, &anchor);
1747 com_push(c, 1);
1748 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1749
1750 if (NCH(n) == 5)
1751 com_gen_iter(c, CHILD(n, 4), t);
1752 else {
1753 com_test(c, t);
1754 com_addbyte(c, YIELD_VALUE);
1755 com_pop(c, 1);
1756 }
1757
1758 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1759 c->c_begin = save_begin;
1760
1761 com_backpatch(c, anchor);
1762 com_pop(c, 1); /* FOR_ITER has popped this */
1763 com_addbyte(c, POP_BLOCK);
1764 block_pop(c, SETUP_LOOP);
1765 com_backpatch(c, break_anchor);
1766}
1767
1768static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001769com_list_if(struct compiling *c, node *n, node *e, char *t)
1770{
1771 int anchor = 0;
1772 int a = 0;
1773 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001774 com_node(c, CHILD(n, 1));
1775 com_addfwref(c, JUMP_IF_FALSE, &a);
1776 com_addbyte(c, POP_TOP);
1777 com_pop(c, 1);
1778 com_list_iter(c, n, e, t);
1779 com_addfwref(c, JUMP_FORWARD, &anchor);
1780 com_backpatch(c, a);
1781 /* We jump here with an extra entry which we now pop */
1782 com_addbyte(c, POP_TOP);
1783 com_backpatch(c, anchor);
1784}
1785
1786static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001787com_gen_if(struct compiling *c, node *n, node *t)
1788{
1789 /* gen_if: 'if' test [gen_iter] */
1790 int anchor = 0;
1791 int a=0;
1792
1793 com_node(c, CHILD(n, 1));
1794 com_addfwref(c, JUMP_IF_FALSE, &a);
1795 com_addbyte(c, POP_TOP);
1796 com_pop(c, 1);
1797
1798 if (NCH(n) == 3)
1799 com_gen_iter(c, CHILD(n, 2), t);
1800 else {
1801 com_test(c, t);
1802 com_addbyte(c, YIELD_VALUE);
1803 com_pop(c, 1);
1804 }
1805 com_addfwref(c, JUMP_FORWARD, &anchor);
1806 com_backpatch(c, a);
1807 /* We jump here with an extra entry which we now pop */
1808 com_addbyte(c, POP_TOP);
1809 com_backpatch(c, anchor);
1810}
1811
1812static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001813com_list_iter(struct compiling *c,
1814 node *p, /* parent of list_iter node */
1815 node *e, /* element expression node */
1816 char *t /* name of result list temp local */)
1817{
1818 /* list_iter is the last child in a listmaker, list_for, or list_if */
1819 node *n = CHILD(p, NCH(p)-1);
1820 if (TYPE(n) == list_iter) {
1821 n = CHILD(n, 0);
1822 switch (TYPE(n)) {
1823 case list_for:
1824 com_list_for(c, n, e, t);
1825 break;
1826 case list_if:
1827 com_list_if(c, n, e, t);
1828 break;
1829 default:
1830 com_error(c, PyExc_SystemError,
1831 "invalid list_iter node type");
1832 }
1833 }
1834 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001835 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001836 com_push(c, 1);
1837 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001838 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001839 com_pop(c, 2);
1840 }
1841}
1842
1843static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001844com_gen_iter(struct compiling *c, node *n, node *t)
1845{
1846 /* gen_iter: gen_for | gen_if */
1847 node *ch;
1848 REQ(n, gen_iter);
1849
1850 ch = CHILD(n, 0);
1851
1852 switch (TYPE(ch)) {
1853 case gen_for:
1854 com_gen_for(c, ch, t, 0);
1855 break;
1856 case gen_if:
1857 com_gen_if(c, ch, t);
1858 break;
1859 default:
1860 com_error(c, PyExc_SystemError,
1861 "invalid gen_iter node type");
1862 }
1863}
1864
1865static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001866com_list_comprehension(struct compiling *c, node *n)
1867{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001868 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001869 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001870
1871 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001872 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001873 com_addoparg(c, BUILD_LIST, 0);
1874 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1875 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001876 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001877 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001878 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001879 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001880 --c->c_tmpname;
1881}
1882
1883static void
1884com_listmaker(struct compiling *c, node *n)
1885{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001886 /* listmaker: test ( list_for | (',' test)* [','] ) */
1887 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001888 com_list_comprehension(c, n);
1889 else {
1890 int len = 0;
1891 int i;
1892 for (i = 0; i < NCH(n); i += 2, len++)
1893 com_node(c, CHILD(n, i));
1894 com_addoparg(c, BUILD_LIST, len);
1895 com_pop(c, len-1);
1896 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897}
1898
1899static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001900com_generator_expression(struct compiling *c, node *n)
1901{
1902 /* testlist_gexp: test gen_for */
1903 /* argument: test gen_for */
1904 PyCodeObject *co;
1905
1906 REQ(CHILD(n, 0), test);
1907 REQ(CHILD(n, 1), gen_for);
1908
1909 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1910 n->n_lineno);
1911 co = icompile(n, c);
1912 symtable_exit_scope(c->c_symtable);
1913
1914 if (co == NULL)
1915 c->c_errors++;
1916 else {
1917 int closure = com_make_closure(c, co);
1918 int i = com_addconst(c, (PyObject *)co);
1919
1920 com_addoparg(c, LOAD_CONST, i);
1921 com_push(c, 1);
1922 if (closure)
1923 com_addoparg(c, MAKE_CLOSURE, 0);
1924 else
1925 com_addoparg(c, MAKE_FUNCTION, 0);
1926
1927 com_test(c, CHILD(CHILD(n, 1), 3));
1928 com_addbyte(c, GET_ITER);
1929 com_addoparg(c, CALL_FUNCTION, 1);
1930 com_pop(c, 1);
1931
1932 Py_DECREF(co);
1933 }
1934}
1935
1936static void
1937com_testlist_gexp(struct compiling *c, node *n)
1938{
1939 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1940 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1941 com_generator_expression(c, n);
1942 else com_list(c, n, 0);
1943}
1944
Anthony Baxterc2a5a632004-08-02 06:10:11 +00001945
Raymond Hettinger354433a2004-05-19 08:20:33 +00001946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001947com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001948{
1949 int i;
1950 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1951 for (i = 0; i+2 < NCH(n); i += 4) {
1952 /* We must arrange things just right for STORE_SUBSCR.
1953 It wants the stack to look like (value) (dict) (key) */
1954 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001956 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001957 com_node(c, CHILD(n, i+2)); /* value */
1958 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001959 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001961 }
1962}
1963
1964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001965com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966{
1967 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 int i;
1970 REQ(n, atom);
1971 ch = CHILD(n, 0);
1972 switch (TYPE(ch)) {
1973 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001976 com_push(c, 1);
1977 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001979 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001981 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_push(c, 1);
1985 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001987 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001989 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001991 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001992 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001993 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 break;
1995 case BACKQUOTE:
1996 com_node(c, CHILD(n, 1));
1997 com_addbyte(c, UNARY_CONVERT);
1998 break;
1999 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002000 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 i = 255;
2002 }
2003 else {
2004 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 }
2007 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 break;
2010 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002011 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002012 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 c->c_errors++;
2014 i = 255;
2015 }
2016 else {
2017 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 }
2020 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 break;
2023 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002024 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 break;
2027 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 com_error(c, PyExc_SystemError,
2029 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 }
2031}
2032
2033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002034com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035{
2036 if (NCH(n) == 1) {
2037 com_addbyte(c, op);
2038 }
2039 else if (NCH(n) == 2) {
2040 if (TYPE(CHILD(n, 0)) != COLON) {
2041 com_node(c, CHILD(n, 0));
2042 com_addbyte(c, op+1);
2043 }
2044 else {
2045 com_node(c, CHILD(n, 1));
2046 com_addbyte(c, op+2);
2047 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 }
2050 else {
2051 com_node(c, CHILD(n, 0));
2052 com_node(c, CHILD(n, 2));
2053 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002054 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 }
2056}
2057
Guido van Rossum635abd21997-01-06 22:56:52 +00002058static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002059com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2060{
2061 if (NCH(n) == 1) {
2062 com_addbyte(c, DUP_TOP);
2063 com_push(c, 1);
2064 com_addbyte(c, SLICE);
2065 com_node(c, augn);
2066 com_addbyte(c, opcode);
2067 com_pop(c, 1);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, STORE_SLICE);
2070 com_pop(c, 2);
2071 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2072 com_node(c, CHILD(n, 0));
2073 com_addoparg(c, DUP_TOPX, 2);
2074 com_push(c, 2);
2075 com_addbyte(c, SLICE+1);
2076 com_pop(c, 1);
2077 com_node(c, augn);
2078 com_addbyte(c, opcode);
2079 com_pop(c, 1);
2080 com_addbyte(c, ROT_THREE);
2081 com_addbyte(c, STORE_SLICE+1);
2082 com_pop(c, 3);
2083 } else if (NCH(n) == 2) {
2084 com_node(c, CHILD(n, 1));
2085 com_addoparg(c, DUP_TOPX, 2);
2086 com_push(c, 2);
2087 com_addbyte(c, SLICE+2);
2088 com_pop(c, 1);
2089 com_node(c, augn);
2090 com_addbyte(c, opcode);
2091 com_pop(c, 1);
2092 com_addbyte(c, ROT_THREE);
2093 com_addbyte(c, STORE_SLICE+2);
2094 com_pop(c, 3);
2095 } else {
2096 com_node(c, CHILD(n, 0));
2097 com_node(c, CHILD(n, 2));
2098 com_addoparg(c, DUP_TOPX, 3);
2099 com_push(c, 3);
2100 com_addbyte(c, SLICE+3);
2101 com_pop(c, 2);
2102 com_node(c, augn);
2103 com_addbyte(c, opcode);
2104 com_pop(c, 1);
2105 com_addbyte(c, ROT_FOUR);
2106 com_addbyte(c, STORE_SLICE+3);
2107 com_pop(c, 4);
2108 }
2109}
2110
2111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002112com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002113{
2114 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002115 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002116 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002117 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002119 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002120 }
2121 else {
2122 com_node(c, CHILD(n, 0));
2123 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002124 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002125 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002126 if (NCH(n) == 2) {
2127 com_generator_expression(c, n);
2128 return;
2129 }
2130
Guido van Rossumf10570b1995-07-07 22:53:21 +00002131 m = n;
2132 do {
2133 m = CHILD(m, 0);
2134 } while (NCH(m) == 1);
2135 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002136 /* f(lambda x: x[0] = 3) ends up getting parsed with
2137 * LHS test = lambda x: x[0], and RHS test = 3.
2138 * SF bug 132313 points out that complaining about a keyword
2139 * then is very confusing.
2140 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002142 TYPE(m) == lambdef ?
2143 "lambda cannot contain assignment" :
2144 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002145 }
2146 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002148 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002149 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002151 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002152 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002153 else if (*pkeywords == NULL) {
2154 c->c_errors++;
2155 Py_DECREF(v);
2156 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 if (PyDict_GetItem(*pkeywords, v) != NULL)
2158 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002159 "duplicate keyword argument");
2160 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002162 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002163 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002164 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002166 }
2167 }
2168 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002169}
2170
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173{
2174 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002175 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002179 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002180 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002181 int star_flag = 0;
2182 int starstar_flag = 0;
2183 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002184 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002185 na = 0;
2186 nk = 0;
2187 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002188 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002189 if (TYPE(ch) == STAR ||
2190 TYPE(ch) == DOUBLESTAR)
2191 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002192 if (ch->n_lineno != lineno) {
2193 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002194 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002195 }
2196 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002197 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002198 na++;
2199 else
2200 nk++;
2201 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002203 while (i < NCH(n)) {
2204 node *tok = CHILD(n, i);
2205 node *ch = CHILD(n, i+1);
2206 i += 3;
2207 switch (TYPE(tok)) {
2208 case STAR: star_flag = 1; break;
2209 case DOUBLESTAR: starstar_flag = 1; break;
2210 }
2211 com_node(c, ch);
2212 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002213 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 com_error(c, PyExc_SyntaxError,
2215 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002217 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002218 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002219 star_flag + (starstar_flag << 1);
2220 else
2221 opcode = CALL_FUNCTION;
2222 com_addoparg(c, opcode, na | (nk << 8));
2223 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 }
2225}
2226
2227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229{
2230 com_addopname(c, LOAD_ATTR, n);
2231}
2232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002235{
2236 int i=0;
2237 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002238 node *ch;
2239
2240 /* first argument */
2241 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002244 i++;
2245 }
2246 else {
2247 com_node(c, CHILD(n,i));
2248 i++;
2249 REQ(CHILD(n,i),COLON);
2250 i++;
2251 }
2252 /* second argument */
2253 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2254 com_node(c, CHILD(n,i));
2255 i++;
2256 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002257 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 com_push(c, 1);
2260 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002261 /* remaining arguments */
2262 for (; i < NCH(n); i++) {
2263 ns++;
2264 ch=CHILD(n,i);
2265 REQ(ch, sliceop);
2266 if (NCH(ch) == 1) {
2267 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002270 }
2271 else
2272 com_node(c, CHILD(ch,1));
2273 }
2274 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002276}
2277
2278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002280{
2281 node *ch;
2282 REQ(n, subscript);
2283 ch = CHILD(n,0);
2284 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002286 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
2288 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002289 else {
2290 /* check for slice */
2291 if ((TYPE(ch) == COLON || NCH(n) > 1))
2292 com_sliceobj(c, n);
2293 else {
2294 REQ(ch, test);
2295 com_node(c, ch);
2296 }
2297 }
2298}
2299
2300static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002301com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002302{
2303 int i, op;
2304 REQ(n, subscriptlist);
2305 /* Check to make backward compatible slice behavior for '[i:j]' */
2306 if (NCH(n) == 1) {
2307 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002308 /* 'Basic' slice, should have exactly one colon. */
2309 if ((TYPE(CHILD(sub, 0)) == COLON
2310 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2311 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2312 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002313 switch (assigning) {
2314 case OP_DELETE:
2315 op = DELETE_SLICE;
2316 break;
2317 case OP_ASSIGN:
2318 op = STORE_SLICE;
2319 break;
2320 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002321 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002322 break;
2323 default:
2324 com_augassign_slice(c, sub, assigning, augn);
2325 return;
2326 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002327 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 if (op == STORE_SLICE)
2329 com_pop(c, 2);
2330 else if (op == DELETE_SLICE)
2331 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002332 return;
2333 }
2334 }
2335 /* Else normal subscriptlist. Compile each subscript. */
2336 for (i = 0; i < NCH(n); i += 2)
2337 com_subscript(c, CHILD(n, i));
2338 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 if (NCH(n) > 1) {
2340 i = (NCH(n)+1) / 2;
2341 com_addoparg(c, BUILD_TUPLE, i);
2342 com_pop(c, i-1);
2343 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002344 switch (assigning) {
2345 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 op = DELETE_SUBSCR;
2347 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002348 break;
2349 default:
2350 case OP_ASSIGN:
2351 op = STORE_SUBSCR;
2352 i = 3;
2353 break;
2354 case OP_APPLY:
2355 op = BINARY_SUBSCR;
2356 i = 1;
2357 break;
2358 }
2359 if (assigning > OP_APPLY) {
2360 com_addoparg(c, DUP_TOPX, 2);
2361 com_push(c, 2);
2362 com_addbyte(c, BINARY_SUBSCR);
2363 com_pop(c, 1);
2364 com_node(c, augn);
2365 com_addbyte(c, assigning);
2366 com_pop(c, 1);
2367 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002369 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002370 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002371}
2372
2373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002374com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
2376 REQ(n, trailer);
2377 switch (TYPE(CHILD(n, 0))) {
2378 case LPAR:
2379 com_call_function(c, CHILD(n, 1));
2380 break;
2381 case DOT:
2382 com_select_member(c, CHILD(n, 1));
2383 break;
2384 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002385 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 break;
2387 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002389 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 }
2391}
2392
2393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002395{
2396 int i;
2397 REQ(n, power);
2398 com_atom(c, CHILD(n, 0));
2399 for (i = 1; i < NCH(n); i++) {
2400 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2401 com_factor(c, CHILD(n, i+1));
2402 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002404 break;
2405 }
2406 else
2407 com_apply_trailer(c, CHILD(n, i));
2408 }
2409}
2410
2411static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412com_invert_constant(struct compiling *c, node *n)
2413{
2414 /* Compute the inverse of int and longs and use them directly,
2415 but be prepared to generate code for all other
2416 possibilities (invalid numbers, floats, complex).
2417 */
2418 PyObject *num, *inv = NULL;
2419 int i;
2420
2421 REQ(n, NUMBER);
2422 num = parsenumber(c, STR(n));
2423 if (num == NULL)
2424 i = 255;
2425 else {
2426 inv = PyNumber_Invert(num);
2427 if (inv == NULL) {
2428 PyErr_Clear();
2429 i = com_addconst(c, num);
2430 } else {
2431 i = com_addconst(c, inv);
2432 Py_DECREF(inv);
2433 }
2434 Py_DECREF(num);
2435 }
2436 com_addoparg(c, LOAD_CONST, i);
2437 com_push(c, 1);
2438 if (num != NULL && inv == NULL)
2439 com_addbyte(c, UNARY_INVERT);
2440}
2441
Tim Peters51e26512001-09-07 08:45:55 +00002442static int
2443is_float_zero(const char *p)
2444{
2445 int found_radix_point = 0;
2446 int ch;
2447 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2448 switch (ch) {
2449 case '0':
2450 /* no reason to believe it's not 0 -- continue */
2451 break;
2452
2453 case 'e': case 'E': case 'j': case 'J':
2454 /* If this was a hex constant, we already would have
2455 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2456 must be an exponent marker, and we haven't yet
2457 seen a non-zero digit, and it doesn't matter what
2458 the exponent is then. For 'j' or 'J' similarly,
2459 except that this is an imaginary 0 then. */
2460 return 1;
2461
2462 case '.':
2463 found_radix_point = 1;
2464 break;
2465
2466 default:
2467 return 0;
2468 }
2469 }
2470 return found_radix_point;
2471}
2472
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002473static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002474com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002476 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002477 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002479 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002480 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002481 approriate value as a constant. If the value is negative,
2482 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002483 negative in the 0th position -- unless we're doing unary minus
2484 of a floating zero! In that case the sign is significant, but
2485 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002486 */
2487 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002488 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002489 && TYPE((pfactor = CHILD(n, 1))) == factor
2490 && NCH(pfactor) == 1
2491 && TYPE((ppower = CHILD(pfactor, 0))) == power
2492 && NCH(ppower) == 1
2493 && TYPE((patom = CHILD(ppower, 0))) == atom
2494 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002495 && !(childtype == MINUS &&
2496 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002497 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002498 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002499 return;
2500 }
2501 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002502 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002503 if (s == NULL) {
2504 com_error(c, PyExc_MemoryError, "");
2505 com_addbyte(c, 255);
2506 return;
2507 }
2508 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002509 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002510 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002511 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002512 }
Tim Peters51e26512001-09-07 08:45:55 +00002513 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002514 }
2515 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 com_factor(c, CHILD(n, 1));
2517 com_addbyte(c, UNARY_POSITIVE);
2518 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002519 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 com_factor(c, CHILD(n, 1));
2521 com_addbyte(c, UNARY_NEGATIVE);
2522 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002523 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002524 com_factor(c, CHILD(n, 1));
2525 com_addbyte(c, UNARY_INVERT);
2526 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002528 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 }
2530}
2531
2532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
2535 int i;
2536 int op;
2537 REQ(n, term);
2538 com_factor(c, CHILD(n, 0));
2539 for (i = 2; i < NCH(n); i += 2) {
2540 com_factor(c, CHILD(n, i));
2541 switch (TYPE(CHILD(n, i-1))) {
2542 case STAR:
2543 op = BINARY_MULTIPLY;
2544 break;
2545 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002546 if (c->c_flags & CO_FUTURE_DIVISION)
2547 op = BINARY_TRUE_DIVIDE;
2548 else
2549 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 break;
2551 case PERCENT:
2552 op = BINARY_MODULO;
2553 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002554 case DOUBLESLASH:
2555 op = BINARY_FLOOR_DIVIDE;
2556 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002558 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002559 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002560 op = 255;
2561 }
2562 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002564 }
2565}
2566
2567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002569{
2570 int i;
2571 int op;
2572 REQ(n, arith_expr);
2573 com_term(c, CHILD(n, 0));
2574 for (i = 2; i < NCH(n); i += 2) {
2575 com_term(c, CHILD(n, i));
2576 switch (TYPE(CHILD(n, i-1))) {
2577 case PLUS:
2578 op = BINARY_ADD;
2579 break;
2580 case MINUS:
2581 op = BINARY_SUBTRACT;
2582 break;
2583 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002584 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002585 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002586 op = 255;
2587 }
2588 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002590 }
2591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002595{
2596 int i;
2597 int op;
2598 REQ(n, shift_expr);
2599 com_arith_expr(c, CHILD(n, 0));
2600 for (i = 2; i < NCH(n); i += 2) {
2601 com_arith_expr(c, CHILD(n, i));
2602 switch (TYPE(CHILD(n, i-1))) {
2603 case LEFTSHIFT:
2604 op = BINARY_LSHIFT;
2605 break;
2606 case RIGHTSHIFT:
2607 op = BINARY_RSHIFT;
2608 break;
2609 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002611 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002612 op = 255;
2613 }
2614 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002616 }
2617}
2618
2619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002621{
2622 int i;
2623 int op;
2624 REQ(n, and_expr);
2625 com_shift_expr(c, CHILD(n, 0));
2626 for (i = 2; i < NCH(n); i += 2) {
2627 com_shift_expr(c, CHILD(n, i));
2628 if (TYPE(CHILD(n, i-1)) == AMPER) {
2629 op = BINARY_AND;
2630 }
2631 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002632 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002633 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002634 op = 255;
2635 }
2636 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002638 }
2639}
2640
2641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002642com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002643{
2644 int i;
2645 int op;
2646 REQ(n, xor_expr);
2647 com_and_expr(c, CHILD(n, 0));
2648 for (i = 2; i < NCH(n); i += 2) {
2649 com_and_expr(c, CHILD(n, i));
2650 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2651 op = BINARY_XOR;
2652 }
2653 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002654 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002655 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 op = 255;
2657 }
2658 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 }
2661}
2662
2663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665{
2666 int i;
2667 int op;
2668 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002669 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002671 com_xor_expr(c, CHILD(n, i));
2672 if (TYPE(CHILD(n, i-1)) == VBAR) {
2673 op = BINARY_OR;
2674 }
2675 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002676 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002677 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 op = 255;
2679 }
2680 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 }
2683}
2684
2685static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002686cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687{
2688 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002689 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2691 if (NCH(n) == 1) {
2692 n = CHILD(n, 0);
2693 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002694 case LESS: return PyCmp_LT;
2695 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002696 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002697 case LESSEQUAL: return PyCmp_LE;
2698 case GREATEREQUAL: return PyCmp_GE;
2699 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2700 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2701 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 }
2703 }
2704 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002707 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002709 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
2711 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002712 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717{
2718 int i;
2719 enum cmp_op op;
2720 int anchor;
2721 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2722 com_expr(c, CHILD(n, 0));
2723 if (NCH(n) == 1)
2724 return;
2725
2726 /****************************************************************
2727 The following code is generated for all but the last
2728 comparison in a chain:
2729
2730 label: on stack: opcode: jump to:
2731
2732 a <code to load b>
2733 a, b DUP_TOP
2734 a, b, b ROT_THREE
2735 b, a, b COMPARE_OP
2736 b, 0-or-1 JUMP_IF_FALSE L1
2737 b, 1 POP_TOP
2738 b
2739
2740 We are now ready to repeat this sequence for the next
2741 comparison in the chain.
2742
2743 For the last we generate:
2744
2745 b <code to load c>
2746 b, c COMPARE_OP
2747 0-or-1
2748
2749 If there were any jumps to L1 (i.e., there was more than one
2750 comparison), we generate:
2751
2752 0-or-1 JUMP_FORWARD L2
2753 L1: b, 0 ROT_TWO
2754 0, b POP_TOP
2755 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 ****************************************************************/
2758
2759 anchor = 0;
2760
2761 for (i = 2; i < NCH(n); i += 2) {
2762 com_expr(c, CHILD(n, i));
2763 if (i+2 < NCH(n)) {
2764 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 com_addbyte(c, ROT_THREE);
2767 }
2768 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002769 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002770 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002771 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 }
2773 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 if (i+2 < NCH(n)) {
2776 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2777 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 }
2780 }
2781
2782 if (anchor) {
2783 int anchor2 = 0;
2784 com_addfwref(c, JUMP_FORWARD, &anchor2);
2785 com_backpatch(c, anchor);
2786 com_addbyte(c, ROT_TWO);
2787 com_addbyte(c, POP_TOP);
2788 com_backpatch(c, anchor2);
2789 }
2790}
2791
2792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002793com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794{
2795 REQ(n, not_test); /* 'not' not_test | comparison */
2796 if (NCH(n) == 1) {
2797 com_comparison(c, CHILD(n, 0));
2798 }
2799 else {
2800 com_not_test(c, CHILD(n, 1));
2801 com_addbyte(c, UNARY_NOT);
2802 }
2803}
2804
2805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002806com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807{
2808 int i;
2809 int anchor;
2810 REQ(n, and_test); /* not_test ('and' not_test)* */
2811 anchor = 0;
2812 i = 0;
2813 for (;;) {
2814 com_not_test(c, CHILD(n, i));
2815 if ((i += 2) >= NCH(n))
2816 break;
2817 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2818 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 }
2821 if (anchor)
2822 com_backpatch(c, anchor);
2823}
2824
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002825static int
2826com_make_closure(struct compiling *c, PyCodeObject *co)
2827{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002828 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002829 if (free == 0)
2830 return 0;
2831 for (i = 0; i < free; ++i) {
2832 /* Bypass com_addop_varname because it will generate
2833 LOAD_DEREF but LOAD_CLOSURE is needed.
2834 */
2835 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2836 int arg, reftype;
2837
2838 /* Special case: If a class contains a method with a
2839 free variable that has the same name as a method,
2840 the name will be considered free *and* local in the
2841 class. It should be handled by the closure, as
2842 well as by the normal name loookup logic.
2843 */
2844 reftype = get_ref_type(c, PyString_AS_STRING(name));
2845 if (reftype == CELL)
2846 arg = com_lookup_arg(c->c_cellvars, name);
2847 else /* (reftype == FREE) */
2848 arg = com_lookup_arg(c->c_freevars, name);
2849 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002850 fprintf(stderr, "lookup %s in %s %d %d\n"
2851 "freevars of %s: %s\n",
2852 PyObject_REPR(name),
2853 c->c_name,
2854 reftype, arg,
2855 PyString_AS_STRING(co->co_name),
2856 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002857 Py_FatalError("com_make_closure()");
2858 }
2859 com_addoparg(c, LOAD_CLOSURE, arg);
2860
2861 }
2862 com_push(c, free);
2863 return 1;
2864}
2865
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002870 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002871 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002872 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002873 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002874 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2875 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002876 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002877 if (co == NULL) {
2878 c->c_errors++;
2879 return;
2880 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002881 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002882 i = com_addconst(c, (PyObject *)co);
2883 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002884 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002886 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002887 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002888 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002889 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002890 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002891 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002894 else {
2895 int anchor = 0;
2896 int i = 0;
2897 for (;;) {
2898 com_and_test(c, CHILD(n, i));
2899 if ((i += 2) >= NCH(n))
2900 break;
2901 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2902 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002903 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002904 }
2905 if (anchor)
2906 com_backpatch(c, anchor);
2907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908}
2909
2910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
2913 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002914 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_node(c, CHILD(n, 0));
2916 }
2917 else {
2918 int i;
2919 int len;
2920 len = (NCH(n) + 1) / 2;
2921 for (i = 0; i < NCH(n); i += 2)
2922 com_node(c, CHILD(n, i));
2923 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 }
2926}
2927
2928
2929/* Begin of assignment compilation */
2930
Thomas Wouters434d0822000-08-24 20:11:32 +00002931
2932static void
2933com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2934{
2935 com_addbyte(c, DUP_TOP);
2936 com_push(c, 1);
2937 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002938 com_node(c, augn);
2939 com_addbyte(c, opcode);
2940 com_pop(c, 1);
2941 com_addbyte(c, ROT_TWO);
2942 com_addopname(c, STORE_ATTR, n);
2943 com_pop(c, 2);
2944}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945
2946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002949 if (none_assignment_check(c, STR(n), assigning))
2950 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002952 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953}
2954
2955static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002956com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 REQ(n, trailer);
2959 switch (TYPE(CHILD(n, 0))) {
2960 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002961 if (assigning == OP_DELETE)
2962 com_error(c, PyExc_SyntaxError,
2963 "can't delete function call");
2964 else
2965 com_error(c, PyExc_SyntaxError,
2966 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 break;
2968 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002969 if (assigning > OP_APPLY)
2970 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2971 else
2972 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002974 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002975 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 break;
2977 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002978 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 }
2980}
2981
2982static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002983com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984{
2985 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002986 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2987 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 if (assigning) {
2990 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002991 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_push(c, i-1);
2993 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002995 com_assign(c, CHILD(n, i), assigning, NULL);
2996}
2997
2998static void
2999com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3000{
3001 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003002 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003003 com_push(c, 1);
3004 com_node(c, augn);
3005 com_addbyte(c, opcode);
3006 com_pop(c, 1);
3007 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008}
3009
3010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012{
3013 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003014 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 if (assigning)
3016 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017}
3018
3019static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003020com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021{
3022 /* Loop to avoid trivial recursion */
3023 for (;;) {
3024 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003025
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 case exprlist:
3027 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003028 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003029 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003031 if (TYPE(CHILD(n, 1)) == gen_for) {
3032 com_error(c, PyExc_SystemError,
3033 "assign to generator expression not possible");
3034 return;
3035 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003036 if (assigning > OP_APPLY) {
3037 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003038 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003039 return;
3040 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003041 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 return;
3043 }
3044 n = CHILD(n, 0);
3045 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003046
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 case test:
3048 case and_test:
3049 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003052 case xor_expr:
3053 case and_expr:
3054 case shift_expr:
3055 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003057 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003059 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003060 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061 return;
3062 }
3063 n = CHILD(n, 0);
3064 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003065
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003066 case power: /* atom trailer* ('**' power)*
3067 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003068 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003070 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 return;
3072 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003073 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 int i;
3075 com_node(c, CHILD(n, 0));
3076 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003077 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003079 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003080 return;
3081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 com_apply_trailer(c, CHILD(n, i));
3083 } /* NB i is still alive */
3084 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003085 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 return;
3087 }
3088 n = CHILD(n, 0);
3089 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 case atom:
3092 switch (TYPE(CHILD(n, 0))) {
3093 case LPAR:
3094 n = CHILD(n, 1);
3095 if (TYPE(n) == RPAR) {
3096 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003097 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003098 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 return;
3100 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003101 if (assigning > OP_APPLY) {
3102 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003103 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003104 return;
3105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 break;
3107 case LSQB:
3108 n = CHILD(n, 1);
3109 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003110 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003111 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 return;
3113 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003114 if (assigning > OP_APPLY) {
3115 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003116 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003117 return;
3118 }
3119 if (NCH(n) > 1
3120 && TYPE(CHILD(n, 1)) == list_for) {
3121 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003122 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003123 return;
3124 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003125 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 return;
3127 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003128 if (assigning > OP_APPLY)
3129 com_augassign_name(c, CHILD(n, 0),
3130 assigning, augn);
3131 else
3132 com_assign_name(c, CHILD(n, 0),
3133 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 return;
3135 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003137 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 return;
3139 }
3140 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003141
3142 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 com_error(c, PyExc_SyntaxError,
3144 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003145 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003146
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003148 com_error(c, PyExc_SystemError,
3149 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 }
3153 }
3154}
Guido van Rossum7c531111997-03-11 18:42:21 +00003155
Thomas Wouters434d0822000-08-24 20:11:32 +00003156static void
3157com_augassign(struct compiling *c, node *n)
3158{
3159 int opcode;
3160
3161 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3162 case '+': opcode = INPLACE_ADD; break;
3163 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003164 case '/':
3165 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3166 opcode = INPLACE_FLOOR_DIVIDE;
3167 else if (c->c_flags & CO_FUTURE_DIVISION)
3168 opcode = INPLACE_TRUE_DIVIDE;
3169 else
3170 opcode = INPLACE_DIVIDE;
3171 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003172 case '%': opcode = INPLACE_MODULO; break;
3173 case '<': opcode = INPLACE_LSHIFT; break;
3174 case '>': opcode = INPLACE_RSHIFT; break;
3175 case '&': opcode = INPLACE_AND; break;
3176 case '^': opcode = INPLACE_XOR; break;
3177 case '|': opcode = INPLACE_OR; break;
3178 case '*':
3179 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3180 opcode = INPLACE_POWER;
3181 else
3182 opcode = INPLACE_MULTIPLY;
3183 break;
3184 default:
3185 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3186 return;
3187 }
3188 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3189}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190
3191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193{
Thomas Wouters434d0822000-08-24 20:11:32 +00003194 REQ(n, expr_stmt);
3195 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003196 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003197 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003199 if (NCH(n) == 1) {
3200 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003201 if (c->c_interactive)
3202 com_addbyte(c, PRINT_EXPR);
3203 else
3204 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003207 else if (TYPE(CHILD(n,1)) == augassign)
3208 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 else {
3210 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003211 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003212 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003213 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_push(c, 1);
3216 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003217 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 }
3219 }
3220}
3221
3222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003224{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003225 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003226 int i;
3227 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003228 if (Py_OptimizeFlag)
3229 return;
3230 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003231
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003232 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003233 raise AssertionError [, <message>]
3234
3235 where <message> is the second test, if present.
3236 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003237 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003238 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003239 com_addbyte(c, POP_TOP);
3240 com_pop(c, 1);
3241 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003242 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003243 com_push(c, 1);
3244 i = NCH(n)/2; /* Either 2 or 4 */
3245 if (i > 1)
3246 com_node(c, CHILD(n, 3));
3247 com_addoparg(c, RAISE_VARARGS, i);
3248 com_pop(c, i);
3249 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003250 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003251 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003252 com_addbyte(c, POP_TOP);
3253}
3254
3255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003256com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003258 int i = 1;
3259 node* stream = NULL;
3260
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003261 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003262
3263 /* are we using the extended print form? */
3264 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3265 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003266 com_node(c, stream);
3267 /* stack: [...] => [... stream] */
3268 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003269 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3270 i = 4;
3271 else
3272 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003274 for (; i < NCH(n); i += 2) {
3275 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003276 com_addbyte(c, DUP_TOP);
3277 /* stack: [stream] => [stream stream] */
3278 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003279 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003280 /* stack: [stream stream] => [stream stream obj] */
3281 com_addbyte(c, ROT_TWO);
3282 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003283 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003284 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003285 com_pop(c, 2);
3286 }
3287 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003288 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003289 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003290 com_addbyte(c, PRINT_ITEM);
3291 com_pop(c, 1);
3292 }
3293 }
3294 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003295 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003296 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003297 /* must pop the extra stream object off the stack */
3298 com_addbyte(c, POP_TOP);
3299 /* stack: [... stream] => [...] */
3300 com_pop(c, 1);
3301 }
3302 }
3303 else {
3304 if (stream != NULL) {
3305 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003306 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003307 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003308 com_pop(c, 1);
3309 }
3310 else
3311 com_addbyte(c, PRINT_NEWLINE);
3312 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313}
3314
3315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003316com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003319 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003321 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003322 if (c->c_flags & CO_GENERATOR) {
3323 if (NCH(n) > 1) {
3324 com_error(c, PyExc_SyntaxError,
3325 "'return' with argument inside generator");
3326 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003327 }
3328 if (NCH(n) < 2) {
3329 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_push(c, 1);
3331 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003332 else
3333 com_node(c, CHILD(n, 1));
3334 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003335 com_pop(c, 1);
3336}
3337
3338static void
3339com_yield_stmt(struct compiling *c, node *n)
3340{
Tim Peters95c80f82001-06-23 02:07:08 +00003341 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003342 REQ(n, yield_stmt); /* 'yield' testlist */
3343 if (!c->c_infunction) {
3344 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3345 }
Tim Peters95c80f82001-06-23 02:07:08 +00003346
3347 for (i = 0; i < c->c_nblocks; ++i) {
3348 if (c->c_block[i] == SETUP_FINALLY) {
3349 com_error(c, PyExc_SyntaxError,
3350 "'yield' not allowed in a 'try' block "
3351 "with a 'finally' clause");
3352 return;
3353 }
3354 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003355 com_node(c, CHILD(n, 1));
3356 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003357 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358}
3359
3360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003361com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003364 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3365 if (NCH(n) > 1) {
3366 com_node(c, CHILD(n, 1));
3367 if (NCH(n) > 3) {
3368 com_node(c, CHILD(n, 3));
3369 if (NCH(n) > 5)
3370 com_node(c, CHILD(n, 5));
3371 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003372 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 i = NCH(n)/2;
3374 com_addoparg(c, RAISE_VARARGS, i);
3375 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376}
3377
3378static void
Thomas Wouters52152252000-08-17 22:55:00 +00003379com_from_import(struct compiling *c, node *n)
3380{
3381 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3382 com_push(c, 1);
3383 if (NCH(n) > 1) {
3384 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3385 com_error(c, PyExc_SyntaxError, "invalid syntax");
3386 return;
3387 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003388 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003389 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003390 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003391 com_pop(c, 1);
3392}
3393
3394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003395com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396{
3397 int i;
3398 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003399 /* 'import' dotted_name (',' dotted_name)* |
3400 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003402 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003403 /* 'from' dotted_name 'import' ... */
3404 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003405
3406 if (TYPE(CHILD(n, 3)) == STAR) {
3407 tup = Py_BuildValue("(s)", "*");
3408 } else {
3409 tup = PyTuple_New((NCH(n) - 2)/2);
3410 for (i = 3; i < NCH(n); i += 2) {
3411 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003412 PyString_FromString(STR(
3413 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003414 }
3415 }
3416 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003417 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003418 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003419 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003420 if (TYPE(CHILD(n, 3)) == STAR)
3421 com_addbyte(c, IMPORT_STAR);
3422 else {
3423 for (i = 3; i < NCH(n); i += 2)
3424 com_from_import(c, CHILD(n, i));
3425 com_addbyte(c, POP_TOP);
3426 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003427 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 }
3429 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003430 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003432 node *subn = CHILD(n, i);
3433 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003434 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003435 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003436 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003437 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003438 int j;
3439 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003440 com_error(c, PyExc_SyntaxError,
3441 "invalid syntax");
3442 return;
3443 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003444 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3445 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003446 CHILD(CHILD(subn, 0),
3447 j));
3448 com_addop_varname(c, VAR_STORE,
3449 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003450 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003451 com_addop_varname(c, VAR_STORE,
3452 STR(CHILD(CHILD(subn, 0),
3453 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 }
3456 }
3457}
3458
3459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003460com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003461{
3462 REQ(n, exec_stmt);
3463 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3464 com_node(c, CHILD(n, 1));
3465 if (NCH(n) >= 4)
3466 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 com_push(c, 1);
3470 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003471 if (NCH(n) >= 6)
3472 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003474 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003475 com_push(c, 1);
3476 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003477 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003478 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003479}
3480
Guido van Rossum7c531111997-03-11 18:42:21 +00003481static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003482is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003483{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003485 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003486 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003487
3488 /* Label to avoid tail recursion */
3489 next:
3490 switch (TYPE(n)) {
3491
3492 case suite:
3493 if (NCH(n) == 1) {
3494 n = CHILD(n, 0);
3495 goto next;
3496 }
3497 /* Fall through */
3498 case file_input:
3499 for (i = 0; i < NCH(n); i++) {
3500 node *ch = CHILD(n, i);
3501 if (TYPE(ch) == stmt) {
3502 n = ch;
3503 goto next;
3504 }
3505 }
3506 break;
3507
3508 case stmt:
3509 case simple_stmt:
3510 case small_stmt:
3511 n = CHILD(n, 0);
3512 goto next;
3513
3514 case expr_stmt:
3515 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003516 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003517 case test:
3518 case and_test:
3519 case not_test:
3520 case comparison:
3521 case expr:
3522 case xor_expr:
3523 case and_expr:
3524 case shift_expr:
3525 case arith_expr:
3526 case term:
3527 case factor:
3528 case power:
3529 case atom:
3530 if (NCH(n) == 1) {
3531 n = CHILD(n, 0);
3532 goto next;
3533 }
3534 break;
3535
3536 case NAME:
3537 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3538 return 1;
3539 break;
3540
3541 case NUMBER:
3542 v = parsenumber(c, STR(n));
3543 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003544 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003545 break;
3546 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003547 i = PyObject_IsTrue(v);
3548 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003549 return i == 0;
3550
3551 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003552 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003553 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003554 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003555 break;
3556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003557 i = PyObject_IsTrue(v);
3558 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003559 return i == 0;
3560
3561 }
3562 return 0;
3563}
3564
Tim Peters08a898f2001-06-28 01:52:22 +00003565
3566/* Look under n for a return stmt with an expression.
3567 * This hack is used to find illegal returns under "if 0:" blocks in
3568 * functions already known to be generators (as determined by the symtable
3569 * pass).
3570 * Return the offending return node if found, else NULL.
3571 */
3572static node *
3573look_for_offending_return(node *n)
3574{
3575 int i;
3576
3577 for (i = 0; i < NCH(n); ++i) {
3578 node *kid = CHILD(n, i);
3579
3580 switch (TYPE(kid)) {
3581 case classdef:
3582 case funcdef:
3583 case lambdef:
3584 /* Stuff in nested functions & classes doesn't
3585 affect the code block we started in. */
3586 return NULL;
3587
3588 case return_stmt:
3589 if (NCH(kid) > 1)
3590 return kid;
3591 break;
3592
3593 default: {
3594 node *bad = look_for_offending_return(kid);
3595 if (bad != NULL)
3596 return bad;
3597 }
3598 }
3599 }
3600
3601 return NULL;
3602}
3603
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606{
3607 int i;
3608 int anchor = 0;
3609 REQ(n, if_stmt);
3610 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3611 for (i = 0; i+3 < NCH(n); i+=4) {
3612 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003613 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003614 if (is_constant_false(c, ch)) {
3615 /* We're going to skip this block. However, if this
3616 is a generator, we have to check the dead code
3617 anyway to make sure there aren't any return stmts
3618 with expressions, in the same scope. */
3619 if (c->c_flags & CO_GENERATOR) {
3620 node *p = look_for_offending_return(n);
3621 if (p != NULL) {
3622 int savelineno = c->c_lineno;
3623 c->c_lineno = p->n_lineno;
3624 com_error(c, PyExc_SyntaxError,
3625 "'return' with argument "
3626 "inside generator");
3627 c->c_lineno = savelineno;
3628 }
3629 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003630 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003631 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003633 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003634 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635 com_addfwref(c, JUMP_IF_FALSE, &a);
3636 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 com_node(c, CHILD(n, i+3));
3639 com_addfwref(c, JUMP_FORWARD, &anchor);
3640 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003641 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642 com_addbyte(c, POP_TOP);
3643 }
3644 if (i+2 < NCH(n))
3645 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003646 if (anchor)
3647 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648}
3649
3650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003651com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652{
3653 int break_anchor = 0;
3654 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003655 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3657 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003658 block_push(c, SETUP_LOOP);
3659 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003660 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661 com_node(c, CHILD(n, 1));
3662 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3663 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003665 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003667 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003668 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3669 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003670 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003671 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003672 com_addbyte(c, POP_TOP);
3673 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003674 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 if (NCH(n) > 4)
3676 com_node(c, CHILD(n, 6));
3677 com_backpatch(c, break_anchor);
3678}
3679
3680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003681com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683 int break_anchor = 0;
3684 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003685 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686 REQ(n, for_stmt);
3687 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3688 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003689 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003691 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003692 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003693 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003694 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003696 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003697 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003699 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003700 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3701 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003703 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003704 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003705 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706 if (NCH(n) > 8)
3707 com_node(c, CHILD(n, 8));
3708 com_backpatch(c, break_anchor);
3709}
3710
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003711/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003712
3713 SETUP_FINALLY L
3714 <code for S>
3715 POP_BLOCK
3716 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003717 L: <code for Sf>
3718 END_FINALLY
3719
3720 The special instructions use the block stack. Each block
3721 stack entry contains the instruction that created it (here
3722 SETUP_FINALLY), the level of the value stack at the time the
3723 block stack entry was created, and a label (here L).
3724
3725 SETUP_FINALLY:
3726 Pushes the current value stack level and the label
3727 onto the block stack.
3728 POP_BLOCK:
3729 Pops en entry from the block stack, and pops the value
3730 stack until its level is the same as indicated on the
3731 block stack. (The label is ignored.)
3732 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003733 Pops a variable number of entries from the *value* stack
3734 and re-raises the exception they specify. The number of
3735 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003736
3737 The block stack is unwound when an exception is raised:
3738 when a SETUP_FINALLY entry is found, the exception is pushed
3739 onto the value stack (and the exception condition is cleared),
3740 and the interpreter jumps to the label gotten from the block
3741 stack.
3742
3743 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003744 (The contents of the value stack is shown in [], with the top
3745 at the right; 'tb' is trace-back info, 'val' the exception's
3746 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003747
3748 Value stack Label Instruction Argument
3749 [] SETUP_EXCEPT L1
3750 [] <code for S>
3751 [] POP_BLOCK
3752 [] JUMP_FORWARD L0
3753
Guido van Rossum3f5da241990-12-20 15:06:42 +00003754 [tb, val, exc] L1: DUP )
3755 [tb, val, exc, exc] <evaluate E1> )
3756 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3757 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3758 [tb, val, exc, 1] POP )
3759 [tb, val, exc] POP
3760 [tb, val] <assign to V1> (or POP if no V1)
3761 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003762 [] <code for S1>
3763 JUMP_FORWARD L0
3764
Guido van Rossum3f5da241990-12-20 15:06:42 +00003765 [tb, val, exc, 0] L2: POP
3766 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003767 .............................etc.......................
3768
Guido van Rossum3f5da241990-12-20 15:06:42 +00003769 [tb, val, exc, 0] Ln+1: POP
3770 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003771
3772 [] L0: <next statement>
3773
3774 Of course, parts are not generated if Vi or Ei is not present.
3775*/
3776
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003779{
3780 int except_anchor = 0;
3781 int end_anchor = 0;
3782 int else_anchor = 0;
3783 int i;
3784 node *ch;
3785
3786 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3787 block_push(c, SETUP_EXCEPT);
3788 com_node(c, CHILD(n, 2));
3789 com_addbyte(c, POP_BLOCK);
3790 block_pop(c, SETUP_EXCEPT);
3791 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3792 com_backpatch(c, except_anchor);
3793 for (i = 3;
3794 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3795 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003797 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003798 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003799 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003800 break;
3801 }
3802 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003803 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003804 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003805 if (NCH(ch) > 1) {
3806 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003807 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003808 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003809 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003811 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3812 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003814 }
3815 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003817 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003818 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003820 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003821 com_pop(c, 1);
3822 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003823 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003825 com_node(c, CHILD(n, i+2));
3826 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3827 if (except_anchor) {
3828 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003829 /* We come in with [tb, val, exc, 0] on the
3830 stack; one pop and it's the same as
3831 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003832 com_addbyte(c, POP_TOP);
3833 }
3834 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003835 /* We actually come in here with [tb, val, exc] but the
3836 END_FINALLY will zap those and jump around.
3837 The c_stacklevel does not reflect them so we need not pop
3838 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003839 com_addbyte(c, END_FINALLY);
3840 com_backpatch(c, else_anchor);
3841 if (i < NCH(n))
3842 com_node(c, CHILD(n, i+2));
3843 com_backpatch(c, end_anchor);
3844}
3845
3846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003847com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848{
3849 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003850 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003851
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003852 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3853 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003855 com_addbyte(c, POP_BLOCK);
3856 block_pop(c, SETUP_FINALLY);
3857 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003858 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 /* While the generated code pushes only one item,
3860 the try-finally handling can enter here with
3861 up to three items. OK, here are the details:
3862 3 for an exception, 2 for RETURN, 1 for BREAK. */
3863 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003864 com_backpatch(c, finally_anchor);
3865 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003866 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003867 com_node(c, ch);
3868 com_addbyte(c, END_FINALLY);
3869 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003870 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003871}
3872
3873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003874com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003875{
3876 REQ(n, try_stmt);
3877 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3878 | 'try' ':' suite 'finally' ':' suite */
3879 if (TYPE(CHILD(n, 3)) != except_clause)
3880 com_try_finally(c, n);
3881 else
3882 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883}
3884
Guido van Rossum8b993a91997-01-17 21:04:03 +00003885static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003886get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003887{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003888 int i;
3889
Guido van Rossum8b993a91997-01-17 21:04:03 +00003890 /* Label to avoid tail recursion */
3891 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003892 switch (TYPE(n)) {
3893
3894 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895 if (NCH(n) == 1) {
3896 n = CHILD(n, 0);
3897 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003898 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003900 case file_input:
3901 for (i = 0; i < NCH(n); i++) {
3902 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 if (TYPE(ch) == stmt) {
3904 n = ch;
3905 goto next;
3906 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003907 }
3908 break;
3909
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003910 case stmt:
3911 case simple_stmt:
3912 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003913 n = CHILD(n, 0);
3914 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003915
3916 case expr_stmt:
3917 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003918 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003919 case test:
3920 case and_test:
3921 case not_test:
3922 case comparison:
3923 case expr:
3924 case xor_expr:
3925 case and_expr:
3926 case shift_expr:
3927 case arith_expr:
3928 case term:
3929 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003930 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003931 if (NCH(n) == 1) {
3932 n = CHILD(n, 0);
3933 goto next;
3934 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003935 break;
3936
3937 case atom:
3938 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003939 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003940 break;
3941
3942 }
3943 return NULL;
3944}
3945
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003947get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003948{
Guido van Rossum541563e1999-01-28 15:08:09 +00003949 /* Don't generate doc-strings if run with -OO */
3950 if (Py_OptimizeFlag > 1)
3951 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003952 n = get_rawdocstring(n);
3953 if (n == NULL)
3954 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003955 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003956}
3957
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003959com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003960{
3961 REQ(n, suite);
3962 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3963 if (NCH(n) == 1) {
3964 com_node(c, CHILD(n, 0));
3965 }
3966 else {
3967 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003968 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 node *ch = CHILD(n, i);
3970 if (TYPE(ch) == stmt)
3971 com_node(c, ch);
3972 }
3973 }
3974}
3975
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003976/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003979{
3980 int i = c->c_nblocks;
3981 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3982 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3983 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003984 else if (i <= 0) {
3985 /* at the outer level */
3986 com_error(c, PyExc_SyntaxError,
3987 "'continue' not properly in loop");
3988 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003989 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003990 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003991 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003992 if (c->c_block[j] == SETUP_LOOP)
3993 break;
3994 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003995 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003996 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003997 for (; i > j; --i) {
3998 if (c->c_block[i] == SETUP_EXCEPT ||
3999 c->c_block[i] == SETUP_FINALLY) {
4000 com_addoparg(c, CONTINUE_LOOP,
4001 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004002 return;
4003 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004004 if (c->c_block[i] == END_FINALLY) {
4005 com_error(c, PyExc_SyntaxError,
4006 "'continue' not supported inside 'finally' clause");
4007 return;
4008 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004009 }
4010 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004011 com_error(c, PyExc_SyntaxError,
4012 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004013 }
4014 /* XXX Could allow it inside a 'finally' clause
4015 XXX if we could pop the exception still on the stack */
4016}
4017
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004018/* Return the number of default values in the argument list.
4019
4020 If a non-default argument follows a default argument, set an
4021 exception and return -1.
4022*/
4023
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004024static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004025com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004026{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004027 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004028 if (TYPE(n) == lambdef) {
4029 /* lambdef: 'lambda' [varargslist] ':' test */
4030 n = CHILD(n, 1);
4031 }
4032 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004033 REQ(n, funcdef);
4034 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4035 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004036 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4037 n = CHILD(n, 1);
4038 }
4039 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004040 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004041 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004042 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004043 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4044 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004045 ndefs = 0;
4046 for (i = 0; i < nch; i++) {
4047 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004048 if (TYPE(CHILD(n, i)) == STAR ||
4049 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004050 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004051 i++;
4052 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004053 t = RPAR; /* Anything except EQUAL or COMMA */
4054 else
4055 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004056 if (t == EQUAL) {
4057 i++;
4058 ndefs++;
4059 com_node(c, CHILD(n, i));
4060 i++;
4061 if (i >= nch)
4062 break;
4063 t = TYPE(CHILD(n, i));
4064 }
4065 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004066 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004067 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004068 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004069 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004070 return -1;
4071 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004072 }
4073 if (t != COMMA)
4074 break;
4075 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004076 return ndefs;
4077}
4078
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004079static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004080com_decorator_name(struct compiling *c, node *n)
4081{
4082 /* dotted_name: NAME ('.' NAME)* */
4083
4084 int i, nch;
4085 node *varname;
4086
4087 REQ(n, dotted_name);
4088 nch = NCH(n);
4089 assert(nch >= 1 && nch % 2 == 1);
4090
4091 varname = CHILD(n, 0);
4092 REQ(varname, NAME);
4093 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004094 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004095
4096 for (i = 1; i < nch; i += 2) {
4097 node *attrname;
4098
4099 REQ(CHILD(n, i), DOT);
4100
4101 attrname = CHILD(n, i + 1);
4102 REQ(attrname, NAME);
4103 com_addop_name(c, LOAD_ATTR, STR(attrname));
4104 }
4105}
4106
4107static void
4108com_decorator(struct compiling *c, node *n)
4109{
4110 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
4111 int nch = NCH(n);
4112 assert(nch >= 2);
4113 REQ(CHILD(n, 0), AT);
4114 com_decorator_name(c, CHILD(n, 1));
4115
4116 if (nch > 2) {
4117 assert(nch == 4 || nch == 5);
4118 REQ(CHILD(n, 2), LPAR);
4119 REQ(CHILD(n, nch - 1), RPAR);
4120 com_call_function(c, CHILD(n, 3));
4121 }
4122}
4123
4124static int
4125com_decorators(struct compiling *c, node *n)
4126{
4127 int i, nch, ndecorators;
4128
4129 /* decorator ([NEWLINE] decorator)* NEWLINE */
4130 nch = NCH(n);
4131 assert(nch >= 2);
4132 REQ(CHILD(n, nch - 1), NEWLINE);
4133
4134 ndecorators = 0;
Brett Cannonadd33602004-08-15 07:21:25 +00004135 /* the application order for decorators is the reverse of how they are
4136 listed; bottom-up */
4137 nch -= 1;
4138 for (i = 0; i < nch; i+=1) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004139 node *ch = CHILD(n, i);
4140 if (TYPE(ch) != NEWLINE) {
4141 com_decorator(c, ch);
4142 ++ndecorators;
4143 }
4144 }
4145
4146 return ndecorators;
4147}
4148
4149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004150com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004151{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004152 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004153 int ndefs, ndecorators;
4154 REQ(n, funcdef);
4155 /* -6 -5 -4 -3 -2 -1
4156 funcdef: [decorators] 'def' NAME parameters ':' suite */
4157
4158 if (NCH(n) == 6)
4159 ndecorators = com_decorators(c, CHILD(n, 0));
4160 else
4161 ndecorators = 0;
4162
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004163 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004164 if (ndefs < 0)
4165 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004166 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004167 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004168 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004169 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004170 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 c->c_errors++;
4172 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004173 int closure = com_make_closure(c, (PyCodeObject *)co);
4174 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004175 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004176 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004177 if (closure)
4178 com_addoparg(c, MAKE_CLOSURE, ndefs);
4179 else
4180 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004181 com_pop(c, ndefs);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004182 while (ndecorators > 0) {
4183 com_addoparg(c, CALL_FUNCTION, 1);
4184 com_pop(c, 1);
4185 ndecorators--;
4186 }
4187 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004188 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004189 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190 }
4191}
4192
4193static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004194com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004195{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004196 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004197 REQ(n, testlist);
4198 /* testlist: test (',' test)* [','] */
4199 for (i = 0; i < NCH(n); i += 2)
4200 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004201 i = (NCH(n)+1) / 2;
4202 com_addoparg(c, BUILD_TUPLE, i);
4203 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004204}
4205
4206static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004207com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004208{
Guido van Rossum25831651993-05-19 14:50:45 +00004209 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004210 PyObject *v;
4211 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004212 char *name;
4213
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004215 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004216 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004217 c->c_errors++;
4218 return;
4219 }
4220 /* Push the class name on the stack */
4221 i = com_addconst(c, v);
4222 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004223 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004224 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004225 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004226 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004227 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004228 com_push(c, 1);
4229 }
Guido van Rossum25831651993-05-19 14:50:45 +00004230 else
4231 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004232 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004233 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004234 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004235 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004236 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004237 c->c_errors++;
4238 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004239 int closure = com_make_closure(c, co);
4240 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004241 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004242 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004243 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004244 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004245 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004246 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004247 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004248 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004249 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004250 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004252 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004253 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004254 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004255}
4256
4257static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004258com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004259{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004260 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004261 if (c->c_errors)
4262 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263 switch (TYPE(n)) {
4264
4265 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 case funcdef:
4268 com_funcdef(c, n);
4269 break;
4270 case classdef:
4271 com_classdef(c, n);
4272 break;
4273
4274 /* Trivial parse tree nodes */
4275
4276 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004277 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004278 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004279 n = CHILD(n, 0);
4280 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004281
4282 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004283 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004284 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004285 {
4286 int i;
4287 for (i = 0; i < NCH(n)-1; i += 2)
4288 com_node(c, CHILD(n, i));
4289 }
4290 break;
4291
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004292 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004293 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004294 n = CHILD(n, 0);
4295 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296
4297 /* Statement nodes */
4298
4299 case expr_stmt:
4300 com_expr_stmt(c, n);
4301 break;
4302 case print_stmt:
4303 com_print_stmt(c, n);
4304 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004305 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004306 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004307 break;
4308 case pass_stmt:
4309 break;
4310 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004311 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004312 com_error(c, PyExc_SyntaxError,
4313 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004314 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004315 com_addbyte(c, BREAK_LOOP);
4316 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004317 case continue_stmt:
4318 com_continue_stmt(c, n);
4319 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004320 case return_stmt:
4321 com_return_stmt(c, n);
4322 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004323 case yield_stmt:
4324 com_yield_stmt(c, n);
4325 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004326 case raise_stmt:
4327 com_raise_stmt(c, n);
4328 break;
4329 case import_stmt:
4330 com_import_stmt(c, n);
4331 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004332 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004333 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004334 case exec_stmt:
4335 com_exec_stmt(c, n);
4336 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004337 case assert_stmt:
4338 com_assert_stmt(c, n);
4339 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004340 case if_stmt:
4341 com_if_stmt(c, n);
4342 break;
4343 case while_stmt:
4344 com_while_stmt(c, n);
4345 break;
4346 case for_stmt:
4347 com_for_stmt(c, n);
4348 break;
4349 case try_stmt:
4350 com_try_stmt(c, n);
4351 break;
4352 case suite:
4353 com_suite(c, n);
4354 break;
4355
4356 /* Expression nodes */
4357
4358 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004359 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004360 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004361 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004362 break;
4363 case test:
4364 com_test(c, n);
4365 break;
4366 case and_test:
4367 com_and_test(c, n);
4368 break;
4369 case not_test:
4370 com_not_test(c, n);
4371 break;
4372 case comparison:
4373 com_comparison(c, n);
4374 break;
4375 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004376 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004377 break;
4378 case expr:
4379 com_expr(c, n);
4380 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004381 case xor_expr:
4382 com_xor_expr(c, n);
4383 break;
4384 case and_expr:
4385 com_and_expr(c, n);
4386 break;
4387 case shift_expr:
4388 com_shift_expr(c, n);
4389 break;
4390 case arith_expr:
4391 com_arith_expr(c, n);
4392 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004393 case term:
4394 com_term(c, n);
4395 break;
4396 case factor:
4397 com_factor(c, n);
4398 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004399 case power:
4400 com_power(c, n);
4401 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004402 case atom:
4403 com_atom(c, n);
4404 break;
4405
4406 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004407 com_error(c, PyExc_SystemError,
4408 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004409 }
4410}
4411
Tim Petersdbd9ba62000-07-09 03:09:57 +00004412static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004413
4414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004415com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004416{
4417 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4418 if (TYPE(CHILD(n, 0)) == LPAR)
4419 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004420 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004421 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004422 com_pop(c, 1);
4423 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004424}
4425
4426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004427com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004428{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004429 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004430 if (NCH(n) == 1) {
4431 com_fpdef(c, CHILD(n, 0));
4432 }
4433 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004434 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004435 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004436 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004437 for (i = 0; i < NCH(n); i += 2)
4438 com_fpdef(c, CHILD(n, i));
4439 }
4440}
4441
4442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004443com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004444{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004445 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004446 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004447 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004448 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004449 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004450 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004451 nch = NCH(n);
4452 /* Enter all arguments in table of locals */
4453 for (i = 0, narg = 0; i < nch; i++) {
4454 node *ch = CHILD(n, i);
4455 node *fp;
4456 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004457 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004458 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4459 fp = CHILD(ch, 0);
4460 if (TYPE(fp) != NAME) {
4461 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4462 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004463 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004464 narg++;
4465 /* all name updates handled by symtable */
4466 if (++i >= nch)
4467 break;
4468 ch = CHILD(n, i);
4469 if (TYPE(ch) == EQUAL)
4470 i += 2;
4471 else
4472 REQ(ch, COMMA);
4473 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004474 if (complex) {
4475 /* Generate code for complex arguments only after
4476 having counted the simple arguments */
4477 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004478 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004479 node *ch = CHILD(n, i);
4480 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004481 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004482 break;
4483 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4484 fp = CHILD(ch, 0);
4485 if (TYPE(fp) != NAME) {
4486 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004487 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004488 com_fpdef(c, ch);
4489 }
4490 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004491 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004492 break;
4493 ch = CHILD(n, i);
4494 if (TYPE(ch) == EQUAL)
4495 i += 2;
4496 else
4497 REQ(ch, COMMA);
4498 }
4499 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004500}
4501
4502static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004503com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004504{
4505 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004506 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004507 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004508 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004509 if (doc != NULL) {
4510 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004511 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004512 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004513 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004514 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004515 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004516 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004517 for (i = 0; i < NCH(n); i++) {
4518 node *ch = CHILD(n, i);
4519 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4520 com_node(c, ch);
4521 }
4522}
4523
4524/* Top-level compile-node interface */
4525
4526static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004527compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004528{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004529 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004530 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004531 REQ(n, funcdef);
4532 /* -6 -5 -4 -3 -2 -1
4533 funcdef: [decorators] 'def' NAME parameters ':' suite */
4534 c->c_name = STR(RCHILD(n, -4));
4535 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004536 if (doc != NULL) {
4537 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004538 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004539 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004540 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004541 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004542 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004543 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004544 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004545 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004546 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004547 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004548 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004549 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004550 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4551 com_push(c, 1);
4552 com_addbyte(c, RETURN_VALUE);
4553 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004554}
4555
4556static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004557compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004558{
Guido van Rossum590baa41993-11-30 13:40:46 +00004559 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004560 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004561 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004562
4563 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004564 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004565 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004566 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004567 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004568 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004569 else
4570 ch = CHILD(n, 2);
4571 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004572 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004573 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004574}
4575
4576static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004577compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004578{
4579 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004580 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004581 REQ(n, classdef);
4582 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4583 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004584 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004585 /* Initialize local __module__ from global __name__ */
4586 com_addop_name(c, LOAD_GLOBAL, "__name__");
4587 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004588 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004589 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004590 if (doc != NULL) {
4591 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004592 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004593 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004594 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004595 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004596 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004597 }
4598 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004599 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004600 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004601 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004602 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004603 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004604 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004605 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004606}
4607
4608static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004609compile_generator_expression(struct compiling *c, node *n)
4610{
4611 /* testlist_gexp: test gen_for */
4612 /* argument: test gen_for */
4613 REQ(CHILD(n, 0), test);
4614 REQ(CHILD(n, 1), gen_for);
4615
4616 c->c_name = "<generator expression>";
4617 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4618
4619 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4620 com_push(c, 1);
4621 com_addbyte(c, RETURN_VALUE);
4622 com_pop(c, 1);
4623}
4624
4625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004626compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004627{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004628 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004629
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004630 switch (TYPE(n)) {
4631
Guido van Rossum4c417781991-01-21 16:09:22 +00004632 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004633 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004634 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004635 n = CHILD(n, 0);
4636 if (TYPE(n) != NEWLINE)
4637 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004638 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004639 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4640 com_push(c, 1);
4641 com_addbyte(c, RETURN_VALUE);
4642 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004643 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004644 break;
4645
Guido van Rossum4c417781991-01-21 16:09:22 +00004646 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004647 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004648 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004649 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4650 com_push(c, 1);
4651 com_addbyte(c, RETURN_VALUE);
4652 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004653 break;
4654
Guido van Rossum590baa41993-11-30 13:40:46 +00004655 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004656 com_node(c, CHILD(n, 0));
4657 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004658 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004659 break;
4660
Guido van Rossum590baa41993-11-30 13:40:46 +00004661 case lambdef: /* anonymous function definition */
4662 compile_lambdef(c, n);
4663 break;
4664
Guido van Rossum4c417781991-01-21 16:09:22 +00004665 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004666 compile_funcdef(c, n);
4667 break;
4668
Guido van Rossum4c417781991-01-21 16:09:22 +00004669 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004670 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004671 break;
4672
Raymond Hettinger354433a2004-05-19 08:20:33 +00004673 case testlist_gexp: /* A generator expression */
4674 case argument: /* A generator expression */
4675 compile_generator_expression(c, n);
4676 break;
4677
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004678 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004679 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004680 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004681 }
4682}
4683
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004684static PyObject *
4685dict_keys_inorder(PyObject *dict, int offset)
4686{
4687 PyObject *tuple, *k, *v;
4688 int i, pos = 0, size = PyDict_Size(dict);
4689
4690 tuple = PyTuple_New(size);
4691 if (tuple == NULL)
4692 return NULL;
4693 while (PyDict_Next(dict, &pos, &k, &v)) {
4694 i = PyInt_AS_LONG(v);
4695 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004696 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004697 PyTuple_SET_ITEM(tuple, i - offset, k);
4698 }
4699 return tuple;
4700}
4701
Guido van Rossum79f25d91997-04-29 20:08:16 +00004702PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004703PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004704{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004705 return PyNode_CompileFlags(n, filename, NULL);
4706}
4707
4708PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004709PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004710{
4711 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004712}
4713
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004714struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004715PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004716{
4717 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004718 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004719
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004720 ff = PyNode_Future(n, filename);
4721 if (ff == NULL)
4722 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004723 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004724 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004725 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004726 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004727 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004728 return st;
4729}
4730
Guido van Rossum79f25d91997-04-29 20:08:16 +00004731static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004732icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004733{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004734 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004735}
4736
Guido van Rossum79f25d91997-04-29 20:08:16 +00004737static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004738jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004739 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004740{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004742 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004743 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004744 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004745 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4746 sc.c_encoding = "utf-8";
4747 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004748 sc.c_encoding = STR(n);
4749 n = CHILD(n, 0);
4750 } else {
4751 sc.c_encoding = NULL;
4752 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004754 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004755 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004756 /* c_symtable still points to parent's symbols */
4757 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004758 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004759 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004760 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004761 if (base->c_encoding != NULL) {
4762 assert(sc.c_encoding == NULL);
4763 sc.c_encoding = base->c_encoding;
4764 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004765 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004766 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004767 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004768 if (sc.c_future == NULL) {
4769 com_free(&sc);
4770 return NULL;
4771 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004772 if (flags) {
4773 int merged = sc.c_future->ff_features |
4774 flags->cf_flags;
4775 sc.c_future->ff_features = merged;
4776 flags->cf_flags = merged;
4777 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004778 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4779 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780 com_free(&sc);
4781 return NULL;
4782 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004783 /* reset symbol table for second pass */
4784 sc.c_symtable->st_nscopes = 1;
4785 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004786 }
4787 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 if (symtable_load_symbols(&sc) < 0) {
4789 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004790 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004791 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004792 compile_node(&sc, n);
4793 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004794 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004795 PyObject *consts, *names, *varnames, *filename, *name,
4796 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004797 consts = PyList_AsTuple(sc.c_consts);
4798 names = PyList_AsTuple(sc.c_names);
4799 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004800 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4801 freevars = dict_keys_inorder(sc.c_freevars,
4802 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004803 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004804 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004805 if (!PyErr_Occurred())
4806 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807 sc.c_nlocals,
4808 sc.c_maxstacklevel,
4809 sc.c_flags,
4810 sc.c_code,
4811 consts,
4812 names,
4813 varnames,
4814 freevars,
4815 cellvars,
4816 filename,
4817 name,
4818 sc.c_firstlineno,
4819 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004820 Py_XDECREF(consts);
4821 Py_XDECREF(names);
4822 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823 Py_XDECREF(freevars);
4824 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004825 Py_XDECREF(filename);
4826 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004827 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004828 else if (!PyErr_Occurred()) {
4829 /* This could happen if someone called PyErr_Clear() after an
4830 error was reported above. That's not supposed to happen,
4831 but I just plugged one case and I'm not sure there can't be
4832 others. In that case, raise SystemError so that at least
4833 it gets reported instead dumping core. */
4834 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4835 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004836 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004837 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004838 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004839 sc.c_symtable = NULL;
4840 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004841 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004842 return co;
4843}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004844
4845int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004846PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004847{
4848 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004849 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004850 int line = co->co_firstlineno;
4851 int addr = 0;
4852 while (--size >= 0) {
4853 addr += *p++;
4854 if (addr > addrq)
4855 break;
4856 line += *p++;
4857 }
4858 return line;
4859}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861/* The test for LOCAL must come before the test for FREE in order to
4862 handle classes where name is both local and free. The local var is
4863 a method and the free var is a free var referenced within a method.
4864*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865
4866static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004867get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004868{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004869 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004871
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004872 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4873 return CELL;
4874 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4875 return LOCAL;
4876 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4877 return FREE;
4878 v = PyDict_GetItemString(c->c_globals, name);
4879 if (v) {
4880 if (v == Py_None)
4881 return GLOBAL_EXPLICIT;
4882 else {
4883 return GLOBAL_IMPLICIT;
4884 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004886 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004887 "unknown scope for %.100s in %.100s(%s) "
4888 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4889 name, c->c_name,
4890 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4891 c->c_filename,
4892 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4893 PyObject_REPR(c->c_locals),
4894 PyObject_REPR(c->c_globals)
4895 );
4896
4897 Py_FatalError(buf);
4898 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899}
4900
Guido van Rossum207fda62001-03-02 03:30:41 +00004901/* Helper functions to issue warnings */
4902
4903static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004904issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004905{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004906 if (PyErr_Occurred()) {
4907 /* This can happen because symtable_node continues
4908 processing even after raising a SyntaxError.
4909 Calling PyErr_WarnExplicit now would clobber the
4910 pending exception; instead we fail and let that
4911 exception propagate.
4912 */
4913 return -1;
4914 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004915 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4916 lineno, NULL, NULL) < 0) {
4917 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4918 PyErr_SetString(PyExc_SyntaxError, msg);
4919 PyErr_SyntaxLocation(filename, lineno);
4920 }
4921 return -1;
4922 }
4923 return 0;
4924}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004925
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004926static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004927symtable_warn(struct symtable *st, char *msg)
4928{
Guido van Rossum207fda62001-03-02 03:30:41 +00004929 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004930 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004931 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004932 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004933 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004934}
4935
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004936/* Helper function for setting lineno and filename */
4937
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004938static struct symtable *
4939symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004940{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004941 struct symtable *st;
4942
4943 st = symtable_init();
4944 if (st == NULL)
4945 return NULL;
4946 st->st_future = ff;
4947 st->st_filename = filename;
4948 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4949 if (st->st_errors > 0)
4950 goto fail;
4951 symtable_node(st, n);
4952 if (st->st_errors > 0)
4953 goto fail;
4954 return st;
4955 fail:
4956 if (!PyErr_Occurred()) {
4957 /* This could happen because after a syntax error is
4958 detected, the symbol-table-building continues for
4959 a while, and PyErr_Clear() might erroneously be
4960 called during that process. One such case has been
4961 fixed, but there might be more (now or later).
4962 */
4963 PyErr_SetString(PyExc_SystemError, "lost exception");
4964 }
4965 st->st_future = NULL;
4966 st->st_filename = NULL;
4967 PySymtable_Free(st);
4968 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004969}
4970
4971static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004972symtable_init_compiling_symbols(struct compiling *c)
4973{
4974 PyObject *varnames;
4975
4976 varnames = c->c_symtable->st_cur->ste_varnames;
4977 if (varnames == NULL) {
4978 varnames = PyList_New(0);
4979 if (varnames == NULL)
4980 return -1;
4981 c->c_symtable->st_cur->ste_varnames = varnames;
4982 Py_INCREF(varnames);
4983 } else
4984 Py_INCREF(varnames);
4985 c->c_varnames = varnames;
4986
4987 c->c_globals = PyDict_New();
4988 if (c->c_globals == NULL)
4989 return -1;
4990 c->c_freevars = PyDict_New();
4991 if (c->c_freevars == NULL)
4992 return -1;
4993 c->c_cellvars = PyDict_New();
4994 if (c->c_cellvars == NULL)
4995 return -1;
4996 return 0;
4997}
4998
4999struct symbol_info {
5000 int si_nlocals;
5001 int si_ncells;
5002 int si_nfrees;
5003 int si_nimplicit;
5004};
5005
5006static void
5007symtable_init_info(struct symbol_info *si)
5008{
5009 si->si_nlocals = 0;
5010 si->si_ncells = 0;
5011 si->si_nfrees = 0;
5012 si->si_nimplicit = 0;
5013}
5014
5015static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005016symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005017 struct symbol_info *si)
5018{
5019 PyObject *dict, *v;
5020
5021 /* Seperate logic for DEF_FREE. If it occurs in a function,
5022 it indicates a local that we must allocate storage for (a
5023 cell var). If it occurs in a class, then the class has a
5024 method and a free variable with the same name.
5025 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005026 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005027 /* If it isn't declared locally, it can't be a cell. */
5028 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5029 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005030 v = PyInt_FromLong(si->si_ncells++);
5031 dict = c->c_cellvars;
5032 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005033 /* If it is free anyway, then there is no need to do
5034 anything here.
5035 */
5036 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005037 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005038 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005039 v = PyInt_FromLong(si->si_nfrees++);
5040 dict = c->c_freevars;
5041 }
5042 if (v == NULL)
5043 return -1;
5044 if (PyDict_SetItem(dict, name, v) < 0) {
5045 Py_DECREF(v);
5046 return -1;
5047 }
5048 Py_DECREF(v);
5049 return 0;
5050}
5051
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005052/* If a variable is a cell and an argument, make sure that appears in
5053 co_cellvars before any variable to its right in varnames.
5054*/
5055
5056
5057static int
5058symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5059 PyObject *varnames, int flags)
5060{
Tim Petersb39903b2003-03-24 17:22:24 +00005061 PyObject *v = NULL;
5062 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005063 int i, pos;
5064
5065 if (flags & CO_VARARGS)
5066 argcount++;
5067 if (flags & CO_VARKEYWORDS)
5068 argcount++;
5069 for (i = argcount; --i >= 0; ) {
5070 v = PyList_GET_ITEM(varnames, i);
5071 if (PyDict_GetItem(*cellvars, v)) {
5072 if (list == NULL) {
5073 list = PyList_New(1);
5074 if (list == NULL)
5075 return -1;
5076 PyList_SET_ITEM(list, 0, v);
5077 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005078 } else {
5079 if (PyList_Insert(list, 0, v) < 0) {
5080 Py_DECREF(list);
5081 return -1;
5082 }
5083 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005084 }
5085 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005086 if (list == NULL)
5087 return 0;
5088
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005089 /* There are cellvars that are also arguments. Create a dict
5090 to replace cellvars and put the args at the front.
5091 */
5092 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005093 if (d == NULL)
5094 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005095 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5096 v = PyInt_FromLong(i);
5097 if (v == NULL)
5098 goto fail;
5099 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5100 goto fail;
5101 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5102 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005103 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005104 }
5105 pos = 0;
5106 i = PyList_GET_SIZE(list);
5107 Py_DECREF(list);
5108 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5109 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005110 if (w == NULL)
5111 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005112 if (PyDict_SetItem(d, v, w) < 0) {
5113 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005114 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005115 goto fail;
5116 }
5117 Py_DECREF(w);
5118 }
5119 Py_DECREF(*cellvars);
5120 *cellvars = d;
5121 return 1;
5122 fail:
5123 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005124 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005125 return -1;
5126}
5127
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005128static int
5129symtable_freevar_offsets(PyObject *freevars, int offset)
5130{
5131 PyObject *name, *v;
5132 int pos;
5133
5134 /* The cell vars are the first elements of the closure,
5135 followed by the free vars. Update the offsets in
5136 c_freevars to account for number of cellvars. */
5137 pos = 0;
5138 while (PyDict_Next(freevars, &pos, &name, &v)) {
5139 int i = PyInt_AS_LONG(v) + offset;
5140 PyObject *o = PyInt_FromLong(i);
5141 if (o == NULL)
5142 return -1;
5143 if (PyDict_SetItem(freevars, name, o) < 0) {
5144 Py_DECREF(o);
5145 return -1;
5146 }
5147 Py_DECREF(o);
5148 }
5149 return 0;
5150}
5151
5152static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005153symtable_check_unoptimized(struct compiling *c,
5154 PySymtableEntryObject *ste,
5155 struct symbol_info *si)
5156{
5157 char buf[300];
5158
5159 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5160 || (ste->ste_nested && si->si_nimplicit)))
5161 return 0;
5162
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005163#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5164
5165#define ILLEGAL_IS "is a nested function"
5166
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005167#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005168"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005169
5170#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005171"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005172
5173#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005174"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005175"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005176
5177 /* XXX perhaps the linenos for these opt-breaking statements
5178 should be stored so the exception can point to them. */
5179
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005180 if (ste->ste_child_free) {
5181 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005182 PyOS_snprintf(buf, sizeof(buf),
5183 ILLEGAL_IMPORT_STAR,
5184 PyString_AS_STRING(ste->ste_name),
5185 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005186 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005187 PyOS_snprintf(buf, sizeof(buf),
5188 ILLEGAL_BARE_EXEC,
5189 PyString_AS_STRING(ste->ste_name),
5190 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005191 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005192 PyOS_snprintf(buf, sizeof(buf),
5193 ILLEGAL_EXEC_AND_IMPORT_STAR,
5194 PyString_AS_STRING(ste->ste_name),
5195 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005196 }
5197 } else {
5198 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005199 PyOS_snprintf(buf, sizeof(buf),
5200 ILLEGAL_IMPORT_STAR,
5201 PyString_AS_STRING(ste->ste_name),
5202 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005203 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005204 PyOS_snprintf(buf, sizeof(buf),
5205 ILLEGAL_BARE_EXEC,
5206 PyString_AS_STRING(ste->ste_name),
5207 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005208 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005209 PyOS_snprintf(buf, sizeof(buf),
5210 ILLEGAL_EXEC_AND_IMPORT_STAR,
5211 PyString_AS_STRING(ste->ste_name),
5212 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005213 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005214 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005215
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005216 PyErr_SetString(PyExc_SyntaxError, buf);
5217 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5218 ste->ste_opt_lineno);
5219 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005220}
5221
5222static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005223symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5224 struct symbol_info *si)
5225{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005226 if (c->c_future)
5227 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005228 if (ste->ste_generator)
5229 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005230 if (ste->ste_type != TYPE_MODULE)
5231 c->c_flags |= CO_NEWLOCALS;
5232 if (ste->ste_type == TYPE_FUNCTION) {
5233 c->c_nlocals = si->si_nlocals;
5234 if (ste->ste_optimized == 0)
5235 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005236 else if (ste->ste_optimized != OPT_EXEC)
5237 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005238 }
5239 return 0;
5240}
5241
5242static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005243symtable_error(struct symtable *st, int lineno)
5244{
5245 if (lineno == 0)
5246 lineno = st->st_cur->ste_lineno;
5247 PyErr_SyntaxLocation(st->st_filename, lineno);
5248 st->st_errors++;
5249 return -1;
5250}
5251
5252static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253symtable_load_symbols(struct compiling *c)
5254{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005256 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005257 PyObject *name, *varnames, *v;
5258 int i, flags, pos;
5259 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005260
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005261 v = NULL;
5262
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005263 if (symtable_init_compiling_symbols(c) < 0)
5264 goto fail;
5265 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005266 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005267 si.si_nlocals = PyList_GET_SIZE(varnames);
5268 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005269
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005270 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005272 if (v == NULL)
5273 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274 if (PyDict_SetItem(c->c_locals,
5275 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005276 goto fail;
5277 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278 }
5279
5280 /* XXX The cases below define the rules for whether a name is
5281 local or global. The logic could probably be clearer. */
5282 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005283 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5284 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005285
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005286 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005287 /* undo the original DEF_FREE */
5288 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005289
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005290 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005291 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005292 2. Free variables in methods that are also class
5293 variables or declared global.
5294 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005295 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005296 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005297
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005298 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 c->c_argcount--;
5300 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005301 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005302 c->c_argcount--;
5303 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005304 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005305 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005306 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005307 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005308 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005309 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005310 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005311 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005313 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5314 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005315 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005316 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005317 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005319 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005320 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005321 if (v == NULL)
5322 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005324 goto fail;
5325 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005326 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005327 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005328 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005329 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005330 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005331 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005332 if (v == NULL)
5333 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005334 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005335 goto fail;
5336 Py_DECREF(v);
5337 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005338 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005339 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005340 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005341 goto fail;
5342 if (st->st_nscopes != 1) {
5343 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005344 if (v == NULL)
5345 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005346 if (PyDict_SetItem(st->st_global,
5347 name, v))
5348 goto fail;
5349 Py_DECREF(v);
5350 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005351 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005352 }
5353 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005354 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5355
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005356 if (si.si_ncells > 1) { /* one cell is always in order */
5357 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5358 c->c_varnames, c->c_flags) < 0)
5359 return -1;
5360 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005361 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5362 return -1;
5363 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005364 fail:
5365 /* is this always the right thing to do? */
5366 Py_XDECREF(v);
5367 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005368}
5369
5370static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005371symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372{
5373 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005374
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005375 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005376 if (st == NULL)
5377 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005378 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005379
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005380 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005381 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005382 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005383 goto fail;
5384 if ((st->st_symbols = PyDict_New()) == NULL)
5385 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005386 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005387 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005388 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389 st->st_private = NULL;
5390 return st;
5391 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005392 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 return NULL;
5394}
5395
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005396void
5397PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005398{
5399 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005401 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005402 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005403}
5404
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405/* When the compiler exits a scope, it must should update the scope's
5406 free variable information with the list of free variables in its
5407 children.
5408
5409 Variables that are free in children and defined in the current
5410 scope are cellvars.
5411
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005412 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005413 false), free variables in children that are not defined here are
5414 implicit globals.
5415
5416*/
5417
5418static int
5419symtable_update_free_vars(struct symtable *st)
5420{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005421 int i, j, def;
5422 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005423 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005425 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005426 def = DEF_FREE_CLASS;
5427 else
5428 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005429 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005430 int pos = 0;
5431
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005432 if (list && PyList_SetSlice(list, 0,
5433 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005434 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005435 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005436 PyList_GET_ITEM(ste->ste_children, i);
5437 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005438 int flags = PyInt_AS_LONG(o);
5439 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005440 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005441 if (list == NULL) {
5442 list = PyList_New(0);
5443 if (list == NULL)
5444 return -1;
5445 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005446 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005447 if (PyList_Append(list, name) < 0) {
5448 Py_DECREF(list);
5449 return -1;
5450 }
5451 }
5452 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005453 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005454 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005455 v = PyDict_GetItem(ste->ste_symbols, name);
5456 /* If a name N is declared global in scope A and
5457 referenced in scope B contained (perhaps
5458 indirectly) in A and there are no scopes
5459 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005460 is global in B. Unless A is a class scope,
5461 because class scopes are not considered for
5462 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005463 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005464 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005465 int flags = PyInt_AS_LONG(v);
5466 if (flags & DEF_GLOBAL) {
5467 symtable_undo_free(st, child->ste_id,
5468 name);
5469 continue;
5470 }
5471 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005472 if (ste->ste_nested) {
5473 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005474 name, def) < 0) {
5475 Py_DECREF(list);
5476 return -1;
5477 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005478 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005479 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005480 name) < 0) {
5481 Py_DECREF(list);
5482 return -1;
5483 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005484 }
5485 }
5486 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005487
5488 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005489 return 0;
5490}
5491
5492/* If the current scope is a non-nested class or if name is not
5493 defined in the current, non-nested scope, then it is an implicit
5494 global in all nested scopes.
5495*/
5496
5497static int
5498symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5499{
5500 PyObject *o;
5501 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005502 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005503
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005505 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005506 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005507 if (o == NULL)
5508 return symtable_undo_free(st, child, name);
5509 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005510
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005511 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005512 return symtable_undo_free(st, child, name);
5513 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 return symtable_add_def_o(st, ste->ste_symbols,
5515 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516}
5517
5518static int
5519symtable_undo_free(struct symtable *st, PyObject *id,
5520 PyObject *name)
5521{
5522 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005523 PyObject *info;
5524 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005525
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005526 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5527 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005529
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005530 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005531 if (info == NULL)
5532 return 0;
5533 v = PyInt_AS_LONG(info);
5534 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005535 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005536 DEF_FREE_GLOBAL) < 0)
5537 return -1;
5538 } else
5539 /* If the name is defined here or declared global,
5540 then the recursion stops. */
5541 return 0;
5542
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005543 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5544 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005545 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005546 PyList_GET_ITEM(ste->ste_children, i);
5547 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005548 if (x < 0)
5549 return x;
5550 }
5551 return 0;
5552}
5553
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005554/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5555 This reference is released when the scope is exited, via the DECREF
5556 in symtable_exit_scope().
5557*/
5558
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005559static int
5560symtable_exit_scope(struct symtable *st)
5561{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005562 int end;
5563
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005564 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005565 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005566 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005568 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5569 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005570 if (PySequence_DelItem(st->st_stack, end) < 0)
5571 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005572 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005574
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005575static void
5576symtable_enter_scope(struct symtable *st, char *name, int type,
5577 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005579 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005580
5581 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005582 prev = st->st_cur;
5583 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005584 st->st_errors++;
5585 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005586 }
5587 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005588 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005589 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005590 if (st->st_cur == NULL) {
5591 st->st_errors++;
5592 return;
5593 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005594 if (strcmp(name, TOP) == 0)
5595 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005596 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005597 if (PyList_Append(prev->ste_children,
5598 (PyObject *)st->st_cur) < 0)
5599 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005600 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601}
5602
5603static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005604symtable_lookup(struct symtable *st, char *name)
5605{
5606 char buffer[MANGLE_LEN];
5607 PyObject *v;
5608 int flags;
5609
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005610 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005611 name = buffer;
5612 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5613 if (v == NULL) {
5614 if (PyErr_Occurred())
5615 return -1;
5616 else
5617 return 0;
5618 }
5619
5620 flags = PyInt_AS_LONG(v);
5621 return flags;
5622}
5623
5624static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005625symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005628 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005629 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005630
Guido van Rossumb7164622002-08-16 02:48:11 +00005631 /* Warn about None, except inside a tuple (where the assignment
5632 code already issues a warning). */
5633 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5634 *name == 'N' && strcmp(name, "None") == 0)
5635 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005636 PyErr_SetString(PyExc_SyntaxError,
5637 "Invalid syntax. Assignment to None.");
5638 symtable_error(st, 0);
5639 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005640 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005641 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005642 name = buffer;
5643 if ((s = PyString_InternFromString(name)) == NULL)
5644 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005645 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5646 Py_DECREF(s);
5647 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648}
5649
5650/* Must only be called with mangled names */
5651
5652static int
5653symtable_add_def_o(struct symtable *st, PyObject *dict,
5654 PyObject *name, int flag)
5655{
5656 PyObject *o;
5657 int val;
5658
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005660 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005661 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005662 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005663 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005664 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005665 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005668 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005670 if (o == NULL)
5671 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005673 Py_DECREF(o);
5674 return -1;
5675 }
5676 Py_DECREF(o);
5677
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005681 } else if (flag & DEF_GLOBAL) {
5682 /* XXX need to update DEF_GLOBAL for other flags too;
5683 perhaps only DEF_FREE_GLOBAL */
5684 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005685 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005686 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005687 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005689 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005690 if (o == NULL)
5691 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 Py_DECREF(o);
5694 return -1;
5695 }
5696 Py_DECREF(o);
5697 }
5698 return 0;
5699}
5700
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005701#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702
Tim Peters08a898f2001-06-28 01:52:22 +00005703/* Look for a yield stmt under n. Return 1 if found, else 0.
5704 This hack is used to look inside "if 0:" blocks (which are normally
5705 ignored) in case those are the only places a yield occurs (so that this
5706 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005707static int
5708look_for_yield(node *n)
5709{
5710 int i;
5711
5712 for (i = 0; i < NCH(n); ++i) {
5713 node *kid = CHILD(n, i);
5714
5715 switch (TYPE(kid)) {
5716
5717 case classdef:
5718 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005719 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005720 /* Stuff in nested functions and classes can't make
5721 the parent a generator. */
5722 return 0;
5723
5724 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005725 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005726
5727 default:
5728 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005729 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005730 }
5731 }
5732 return 0;
5733}
5734
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005735static void
5736symtable_node(struct symtable *st, node *n)
5737{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005738 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005739
5740 loop:
5741 switch (TYPE(n)) {
5742 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005743 char *func_name;
5744 if (NCH(n) == 6)
5745 symtable_node(st, CHILD(n, 0));
5746 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005747 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005748 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005749 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005750 symtable_funcdef(st, n);
5751 symtable_exit_scope(st);
5752 break;
5753 }
5754 case lambdef:
5755 if (NCH(n) == 4)
5756 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005757 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005758 symtable_funcdef(st, n);
5759 symtable_exit_scope(st);
5760 break;
5761 case classdef: {
5762 char *tmp, *class_name = STR(CHILD(n, 1));
5763 symtable_add_def(st, class_name, DEF_LOCAL);
5764 if (TYPE(CHILD(n, 2)) == LPAR) {
5765 node *bases = CHILD(n, 3);
5766 int i;
5767 for (i = 0; i < NCH(bases); i += 2) {
5768 symtable_node(st, CHILD(bases, i));
5769 }
5770 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005771 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005772 tmp = st->st_private;
5773 st->st_private = class_name;
5774 symtable_node(st, CHILD(n, NCH(n) - 1));
5775 st->st_private = tmp;
5776 symtable_exit_scope(st);
5777 break;
5778 }
5779 case if_stmt:
5780 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005781 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5782 if (st->st_cur->ste_generator == 0)
5783 st->st_cur->ste_generator =
5784 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005786 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005787 symtable_node(st, CHILD(n, i + 1));
5788 symtable_node(st, CHILD(n, i + 3));
5789 }
5790 if (i + 2 < NCH(n))
5791 symtable_node(st, CHILD(n, i + 2));
5792 break;
5793 case global_stmt:
5794 symtable_global(st, n);
5795 break;
5796 case import_stmt:
5797 symtable_import(st, n);
5798 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005799 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005800 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801 symtable_node(st, CHILD(n, 1));
5802 if (NCH(n) > 2)
5803 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005804 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005805 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005806 st->st_cur->ste_opt_lineno = n->n_lineno;
5807 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005808 if (NCH(n) > 4)
5809 symtable_node(st, CHILD(n, 5));
5810 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005811
5812 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005813 case assert_stmt:
5814 if (Py_OptimizeFlag)
5815 return;
5816 if (NCH(n) == 2) {
5817 n = CHILD(n, 1);
5818 goto loop;
5819 } else {
5820 symtable_node(st, CHILD(n, 1));
5821 n = CHILD(n, 3);
5822 goto loop;
5823 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005824 case except_clause:
5825 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005826 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005827 if (NCH(n) > 1) {
5828 n = CHILD(n, 1);
5829 goto loop;
5830 }
5831 break;
5832 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005833 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005834 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005835 case yield_stmt:
5836 st->st_cur->ste_generator = 1;
5837 n = CHILD(n, 1);
5838 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005839 case expr_stmt:
5840 if (NCH(n) == 1)
5841 n = CHILD(n, 0);
5842 else {
5843 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005844 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005845 symtable_node(st, CHILD(n, 2));
5846 break;
5847 } else {
5848 int i;
5849 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005850 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005851 n = CHILD(n, NCH(n) - 1);
5852 }
5853 }
5854 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005855 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005856 /* only occurs when there are multiple for loops
5857 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005858 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005859 if (TYPE(n) == list_for)
5860 symtable_list_for(st, n);
5861 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005862 REQ(n, list_if);
5863 symtable_node(st, CHILD(n, 1));
5864 if (NCH(n) == 3) {
5865 n = CHILD(n, 2);
5866 goto loop;
5867 }
5868 }
5869 break;
5870 case for_stmt:
5871 symtable_assign(st, CHILD(n, 1), 0);
5872 for (i = 3; i < NCH(n); ++i)
5873 if (TYPE(CHILD(n, i)) >= single_input)
5874 symtable_node(st, CHILD(n, i));
5875 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005876 case arglist:
5877 if (NCH(n) > 1)
5878 for (i = 0; i < NCH(n); ++i) {
5879 node *ch = CHILD(n, i);
5880 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5881 TYPE(CHILD(ch, 1)) == gen_for) {
5882 PyErr_SetString(PyExc_SyntaxError,
5883 "invalid syntax");
5884 symtable_error(st, n->n_lineno);
5885 return;
5886 }
5887 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005888 /* The remaining cases fall through to default except in
5889 special circumstances. This requires the individual cases
5890 to be coded with great care, even though they look like
5891 rather innocuous. Each case must double-check TYPE(n).
5892 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005893 case decorator:
5894 if (TYPE(n) == decorator) {
5895 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5896 node *name, *varname;
5897 name = CHILD(n, 1);
5898 REQ(name, dotted_name);
5899 varname = CHILD(name, 0);
5900 REQ(varname, NAME);
5901 symtable_add_use(st, STR(varname));
5902 }
5903 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005905 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005906 n = CHILD(n, 2);
5907 goto loop;
5908 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005909 else if (TYPE(n) == argument && NCH(n) == 2 &&
5910 TYPE(CHILD(n, 1)) == gen_for) {
5911 symtable_generator_expression(st, n);
5912 break;
5913 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005914 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005915 case listmaker:
5916 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005917 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005918 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005919 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005920 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005921 case testlist_gexp:
5922 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5923 symtable_generator_expression(st, n);
5924 break;
5925 }
5926 /* fall through */
5927
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005928 case atom:
5929 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5930 symtable_add_use(st, STR(CHILD(n, 0)));
5931 break;
5932 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005933 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005934 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005935 /* Walk over every non-token child with a special case
5936 for one child.
5937 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005938 if (NCH(n) == 1) {
5939 n = CHILD(n, 0);
5940 goto loop;
5941 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005942 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005943 if (TYPE(CHILD(n, i)) >= single_input)
5944 symtable_node(st, CHILD(n, i));
5945 }
5946}
5947
5948static void
5949symtable_funcdef(struct symtable *st, node *n)
5950{
5951 node *body;
5952
5953 if (TYPE(n) == lambdef) {
5954 if (NCH(n) == 4)
5955 symtable_params(st, CHILD(n, 1));
5956 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005957 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005958 body = CHILD(n, NCH(n) - 1);
5959 symtable_node(st, body);
5960}
5961
5962/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005963 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005964 which are references in the defining scope. symtable_params()
5965 parses the parameter names, which are defined in the function's
5966 body.
5967
5968 varargslist:
5969 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5970 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5971*/
5972
5973static void
5974symtable_default_args(struct symtable *st, node *n)
5975{
5976 node *c;
5977 int i;
5978
5979 if (TYPE(n) == parameters) {
5980 n = CHILD(n, 1);
5981 if (TYPE(n) == RPAR)
5982 return;
5983 }
5984 REQ(n, varargslist);
5985 for (i = 0; i < NCH(n); i += 2) {
5986 c = CHILD(n, i);
5987 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5988 break;
5989 }
5990 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5991 symtable_node(st, CHILD(n, i));
5992 }
5993}
5994
5995static void
5996symtable_params(struct symtable *st, node *n)
5997{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005998 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005999 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006000
6001 if (TYPE(n) == parameters) {
6002 n = CHILD(n, 1);
6003 if (TYPE(n) == RPAR)
6004 return;
6005 }
6006 REQ(n, varargslist);
6007 for (i = 0; i < NCH(n); i += 2) {
6008 c = CHILD(n, i);
6009 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6010 ext = 1;
6011 break;
6012 }
6013 if (TYPE(c) == test) {
6014 continue;
6015 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006016 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006017 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006018 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006019 char nbuf[30];
6020 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006022 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023 }
6024 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006025 if (ext) {
6026 c = CHILD(n, i);
6027 if (TYPE(c) == STAR) {
6028 i++;
6029 symtable_add_def(st, STR(CHILD(n, i)),
6030 DEF_PARAM | DEF_STAR);
6031 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006032 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006033 c = NULL;
6034 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006035 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006036 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006037 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006038 i++;
6039 symtable_add_def(st, STR(CHILD(n, i)),
6040 DEF_PARAM | DEF_DOUBLESTAR);
6041 }
6042 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006043 if (complex >= 0) {
6044 int j;
6045 for (j = 0; j <= complex; j++) {
6046 c = CHILD(n, j);
6047 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006048 c = CHILD(n, ++j);
6049 else if (TYPE(c) == EQUAL)
6050 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006051 if (TYPE(CHILD(c, 0)) == LPAR)
6052 symtable_params_fplist(st, CHILD(c, 1));
6053 }
6054 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055}
6056
6057static void
6058symtable_params_fplist(struct symtable *st, node *n)
6059{
6060 int i;
6061 node *c;
6062
6063 REQ(n, fplist);
6064 for (i = 0; i < NCH(n); i += 2) {
6065 c = CHILD(n, i);
6066 REQ(c, fpdef);
6067 if (NCH(c) == 1)
6068 symtable_add_def(st, STR(CHILD(c, 0)),
6069 DEF_PARAM | DEF_INTUPLE);
6070 else
6071 symtable_params_fplist(st, CHILD(c, 1));
6072 }
6073
6074}
6075
6076static void
6077symtable_global(struct symtable *st, node *n)
6078{
6079 int i;
6080
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006081 /* XXX It might be helpful to warn about module-level global
6082 statements, but it's hard to tell the difference between
6083 module-level and a string passed to exec.
6084 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006085
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006086 for (i = 1; i < NCH(n); i += 2) {
6087 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006088 int flags;
6089
6090 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006091 if (flags < 0)
6092 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006093 if (flags && flags != DEF_GLOBAL) {
6094 char buf[500];
6095 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006096 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006097 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006098 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006099 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006100 }
6101 else {
6102 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006103 PyOS_snprintf(buf, sizeof(buf),
6104 GLOBAL_AFTER_ASSIGN,
6105 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006106 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006107 PyOS_snprintf(buf, sizeof(buf),
6108 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006109 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006110 }
6111 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006112 symtable_add_def(st, name, DEF_GLOBAL);
6113 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006114}
6115
6116static void
6117symtable_list_comprehension(struct symtable *st, node *n)
6118{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006119 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006120 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006121
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006122 REQ(n, listmaker);
6123 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6124 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006125 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006126 symtable_list_for(st, CHILD(n, 1));
6127 symtable_node(st, CHILD(n, 0));
6128 --st->st_cur->ste_tmpname;
6129}
6130
6131static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006132symtable_generator_expression(struct symtable *st, node *n)
6133{
6134 /* testlist_gexp: test gen_for */
6135 REQ(CHILD(n, 0), test);
6136 REQ(CHILD(n, 1), gen_for);
6137
6138 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6139 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6140
6141 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6142
6143 symtable_gen_for(st, CHILD(n, 1), 1);
6144 symtable_node(st, CHILD(n, 0));
6145 symtable_exit_scope(st);
6146
6147 /* for outmost iterable precomputation */
6148 symtable_node(st, CHILD(CHILD(n, 1), 3));
6149}
6150
6151static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006152symtable_list_for(struct symtable *st, node *n)
6153{
6154 REQ(n, list_for);
6155 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006156 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006157 symtable_node(st, CHILD(n, 3));
6158 if (NCH(n) == 5)
6159 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006160}
6161
6162static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006163symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6164{
6165 REQ(n, gen_for);
6166
6167 /* gen_for: for v in test [gen_iter] */
6168 symtable_assign(st, CHILD(n, 1), 0);
6169 if (is_outmost)
6170 symtable_add_use(st, "[outmost-iterable]");
6171 else
6172 symtable_node(st, CHILD(n, 3));
6173
6174 if (NCH(n) == 5)
6175 symtable_gen_iter(st, CHILD(n, 4));
6176}
6177
6178static void
6179symtable_gen_iter(struct symtable *st, node *n)
6180{
6181 REQ(n, gen_iter);
6182
6183 n = CHILD(n, 0);
6184 if (TYPE(n) == gen_for)
6185 symtable_gen_for(st, n, 0);
6186 else {
6187 REQ(n, gen_if);
6188 symtable_node(st, CHILD(n, 1));
6189
6190 if (NCH(n) == 3)
6191 symtable_gen_iter(st, CHILD(n, 2));
6192 }
6193}
6194
6195static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006196symtable_import(struct symtable *st, node *n)
6197{
6198 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006199 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 | 'from' dotted_name 'import'
6201 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006202 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006203 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006204 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006205 node *dotname = CHILD(n, 1);
6206 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6207 /* check for bogus imports */
6208 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6209 PyErr_SetString(PyExc_SyntaxError,
6210 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006211 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006212 return;
6213 }
6214 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006215 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006216 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006217 if (symtable_warn(st,
6218 "import * only allowed at module level") < 0)
6219 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006220 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006221 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006222 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006223 } else {
6224 for (i = 3; i < NCH(n); i += 2) {
6225 node *c = CHILD(n, i);
6226 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006227 symtable_assign(st, CHILD(c, 2),
6228 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006229 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006230 symtable_assign(st, CHILD(c, 0),
6231 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 }
6233 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006234 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006235 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006236 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006237 }
6238 }
6239}
6240
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006241/* The third argument to symatble_assign() is a flag to be passed to
6242 symtable_add_def() if it is eventually called. The flag is useful
6243 to specify the particular type of assignment that should be
6244 recorded, e.g. an assignment caused by import.
6245 */
6246
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006247static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006248symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006249{
6250 node *tmp;
6251 int i;
6252
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006253 loop:
6254 switch (TYPE(n)) {
6255 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006256 /* invalid assignment, e.g. lambda x:x=2. The next
6257 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006258 return;
6259 case power:
6260 if (NCH(n) > 2) {
6261 for (i = 2; i < NCH(n); ++i)
6262 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6263 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006264 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006265 if (NCH(n) > 1) {
6266 symtable_node(st, CHILD(n, 0));
6267 symtable_node(st, CHILD(n, 1));
6268 } else {
6269 n = CHILD(n, 0);
6270 goto loop;
6271 }
6272 return;
6273 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006274 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6275 /* XXX This is an error, but the next pass
6276 will catch it. */
6277 return;
6278 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006279 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006280 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006281 }
6282 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006283 case testlist_gexp:
6284 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6285 /* XXX This is an error, but the next pass
6286 will catch it. */
6287 return;
6288 } else {
6289 for (i = 0; i < NCH(n); i += 2)
6290 symtable_assign(st, CHILD(n, i), def_flag);
6291 }
6292 return;
6293
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006294 case exprlist:
6295 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006296 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006297 if (NCH(n) == 1) {
6298 n = CHILD(n, 0);
6299 goto loop;
6300 }
6301 else {
6302 int i;
6303 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006304 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006305 return;
6306 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006307 case atom:
6308 tmp = CHILD(n, 0);
6309 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6310 n = CHILD(n, 1);
6311 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006312 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006313 if (strcmp(STR(tmp), "__debug__") == 0) {
6314 PyErr_SetString(PyExc_SyntaxError,
6315 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006316 symtable_error(st, n->n_lineno);
6317 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006318 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006319 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006320 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006321 return;
6322 case dotted_as_name:
6323 if (NCH(n) == 3)
6324 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006325 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006326 else
6327 symtable_add_def(st,
6328 STR(CHILD(CHILD(n,
6329 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006330 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006331 return;
6332 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006333 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006334 return;
6335 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006336 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006337 return;
6338 default:
6339 if (NCH(n) == 0)
6340 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006341 if (NCH(n) == 1) {
6342 n = CHILD(n, 0);
6343 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006344 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006345 /* Should only occur for errors like x + 1 = 1,
6346 which will be caught in the next pass. */
6347 for (i = 0; i < NCH(n); ++i)
6348 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006349 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006350 }
6351}