blob: fbb91f792c80a57a08896312a112c3754940362b [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{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004110 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004111 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004112 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004113 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004114 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004115 com_decorator_name(c, CHILD(n, 1));
4116
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004117 if (nch > 3) {
4118 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004119 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004120 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004121 com_call_function(c, CHILD(n, 3));
4122 }
4123}
4124
4125static int
4126com_decorators(struct compiling *c, node *n)
4127{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004128 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004129
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004130 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004131 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004132 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004133
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004134 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004135 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004136 REQ(ch, decorator);
4137
4138 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004139 }
4140
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004141 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004142}
4143
4144static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004145com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004146{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004147 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004148 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004149
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004150 REQ(n, funcdef);
4151 /* -6 -5 -4 -3 -2 -1
4152 funcdef: [decorators] 'def' NAME parameters ':' suite */
4153
4154 if (NCH(n) == 6)
4155 ndecorators = com_decorators(c, CHILD(n, 0));
4156 else
4157 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004158
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004159 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004160 if (ndefs < 0)
4161 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004162 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004163 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004164 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004165 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004166 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004167 c->c_errors++;
4168 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004169 int closure = com_make_closure(c, (PyCodeObject *)co);
4170 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004171 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004172 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004173 if (closure)
4174 com_addoparg(c, MAKE_CLOSURE, ndefs);
4175 else
4176 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004177 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004178
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004179 while (ndecorators > 0) {
4180 com_addoparg(c, CALL_FUNCTION, 1);
4181 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004182 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004183 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004184
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004185 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004186 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004187 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188 }
4189}
4190
4191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004192com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004193{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004194 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004195 REQ(n, testlist);
4196 /* testlist: test (',' test)* [','] */
4197 for (i = 0; i < NCH(n); i += 2)
4198 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004199 i = (NCH(n)+1) / 2;
4200 com_addoparg(c, BUILD_TUPLE, i);
4201 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004202}
4203
4204static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004205com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004206{
Guido van Rossum25831651993-05-19 14:50:45 +00004207 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004208 PyObject *v;
4209 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004210 char *name;
4211
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004212 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004213 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004214 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004215 c->c_errors++;
4216 return;
4217 }
4218 /* Push the class name on the stack */
4219 i = com_addconst(c, v);
4220 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004221 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004222 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004223 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004224 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004225 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004226 com_push(c, 1);
4227 }
Guido van Rossum25831651993-05-19 14:50:45 +00004228 else
4229 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004230 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004231 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004232 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004233 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004234 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004235 c->c_errors++;
4236 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004237 int closure = com_make_closure(c, co);
4238 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004239 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004240 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004241 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004242 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004243 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004244 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004245 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004246 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004247 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004248 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004249 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004250 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004251 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004252 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253}
4254
4255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004256com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004257{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004258 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004259 if (c->c_errors)
4260 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004261 switch (TYPE(n)) {
4262
4263 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004264
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004265 case funcdef:
4266 com_funcdef(c, n);
4267 break;
4268 case classdef:
4269 com_classdef(c, n);
4270 break;
4271
4272 /* Trivial parse tree nodes */
4273
4274 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004275 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004276 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004277 n = CHILD(n, 0);
4278 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004279
4280 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004281 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004282 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004283 {
4284 int i;
4285 for (i = 0; i < NCH(n)-1; i += 2)
4286 com_node(c, CHILD(n, i));
4287 }
4288 break;
4289
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004290 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004291 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004292 n = CHILD(n, 0);
4293 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004294
4295 /* Statement nodes */
4296
4297 case expr_stmt:
4298 com_expr_stmt(c, n);
4299 break;
4300 case print_stmt:
4301 com_print_stmt(c, n);
4302 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004303 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004304 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004305 break;
4306 case pass_stmt:
4307 break;
4308 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004309 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004310 com_error(c, PyExc_SyntaxError,
4311 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004312 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313 com_addbyte(c, BREAK_LOOP);
4314 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004315 case continue_stmt:
4316 com_continue_stmt(c, n);
4317 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004318 case return_stmt:
4319 com_return_stmt(c, n);
4320 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004321 case yield_stmt:
4322 com_yield_stmt(c, n);
4323 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004324 case raise_stmt:
4325 com_raise_stmt(c, n);
4326 break;
4327 case import_stmt:
4328 com_import_stmt(c, n);
4329 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004330 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004331 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004332 case exec_stmt:
4333 com_exec_stmt(c, n);
4334 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004335 case assert_stmt:
4336 com_assert_stmt(c, n);
4337 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004338 case if_stmt:
4339 com_if_stmt(c, n);
4340 break;
4341 case while_stmt:
4342 com_while_stmt(c, n);
4343 break;
4344 case for_stmt:
4345 com_for_stmt(c, n);
4346 break;
4347 case try_stmt:
4348 com_try_stmt(c, n);
4349 break;
4350 case suite:
4351 com_suite(c, n);
4352 break;
4353
4354 /* Expression nodes */
4355
4356 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004357 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004358 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004359 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360 break;
4361 case test:
4362 com_test(c, n);
4363 break;
4364 case and_test:
4365 com_and_test(c, n);
4366 break;
4367 case not_test:
4368 com_not_test(c, n);
4369 break;
4370 case comparison:
4371 com_comparison(c, n);
4372 break;
4373 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004374 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004375 break;
4376 case expr:
4377 com_expr(c, n);
4378 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004379 case xor_expr:
4380 com_xor_expr(c, n);
4381 break;
4382 case and_expr:
4383 com_and_expr(c, n);
4384 break;
4385 case shift_expr:
4386 com_shift_expr(c, n);
4387 break;
4388 case arith_expr:
4389 com_arith_expr(c, n);
4390 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004391 case term:
4392 com_term(c, n);
4393 break;
4394 case factor:
4395 com_factor(c, n);
4396 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004397 case power:
4398 com_power(c, n);
4399 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004400 case atom:
4401 com_atom(c, n);
4402 break;
4403
4404 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004405 com_error(c, PyExc_SystemError,
4406 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004407 }
4408}
4409
Tim Petersdbd9ba62000-07-09 03:09:57 +00004410static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004411
4412static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004413com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004414{
4415 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4416 if (TYPE(CHILD(n, 0)) == LPAR)
4417 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004418 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004419 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004420 com_pop(c, 1);
4421 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004422}
4423
4424static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004425com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004426{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004427 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004428 if (NCH(n) == 1) {
4429 com_fpdef(c, CHILD(n, 0));
4430 }
4431 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004432 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004433 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004434 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004435 for (i = 0; i < NCH(n); i += 2)
4436 com_fpdef(c, CHILD(n, i));
4437 }
4438}
4439
4440static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004441com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004442{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004443 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004444 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004445 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004446 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004447 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004448 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004449 nch = NCH(n);
4450 /* Enter all arguments in table of locals */
4451 for (i = 0, narg = 0; i < nch; i++) {
4452 node *ch = CHILD(n, i);
4453 node *fp;
4454 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004455 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004456 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4457 fp = CHILD(ch, 0);
4458 if (TYPE(fp) != NAME) {
4459 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4460 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004461 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004462 narg++;
4463 /* all name updates handled by symtable */
4464 if (++i >= nch)
4465 break;
4466 ch = CHILD(n, i);
4467 if (TYPE(ch) == EQUAL)
4468 i += 2;
4469 else
4470 REQ(ch, COMMA);
4471 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004472 if (complex) {
4473 /* Generate code for complex arguments only after
4474 having counted the simple arguments */
4475 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004476 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004477 node *ch = CHILD(n, i);
4478 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004479 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004480 break;
4481 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4482 fp = CHILD(ch, 0);
4483 if (TYPE(fp) != NAME) {
4484 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004485 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004486 com_fpdef(c, ch);
4487 }
4488 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004489 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004490 break;
4491 ch = CHILD(n, i);
4492 if (TYPE(ch) == EQUAL)
4493 i += 2;
4494 else
4495 REQ(ch, COMMA);
4496 }
4497 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004498}
4499
4500static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004501com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004502{
4503 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004504 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004506 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004507 if (doc != NULL) {
4508 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004509 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004510 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004511 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004512 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004513 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004514 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004515 for (i = 0; i < NCH(n); i++) {
4516 node *ch = CHILD(n, i);
4517 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4518 com_node(c, ch);
4519 }
4520}
4521
4522/* Top-level compile-node interface */
4523
4524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004525compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004526{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004527 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004528 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004529 REQ(n, funcdef);
4530 /* -6 -5 -4 -3 -2 -1
4531 funcdef: [decorators] 'def' NAME parameters ':' suite */
4532 c->c_name = STR(RCHILD(n, -4));
4533 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004534 if (doc != NULL) {
4535 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004536 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004537 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004538 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004539 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004540 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004541 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004542 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004543 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004544 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004545 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004546 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004547 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004548 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4549 com_push(c, 1);
4550 com_addbyte(c, RETURN_VALUE);
4551 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004552}
4553
4554static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004555compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004556{
Guido van Rossum590baa41993-11-30 13:40:46 +00004557 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004558 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004559 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004560
4561 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004562 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004563 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004564 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004565 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004566 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004567 else
4568 ch = CHILD(n, 2);
4569 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004570 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004571 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004572}
4573
4574static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004575compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004576{
4577 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004578 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004579 REQ(n, classdef);
4580 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4581 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004582 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004583 /* Initialize local __module__ from global __name__ */
4584 com_addop_name(c, LOAD_GLOBAL, "__name__");
4585 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004586 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004587 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004588 if (doc != NULL) {
4589 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004590 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004591 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004592 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004593 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004594 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004595 }
4596 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004597 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004598 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004599 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004600 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004601 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004602 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004603 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004604}
4605
4606static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004607compile_generator_expression(struct compiling *c, node *n)
4608{
4609 /* testlist_gexp: test gen_for */
4610 /* argument: test gen_for */
4611 REQ(CHILD(n, 0), test);
4612 REQ(CHILD(n, 1), gen_for);
4613
4614 c->c_name = "<generator expression>";
4615 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4616
4617 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4618 com_push(c, 1);
4619 com_addbyte(c, RETURN_VALUE);
4620 com_pop(c, 1);
4621}
4622
4623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004624compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004625{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004626 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004627
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004628 switch (TYPE(n)) {
4629
Guido van Rossum4c417781991-01-21 16:09:22 +00004630 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004631 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004632 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004633 n = CHILD(n, 0);
4634 if (TYPE(n) != NEWLINE)
4635 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004636 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004637 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4638 com_push(c, 1);
4639 com_addbyte(c, RETURN_VALUE);
4640 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004641 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004642 break;
4643
Guido van Rossum4c417781991-01-21 16:09:22 +00004644 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004645 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004646 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004647 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4648 com_push(c, 1);
4649 com_addbyte(c, RETURN_VALUE);
4650 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004651 break;
4652
Guido van Rossum590baa41993-11-30 13:40:46 +00004653 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004654 com_node(c, CHILD(n, 0));
4655 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004656 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004657 break;
4658
Guido van Rossum590baa41993-11-30 13:40:46 +00004659 case lambdef: /* anonymous function definition */
4660 compile_lambdef(c, n);
4661 break;
4662
Guido van Rossum4c417781991-01-21 16:09:22 +00004663 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004664 compile_funcdef(c, n);
4665 break;
4666
Guido van Rossum4c417781991-01-21 16:09:22 +00004667 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004668 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004669 break;
4670
Raymond Hettinger354433a2004-05-19 08:20:33 +00004671 case testlist_gexp: /* A generator expression */
4672 case argument: /* A generator expression */
4673 compile_generator_expression(c, n);
4674 break;
4675
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004676 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004677 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004678 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004679 }
4680}
4681
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004682static PyObject *
4683dict_keys_inorder(PyObject *dict, int offset)
4684{
4685 PyObject *tuple, *k, *v;
4686 int i, pos = 0, size = PyDict_Size(dict);
4687
4688 tuple = PyTuple_New(size);
4689 if (tuple == NULL)
4690 return NULL;
4691 while (PyDict_Next(dict, &pos, &k, &v)) {
4692 i = PyInt_AS_LONG(v);
4693 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004694 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004695 PyTuple_SET_ITEM(tuple, i - offset, k);
4696 }
4697 return tuple;
4698}
4699
Guido van Rossum79f25d91997-04-29 20:08:16 +00004700PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004701PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004702{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004703 return PyNode_CompileFlags(n, filename, NULL);
4704}
4705
4706PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004707PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004708{
4709 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004710}
4711
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004712struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004713PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004714{
4715 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004716 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004717
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004718 ff = PyNode_Future(n, filename);
4719 if (ff == NULL)
4720 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004721 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004722 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004723 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004724 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004725 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004726 return st;
4727}
4728
Guido van Rossum79f25d91997-04-29 20:08:16 +00004729static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004730icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004731{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004732 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004733}
4734
Guido van Rossum79f25d91997-04-29 20:08:16 +00004735static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004736jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004737 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004738{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004739 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004740 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004741 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004742 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004743 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4744 sc.c_encoding = "utf-8";
4745 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004746 sc.c_encoding = STR(n);
4747 n = CHILD(n, 0);
4748 } else {
4749 sc.c_encoding = NULL;
4750 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004751 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004752 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004754 /* c_symtable still points to parent's symbols */
4755 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004756 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004757 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004758 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004759 if (base->c_encoding != NULL) {
4760 assert(sc.c_encoding == NULL);
4761 sc.c_encoding = base->c_encoding;
4762 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004763 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004764 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004765 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004766 if (sc.c_future == NULL) {
4767 com_free(&sc);
4768 return NULL;
4769 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004770 if (flags) {
4771 int merged = sc.c_future->ff_features |
4772 flags->cf_flags;
4773 sc.c_future->ff_features = merged;
4774 flags->cf_flags = merged;
4775 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004776 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4777 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004778 com_free(&sc);
4779 return NULL;
4780 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004781 /* reset symbol table for second pass */
4782 sc.c_symtable->st_nscopes = 1;
4783 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004784 }
4785 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004786 if (symtable_load_symbols(&sc) < 0) {
4787 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004789 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004790 compile_node(&sc, n);
4791 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004792 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004793 PyObject *consts, *names, *varnames, *filename, *name,
4794 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004795 consts = PyList_AsTuple(sc.c_consts);
4796 names = PyList_AsTuple(sc.c_names);
4797 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004798 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4799 freevars = dict_keys_inorder(sc.c_freevars,
4800 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004801 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004802 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004803 if (!PyErr_Occurred())
4804 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004805 sc.c_nlocals,
4806 sc.c_maxstacklevel,
4807 sc.c_flags,
4808 sc.c_code,
4809 consts,
4810 names,
4811 varnames,
4812 freevars,
4813 cellvars,
4814 filename,
4815 name,
4816 sc.c_firstlineno,
4817 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004818 Py_XDECREF(consts);
4819 Py_XDECREF(names);
4820 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004821 Py_XDECREF(freevars);
4822 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004823 Py_XDECREF(filename);
4824 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004825 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004826 else if (!PyErr_Occurred()) {
4827 /* This could happen if someone called PyErr_Clear() after an
4828 error was reported above. That's not supposed to happen,
4829 but I just plugged one case and I'm not sure there can't be
4830 others. In that case, raise SystemError so that at least
4831 it gets reported instead dumping core. */
4832 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4833 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004835 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004836 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004837 sc.c_symtable = NULL;
4838 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004839 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004840 return co;
4841}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004842
4843int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004844PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004845{
4846 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004847 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004848 int line = co->co_firstlineno;
4849 int addr = 0;
4850 while (--size >= 0) {
4851 addr += *p++;
4852 if (addr > addrq)
4853 break;
4854 line += *p++;
4855 }
4856 return line;
4857}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004859/* The test for LOCAL must come before the test for FREE in order to
4860 handle classes where name is both local and free. The local var is
4861 a method and the free var is a free var referenced within a method.
4862*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004863
4864static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004865get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004867 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004868 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004869
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004870 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4871 return CELL;
4872 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4873 return LOCAL;
4874 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4875 return FREE;
4876 v = PyDict_GetItemString(c->c_globals, name);
4877 if (v) {
4878 if (v == Py_None)
4879 return GLOBAL_EXPLICIT;
4880 else {
4881 return GLOBAL_IMPLICIT;
4882 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004883 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004884 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004885 "unknown scope for %.100s in %.100s(%s) "
4886 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4887 name, c->c_name,
4888 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4889 c->c_filename,
4890 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4891 PyObject_REPR(c->c_locals),
4892 PyObject_REPR(c->c_globals)
4893 );
4894
4895 Py_FatalError(buf);
4896 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004897}
4898
Guido van Rossum207fda62001-03-02 03:30:41 +00004899/* Helper functions to issue warnings */
4900
4901static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004902issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004903{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004904 if (PyErr_Occurred()) {
4905 /* This can happen because symtable_node continues
4906 processing even after raising a SyntaxError.
4907 Calling PyErr_WarnExplicit now would clobber the
4908 pending exception; instead we fail and let that
4909 exception propagate.
4910 */
4911 return -1;
4912 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004913 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4914 lineno, NULL, NULL) < 0) {
4915 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4916 PyErr_SetString(PyExc_SyntaxError, msg);
4917 PyErr_SyntaxLocation(filename, lineno);
4918 }
4919 return -1;
4920 }
4921 return 0;
4922}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004923
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004924static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004925symtable_warn(struct symtable *st, char *msg)
4926{
Guido van Rossum207fda62001-03-02 03:30:41 +00004927 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004928 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004929 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004930 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004931 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004932}
4933
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004934/* Helper function for setting lineno and filename */
4935
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004936static struct symtable *
4937symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004939 struct symtable *st;
4940
4941 st = symtable_init();
4942 if (st == NULL)
4943 return NULL;
4944 st->st_future = ff;
4945 st->st_filename = filename;
4946 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4947 if (st->st_errors > 0)
4948 goto fail;
4949 symtable_node(st, n);
4950 if (st->st_errors > 0)
4951 goto fail;
4952 return st;
4953 fail:
4954 if (!PyErr_Occurred()) {
4955 /* This could happen because after a syntax error is
4956 detected, the symbol-table-building continues for
4957 a while, and PyErr_Clear() might erroneously be
4958 called during that process. One such case has been
4959 fixed, but there might be more (now or later).
4960 */
4961 PyErr_SetString(PyExc_SystemError, "lost exception");
4962 }
4963 st->st_future = NULL;
4964 st->st_filename = NULL;
4965 PySymtable_Free(st);
4966 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967}
4968
4969static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004970symtable_init_compiling_symbols(struct compiling *c)
4971{
4972 PyObject *varnames;
4973
4974 varnames = c->c_symtable->st_cur->ste_varnames;
4975 if (varnames == NULL) {
4976 varnames = PyList_New(0);
4977 if (varnames == NULL)
4978 return -1;
4979 c->c_symtable->st_cur->ste_varnames = varnames;
4980 Py_INCREF(varnames);
4981 } else
4982 Py_INCREF(varnames);
4983 c->c_varnames = varnames;
4984
4985 c->c_globals = PyDict_New();
4986 if (c->c_globals == NULL)
4987 return -1;
4988 c->c_freevars = PyDict_New();
4989 if (c->c_freevars == NULL)
4990 return -1;
4991 c->c_cellvars = PyDict_New();
4992 if (c->c_cellvars == NULL)
4993 return -1;
4994 return 0;
4995}
4996
4997struct symbol_info {
4998 int si_nlocals;
4999 int si_ncells;
5000 int si_nfrees;
5001 int si_nimplicit;
5002};
5003
5004static void
5005symtable_init_info(struct symbol_info *si)
5006{
5007 si->si_nlocals = 0;
5008 si->si_ncells = 0;
5009 si->si_nfrees = 0;
5010 si->si_nimplicit = 0;
5011}
5012
5013static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005014symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005015 struct symbol_info *si)
5016{
5017 PyObject *dict, *v;
5018
5019 /* Seperate logic for DEF_FREE. If it occurs in a function,
5020 it indicates a local that we must allocate storage for (a
5021 cell var). If it occurs in a class, then the class has a
5022 method and a free variable with the same name.
5023 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005024 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005025 /* If it isn't declared locally, it can't be a cell. */
5026 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5027 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005028 v = PyInt_FromLong(si->si_ncells++);
5029 dict = c->c_cellvars;
5030 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005031 /* If it is free anyway, then there is no need to do
5032 anything here.
5033 */
5034 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005035 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005036 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005037 v = PyInt_FromLong(si->si_nfrees++);
5038 dict = c->c_freevars;
5039 }
5040 if (v == NULL)
5041 return -1;
5042 if (PyDict_SetItem(dict, name, v) < 0) {
5043 Py_DECREF(v);
5044 return -1;
5045 }
5046 Py_DECREF(v);
5047 return 0;
5048}
5049
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005050/* If a variable is a cell and an argument, make sure that appears in
5051 co_cellvars before any variable to its right in varnames.
5052*/
5053
5054
5055static int
5056symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5057 PyObject *varnames, int flags)
5058{
Tim Petersb39903b2003-03-24 17:22:24 +00005059 PyObject *v = NULL;
5060 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005061 int i, pos;
5062
5063 if (flags & CO_VARARGS)
5064 argcount++;
5065 if (flags & CO_VARKEYWORDS)
5066 argcount++;
5067 for (i = argcount; --i >= 0; ) {
5068 v = PyList_GET_ITEM(varnames, i);
5069 if (PyDict_GetItem(*cellvars, v)) {
5070 if (list == NULL) {
5071 list = PyList_New(1);
5072 if (list == NULL)
5073 return -1;
5074 PyList_SET_ITEM(list, 0, v);
5075 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005076 } else {
5077 if (PyList_Insert(list, 0, v) < 0) {
5078 Py_DECREF(list);
5079 return -1;
5080 }
5081 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005082 }
5083 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005084 if (list == NULL)
5085 return 0;
5086
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005087 /* There are cellvars that are also arguments. Create a dict
5088 to replace cellvars and put the args at the front.
5089 */
5090 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005091 if (d == NULL)
5092 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005093 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5094 v = PyInt_FromLong(i);
5095 if (v == NULL)
5096 goto fail;
5097 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5098 goto fail;
5099 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5100 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005101 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005102 }
5103 pos = 0;
5104 i = PyList_GET_SIZE(list);
5105 Py_DECREF(list);
5106 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5107 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005108 if (w == NULL)
5109 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005110 if (PyDict_SetItem(d, v, w) < 0) {
5111 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005112 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005113 goto fail;
5114 }
5115 Py_DECREF(w);
5116 }
5117 Py_DECREF(*cellvars);
5118 *cellvars = d;
5119 return 1;
5120 fail:
5121 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005122 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005123 return -1;
5124}
5125
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005126static int
5127symtable_freevar_offsets(PyObject *freevars, int offset)
5128{
5129 PyObject *name, *v;
5130 int pos;
5131
5132 /* The cell vars are the first elements of the closure,
5133 followed by the free vars. Update the offsets in
5134 c_freevars to account for number of cellvars. */
5135 pos = 0;
5136 while (PyDict_Next(freevars, &pos, &name, &v)) {
5137 int i = PyInt_AS_LONG(v) + offset;
5138 PyObject *o = PyInt_FromLong(i);
5139 if (o == NULL)
5140 return -1;
5141 if (PyDict_SetItem(freevars, name, o) < 0) {
5142 Py_DECREF(o);
5143 return -1;
5144 }
5145 Py_DECREF(o);
5146 }
5147 return 0;
5148}
5149
5150static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005151symtable_check_unoptimized(struct compiling *c,
5152 PySymtableEntryObject *ste,
5153 struct symbol_info *si)
5154{
5155 char buf[300];
5156
5157 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5158 || (ste->ste_nested && si->si_nimplicit)))
5159 return 0;
5160
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005161#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5162
5163#define ILLEGAL_IS "is a nested function"
5164
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005165#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005166"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005167
5168#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005169"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005170
5171#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005172"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005173"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005174
5175 /* XXX perhaps the linenos for these opt-breaking statements
5176 should be stored so the exception can point to them. */
5177
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005178 if (ste->ste_child_free) {
5179 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005180 PyOS_snprintf(buf, sizeof(buf),
5181 ILLEGAL_IMPORT_STAR,
5182 PyString_AS_STRING(ste->ste_name),
5183 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005184 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005185 PyOS_snprintf(buf, sizeof(buf),
5186 ILLEGAL_BARE_EXEC,
5187 PyString_AS_STRING(ste->ste_name),
5188 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005189 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005190 PyOS_snprintf(buf, sizeof(buf),
5191 ILLEGAL_EXEC_AND_IMPORT_STAR,
5192 PyString_AS_STRING(ste->ste_name),
5193 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005194 }
5195 } else {
5196 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005197 PyOS_snprintf(buf, sizeof(buf),
5198 ILLEGAL_IMPORT_STAR,
5199 PyString_AS_STRING(ste->ste_name),
5200 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005201 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005202 PyOS_snprintf(buf, sizeof(buf),
5203 ILLEGAL_BARE_EXEC,
5204 PyString_AS_STRING(ste->ste_name),
5205 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005206 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005207 PyOS_snprintf(buf, sizeof(buf),
5208 ILLEGAL_EXEC_AND_IMPORT_STAR,
5209 PyString_AS_STRING(ste->ste_name),
5210 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005211 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005212 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005213
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005214 PyErr_SetString(PyExc_SyntaxError, buf);
5215 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5216 ste->ste_opt_lineno);
5217 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005218}
5219
5220static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005221symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5222 struct symbol_info *si)
5223{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005224 if (c->c_future)
5225 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005226 if (ste->ste_generator)
5227 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005228 if (ste->ste_type != TYPE_MODULE)
5229 c->c_flags |= CO_NEWLOCALS;
5230 if (ste->ste_type == TYPE_FUNCTION) {
5231 c->c_nlocals = si->si_nlocals;
5232 if (ste->ste_optimized == 0)
5233 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005234 else if (ste->ste_optimized != OPT_EXEC)
5235 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005236 }
5237 return 0;
5238}
5239
5240static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005241symtable_error(struct symtable *st, int lineno)
5242{
5243 if (lineno == 0)
5244 lineno = st->st_cur->ste_lineno;
5245 PyErr_SyntaxLocation(st->st_filename, lineno);
5246 st->st_errors++;
5247 return -1;
5248}
5249
5250static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251symtable_load_symbols(struct compiling *c)
5252{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005254 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005255 PyObject *name, *varnames, *v;
5256 int i, flags, pos;
5257 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005259 v = NULL;
5260
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005261 if (symtable_init_compiling_symbols(c) < 0)
5262 goto fail;
5263 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005264 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005265 si.si_nlocals = PyList_GET_SIZE(varnames);
5266 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005267
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005268 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005269 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005270 if (v == NULL)
5271 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 if (PyDict_SetItem(c->c_locals,
5273 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274 goto fail;
5275 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005276 }
5277
5278 /* XXX The cases below define the rules for whether a name is
5279 local or global. The logic could probably be clearer. */
5280 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005281 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5282 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005283
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005284 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005285 /* undo the original DEF_FREE */
5286 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005287
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005288 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005289 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005290 2. Free variables in methods that are also class
5291 variables or declared global.
5292 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005293 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005294 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005295
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005296 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005297 c->c_argcount--;
5298 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005299 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 c->c_argcount--;
5301 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005302 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005304 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005305 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005306 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005307 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005308 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005309 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005311 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5312 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005313 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005314 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005315 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005316 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005317 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005318 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005319 if (v == NULL)
5320 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005322 goto fail;
5323 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005324 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005325 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005326 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005327 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005328 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005329 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005330 if (v == NULL)
5331 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005332 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005333 goto fail;
5334 Py_DECREF(v);
5335 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005336 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005337 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005338 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005339 goto fail;
5340 if (st->st_nscopes != 1) {
5341 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005342 if (v == NULL)
5343 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005344 if (PyDict_SetItem(st->st_global,
5345 name, v))
5346 goto fail;
5347 Py_DECREF(v);
5348 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005349 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350 }
5351 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005352 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5353
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005354 if (si.si_ncells > 1) { /* one cell is always in order */
5355 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5356 c->c_varnames, c->c_flags) < 0)
5357 return -1;
5358 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005359 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5360 return -1;
5361 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005362 fail:
5363 /* is this always the right thing to do? */
5364 Py_XDECREF(v);
5365 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366}
5367
5368static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005369symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370{
5371 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005373 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005374 if (st == NULL)
5375 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005376 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005377
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005378 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005379 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381 goto fail;
5382 if ((st->st_symbols = PyDict_New()) == NULL)
5383 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005384 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005385 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005386 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 st->st_private = NULL;
5388 return st;
5389 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005390 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005391 return NULL;
5392}
5393
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005394void
5395PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005396{
5397 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005398 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005399 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005400 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005401}
5402
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403/* When the compiler exits a scope, it must should update the scope's
5404 free variable information with the list of free variables in its
5405 children.
5406
5407 Variables that are free in children and defined in the current
5408 scope are cellvars.
5409
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005410 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005411 false), free variables in children that are not defined here are
5412 implicit globals.
5413
5414*/
5415
5416static int
5417symtable_update_free_vars(struct symtable *st)
5418{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005419 int i, j, def;
5420 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005421 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005422
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005423 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424 def = DEF_FREE_CLASS;
5425 else
5426 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005427 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005428 int pos = 0;
5429
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005430 if (list && PyList_SetSlice(list, 0,
5431 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005432 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005433 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005434 PyList_GET_ITEM(ste->ste_children, i);
5435 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005436 int flags = PyInt_AS_LONG(o);
5437 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005438 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005439 if (list == NULL) {
5440 list = PyList_New(0);
5441 if (list == NULL)
5442 return -1;
5443 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005444 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005445 if (PyList_Append(list, name) < 0) {
5446 Py_DECREF(list);
5447 return -1;
5448 }
5449 }
5450 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005451 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005452 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005453 v = PyDict_GetItem(ste->ste_symbols, name);
5454 /* If a name N is declared global in scope A and
5455 referenced in scope B contained (perhaps
5456 indirectly) in A and there are no scopes
5457 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005458 is global in B. Unless A is a class scope,
5459 because class scopes are not considered for
5460 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005461 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005462 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005463 int flags = PyInt_AS_LONG(v);
5464 if (flags & DEF_GLOBAL) {
5465 symtable_undo_free(st, child->ste_id,
5466 name);
5467 continue;
5468 }
5469 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005470 if (ste->ste_nested) {
5471 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005472 name, def) < 0) {
5473 Py_DECREF(list);
5474 return -1;
5475 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005476 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005477 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005478 name) < 0) {
5479 Py_DECREF(list);
5480 return -1;
5481 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005482 }
5483 }
5484 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005485
5486 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005487 return 0;
5488}
5489
5490/* If the current scope is a non-nested class or if name is not
5491 defined in the current, non-nested scope, then it is an implicit
5492 global in all nested scopes.
5493*/
5494
5495static int
5496symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5497{
5498 PyObject *o;
5499 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005500 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005501
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005502 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005503 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005505 if (o == NULL)
5506 return symtable_undo_free(st, child, name);
5507 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005508
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005509 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005510 return symtable_undo_free(st, child, name);
5511 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005512 return symtable_add_def_o(st, ste->ste_symbols,
5513 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005514}
5515
5516static int
5517symtable_undo_free(struct symtable *st, PyObject *id,
5518 PyObject *name)
5519{
5520 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005521 PyObject *info;
5522 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005523
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005524 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5525 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005527
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005528 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005529 if (info == NULL)
5530 return 0;
5531 v = PyInt_AS_LONG(info);
5532 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005533 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005534 DEF_FREE_GLOBAL) < 0)
5535 return -1;
5536 } else
5537 /* If the name is defined here or declared global,
5538 then the recursion stops. */
5539 return 0;
5540
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005541 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5542 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005543 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005544 PyList_GET_ITEM(ste->ste_children, i);
5545 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005546 if (x < 0)
5547 return x;
5548 }
5549 return 0;
5550}
5551
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005552/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5553 This reference is released when the scope is exited, via the DECREF
5554 in symtable_exit_scope().
5555*/
5556
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005557static int
5558symtable_exit_scope(struct symtable *st)
5559{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005560 int end;
5561
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005562 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005564 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005565 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005566 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5567 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005568 if (PySequence_DelItem(st->st_stack, end) < 0)
5569 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005570 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005571}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005572
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005573static void
5574symtable_enter_scope(struct symtable *st, char *name, int type,
5575 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005576{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005577 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005578
5579 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005580 prev = st->st_cur;
5581 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005582 st->st_errors++;
5583 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005584 }
5585 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005586 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005587 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005588 if (st->st_cur == NULL) {
5589 st->st_errors++;
5590 return;
5591 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005592 if (strcmp(name, TOP) == 0)
5593 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005594 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005595 if (PyList_Append(prev->ste_children,
5596 (PyObject *)st->st_cur) < 0)
5597 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005598 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005599}
5600
5601static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005602symtable_lookup(struct symtable *st, char *name)
5603{
5604 char buffer[MANGLE_LEN];
5605 PyObject *v;
5606 int flags;
5607
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005608 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005609 name = buffer;
5610 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5611 if (v == NULL) {
5612 if (PyErr_Occurred())
5613 return -1;
5614 else
5615 return 0;
5616 }
5617
5618 flags = PyInt_AS_LONG(v);
5619 return flags;
5620}
5621
5622static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005624{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005625 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005626 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005627 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005628
Guido van Rossumb7164622002-08-16 02:48:11 +00005629 /* Warn about None, except inside a tuple (where the assignment
5630 code already issues a warning). */
5631 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5632 *name == 'N' && strcmp(name, "None") == 0)
5633 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005634 PyErr_SetString(PyExc_SyntaxError,
5635 "Invalid syntax. Assignment to None.");
5636 symtable_error(st, 0);
5637 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005638 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005639 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005640 name = buffer;
5641 if ((s = PyString_InternFromString(name)) == NULL)
5642 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005643 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5644 Py_DECREF(s);
5645 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005646}
5647
5648/* Must only be called with mangled names */
5649
5650static int
5651symtable_add_def_o(struct symtable *st, PyObject *dict,
5652 PyObject *name, int flag)
5653{
5654 PyObject *o;
5655 int val;
5656
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005657 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005658 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005660 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005661 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005662 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005663 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005664 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005665 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005668 if (o == NULL)
5669 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005670 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671 Py_DECREF(o);
5672 return -1;
5673 }
5674 Py_DECREF(o);
5675
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005677 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005678 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 } else if (flag & DEF_GLOBAL) {
5680 /* XXX need to update DEF_GLOBAL for other flags too;
5681 perhaps only DEF_FREE_GLOBAL */
5682 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005685 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005686 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005687 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005688 if (o == NULL)
5689 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005691 Py_DECREF(o);
5692 return -1;
5693 }
5694 Py_DECREF(o);
5695 }
5696 return 0;
5697}
5698
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005700
Tim Peters08a898f2001-06-28 01:52:22 +00005701/* Look for a yield stmt under n. Return 1 if found, else 0.
5702 This hack is used to look inside "if 0:" blocks (which are normally
5703 ignored) in case those are the only places a yield occurs (so that this
5704 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005705static int
5706look_for_yield(node *n)
5707{
5708 int i;
5709
5710 for (i = 0; i < NCH(n); ++i) {
5711 node *kid = CHILD(n, i);
5712
5713 switch (TYPE(kid)) {
5714
5715 case classdef:
5716 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005717 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005718 /* Stuff in nested functions and classes can't make
5719 the parent a generator. */
5720 return 0;
5721
5722 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005723 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005724
5725 default:
5726 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005727 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005728 }
5729 }
5730 return 0;
5731}
5732
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733static void
5734symtable_node(struct symtable *st, node *n)
5735{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005736 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737
5738 loop:
5739 switch (TYPE(n)) {
5740 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005741 char *func_name;
5742 if (NCH(n) == 6)
5743 symtable_node(st, CHILD(n, 0));
5744 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005745 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005746 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005747 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 symtable_funcdef(st, n);
5749 symtable_exit_scope(st);
5750 break;
5751 }
5752 case lambdef:
5753 if (NCH(n) == 4)
5754 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005755 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 symtable_funcdef(st, n);
5757 symtable_exit_scope(st);
5758 break;
5759 case classdef: {
5760 char *tmp, *class_name = STR(CHILD(n, 1));
5761 symtable_add_def(st, class_name, DEF_LOCAL);
5762 if (TYPE(CHILD(n, 2)) == LPAR) {
5763 node *bases = CHILD(n, 3);
5764 int i;
5765 for (i = 0; i < NCH(bases); i += 2) {
5766 symtable_node(st, CHILD(bases, i));
5767 }
5768 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005769 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 tmp = st->st_private;
5771 st->st_private = class_name;
5772 symtable_node(st, CHILD(n, NCH(n) - 1));
5773 st->st_private = tmp;
5774 symtable_exit_scope(st);
5775 break;
5776 }
5777 case if_stmt:
5778 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005779 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5780 if (st->st_cur->ste_generator == 0)
5781 st->st_cur->ste_generator =
5782 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005783 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005784 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785 symtable_node(st, CHILD(n, i + 1));
5786 symtable_node(st, CHILD(n, i + 3));
5787 }
5788 if (i + 2 < NCH(n))
5789 symtable_node(st, CHILD(n, i + 2));
5790 break;
5791 case global_stmt:
5792 symtable_global(st, n);
5793 break;
5794 case import_stmt:
5795 symtable_import(st, n);
5796 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005797 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005798 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005799 symtable_node(st, CHILD(n, 1));
5800 if (NCH(n) > 2)
5801 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005802 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005803 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005804 st->st_cur->ste_opt_lineno = n->n_lineno;
5805 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005806 if (NCH(n) > 4)
5807 symtable_node(st, CHILD(n, 5));
5808 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005809
5810 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005811 case assert_stmt:
5812 if (Py_OptimizeFlag)
5813 return;
5814 if (NCH(n) == 2) {
5815 n = CHILD(n, 1);
5816 goto loop;
5817 } else {
5818 symtable_node(st, CHILD(n, 1));
5819 n = CHILD(n, 3);
5820 goto loop;
5821 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005822 case except_clause:
5823 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005824 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005825 if (NCH(n) > 1) {
5826 n = CHILD(n, 1);
5827 goto loop;
5828 }
5829 break;
5830 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005831 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005832 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005833 case yield_stmt:
5834 st->st_cur->ste_generator = 1;
5835 n = CHILD(n, 1);
5836 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005837 case expr_stmt:
5838 if (NCH(n) == 1)
5839 n = CHILD(n, 0);
5840 else {
5841 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005842 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005843 symtable_node(st, CHILD(n, 2));
5844 break;
5845 } else {
5846 int i;
5847 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005848 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005849 n = CHILD(n, NCH(n) - 1);
5850 }
5851 }
5852 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005853 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005854 /* only occurs when there are multiple for loops
5855 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005856 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005857 if (TYPE(n) == list_for)
5858 symtable_list_for(st, n);
5859 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005860 REQ(n, list_if);
5861 symtable_node(st, CHILD(n, 1));
5862 if (NCH(n) == 3) {
5863 n = CHILD(n, 2);
5864 goto loop;
5865 }
5866 }
5867 break;
5868 case for_stmt:
5869 symtable_assign(st, CHILD(n, 1), 0);
5870 for (i = 3; i < NCH(n); ++i)
5871 if (TYPE(CHILD(n, i)) >= single_input)
5872 symtable_node(st, CHILD(n, i));
5873 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005874 case arglist:
5875 if (NCH(n) > 1)
5876 for (i = 0; i < NCH(n); ++i) {
5877 node *ch = CHILD(n, i);
5878 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5879 TYPE(CHILD(ch, 1)) == gen_for) {
5880 PyErr_SetString(PyExc_SyntaxError,
5881 "invalid syntax");
5882 symtable_error(st, n->n_lineno);
5883 return;
5884 }
5885 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005886 /* The remaining cases fall through to default except in
5887 special circumstances. This requires the individual cases
5888 to be coded with great care, even though they look like
5889 rather innocuous. Each case must double-check TYPE(n).
5890 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005891 case decorator:
5892 if (TYPE(n) == decorator) {
5893 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5894 node *name, *varname;
5895 name = CHILD(n, 1);
5896 REQ(name, dotted_name);
5897 varname = CHILD(name, 0);
5898 REQ(varname, NAME);
5899 symtable_add_use(st, STR(varname));
5900 }
5901 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005902 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005903 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904 n = CHILD(n, 2);
5905 goto loop;
5906 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005907 else if (TYPE(n) == argument && NCH(n) == 2 &&
5908 TYPE(CHILD(n, 1)) == gen_for) {
5909 symtable_generator_expression(st, n);
5910 break;
5911 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005912 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005913 case listmaker:
5914 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005915 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005916 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005917 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005918 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005919 case testlist_gexp:
5920 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5921 symtable_generator_expression(st, n);
5922 break;
5923 }
5924 /* fall through */
5925
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005926 case atom:
5927 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5928 symtable_add_use(st, STR(CHILD(n, 0)));
5929 break;
5930 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005931 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005932 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005933 /* Walk over every non-token child with a special case
5934 for one child.
5935 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005936 if (NCH(n) == 1) {
5937 n = CHILD(n, 0);
5938 goto loop;
5939 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005940 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005941 if (TYPE(CHILD(n, i)) >= single_input)
5942 symtable_node(st, CHILD(n, i));
5943 }
5944}
5945
5946static void
5947symtable_funcdef(struct symtable *st, node *n)
5948{
5949 node *body;
5950
5951 if (TYPE(n) == lambdef) {
5952 if (NCH(n) == 4)
5953 symtable_params(st, CHILD(n, 1));
5954 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005955 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005956 body = CHILD(n, NCH(n) - 1);
5957 symtable_node(st, body);
5958}
5959
5960/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005961 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005962 which are references in the defining scope. symtable_params()
5963 parses the parameter names, which are defined in the function's
5964 body.
5965
5966 varargslist:
5967 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5968 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5969*/
5970
5971static void
5972symtable_default_args(struct symtable *st, node *n)
5973{
5974 node *c;
5975 int i;
5976
5977 if (TYPE(n) == parameters) {
5978 n = CHILD(n, 1);
5979 if (TYPE(n) == RPAR)
5980 return;
5981 }
5982 REQ(n, varargslist);
5983 for (i = 0; i < NCH(n); i += 2) {
5984 c = CHILD(n, i);
5985 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5986 break;
5987 }
5988 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5989 symtable_node(st, CHILD(n, i));
5990 }
5991}
5992
5993static void
5994symtable_params(struct symtable *st, node *n)
5995{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005996 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005997 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005998
5999 if (TYPE(n) == parameters) {
6000 n = CHILD(n, 1);
6001 if (TYPE(n) == RPAR)
6002 return;
6003 }
6004 REQ(n, varargslist);
6005 for (i = 0; i < NCH(n); i += 2) {
6006 c = CHILD(n, i);
6007 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6008 ext = 1;
6009 break;
6010 }
6011 if (TYPE(c) == test) {
6012 continue;
6013 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006014 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006015 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006016 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006017 char nbuf[30];
6018 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006020 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 }
6022 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023 if (ext) {
6024 c = CHILD(n, i);
6025 if (TYPE(c) == STAR) {
6026 i++;
6027 symtable_add_def(st, STR(CHILD(n, i)),
6028 DEF_PARAM | DEF_STAR);
6029 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006030 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006031 c = NULL;
6032 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006033 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006035 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006036 i++;
6037 symtable_add_def(st, STR(CHILD(n, i)),
6038 DEF_PARAM | DEF_DOUBLESTAR);
6039 }
6040 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006041 if (complex >= 0) {
6042 int j;
6043 for (j = 0; j <= complex; j++) {
6044 c = CHILD(n, j);
6045 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006046 c = CHILD(n, ++j);
6047 else if (TYPE(c) == EQUAL)
6048 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006049 if (TYPE(CHILD(c, 0)) == LPAR)
6050 symtable_params_fplist(st, CHILD(c, 1));
6051 }
6052 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006053}
6054
6055static void
6056symtable_params_fplist(struct symtable *st, node *n)
6057{
6058 int i;
6059 node *c;
6060
6061 REQ(n, fplist);
6062 for (i = 0; i < NCH(n); i += 2) {
6063 c = CHILD(n, i);
6064 REQ(c, fpdef);
6065 if (NCH(c) == 1)
6066 symtable_add_def(st, STR(CHILD(c, 0)),
6067 DEF_PARAM | DEF_INTUPLE);
6068 else
6069 symtable_params_fplist(st, CHILD(c, 1));
6070 }
6071
6072}
6073
6074static void
6075symtable_global(struct symtable *st, node *n)
6076{
6077 int i;
6078
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006079 /* XXX It might be helpful to warn about module-level global
6080 statements, but it's hard to tell the difference between
6081 module-level and a string passed to exec.
6082 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006083
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006084 for (i = 1; i < NCH(n); i += 2) {
6085 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006086 int flags;
6087
6088 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006089 if (flags < 0)
6090 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006091 if (flags && flags != DEF_GLOBAL) {
6092 char buf[500];
6093 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006094 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006095 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006096 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006097 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006098 }
6099 else {
6100 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006101 PyOS_snprintf(buf, sizeof(buf),
6102 GLOBAL_AFTER_ASSIGN,
6103 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006104 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006105 PyOS_snprintf(buf, sizeof(buf),
6106 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006107 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006108 }
6109 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006110 symtable_add_def(st, name, DEF_GLOBAL);
6111 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006112}
6113
6114static void
6115symtable_list_comprehension(struct symtable *st, node *n)
6116{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006117 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006118 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006119
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006120 REQ(n, listmaker);
6121 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6122 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006123 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006124 symtable_list_for(st, CHILD(n, 1));
6125 symtable_node(st, CHILD(n, 0));
6126 --st->st_cur->ste_tmpname;
6127}
6128
6129static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006130symtable_generator_expression(struct symtable *st, node *n)
6131{
6132 /* testlist_gexp: test gen_for */
6133 REQ(CHILD(n, 0), test);
6134 REQ(CHILD(n, 1), gen_for);
6135
6136 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6137 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6138
6139 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6140
6141 symtable_gen_for(st, CHILD(n, 1), 1);
6142 symtable_node(st, CHILD(n, 0));
6143 symtable_exit_scope(st);
6144
6145 /* for outmost iterable precomputation */
6146 symtable_node(st, CHILD(CHILD(n, 1), 3));
6147}
6148
6149static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006150symtable_list_for(struct symtable *st, node *n)
6151{
6152 REQ(n, list_for);
6153 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006154 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006155 symtable_node(st, CHILD(n, 3));
6156 if (NCH(n) == 5)
6157 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006158}
6159
6160static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006161symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6162{
6163 REQ(n, gen_for);
6164
6165 /* gen_for: for v in test [gen_iter] */
6166 symtable_assign(st, CHILD(n, 1), 0);
6167 if (is_outmost)
6168 symtable_add_use(st, "[outmost-iterable]");
6169 else
6170 symtable_node(st, CHILD(n, 3));
6171
6172 if (NCH(n) == 5)
6173 symtable_gen_iter(st, CHILD(n, 4));
6174}
6175
6176static void
6177symtable_gen_iter(struct symtable *st, node *n)
6178{
6179 REQ(n, gen_iter);
6180
6181 n = CHILD(n, 0);
6182 if (TYPE(n) == gen_for)
6183 symtable_gen_for(st, n, 0);
6184 else {
6185 REQ(n, gen_if);
6186 symtable_node(st, CHILD(n, 1));
6187
6188 if (NCH(n) == 3)
6189 symtable_gen_iter(st, CHILD(n, 2));
6190 }
6191}
6192
6193static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006194symtable_import(struct symtable *st, node *n)
6195{
6196 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006197 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006198 | 'from' dotted_name 'import'
6199 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006200 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006201 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006202 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006203 node *dotname = CHILD(n, 1);
6204 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6205 /* check for bogus imports */
6206 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6207 PyErr_SetString(PyExc_SyntaxError,
6208 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006209 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006210 return;
6211 }
6212 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006213 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006214 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006215 if (symtable_warn(st,
6216 "import * only allowed at module level") < 0)
6217 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006218 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006219 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006220 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 } else {
6222 for (i = 3; i < NCH(n); i += 2) {
6223 node *c = CHILD(n, i);
6224 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006225 symtable_assign(st, CHILD(c, 2),
6226 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006227 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006228 symtable_assign(st, CHILD(c, 0),
6229 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006230 }
6231 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006232 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006233 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006234 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006235 }
6236 }
6237}
6238
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006239/* The third argument to symatble_assign() is a flag to be passed to
6240 symtable_add_def() if it is eventually called. The flag is useful
6241 to specify the particular type of assignment that should be
6242 recorded, e.g. an assignment caused by import.
6243 */
6244
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006245static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006246symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006247{
6248 node *tmp;
6249 int i;
6250
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006251 loop:
6252 switch (TYPE(n)) {
6253 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006254 /* invalid assignment, e.g. lambda x:x=2. The next
6255 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006256 return;
6257 case power:
6258 if (NCH(n) > 2) {
6259 for (i = 2; i < NCH(n); ++i)
6260 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6261 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006262 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006263 if (NCH(n) > 1) {
6264 symtable_node(st, CHILD(n, 0));
6265 symtable_node(st, CHILD(n, 1));
6266 } else {
6267 n = CHILD(n, 0);
6268 goto loop;
6269 }
6270 return;
6271 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006272 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6273 /* XXX This is an error, but the next pass
6274 will catch it. */
6275 return;
6276 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006277 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006278 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006279 }
6280 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006281 case testlist_gexp:
6282 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6283 /* XXX This is an error, but the next pass
6284 will catch it. */
6285 return;
6286 } else {
6287 for (i = 0; i < NCH(n); i += 2)
6288 symtable_assign(st, CHILD(n, i), def_flag);
6289 }
6290 return;
6291
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006292 case exprlist:
6293 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006294 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006295 if (NCH(n) == 1) {
6296 n = CHILD(n, 0);
6297 goto loop;
6298 }
6299 else {
6300 int i;
6301 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006302 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006303 return;
6304 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006305 case atom:
6306 tmp = CHILD(n, 0);
6307 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6308 n = CHILD(n, 1);
6309 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006310 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006311 if (strcmp(STR(tmp), "__debug__") == 0) {
6312 PyErr_SetString(PyExc_SyntaxError,
6313 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006314 symtable_error(st, n->n_lineno);
6315 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006316 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006317 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006318 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006319 return;
6320 case dotted_as_name:
6321 if (NCH(n) == 3)
6322 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006323 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006324 else
6325 symtable_add_def(st,
6326 STR(CHILD(CHILD(n,
6327 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006328 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006329 return;
6330 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006331 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006332 return;
6333 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006334 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006335 return;
6336 default:
6337 if (NCH(n) == 0)
6338 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006339 if (NCH(n) == 1) {
6340 n = CHILD(n, 0);
6341 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006342 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006343 /* Should only occur for errors like x + 1 = 1,
6344 which will be caught in the next pass. */
6345 for (i = 0; i < NCH(n); ++i)
6346 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006347 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006348 }
6349}