blob: 12ab03eea5dbce667d99372ea616c03417e8b2b3 [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 Hettinger1a789292004-08-18 05:22:06 +0000628 Py_INCREF(code);
629 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000631 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000633 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000635 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000636 Py_INCREF(freevars);
637 co->co_freevars = freevars;
638 Py_INCREF(cellvars);
639 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000641 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000643 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000644 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000646 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000647 if (PyTuple_GET_SIZE(freevars) == 0 &&
648 PyTuple_GET_SIZE(cellvars) == 0)
649 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000650 }
651 return co;
652}
653
654
655/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000656
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000657/* The compiler uses two passes to generate bytecodes. The first pass
658 builds the symbol table. The second pass generates the bytecode.
659
660 The first pass uses a single symtable struct. The second pass uses
661 a compiling struct for each code block. The compiling structs
662 share a reference to the symtable.
663
664 The two passes communicate via symtable_load_symbols() and via
665 is_local() and is_global(). The former initializes several slots
666 in the compiling struct: c_varnames, c_locals, c_nlocals,
667 c_argcount, c_globals, and c_flags.
668*/
669
Tim Peters2a7f3842001-06-09 09:26:21 +0000670/* All about c_lnotab.
671
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000672c_lnotab is an array of unsigned bytes disguised as a Python string. Since
673version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
674mapped to source code line #s via c_lnotab instead.
675
Tim Peters2a7f3842001-06-09 09:26:21 +0000676The array is conceptually a list of
677 (bytecode offset increment, line number increment)
678pairs. The details are important and delicate, best illustrated by example:
679
680 byte code offset source code line number
681 0 1
682 6 2
683 50 7
684 350 307
685 361 308
686
687The first trick is that these numbers aren't stored, only the increments
688from one row to the next (this doesn't really work, but it's a start):
689
690 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
691
692The second trick is that an unsigned byte can't hold negative values, or
693values larger than 255, so (a) there's a deep assumption that byte code
694offsets and their corresponding line #s both increase monotonically, and (b)
695if at least one column jumps by more than 255 from one row to the next, more
696than one pair is written to the table. In case #b, there's no way to know
697from looking at the table later how many were written. That's the delicate
698part. A user of c_lnotab desiring to find the source line number
699corresponding to a bytecode address A should do something like this
700
701 lineno = addr = 0
702 for addr_incr, line_incr in c_lnotab:
703 addr += addr_incr
704 if addr > A:
705 return lineno
706 lineno += line_incr
707
708In order for this to work, when the addr field increments by more than 255,
709the line # increment in each pair generated must be 0 until the remaining addr
710increment is < 256. So, in the example above, com_set_lineno should not (as
711was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
712255, 0, 45, 255, 0, 45.
713*/
714
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000715struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000716 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000718 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000720 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000721 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 PyObject *c_locals; /* dictionary (value=localID) */
723 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000724 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000725 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000726 int c_nlocals; /* index of next local */
727 int c_argcount; /* number of top-level arguments */
728 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000729 int c_nexti; /* index into c_code */
730 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000731 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000732 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000733 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000734 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000735 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000736 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000737 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000738 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000739 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000740 int c_stacklevel; /* Current stack level */
741 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000742 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000744 int c_last_addr; /* last op addr seen and recorded in lnotab */
745 int c_last_line; /* last line seen and recorded in lnotab */
746 int c_lnotab_next; /* current length of lnotab */
747 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000748 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000749 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000750 int c_nested; /* Is block nested funcdef or lamdef? */
751 int c_closure; /* Is nested w/freevars? */
752 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000753 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000754 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000755};
756
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000757static int
758is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000759{
760 if ((v & (USE | DEF_FREE))
761 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
762 return 1;
763 if (v & DEF_FREE_CLASS)
764 return 1;
765 return 0;
766}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000767
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000768static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000769com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000770{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000771 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
772
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000773 if (c == NULL) {
774 /* Error occurred via symtable call to
775 is_constant_false */
776 PyErr_SetString(exc, msg);
777 return;
778 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000779 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000780 if (c->c_lineno < 1 || c->c_interactive) {
781 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000783 return;
784 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000785 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000786 if (v == NULL)
787 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000788
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000789 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000790 if (line == NULL) {
791 Py_INCREF(Py_None);
792 line = Py_None;
793 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000794 if (exc == PyExc_SyntaxError) {
795 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
796 Py_None, line);
797 if (t == NULL)
798 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000799 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000800 if (w == NULL)
801 goto exit;
802 PyErr_SetObject(exc, w);
803 } else {
804 /* Make sure additional exceptions are printed with
805 file and line, also. */
806 PyErr_SetObject(exc, v);
807 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
808 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000809 exit:
810 Py_XDECREF(t);
811 Py_XDECREF(v);
812 Py_XDECREF(w);
813 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000814}
815
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000816/* Interface to the block stack */
817
818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000820{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000821 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 com_error(c, PyExc_SystemError,
823 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000824 }
825 else {
826 c->c_block[c->c_nblocks++] = type;
827 }
828}
829
830static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000832{
833 if (c->c_nblocks > 0)
834 c->c_nblocks--;
835 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000837 }
838}
839
Guido van Rossum681d79a1995-07-18 14:51:37 +0000840/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000841
Martin v. Löwis95292d62002-12-11 14:04:59 +0000842static int issue_warning(const char *, const char *, int);
843static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000844static void com_free(struct compiling *);
845static void com_push(struct compiling *, int);
846static void com_pop(struct compiling *, int);
847static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000848static void com_node(struct compiling *, node *);
849static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000850static void com_addbyte(struct compiling *, int);
851static void com_addint(struct compiling *, int);
852static void com_addoparg(struct compiling *, int, int);
853static void com_addfwref(struct compiling *, int, int *);
854static void com_backpatch(struct compiling *, int);
855static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
856static int com_addconst(struct compiling *, PyObject *);
857static int com_addname(struct compiling *, PyObject *);
858static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000859static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000860static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000861static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000862static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000863static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000864static void com_assign(struct compiling *, node *, int, node *);
865static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000866static int com_make_closure(struct compiling *c, PyCodeObject *co);
867
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000868static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000869static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000870 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000871static PyObject *parsestrplus(struct compiling*, node *);
872static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000873static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000874
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000875static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000876
877/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000878static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000879static struct symtable *symtable_build(node *, PyFutureFeatures *,
880 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000881static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000882static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000883static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000885static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000886static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000887
888static void symtable_node(struct symtable *, node *);
889static void symtable_funcdef(struct symtable *, node *);
890static void symtable_default_args(struct symtable *, node *);
891static void symtable_params(struct symtable *, node *);
892static void symtable_params_fplist(struct symtable *, node *n);
893static void symtable_global(struct symtable *, node *);
894static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000895static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000896static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000897static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000898static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000899static void symtable_gen_for(struct symtable *, node *, int);
900static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000901
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000902static int symtable_update_free_vars(struct symtable *);
903static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
904static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
905
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000906/* helper */
907static void
908do_pad(int pad)
909{
910 int i;
911 for (i = 0; i < pad; ++i)
912 fprintf(stderr, " ");
913}
914
915static void
916dump(node *n, int pad, int depth)
917{
918 int i;
919 if (depth == 0)
920 return;
921 do_pad(pad);
922 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
923 if (depth > 0)
924 depth--;
925 for (i = 0; i < NCH(n); ++i)
926 dump(CHILD(n, i), pad + 1, depth);
927}
928
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000929static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000930com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000931{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000932 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
934 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000935 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000937 goto fail;
938 if ((c->c_const_dict = PyDict_New()) == NULL)
939 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000941 goto fail;
942 if ((c->c_name_dict = PyDict_New()) == NULL)
943 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000945 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
947 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000948 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000949 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000950 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000951 c->c_freevars = NULL;
952 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000953 c->c_nlocals = 0;
954 c->c_argcount = 0;
955 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956 c->c_nexti = 0;
957 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000958 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000959 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000960 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000961 c->c_begin = 0;
962 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000963 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000964 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000965 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000966 c->c_stacklevel = 0;
967 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000968 c->c_firstlineno = 0;
969 c->c_last_addr = 0;
970 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000971 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000972 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000973 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000974 c->c_nested = 0;
975 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000977 return 1;
978
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000979 fail:
980 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000981 return 0;
982}
983
984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000985com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 Py_XDECREF(c->c_code);
988 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000989 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000990 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000991 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 Py_XDECREF(c->c_globals);
993 Py_XDECREF(c->c_locals);
994 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000995 Py_XDECREF(c->c_freevars);
996 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000998 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000999 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001000}
1001
1002static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001003com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001004{
1005 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001006 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001007 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001008 /*
1009 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1010 c->c_filename, c->c_name, c->c_lineno,
1011 c->c_nexti, c->c_stacklevel, n);
1012 */
1013 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001014}
1015
1016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001017com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001018{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001019 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001021 else
1022 c->c_stacklevel -= n;
1023}
1024
1025static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001026com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027{
1028 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001030 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001032}
1033
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001034static int
1035com_check_size(PyObject **s, int offset)
1036{
1037 int len = PyString_GET_SIZE(*s);
1038 if (offset >= len)
1039 return _PyString_Resize(s, len * 2);
1040 return 0;
1041}
1042
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001044com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001045{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001046 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001047 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001048 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001049 if (com_check_size(&c->c_code, c->c_nexti)) {
1050 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001052 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001053 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001054}
1055
1056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001057com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001058{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001059 com_addbyte(c, x & 0xff);
1060 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001061}
1062
1063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001064com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001065{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001066 char *p;
1067 if (c->c_lnotab == NULL)
1068 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001069 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1070 c->c_errors++;
1071 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001072 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001073 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001074 *p++ = addr;
1075 *p++ = line;
1076 c->c_lnotab_next += 2;
1077}
1078
1079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001080com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001081{
1082 c->c_lineno = lineno;
1083 if (c->c_firstlineno == 0) {
1084 c->c_firstlineno = c->c_last_line = lineno;
1085 }
1086 else {
1087 int incr_addr = c->c_nexti - c->c_last_addr;
1088 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001089 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001090 while (incr_addr > 255) {
1091 com_add_lnotab(c, 255, 0);
1092 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001093 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001094 while (incr_line > 255) {
1095 com_add_lnotab(c, incr_addr, 255);
1096 incr_line -=255;
1097 incr_addr = 0;
1098 }
1099 if (incr_addr > 0 || incr_line > 0)
1100 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001101 c->c_last_addr = c->c_nexti;
1102 c->c_last_line = lineno;
1103 }
1104}
1105
1106static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001107com_strip_lnotab(struct compiling *c)
1108{
1109 /* strip the last lnotab entry if no opcode were emitted.
1110 * This prevents a line number to be generated on a final
1111 * pass, like in the following example:
1112 *
1113 * if a:
1114 * print 5
1115 * else:
1116 * pass
1117 *
1118 * Without the fix, a line trace event would be generated
1119 * on the pass even if a is true (because of the implicit
1120 * return).
1121 */
1122 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1123 c->c_lnotab_next = c->c_lnotab_last;
1124 }
1125}
1126
1127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001128com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001129{
Fred Drakeef8ace32000-08-24 00:32:09 +00001130 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001131 if (extended_arg){
1132 com_addbyte(c, EXTENDED_ARG);
1133 com_addint(c, extended_arg);
1134 arg &= 0xffff;
1135 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001136 com_addbyte(c, op);
1137 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138}
1139
1140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001141com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142{
1143 /* Compile a forward reference for backpatching */
1144 int here;
1145 int anchor;
1146 com_addbyte(c, op);
1147 here = c->c_nexti;
1148 anchor = *p_anchor;
1149 *p_anchor = here;
1150 com_addint(c, anchor == 0 ? 0 : here - anchor);
1151}
1152
1153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001154com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001155{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001156 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001158 int dist;
1159 int prev;
1160 for (;;) {
1161 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001162 prev = code[anchor] + (code[anchor+1] << 8);
1163 dist = target - (anchor+2);
1164 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001165 dist >>= 8;
1166 code[anchor+1] = dist;
1167 dist >>= 8;
1168 if (dist) {
1169 com_error(c, PyExc_SystemError,
1170 "com_backpatch: offset too large");
1171 break;
1172 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001173 if (!prev)
1174 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175 anchor -= prev;
1176 }
1177}
1178
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001179/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001180
1181static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001182com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001184 PyObject *w, *t, *np=NULL;
1185 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001186
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001187 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001188 if (t == NULL)
1189 goto fail;
1190 w = PyDict_GetItem(dict, t);
1191 if (w != NULL) {
1192 n = PyInt_AsLong(w);
1193 } else {
1194 n = PyList_Size(list);
1195 np = PyInt_FromLong(n);
1196 if (np == NULL)
1197 goto fail;
1198 if (PyList_Append(list, v) != 0)
1199 goto fail;
1200 if (PyDict_SetItem(dict, t, np) != 0)
1201 goto fail;
1202 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001203 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001204 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001205 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001206 fail:
1207 Py_XDECREF(np);
1208 Py_XDECREF(t);
1209 c->c_errors++;
1210 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001211}
1212
1213static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001214com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001216 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001217}
1218
1219static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001220com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001221{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001222 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001223}
1224
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001225int
1226_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001227{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001228 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001229 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001230 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001231 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1232 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001233 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001234 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001235 return 0; /* Don't mangle __extremely_long_names */
1236 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1237 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001238 /* Strip leading underscores from class name */
1239 while (*p == '_')
1240 p++;
1241 if (*p == '\0')
1242 return 0; /* Don't mangle if class is just underscores */
1243 plen = strlen(p);
1244 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001245 plen = maxlen-nlen-2; /* Truncate class name if too long */
1246 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001247 buffer[0] = '_';
1248 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001249 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001250 return 1;
1251}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001254com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001255{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001257 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001258 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001259
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001260 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001261 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001262 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001263 c->c_errors++;
1264 i = 255;
1265 }
1266 else {
1267 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001269 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001270 com_addoparg(c, op, i);
1271}
1272
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001273#define NAME_LOCAL 0
1274#define NAME_GLOBAL 1
1275#define NAME_DEFAULT 2
1276#define NAME_CLOSURE 3
1277
1278static int
1279com_lookup_arg(PyObject *dict, PyObject *name)
1280{
1281 PyObject *v = PyDict_GetItem(dict, name);
1282 if (v == NULL)
1283 return -1;
1284 else
1285 return PyInt_AS_LONG(v);
1286}
1287
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001288static int
1289none_assignment_check(struct compiling *c, char *name, int assigning)
1290{
1291 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1292 char *msg;
1293 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001294 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001295 else
1296 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001297 com_error(c, PyExc_SyntaxError, msg);
1298 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001299 }
1300 return 0;
1301}
1302
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001303static void
1304com_addop_varname(struct compiling *c, int kind, char *name)
1305{
1306 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001307 int i, reftype;
1308 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001309 int op = STOP_CODE;
1310 char buffer[MANGLE_LEN];
1311
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001312 if (kind != VAR_LOAD &&
1313 none_assignment_check(c, name, kind == VAR_STORE))
1314 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001315 i = 255;
1316 goto done;
1317 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001318 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319 name = buffer;
1320 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1321 c->c_errors++;
1322 i = 255;
1323 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001324 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001325
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001326 reftype = get_ref_type(c, name);
1327 switch (reftype) {
1328 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001329 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001330 scope = NAME_LOCAL;
1331 break;
1332 case GLOBAL_EXPLICIT:
1333 scope = NAME_GLOBAL;
1334 break;
1335 case GLOBAL_IMPLICIT:
1336 if (c->c_flags & CO_OPTIMIZED)
1337 scope = NAME_GLOBAL;
1338 break;
1339 case FREE:
1340 case CELL:
1341 scope = NAME_CLOSURE;
1342 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001343 }
1344
1345 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001346 if (scope == NAME_LOCAL)
1347 i = com_lookup_arg(c->c_locals, v);
1348 else if (reftype == FREE)
1349 i = com_lookup_arg(c->c_freevars, v);
1350 else if (reftype == CELL)
1351 i = com_lookup_arg(c->c_cellvars, v);
1352 if (i == -1) {
1353 c->c_errors++; /* XXX no exception set */
1354 i = 255;
1355 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001356 }
1357 Py_DECREF(v);
1358
1359 switch (kind) {
1360 case VAR_LOAD:
1361 switch (scope) {
1362 case NAME_LOCAL:
1363 op = LOAD_FAST;
1364 break;
1365 case NAME_GLOBAL:
1366 op = LOAD_GLOBAL;
1367 break;
1368 case NAME_DEFAULT:
1369 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001370 break;
1371 case NAME_CLOSURE:
1372 op = LOAD_DEREF;
1373 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001374 }
1375 break;
1376 case VAR_STORE:
1377 switch (scope) {
1378 case NAME_LOCAL:
1379 op = STORE_FAST;
1380 break;
1381 case NAME_GLOBAL:
1382 op = STORE_GLOBAL;
1383 break;
1384 case NAME_DEFAULT:
1385 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001386 break;
1387 case NAME_CLOSURE:
1388 op = STORE_DEREF;
1389 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001390 }
1391 break;
1392 case VAR_DELETE:
1393 switch (scope) {
1394 case NAME_LOCAL:
1395 op = DELETE_FAST;
1396 break;
1397 case NAME_GLOBAL:
1398 op = DELETE_GLOBAL;
1399 break;
1400 case NAME_DEFAULT:
1401 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001402 break;
1403 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001404 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001405 PyOS_snprintf(buf, sizeof(buf),
1406 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001407 com_error(c, PyExc_SyntaxError, buf);
1408 i = 255;
1409 break;
1410 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001411 }
1412 break;
1413 }
1414done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001415 com_addoparg(c, op, i);
1416}
1417
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001418static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001419com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001420{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001421 char *name;
1422 char buffer[1000];
1423 /* XXX it is possible to write this code without the 1000
1424 chars on the total length of dotted names, I just can't be
1425 bothered right now */
1426 if (TYPE(n) == STAR)
1427 name = "*";
1428 else if (TYPE(n) == dotted_name) {
1429 char *p = buffer;
1430 int i;
1431 name = buffer;
1432 for (i = 0; i < NCH(n); i += 2) {
1433 char *s = STR(CHILD(n, i));
1434 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001436 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001437 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001438 break;
1439 }
1440 if (p != buffer)
1441 *p++ = '.';
1442 strcpy(p, s);
1443 p = strchr(p, '\0');
1444 }
1445 }
1446 else {
1447 REQ(n, NAME);
1448 name = STR(n);
1449 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001450 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001451}
1452
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001454parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001455{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001456 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001458 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001459#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001460 int imflag;
1461#endif
1462
Guido van Rossum282914b1991-04-04 10:42:56 +00001463 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001464 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001465#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001466 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001467#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001468 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001470 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001472 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001473 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001474 }
1475 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001476 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001478 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001479 if (errno != 0)
1480 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001482 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001483 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001484#ifndef WITHOUT_COMPLEX
1485 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001486 Py_complex z;
1487 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001488 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001489 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001490 PyFPE_END_PROTECT(z)
1491 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001492 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001493 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001494#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001495 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001496 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001497 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001498 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001500 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501}
1502
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001504decode_utf8(char **sPtr, char *end, char* encoding)
1505{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001506#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001507 Py_FatalError("decode_utf8 should not be called in this build.");
1508 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001509#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001510 PyObject *u, *v;
1511 char *s, *t;
1512 t = s = *sPtr;
1513 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1514 while (s < end && (*s & 0x80)) s++;
1515 *sPtr = s;
1516 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1517 if (u == NULL)
1518 return NULL;
1519 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1520 Py_DECREF(u);
1521 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001522#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001523}
1524
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001525/* compiler.transformer.Transformer.decode_literal depends on what
1526 might seem like minor details of this function -- changes here
1527 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001528static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001529parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001532 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001533 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001534 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001535 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001536 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001537 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001538
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001539 if (isalpha(quote) || quote == '_') {
1540 if (quote == 'u' || quote == 'U') {
1541 quote = *++s;
1542 unicode = 1;
1543 }
1544 if (quote == 'r' || quote == 'R') {
1545 quote = *++s;
1546 rawmode = 1;
1547 }
1548 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001549 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551 return NULL;
1552 }
1553 s++;
1554 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001555 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001556 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001557 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001558 return NULL;
1559 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001560 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001562 return NULL;
1563 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001564 if (len >= 4 && s[0] == quote && s[1] == quote) {
1565 s += 2;
1566 len -= 2;
1567 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001569 return NULL;
1570 }
1571 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001572#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001573 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001574 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001575 char *buf;
1576 char *p;
1577 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001578 if (encoding == NULL) {
1579 buf = s;
1580 u = NULL;
1581 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1582 buf = s;
1583 u = NULL;
1584 } else {
1585 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1586 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1587 if (u == NULL)
1588 return NULL;
1589 p = buf = PyString_AsString(u);
1590 end = s + len;
1591 while (s < end) {
1592 if (*s == '\\') {
1593 *p++ = *s++;
1594 if (*s & 0x80) {
1595 strcpy(p, "u005c");
1596 p += 5;
1597 }
1598 }
1599 if (*s & 0x80) { /* XXX inefficient */
1600 char *r;
1601 int rn, i;
1602 w = decode_utf8(&s, end, "utf-16-be");
1603 if (w == NULL) {
1604 Py_DECREF(u);
1605 return NULL;
1606 }
1607 r = PyString_AsString(w);
1608 rn = PyString_Size(w);
1609 assert(rn % 2 == 0);
1610 for (i = 0; i < rn; i += 2) {
1611 sprintf(p, "\\u%02x%02x",
1612 r[i + 0] & 0xFF,
1613 r[i + 1] & 0xFF);
1614 p += 6;
1615 }
1616 Py_DECREF(w);
1617 } else {
1618 *p++ = *s++;
1619 }
1620 }
1621 len = p - buf;
1622 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001623 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001624 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001625 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001626 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1627 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001628 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001629 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001630 return v;
1631
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001632 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001633#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001634 need_encoding = (encoding != NULL &&
1635 strcmp(encoding, "utf-8") != 0 &&
1636 strcmp(encoding, "iso-8859-1") != 0);
1637 if (rawmode || strchr(s, '\\') == NULL) {
1638 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001639#ifndef Py_USING_UNICODE
1640 /* This should not happen - we never see any other
1641 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001642 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001643#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001644 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1645 if (u == NULL)
1646 return NULL;
1647 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1648 Py_DECREF(u);
1649 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001650#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001651 } else {
1652 return PyString_FromStringAndSize(s, len);
1653 }
1654 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001655
1656 v = PyString_DecodeEscape(s, len, NULL, unicode,
1657 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001658 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001659 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 return v;
1661}
1662
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001664parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001665{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001666 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001667 int i;
1668 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001669 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001670 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001671 for (i = 1; i < NCH(n); i++) {
1672 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001673 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001674 if (s == NULL)
1675 goto onError;
1676 if (PyString_Check(v) && PyString_Check(s)) {
1677 PyString_ConcatAndDel(&v, s);
1678 if (v == NULL)
1679 goto onError;
1680 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001681#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001682 else {
1683 PyObject *temp;
1684 temp = PyUnicode_Concat(v, s);
1685 Py_DECREF(s);
1686 if (temp == NULL)
1687 goto onError;
1688 Py_DECREF(v);
1689 v = temp;
1690 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001691#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001692 }
1693 }
1694 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001695
1696 onError:
1697 Py_XDECREF(v);
1698 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001699}
1700
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001701static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001702com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001703{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001704 int anchor = 0;
1705 int save_begin = c->c_begin;
1706
Raymond Hettinger354433a2004-05-19 08:20:33 +00001707 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001708 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001709 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001710 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001711 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001712 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001713 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001714 c->c_loops++;
1715 com_list_iter(c, n, e, t);
1716 c->c_loops--;
1717 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1718 c->c_begin = save_begin;
1719 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001720 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001721}
1722
1723static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001724com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1725{
1726 int break_anchor = 0;
1727 int anchor = 0;
1728 int save_begin = c->c_begin;
1729
1730 REQ(n, gen_for);
1731 /* gen_for: for v in test [gen_iter] */
1732
1733 com_addfwref(c, SETUP_LOOP, &break_anchor);
1734 block_push(c, SETUP_LOOP);
1735
1736 if (is_outmost) {
1737 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1738 com_push(c, 1);
1739 }
1740 else {
1741 com_node(c, CHILD(n, 3));
1742 com_addbyte(c, GET_ITER);
1743 }
1744
1745 c->c_begin = c->c_nexti;
1746 com_set_lineno(c, c->c_last_line);
1747 com_addfwref(c, FOR_ITER, &anchor);
1748 com_push(c, 1);
1749 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1750
1751 if (NCH(n) == 5)
1752 com_gen_iter(c, CHILD(n, 4), t);
1753 else {
1754 com_test(c, t);
1755 com_addbyte(c, YIELD_VALUE);
1756 com_pop(c, 1);
1757 }
1758
1759 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1760 c->c_begin = save_begin;
1761
1762 com_backpatch(c, anchor);
1763 com_pop(c, 1); /* FOR_ITER has popped this */
1764 com_addbyte(c, POP_BLOCK);
1765 block_pop(c, SETUP_LOOP);
1766 com_backpatch(c, break_anchor);
1767}
1768
1769static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001770com_list_if(struct compiling *c, node *n, node *e, char *t)
1771{
1772 int anchor = 0;
1773 int a = 0;
1774 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001775 com_node(c, CHILD(n, 1));
1776 com_addfwref(c, JUMP_IF_FALSE, &a);
1777 com_addbyte(c, POP_TOP);
1778 com_pop(c, 1);
1779 com_list_iter(c, n, e, t);
1780 com_addfwref(c, JUMP_FORWARD, &anchor);
1781 com_backpatch(c, a);
1782 /* We jump here with an extra entry which we now pop */
1783 com_addbyte(c, POP_TOP);
1784 com_backpatch(c, anchor);
1785}
1786
1787static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001788com_gen_if(struct compiling *c, node *n, node *t)
1789{
1790 /* gen_if: 'if' test [gen_iter] */
1791 int anchor = 0;
1792 int a=0;
1793
1794 com_node(c, CHILD(n, 1));
1795 com_addfwref(c, JUMP_IF_FALSE, &a);
1796 com_addbyte(c, POP_TOP);
1797 com_pop(c, 1);
1798
1799 if (NCH(n) == 3)
1800 com_gen_iter(c, CHILD(n, 2), t);
1801 else {
1802 com_test(c, t);
1803 com_addbyte(c, YIELD_VALUE);
1804 com_pop(c, 1);
1805 }
1806 com_addfwref(c, JUMP_FORWARD, &anchor);
1807 com_backpatch(c, a);
1808 /* We jump here with an extra entry which we now pop */
1809 com_addbyte(c, POP_TOP);
1810 com_backpatch(c, anchor);
1811}
1812
1813static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001814com_list_iter(struct compiling *c,
1815 node *p, /* parent of list_iter node */
1816 node *e, /* element expression node */
1817 char *t /* name of result list temp local */)
1818{
1819 /* list_iter is the last child in a listmaker, list_for, or list_if */
1820 node *n = CHILD(p, NCH(p)-1);
1821 if (TYPE(n) == list_iter) {
1822 n = CHILD(n, 0);
1823 switch (TYPE(n)) {
1824 case list_for:
1825 com_list_for(c, n, e, t);
1826 break;
1827 case list_if:
1828 com_list_if(c, n, e, t);
1829 break;
1830 default:
1831 com_error(c, PyExc_SystemError,
1832 "invalid list_iter node type");
1833 }
1834 }
1835 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001836 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001837 com_push(c, 1);
1838 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001839 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001840 com_pop(c, 2);
1841 }
1842}
1843
1844static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001845com_gen_iter(struct compiling *c, node *n, node *t)
1846{
1847 /* gen_iter: gen_for | gen_if */
1848 node *ch;
1849 REQ(n, gen_iter);
1850
1851 ch = CHILD(n, 0);
1852
1853 switch (TYPE(ch)) {
1854 case gen_for:
1855 com_gen_for(c, ch, t, 0);
1856 break;
1857 case gen_if:
1858 com_gen_if(c, ch, t);
1859 break;
1860 default:
1861 com_error(c, PyExc_SystemError,
1862 "invalid gen_iter node type");
1863 }
1864}
1865
1866static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001867com_list_comprehension(struct compiling *c, node *n)
1868{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001869 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001870 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001871
1872 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001873 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001874 com_addoparg(c, BUILD_LIST, 0);
1875 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1876 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001877 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001878 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001879 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001880 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001881 --c->c_tmpname;
1882}
1883
1884static void
1885com_listmaker(struct compiling *c, node *n)
1886{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001887 /* listmaker: test ( list_for | (',' test)* [','] ) */
1888 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001889 com_list_comprehension(c, n);
1890 else {
1891 int len = 0;
1892 int i;
1893 for (i = 0; i < NCH(n); i += 2, len++)
1894 com_node(c, CHILD(n, i));
1895 com_addoparg(c, BUILD_LIST, len);
1896 com_pop(c, len-1);
1897 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001898}
1899
1900static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001901com_generator_expression(struct compiling *c, node *n)
1902{
1903 /* testlist_gexp: test gen_for */
1904 /* argument: test gen_for */
1905 PyCodeObject *co;
1906
1907 REQ(CHILD(n, 0), test);
1908 REQ(CHILD(n, 1), gen_for);
1909
1910 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1911 n->n_lineno);
1912 co = icompile(n, c);
1913 symtable_exit_scope(c->c_symtable);
1914
1915 if (co == NULL)
1916 c->c_errors++;
1917 else {
1918 int closure = com_make_closure(c, co);
1919 int i = com_addconst(c, (PyObject *)co);
1920
1921 com_addoparg(c, LOAD_CONST, i);
1922 com_push(c, 1);
1923 if (closure)
1924 com_addoparg(c, MAKE_CLOSURE, 0);
1925 else
1926 com_addoparg(c, MAKE_FUNCTION, 0);
1927
1928 com_test(c, CHILD(CHILD(n, 1), 3));
1929 com_addbyte(c, GET_ITER);
1930 com_addoparg(c, CALL_FUNCTION, 1);
1931 com_pop(c, 1);
1932
1933 Py_DECREF(co);
1934 }
1935}
1936
1937static void
1938com_testlist_gexp(struct compiling *c, node *n)
1939{
1940 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1941 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1942 com_generator_expression(c, n);
1943 else com_list(c, n, 0);
1944}
1945
Anthony Baxterc2a5a632004-08-02 06:10:11 +00001946
Raymond Hettinger354433a2004-05-19 08:20:33 +00001947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001949{
1950 int i;
1951 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1952 for (i = 0; i+2 < NCH(n); i += 4) {
1953 /* We must arrange things just right for STORE_SUBSCR.
1954 It wants the stack to look like (value) (dict) (key) */
1955 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001956 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001957 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001958 com_node(c, CHILD(n, i+2)); /* value */
1959 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001960 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001961 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001962 }
1963}
1964
1965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001966com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001967{
1968 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001969 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001970 int i;
1971 REQ(n, atom);
1972 ch = CHILD(n, 0);
1973 switch (TYPE(ch)) {
1974 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001975 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001976 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001977 com_push(c, 1);
1978 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001980 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001981 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001982 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001983 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001984 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001985 com_push(c, 1);
1986 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001987 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001988 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001990 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001991 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001992 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001993 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001994 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001995 break;
1996 case BACKQUOTE:
1997 com_node(c, CHILD(n, 1));
1998 com_addbyte(c, UNARY_CONVERT);
1999 break;
2000 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002001 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002002 i = 255;
2003 }
2004 else {
2005 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002006 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002007 }
2008 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002009 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002010 break;
2011 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002012 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002013 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002014 c->c_errors++;
2015 i = 255;
2016 }
2017 else {
2018 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020 }
2021 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002022 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002023 break;
2024 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002025 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002026 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002027 break;
2028 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 com_error(c, PyExc_SystemError,
2030 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 }
2032}
2033
2034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002035com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002036{
2037 if (NCH(n) == 1) {
2038 com_addbyte(c, op);
2039 }
2040 else if (NCH(n) == 2) {
2041 if (TYPE(CHILD(n, 0)) != COLON) {
2042 com_node(c, CHILD(n, 0));
2043 com_addbyte(c, op+1);
2044 }
2045 else {
2046 com_node(c, CHILD(n, 1));
2047 com_addbyte(c, op+2);
2048 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002049 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002050 }
2051 else {
2052 com_node(c, CHILD(n, 0));
2053 com_node(c, CHILD(n, 2));
2054 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002055 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 }
2057}
2058
Guido van Rossum635abd21997-01-06 22:56:52 +00002059static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002060com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2061{
2062 if (NCH(n) == 1) {
2063 com_addbyte(c, DUP_TOP);
2064 com_push(c, 1);
2065 com_addbyte(c, SLICE);
2066 com_node(c, augn);
2067 com_addbyte(c, opcode);
2068 com_pop(c, 1);
2069 com_addbyte(c, ROT_TWO);
2070 com_addbyte(c, STORE_SLICE);
2071 com_pop(c, 2);
2072 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2073 com_node(c, CHILD(n, 0));
2074 com_addoparg(c, DUP_TOPX, 2);
2075 com_push(c, 2);
2076 com_addbyte(c, SLICE+1);
2077 com_pop(c, 1);
2078 com_node(c, augn);
2079 com_addbyte(c, opcode);
2080 com_pop(c, 1);
2081 com_addbyte(c, ROT_THREE);
2082 com_addbyte(c, STORE_SLICE+1);
2083 com_pop(c, 3);
2084 } else if (NCH(n) == 2) {
2085 com_node(c, CHILD(n, 1));
2086 com_addoparg(c, DUP_TOPX, 2);
2087 com_push(c, 2);
2088 com_addbyte(c, SLICE+2);
2089 com_pop(c, 1);
2090 com_node(c, augn);
2091 com_addbyte(c, opcode);
2092 com_pop(c, 1);
2093 com_addbyte(c, ROT_THREE);
2094 com_addbyte(c, STORE_SLICE+2);
2095 com_pop(c, 3);
2096 } else {
2097 com_node(c, CHILD(n, 0));
2098 com_node(c, CHILD(n, 2));
2099 com_addoparg(c, DUP_TOPX, 3);
2100 com_push(c, 3);
2101 com_addbyte(c, SLICE+3);
2102 com_pop(c, 2);
2103 com_node(c, augn);
2104 com_addbyte(c, opcode);
2105 com_pop(c, 1);
2106 com_addbyte(c, ROT_FOUR);
2107 com_addbyte(c, STORE_SLICE+3);
2108 com_pop(c, 4);
2109 }
2110}
2111
2112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002113com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002114{
2115 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002116 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002117 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002118 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002120 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002121 }
2122 else {
2123 com_node(c, CHILD(n, 0));
2124 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002125 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002126 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002127 if (NCH(n) == 2) {
2128 com_generator_expression(c, n);
2129 return;
2130 }
2131
Guido van Rossumf10570b1995-07-07 22:53:21 +00002132 m = n;
2133 do {
2134 m = CHILD(m, 0);
2135 } while (NCH(m) == 1);
2136 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002137 /* f(lambda x: x[0] = 3) ends up getting parsed with
2138 * LHS test = lambda x: x[0], and RHS test = 3.
2139 * SF bug 132313 points out that complaining about a keyword
2140 * then is very confusing.
2141 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002142 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002143 TYPE(m) == lambdef ?
2144 "lambda cannot contain assignment" :
2145 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002146 }
2147 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002148 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002149 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002150 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002151 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002152 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002153 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002154 else if (*pkeywords == NULL) {
2155 c->c_errors++;
2156 Py_DECREF(v);
2157 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002158 if (PyDict_GetItem(*pkeywords, v) != NULL)
2159 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002160 "duplicate keyword argument");
2161 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002162 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002163 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002164 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002165 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002166 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002167 }
2168 }
2169 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002170}
2171
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002173com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174{
2175 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002176 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 }
2178 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002179 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002180 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002181 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002182 int star_flag = 0;
2183 int starstar_flag = 0;
2184 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002185 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002186 na = 0;
2187 nk = 0;
2188 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002189 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002190 if (TYPE(ch) == STAR ||
2191 TYPE(ch) == DOUBLESTAR)
2192 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002193 if (ch->n_lineno != lineno) {
2194 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002195 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002196 }
2197 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002198 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002199 na++;
2200 else
2201 nk++;
2202 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002203 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002204 while (i < NCH(n)) {
2205 node *tok = CHILD(n, i);
2206 node *ch = CHILD(n, i+1);
2207 i += 3;
2208 switch (TYPE(tok)) {
2209 case STAR: star_flag = 1; break;
2210 case DOUBLESTAR: starstar_flag = 1; break;
2211 }
2212 com_node(c, ch);
2213 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002214 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 com_error(c, PyExc_SyntaxError,
2216 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002217 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002218 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002219 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002220 star_flag + (starstar_flag << 1);
2221 else
2222 opcode = CALL_FUNCTION;
2223 com_addoparg(c, opcode, na | (nk << 8));
2224 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 }
2226}
2227
2228static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002229com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002230{
2231 com_addopname(c, LOAD_ATTR, n);
2232}
2233
2234static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002235com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002236{
2237 int i=0;
2238 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002239 node *ch;
2240
2241 /* first argument */
2242 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002244 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002245 i++;
2246 }
2247 else {
2248 com_node(c, CHILD(n,i));
2249 i++;
2250 REQ(CHILD(n,i),COLON);
2251 i++;
2252 }
2253 /* second argument */
2254 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2255 com_node(c, CHILD(n,i));
2256 i++;
2257 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002258 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002259 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002260 com_push(c, 1);
2261 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002262 /* remaining arguments */
2263 for (; i < NCH(n); i++) {
2264 ns++;
2265 ch=CHILD(n,i);
2266 REQ(ch, sliceop);
2267 if (NCH(ch) == 1) {
2268 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002270 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002271 }
2272 else
2273 com_node(c, CHILD(ch,1));
2274 }
2275 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002276 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002277}
2278
2279static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002280com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002281{
2282 node *ch;
2283 REQ(n, subscript);
2284 ch = CHILD(n,0);
2285 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002286 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002287 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002288 com_push(c, 1);
2289 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002290 else {
2291 /* check for slice */
2292 if ((TYPE(ch) == COLON || NCH(n) > 1))
2293 com_sliceobj(c, n);
2294 else {
2295 REQ(ch, test);
2296 com_node(c, ch);
2297 }
2298 }
2299}
2300
2301static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002302com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002303{
2304 int i, op;
2305 REQ(n, subscriptlist);
2306 /* Check to make backward compatible slice behavior for '[i:j]' */
2307 if (NCH(n) == 1) {
2308 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002309 /* 'Basic' slice, should have exactly one colon. */
2310 if ((TYPE(CHILD(sub, 0)) == COLON
2311 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2312 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2313 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002314 switch (assigning) {
2315 case OP_DELETE:
2316 op = DELETE_SLICE;
2317 break;
2318 case OP_ASSIGN:
2319 op = STORE_SLICE;
2320 break;
2321 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002322 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002323 break;
2324 default:
2325 com_augassign_slice(c, sub, assigning, augn);
2326 return;
2327 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002328 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002329 if (op == STORE_SLICE)
2330 com_pop(c, 2);
2331 else if (op == DELETE_SLICE)
2332 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002333 return;
2334 }
2335 }
2336 /* Else normal subscriptlist. Compile each subscript. */
2337 for (i = 0; i < NCH(n); i += 2)
2338 com_subscript(c, CHILD(n, i));
2339 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002340 if (NCH(n) > 1) {
2341 i = (NCH(n)+1) / 2;
2342 com_addoparg(c, BUILD_TUPLE, i);
2343 com_pop(c, i-1);
2344 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002345 switch (assigning) {
2346 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 op = DELETE_SUBSCR;
2348 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002349 break;
2350 default:
2351 case OP_ASSIGN:
2352 op = STORE_SUBSCR;
2353 i = 3;
2354 break;
2355 case OP_APPLY:
2356 op = BINARY_SUBSCR;
2357 i = 1;
2358 break;
2359 }
2360 if (assigning > OP_APPLY) {
2361 com_addoparg(c, DUP_TOPX, 2);
2362 com_push(c, 2);
2363 com_addbyte(c, BINARY_SUBSCR);
2364 com_pop(c, 1);
2365 com_node(c, augn);
2366 com_addbyte(c, assigning);
2367 com_pop(c, 1);
2368 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002369 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002370 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002372}
2373
2374static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002375com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376{
2377 REQ(n, trailer);
2378 switch (TYPE(CHILD(n, 0))) {
2379 case LPAR:
2380 com_call_function(c, CHILD(n, 1));
2381 break;
2382 case DOT:
2383 com_select_member(c, CHILD(n, 1));
2384 break;
2385 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002386 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 break;
2388 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002389 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002390 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 }
2392}
2393
2394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002395com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002396{
2397 int i;
2398 REQ(n, power);
2399 com_atom(c, CHILD(n, 0));
2400 for (i = 1; i < NCH(n); i++) {
2401 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2402 com_factor(c, CHILD(n, i+1));
2403 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002404 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002405 break;
2406 }
2407 else
2408 com_apply_trailer(c, CHILD(n, i));
2409 }
2410}
2411
2412static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002413com_invert_constant(struct compiling *c, node *n)
2414{
2415 /* Compute the inverse of int and longs and use them directly,
2416 but be prepared to generate code for all other
2417 possibilities (invalid numbers, floats, complex).
2418 */
2419 PyObject *num, *inv = NULL;
2420 int i;
2421
2422 REQ(n, NUMBER);
2423 num = parsenumber(c, STR(n));
2424 if (num == NULL)
2425 i = 255;
2426 else {
2427 inv = PyNumber_Invert(num);
2428 if (inv == NULL) {
2429 PyErr_Clear();
2430 i = com_addconst(c, num);
2431 } else {
2432 i = com_addconst(c, inv);
2433 Py_DECREF(inv);
2434 }
2435 Py_DECREF(num);
2436 }
2437 com_addoparg(c, LOAD_CONST, i);
2438 com_push(c, 1);
2439 if (num != NULL && inv == NULL)
2440 com_addbyte(c, UNARY_INVERT);
2441}
2442
Tim Peters51e26512001-09-07 08:45:55 +00002443static int
2444is_float_zero(const char *p)
2445{
2446 int found_radix_point = 0;
2447 int ch;
2448 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2449 switch (ch) {
2450 case '0':
2451 /* no reason to believe it's not 0 -- continue */
2452 break;
2453
2454 case 'e': case 'E': case 'j': case 'J':
2455 /* If this was a hex constant, we already would have
2456 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2457 must be an exponent marker, and we haven't yet
2458 seen a non-zero digit, and it doesn't matter what
2459 the exponent is then. For 'j' or 'J' similarly,
2460 except that this is an imaginary 0 then. */
2461 return 1;
2462
2463 case '.':
2464 found_radix_point = 1;
2465 break;
2466
2467 default:
2468 return 0;
2469 }
2470 }
2471 return found_radix_point;
2472}
2473
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002474static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002475com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002476{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002477 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002478 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002479 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002480 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002481 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002482 approriate value as a constant. If the value is negative,
2483 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002484 negative in the 0th position -- unless we're doing unary minus
2485 of a floating zero! In that case the sign is significant, but
2486 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002487 */
2488 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002489 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002490 && TYPE((pfactor = CHILD(n, 1))) == factor
2491 && NCH(pfactor) == 1
2492 && TYPE((ppower = CHILD(pfactor, 0))) == power
2493 && NCH(ppower) == 1
2494 && TYPE((patom = CHILD(ppower, 0))) == atom
2495 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002496 && !(childtype == MINUS &&
2497 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002498 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002499 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002500 return;
2501 }
2502 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002503 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002504 if (s == NULL) {
2505 com_error(c, PyExc_MemoryError, "");
2506 com_addbyte(c, 255);
2507 return;
2508 }
2509 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002510 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002511 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002512 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002513 }
Tim Peters51e26512001-09-07 08:45:55 +00002514 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002515 }
2516 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002517 com_factor(c, CHILD(n, 1));
2518 com_addbyte(c, UNARY_POSITIVE);
2519 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002520 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002521 com_factor(c, CHILD(n, 1));
2522 com_addbyte(c, UNARY_NEGATIVE);
2523 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002524 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002525 com_factor(c, CHILD(n, 1));
2526 com_addbyte(c, UNARY_INVERT);
2527 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002528 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002529 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002530 }
2531}
2532
2533static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002534com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002535{
2536 int i;
2537 int op;
2538 REQ(n, term);
2539 com_factor(c, CHILD(n, 0));
2540 for (i = 2; i < NCH(n); i += 2) {
2541 com_factor(c, CHILD(n, i));
2542 switch (TYPE(CHILD(n, i-1))) {
2543 case STAR:
2544 op = BINARY_MULTIPLY;
2545 break;
2546 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002547 if (c->c_flags & CO_FUTURE_DIVISION)
2548 op = BINARY_TRUE_DIVIDE;
2549 else
2550 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551 break;
2552 case PERCENT:
2553 op = BINARY_MODULO;
2554 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002555 case DOUBLESLASH:
2556 op = BINARY_FLOOR_DIVIDE;
2557 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002559 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002560 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002561 op = 255;
2562 }
2563 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002564 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002565 }
2566}
2567
2568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002569com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002570{
2571 int i;
2572 int op;
2573 REQ(n, arith_expr);
2574 com_term(c, CHILD(n, 0));
2575 for (i = 2; i < NCH(n); i += 2) {
2576 com_term(c, CHILD(n, i));
2577 switch (TYPE(CHILD(n, i-1))) {
2578 case PLUS:
2579 op = BINARY_ADD;
2580 break;
2581 case MINUS:
2582 op = BINARY_SUBTRACT;
2583 break;
2584 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002585 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002586 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002587 op = 255;
2588 }
2589 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002590 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002591 }
2592}
2593
2594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002595com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002596{
2597 int i;
2598 int op;
2599 REQ(n, shift_expr);
2600 com_arith_expr(c, CHILD(n, 0));
2601 for (i = 2; i < NCH(n); i += 2) {
2602 com_arith_expr(c, CHILD(n, i));
2603 switch (TYPE(CHILD(n, i-1))) {
2604 case LEFTSHIFT:
2605 op = BINARY_LSHIFT;
2606 break;
2607 case RIGHTSHIFT:
2608 op = BINARY_RSHIFT;
2609 break;
2610 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002611 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002612 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002613 op = 255;
2614 }
2615 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002616 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002617 }
2618}
2619
2620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002622{
2623 int i;
2624 int op;
2625 REQ(n, and_expr);
2626 com_shift_expr(c, CHILD(n, 0));
2627 for (i = 2; i < NCH(n); i += 2) {
2628 com_shift_expr(c, CHILD(n, i));
2629 if (TYPE(CHILD(n, i-1)) == AMPER) {
2630 op = BINARY_AND;
2631 }
2632 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002633 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002634 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002635 op = 255;
2636 }
2637 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002638 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002639 }
2640}
2641
2642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002643com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002644{
2645 int i;
2646 int op;
2647 REQ(n, xor_expr);
2648 com_and_expr(c, CHILD(n, 0));
2649 for (i = 2; i < NCH(n); i += 2) {
2650 com_and_expr(c, CHILD(n, i));
2651 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2652 op = BINARY_XOR;
2653 }
2654 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002655 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002656 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002657 op = 255;
2658 }
2659 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002660 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002661 }
2662}
2663
2664static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002665com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002666{
2667 int i;
2668 int op;
2669 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002670 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002671 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002672 com_xor_expr(c, CHILD(n, i));
2673 if (TYPE(CHILD(n, i-1)) == VBAR) {
2674 op = BINARY_OR;
2675 }
2676 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002677 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002678 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002679 op = 255;
2680 }
2681 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002682 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002683 }
2684}
2685
2686static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002687cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688{
2689 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002690 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002691 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2692 if (NCH(n) == 1) {
2693 n = CHILD(n, 0);
2694 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002695 case LESS: return PyCmp_LT;
2696 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002697 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002698 case LESSEQUAL: return PyCmp_LE;
2699 case GREATEREQUAL: return PyCmp_GE;
2700 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2701 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2702 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704 }
2705 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002707 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002708 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002709 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002710 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 }
2712 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002713 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002714}
2715
2716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718{
2719 int i;
2720 enum cmp_op op;
2721 int anchor;
2722 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2723 com_expr(c, CHILD(n, 0));
2724 if (NCH(n) == 1)
2725 return;
2726
2727 /****************************************************************
2728 The following code is generated for all but the last
2729 comparison in a chain:
2730
2731 label: on stack: opcode: jump to:
2732
2733 a <code to load b>
2734 a, b DUP_TOP
2735 a, b, b ROT_THREE
2736 b, a, b COMPARE_OP
2737 b, 0-or-1 JUMP_IF_FALSE L1
2738 b, 1 POP_TOP
2739 b
2740
2741 We are now ready to repeat this sequence for the next
2742 comparison in the chain.
2743
2744 For the last we generate:
2745
2746 b <code to load c>
2747 b, c COMPARE_OP
2748 0-or-1
2749
2750 If there were any jumps to L1 (i.e., there was more than one
2751 comparison), we generate:
2752
2753 0-or-1 JUMP_FORWARD L2
2754 L1: b, 0 ROT_TWO
2755 0, b POP_TOP
2756 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002757 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 ****************************************************************/
2759
2760 anchor = 0;
2761
2762 for (i = 2; i < NCH(n); i += 2) {
2763 com_expr(c, CHILD(n, i));
2764 if (i+2 < NCH(n)) {
2765 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002766 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767 com_addbyte(c, ROT_THREE);
2768 }
2769 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002770 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002771 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002772 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 }
2774 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 if (i+2 < NCH(n)) {
2777 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2778 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002779 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002780 }
2781 }
2782
2783 if (anchor) {
2784 int anchor2 = 0;
2785 com_addfwref(c, JUMP_FORWARD, &anchor2);
2786 com_backpatch(c, anchor);
2787 com_addbyte(c, ROT_TWO);
2788 com_addbyte(c, POP_TOP);
2789 com_backpatch(c, anchor2);
2790 }
2791}
2792
2793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
2796 REQ(n, not_test); /* 'not' not_test | comparison */
2797 if (NCH(n) == 1) {
2798 com_comparison(c, CHILD(n, 0));
2799 }
2800 else {
2801 com_not_test(c, CHILD(n, 1));
2802 com_addbyte(c, UNARY_NOT);
2803 }
2804}
2805
2806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002807com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808{
2809 int i;
2810 int anchor;
2811 REQ(n, and_test); /* not_test ('and' not_test)* */
2812 anchor = 0;
2813 i = 0;
2814 for (;;) {
2815 com_not_test(c, CHILD(n, i));
2816 if ((i += 2) >= NCH(n))
2817 break;
2818 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2819 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002820 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002821 }
2822 if (anchor)
2823 com_backpatch(c, anchor);
2824}
2825
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002826static int
2827com_make_closure(struct compiling *c, PyCodeObject *co)
2828{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002829 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002830 if (free == 0)
2831 return 0;
2832 for (i = 0; i < free; ++i) {
2833 /* Bypass com_addop_varname because it will generate
2834 LOAD_DEREF but LOAD_CLOSURE is needed.
2835 */
2836 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2837 int arg, reftype;
2838
2839 /* Special case: If a class contains a method with a
2840 free variable that has the same name as a method,
2841 the name will be considered free *and* local in the
2842 class. It should be handled by the closure, as
2843 well as by the normal name loookup logic.
2844 */
2845 reftype = get_ref_type(c, PyString_AS_STRING(name));
2846 if (reftype == CELL)
2847 arg = com_lookup_arg(c->c_cellvars, name);
2848 else /* (reftype == FREE) */
2849 arg = com_lookup_arg(c->c_freevars, name);
2850 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002851 fprintf(stderr, "lookup %s in %s %d %d\n"
2852 "freevars of %s: %s\n",
2853 PyObject_REPR(name),
2854 c->c_name,
2855 reftype, arg,
2856 PyString_AS_STRING(co->co_name),
2857 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002858 Py_FatalError("com_make_closure()");
2859 }
2860 com_addoparg(c, LOAD_CLOSURE, arg);
2861
2862 }
2863 com_push(c, free);
2864 return 1;
2865}
2866
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002868com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002869{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002871 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002872 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002873 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002874 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002875 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2876 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002877 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002878 if (co == NULL) {
2879 c->c_errors++;
2880 return;
2881 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002882 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002883 i = com_addconst(c, (PyObject *)co);
2884 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002885 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002886 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002887 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002888 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002889 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002890 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002891 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002892 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002893 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002895 else {
2896 int anchor = 0;
2897 int i = 0;
2898 for (;;) {
2899 com_and_test(c, CHILD(n, i));
2900 if ((i += 2) >= NCH(n))
2901 break;
2902 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2903 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002904 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002905 }
2906 if (anchor)
2907 com_backpatch(c, anchor);
2908 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909}
2910
2911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002912com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913{
2914 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002915 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 com_node(c, CHILD(n, 0));
2917 }
2918 else {
2919 int i;
2920 int len;
2921 len = (NCH(n) + 1) / 2;
2922 for (i = 0; i < NCH(n); i += 2)
2923 com_node(c, CHILD(n, i));
2924 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002925 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926 }
2927}
2928
2929
2930/* Begin of assignment compilation */
2931
Thomas Wouters434d0822000-08-24 20:11:32 +00002932
2933static void
2934com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2935{
2936 com_addbyte(c, DUP_TOP);
2937 com_push(c, 1);
2938 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002939 com_node(c, augn);
2940 com_addbyte(c, opcode);
2941 com_pop(c, 1);
2942 com_addbyte(c, ROT_TWO);
2943 com_addopname(c, STORE_ATTR, n);
2944 com_pop(c, 2);
2945}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002946
2947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002948com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002950 if (none_assignment_check(c, STR(n), assigning))
2951 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002952 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002953 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002954}
2955
2956static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002957com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 REQ(n, trailer);
2960 switch (TYPE(CHILD(n, 0))) {
2961 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002962 if (assigning == OP_DELETE)
2963 com_error(c, PyExc_SyntaxError,
2964 "can't delete function call");
2965 else
2966 com_error(c, PyExc_SyntaxError,
2967 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002968 break;
2969 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002970 if (assigning > OP_APPLY)
2971 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2972 else
2973 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002974 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002975 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002976 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002977 break;
2978 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002979 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 }
2981}
2982
2983static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002984com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985{
2986 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002987 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2988 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002990 if (assigning) {
2991 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002992 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002993 com_push(c, i-1);
2994 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002996 com_assign(c, CHILD(n, i), assigning, NULL);
2997}
2998
2999static void
3000com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3001{
3002 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003003 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003004 com_push(c, 1);
3005 com_node(c, augn);
3006 com_addbyte(c, opcode);
3007 com_pop(c, 1);
3008 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003009}
3010
3011static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003012com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013{
3014 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003015 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 if (assigning)
3017 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018}
3019
3020static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003021com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022{
3023 /* Loop to avoid trivial recursion */
3024 for (;;) {
3025 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003026
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003027 case exprlist:
3028 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003029 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003030 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003032 if (TYPE(CHILD(n, 1)) == gen_for) {
3033 com_error(c, PyExc_SystemError,
3034 "assign to generator expression not possible");
3035 return;
3036 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003037 if (assigning > OP_APPLY) {
3038 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003039 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003040 return;
3041 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003042 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043 return;
3044 }
3045 n = CHILD(n, 0);
3046 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003047
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 case test:
3049 case and_test:
3050 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003053 case xor_expr:
3054 case and_expr:
3055 case shift_expr:
3056 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003058 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003060 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003061 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 return;
3063 }
3064 n = CHILD(n, 0);
3065 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003066
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003067 case power: /* atom trailer* ('**' power)*
3068 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003069 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003071 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 return;
3073 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003074 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075 int i;
3076 com_node(c, CHILD(n, 0));
3077 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003078 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003079 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003080 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003081 return;
3082 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083 com_apply_trailer(c, CHILD(n, i));
3084 } /* NB i is still alive */
3085 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003086 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 return;
3088 }
3089 n = CHILD(n, 0);
3090 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003091
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 case atom:
3093 switch (TYPE(CHILD(n, 0))) {
3094 case LPAR:
3095 n = CHILD(n, 1);
3096 if (TYPE(n) == RPAR) {
3097 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003098 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003099 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100 return;
3101 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003102 if (assigning > OP_APPLY) {
3103 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003104 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003105 return;
3106 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107 break;
3108 case LSQB:
3109 n = CHILD(n, 1);
3110 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003111 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003112 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113 return;
3114 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003115 if (assigning > OP_APPLY) {
3116 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003117 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003118 return;
3119 }
3120 if (NCH(n) > 1
3121 && TYPE(CHILD(n, 1)) == list_for) {
3122 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003123 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003124 return;
3125 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003126 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127 return;
3128 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003129 if (assigning > OP_APPLY)
3130 com_augassign_name(c, CHILD(n, 0),
3131 assigning, augn);
3132 else
3133 com_assign_name(c, CHILD(n, 0),
3134 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 return;
3136 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003137 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003138 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 return;
3140 }
3141 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003142
3143 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003144 com_error(c, PyExc_SyntaxError,
3145 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003146 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003147
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003149 com_error(c, PyExc_SystemError,
3150 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 }
3154 }
3155}
Guido van Rossum7c531111997-03-11 18:42:21 +00003156
Thomas Wouters434d0822000-08-24 20:11:32 +00003157static void
3158com_augassign(struct compiling *c, node *n)
3159{
3160 int opcode;
3161
3162 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3163 case '+': opcode = INPLACE_ADD; break;
3164 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003165 case '/':
3166 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3167 opcode = INPLACE_FLOOR_DIVIDE;
3168 else if (c->c_flags & CO_FUTURE_DIVISION)
3169 opcode = INPLACE_TRUE_DIVIDE;
3170 else
3171 opcode = INPLACE_DIVIDE;
3172 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003173 case '%': opcode = INPLACE_MODULO; break;
3174 case '<': opcode = INPLACE_LSHIFT; break;
3175 case '>': opcode = INPLACE_RSHIFT; break;
3176 case '&': opcode = INPLACE_AND; break;
3177 case '^': opcode = INPLACE_XOR; break;
3178 case '|': opcode = INPLACE_OR; break;
3179 case '*':
3180 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3181 opcode = INPLACE_POWER;
3182 else
3183 opcode = INPLACE_MULTIPLY;
3184 break;
3185 default:
3186 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3187 return;
3188 }
3189 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3190}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191
3192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003193com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194{
Thomas Wouters434d0822000-08-24 20:11:32 +00003195 REQ(n, expr_stmt);
3196 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003197 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003198 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003200 if (NCH(n) == 1) {
3201 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003202 if (c->c_interactive)
3203 com_addbyte(c, PRINT_EXPR);
3204 else
3205 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003206 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003207 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003208 else if (TYPE(CHILD(n,1)) == augassign)
3209 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210 else {
3211 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003212 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003213 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003214 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_push(c, 1);
3217 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003218 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003219 }
3220 }
3221}
3222
3223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003224com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003225{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003226 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003227 int i;
3228 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003229 if (Py_OptimizeFlag)
3230 return;
3231 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003232
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003233 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003234 raise AssertionError [, <message>]
3235
3236 where <message> is the second test, if present.
3237 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003238 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003239 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003240 com_addbyte(c, POP_TOP);
3241 com_pop(c, 1);
3242 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003243 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003244 com_push(c, 1);
3245 i = NCH(n)/2; /* Either 2 or 4 */
3246 if (i > 1)
3247 com_node(c, CHILD(n, 3));
3248 com_addoparg(c, RAISE_VARARGS, i);
3249 com_pop(c, i);
3250 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003251 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003252 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003253 com_addbyte(c, POP_TOP);
3254}
3255
3256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003257com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003259 int i = 1;
3260 node* stream = NULL;
3261
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003262 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003263
3264 /* are we using the extended print form? */
3265 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3266 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003267 com_node(c, stream);
3268 /* stack: [...] => [... stream] */
3269 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003270 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3271 i = 4;
3272 else
3273 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003275 for (; i < NCH(n); i += 2) {
3276 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003277 com_addbyte(c, DUP_TOP);
3278 /* stack: [stream] => [stream stream] */
3279 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003280 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003281 /* stack: [stream stream] => [stream stream obj] */
3282 com_addbyte(c, ROT_TWO);
3283 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003284 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003285 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003286 com_pop(c, 2);
3287 }
3288 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003289 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003290 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003291 com_addbyte(c, PRINT_ITEM);
3292 com_pop(c, 1);
3293 }
3294 }
3295 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003296 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003297 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003298 /* must pop the extra stream object off the stack */
3299 com_addbyte(c, POP_TOP);
3300 /* stack: [... stream] => [...] */
3301 com_pop(c, 1);
3302 }
3303 }
3304 else {
3305 if (stream != NULL) {
3306 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003307 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003308 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003309 com_pop(c, 1);
3310 }
3311 else
3312 com_addbyte(c, PRINT_NEWLINE);
3313 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314}
3315
3316static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003317com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003319 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003320 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003321 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003322 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003323 if (c->c_flags & CO_GENERATOR) {
3324 if (NCH(n) > 1) {
3325 com_error(c, PyExc_SyntaxError,
3326 "'return' with argument inside generator");
3327 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003328 }
3329 if (NCH(n) < 2) {
3330 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003331 com_push(c, 1);
3332 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003333 else
3334 com_node(c, CHILD(n, 1));
3335 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003336 com_pop(c, 1);
3337}
3338
3339static void
3340com_yield_stmt(struct compiling *c, node *n)
3341{
Tim Peters95c80f82001-06-23 02:07:08 +00003342 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003343 REQ(n, yield_stmt); /* 'yield' testlist */
3344 if (!c->c_infunction) {
3345 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3346 }
Tim Peters95c80f82001-06-23 02:07:08 +00003347
3348 for (i = 0; i < c->c_nblocks; ++i) {
3349 if (c->c_block[i] == SETUP_FINALLY) {
3350 com_error(c, PyExc_SyntaxError,
3351 "'yield' not allowed in a 'try' block "
3352 "with a 'finally' clause");
3353 return;
3354 }
3355 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003356 com_node(c, CHILD(n, 1));
3357 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359}
3360
3361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003362com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003364 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003365 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3366 if (NCH(n) > 1) {
3367 com_node(c, CHILD(n, 1));
3368 if (NCH(n) > 3) {
3369 com_node(c, CHILD(n, 3));
3370 if (NCH(n) > 5)
3371 com_node(c, CHILD(n, 5));
3372 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003373 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 i = NCH(n)/2;
3375 com_addoparg(c, RAISE_VARARGS, i);
3376 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377}
3378
3379static void
Thomas Wouters52152252000-08-17 22:55:00 +00003380com_from_import(struct compiling *c, node *n)
3381{
3382 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3383 com_push(c, 1);
3384 if (NCH(n) > 1) {
3385 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3386 com_error(c, PyExc_SyntaxError, "invalid syntax");
3387 return;
3388 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003389 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003390 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003391 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003392 com_pop(c, 1);
3393}
3394
3395static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003396com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003397{
3398 int i;
3399 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003400 /* 'import' dotted_name (',' dotted_name)* |
3401 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003403 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003404 /* 'from' dotted_name 'import' ... */
3405 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003406
3407 if (TYPE(CHILD(n, 3)) == STAR) {
3408 tup = Py_BuildValue("(s)", "*");
3409 } else {
3410 tup = PyTuple_New((NCH(n) - 2)/2);
3411 for (i = 3; i < NCH(n); i += 2) {
3412 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003413 PyString_FromString(STR(
3414 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003415 }
3416 }
3417 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003418 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003419 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003420 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003421 if (TYPE(CHILD(n, 3)) == STAR)
3422 com_addbyte(c, IMPORT_STAR);
3423 else {
3424 for (i = 3; i < NCH(n); i += 2)
3425 com_from_import(c, CHILD(n, i));
3426 com_addbyte(c, POP_TOP);
3427 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003428 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429 }
3430 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003431 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003433 node *subn = CHILD(n, i);
3434 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003435 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003436 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003437 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003438 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003439 int j;
3440 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003441 com_error(c, PyExc_SyntaxError,
3442 "invalid syntax");
3443 return;
3444 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003445 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3446 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003447 CHILD(CHILD(subn, 0),
3448 j));
3449 com_addop_varname(c, VAR_STORE,
3450 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003451 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003452 com_addop_varname(c, VAR_STORE,
3453 STR(CHILD(CHILD(subn, 0),
3454 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 }
3457 }
3458}
3459
3460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003461com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003462{
3463 REQ(n, exec_stmt);
3464 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3465 com_node(c, CHILD(n, 1));
3466 if (NCH(n) >= 4)
3467 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003468 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003469 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003470 com_push(c, 1);
3471 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003472 if (NCH(n) >= 6)
3473 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003474 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003475 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003476 com_push(c, 1);
3477 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003478 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003479 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003480}
3481
Guido van Rossum7c531111997-03-11 18:42:21 +00003482static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003483is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003484{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003485 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003486 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003487 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003488
3489 /* Label to avoid tail recursion */
3490 next:
3491 switch (TYPE(n)) {
3492
3493 case suite:
3494 if (NCH(n) == 1) {
3495 n = CHILD(n, 0);
3496 goto next;
3497 }
3498 /* Fall through */
3499 case file_input:
3500 for (i = 0; i < NCH(n); i++) {
3501 node *ch = CHILD(n, i);
3502 if (TYPE(ch) == stmt) {
3503 n = ch;
3504 goto next;
3505 }
3506 }
3507 break;
3508
3509 case stmt:
3510 case simple_stmt:
3511 case small_stmt:
3512 n = CHILD(n, 0);
3513 goto next;
3514
3515 case expr_stmt:
3516 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003517 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003518 case test:
3519 case and_test:
3520 case not_test:
3521 case comparison:
3522 case expr:
3523 case xor_expr:
3524 case and_expr:
3525 case shift_expr:
3526 case arith_expr:
3527 case term:
3528 case factor:
3529 case power:
3530 case atom:
3531 if (NCH(n) == 1) {
3532 n = CHILD(n, 0);
3533 goto next;
3534 }
3535 break;
3536
3537 case NAME:
3538 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3539 return 1;
3540 break;
3541
3542 case NUMBER:
3543 v = parsenumber(c, STR(n));
3544 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003545 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003546 break;
3547 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003548 i = PyObject_IsTrue(v);
3549 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003550 return i == 0;
3551
3552 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003553 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003554 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003555 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003556 break;
3557 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003558 i = PyObject_IsTrue(v);
3559 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003560 return i == 0;
3561
3562 }
3563 return 0;
3564}
3565
Tim Peters08a898f2001-06-28 01:52:22 +00003566
3567/* Look under n for a return stmt with an expression.
3568 * This hack is used to find illegal returns under "if 0:" blocks in
3569 * functions already known to be generators (as determined by the symtable
3570 * pass).
3571 * Return the offending return node if found, else NULL.
3572 */
3573static node *
3574look_for_offending_return(node *n)
3575{
3576 int i;
3577
3578 for (i = 0; i < NCH(n); ++i) {
3579 node *kid = CHILD(n, i);
3580
3581 switch (TYPE(kid)) {
3582 case classdef:
3583 case funcdef:
3584 case lambdef:
3585 /* Stuff in nested functions & classes doesn't
3586 affect the code block we started in. */
3587 return NULL;
3588
3589 case return_stmt:
3590 if (NCH(kid) > 1)
3591 return kid;
3592 break;
3593
3594 default: {
3595 node *bad = look_for_offending_return(kid);
3596 if (bad != NULL)
3597 return bad;
3598 }
3599 }
3600 }
3601
3602 return NULL;
3603}
3604
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003606com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607{
3608 int i;
3609 int anchor = 0;
3610 REQ(n, if_stmt);
3611 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3612 for (i = 0; i+3 < NCH(n); i+=4) {
3613 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003614 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003615 if (is_constant_false(c, ch)) {
3616 /* We're going to skip this block. However, if this
3617 is a generator, we have to check the dead code
3618 anyway to make sure there aren't any return stmts
3619 with expressions, in the same scope. */
3620 if (c->c_flags & CO_GENERATOR) {
3621 node *p = look_for_offending_return(n);
3622 if (p != NULL) {
3623 int savelineno = c->c_lineno;
3624 c->c_lineno = p->n_lineno;
3625 com_error(c, PyExc_SyntaxError,
3626 "'return' with argument "
3627 "inside generator");
3628 c->c_lineno = savelineno;
3629 }
3630 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003631 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003632 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003633 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003634 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003635 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003636 com_addfwref(c, JUMP_IF_FALSE, &a);
3637 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003638 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 com_node(c, CHILD(n, i+3));
3640 com_addfwref(c, JUMP_FORWARD, &anchor);
3641 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003642 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003643 com_addbyte(c, POP_TOP);
3644 }
3645 if (i+2 < NCH(n))
3646 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003647 if (anchor)
3648 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649}
3650
3651static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003652com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003653{
3654 int break_anchor = 0;
3655 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003656 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003657 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3658 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003659 block_push(c, SETUP_LOOP);
3660 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003661 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003662 com_node(c, CHILD(n, 1));
3663 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3664 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003665 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003666 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003667 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003668 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003669 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3670 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003671 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003672 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673 com_addbyte(c, POP_TOP);
3674 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003675 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003676 if (NCH(n) > 4)
3677 com_node(c, CHILD(n, 6));
3678 com_backpatch(c, break_anchor);
3679}
3680
3681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003684 int break_anchor = 0;
3685 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003686 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003687 REQ(n, for_stmt);
3688 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3689 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003690 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003691 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003692 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003693 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003694 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003695 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003697 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003698 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003700 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003701 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3702 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003704 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003706 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003707 if (NCH(n) > 8)
3708 com_node(c, CHILD(n, 8));
3709 com_backpatch(c, break_anchor);
3710}
3711
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003712/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003713
3714 SETUP_FINALLY L
3715 <code for S>
3716 POP_BLOCK
3717 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003718 L: <code for Sf>
3719 END_FINALLY
3720
3721 The special instructions use the block stack. Each block
3722 stack entry contains the instruction that created it (here
3723 SETUP_FINALLY), the level of the value stack at the time the
3724 block stack entry was created, and a label (here L).
3725
3726 SETUP_FINALLY:
3727 Pushes the current value stack level and the label
3728 onto the block stack.
3729 POP_BLOCK:
3730 Pops en entry from the block stack, and pops the value
3731 stack until its level is the same as indicated on the
3732 block stack. (The label is ignored.)
3733 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003734 Pops a variable number of entries from the *value* stack
3735 and re-raises the exception they specify. The number of
3736 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003737
3738 The block stack is unwound when an exception is raised:
3739 when a SETUP_FINALLY entry is found, the exception is pushed
3740 onto the value stack (and the exception condition is cleared),
3741 and the interpreter jumps to the label gotten from the block
3742 stack.
3743
3744 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003745 (The contents of the value stack is shown in [], with the top
3746 at the right; 'tb' is trace-back info, 'val' the exception's
3747 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003748
3749 Value stack Label Instruction Argument
3750 [] SETUP_EXCEPT L1
3751 [] <code for S>
3752 [] POP_BLOCK
3753 [] JUMP_FORWARD L0
3754
Guido van Rossum3f5da241990-12-20 15:06:42 +00003755 [tb, val, exc] L1: DUP )
3756 [tb, val, exc, exc] <evaluate E1> )
3757 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3758 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3759 [tb, val, exc, 1] POP )
3760 [tb, val, exc] POP
3761 [tb, val] <assign to V1> (or POP if no V1)
3762 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003763 [] <code for S1>
3764 JUMP_FORWARD L0
3765
Guido van Rossum3f5da241990-12-20 15:06:42 +00003766 [tb, val, exc, 0] L2: POP
3767 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003768 .............................etc.......................
3769
Guido van Rossum3f5da241990-12-20 15:06:42 +00003770 [tb, val, exc, 0] Ln+1: POP
3771 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003772
3773 [] L0: <next statement>
3774
3775 Of course, parts are not generated if Vi or Ei is not present.
3776*/
3777
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003779com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003780{
3781 int except_anchor = 0;
3782 int end_anchor = 0;
3783 int else_anchor = 0;
3784 int i;
3785 node *ch;
3786
3787 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3788 block_push(c, SETUP_EXCEPT);
3789 com_node(c, CHILD(n, 2));
3790 com_addbyte(c, POP_BLOCK);
3791 block_pop(c, SETUP_EXCEPT);
3792 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3793 com_backpatch(c, except_anchor);
3794 for (i = 3;
3795 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3796 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003797 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003798 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003799 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003800 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003801 break;
3802 }
3803 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003804 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003805 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003806 if (NCH(ch) > 1) {
3807 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003808 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003809 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003810 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003811 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003812 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3813 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003815 }
3816 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003817 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003818 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003819 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003820 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003821 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_pop(c, 1);
3823 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003824 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003825 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003826 com_node(c, CHILD(n, i+2));
3827 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3828 if (except_anchor) {
3829 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 /* We come in with [tb, val, exc, 0] on the
3831 stack; one pop and it's the same as
3832 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003833 com_addbyte(c, POP_TOP);
3834 }
3835 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003836 /* We actually come in here with [tb, val, exc] but the
3837 END_FINALLY will zap those and jump around.
3838 The c_stacklevel does not reflect them so we need not pop
3839 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003840 com_addbyte(c, END_FINALLY);
3841 com_backpatch(c, else_anchor);
3842 if (i < NCH(n))
3843 com_node(c, CHILD(n, i+2));
3844 com_backpatch(c, end_anchor);
3845}
3846
3847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003848com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003849{
3850 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003851 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003852
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003853 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3854 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003855 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003856 com_addbyte(c, POP_BLOCK);
3857 block_pop(c, SETUP_FINALLY);
3858 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003859 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003860 /* While the generated code pushes only one item,
3861 the try-finally handling can enter here with
3862 up to three items. OK, here are the details:
3863 3 for an exception, 2 for RETURN, 1 for BREAK. */
3864 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003865 com_backpatch(c, finally_anchor);
3866 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003867 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003868 com_node(c, ch);
3869 com_addbyte(c, END_FINALLY);
3870 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003872}
3873
3874static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003875com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003876{
3877 REQ(n, try_stmt);
3878 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3879 | 'try' ':' suite 'finally' ':' suite */
3880 if (TYPE(CHILD(n, 3)) != except_clause)
3881 com_try_finally(c, n);
3882 else
3883 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884}
3885
Guido van Rossum8b993a91997-01-17 21:04:03 +00003886static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003887get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003888{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003889 int i;
3890
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 /* Label to avoid tail recursion */
3892 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003893 switch (TYPE(n)) {
3894
3895 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003896 if (NCH(n) == 1) {
3897 n = CHILD(n, 0);
3898 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003899 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003900 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003901 case file_input:
3902 for (i = 0; i < NCH(n); i++) {
3903 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003904 if (TYPE(ch) == stmt) {
3905 n = ch;
3906 goto next;
3907 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003908 }
3909 break;
3910
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003911 case stmt:
3912 case simple_stmt:
3913 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003914 n = CHILD(n, 0);
3915 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003916
3917 case expr_stmt:
3918 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003919 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003920 case test:
3921 case and_test:
3922 case not_test:
3923 case comparison:
3924 case expr:
3925 case xor_expr:
3926 case and_expr:
3927 case shift_expr:
3928 case arith_expr:
3929 case term:
3930 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003931 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003932 if (NCH(n) == 1) {
3933 n = CHILD(n, 0);
3934 goto next;
3935 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003936 break;
3937
3938 case atom:
3939 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003940 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003941 break;
3942
3943 }
3944 return NULL;
3945}
3946
Guido van Rossum79f25d91997-04-29 20:08:16 +00003947static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003948get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003949{
Guido van Rossum541563e1999-01-28 15:08:09 +00003950 /* Don't generate doc-strings if run with -OO */
3951 if (Py_OptimizeFlag > 1)
3952 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003953 n = get_rawdocstring(n);
3954 if (n == NULL)
3955 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003956 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003957}
3958
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003960com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961{
3962 REQ(n, suite);
3963 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3964 if (NCH(n) == 1) {
3965 com_node(c, CHILD(n, 0));
3966 }
3967 else {
3968 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003969 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003970 node *ch = CHILD(n, i);
3971 if (TYPE(ch) == stmt)
3972 com_node(c, ch);
3973 }
3974 }
3975}
3976
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003977/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003979com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003980{
3981 int i = c->c_nblocks;
3982 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3983 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3984 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003985 else if (i <= 0) {
3986 /* at the outer level */
3987 com_error(c, PyExc_SyntaxError,
3988 "'continue' not properly in loop");
3989 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003990 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003991 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003992 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003993 if (c->c_block[j] == SETUP_LOOP)
3994 break;
3995 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003996 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003997 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003998 for (; i > j; --i) {
3999 if (c->c_block[i] == SETUP_EXCEPT ||
4000 c->c_block[i] == SETUP_FINALLY) {
4001 com_addoparg(c, CONTINUE_LOOP,
4002 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004003 return;
4004 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004005 if (c->c_block[i] == END_FINALLY) {
4006 com_error(c, PyExc_SyntaxError,
4007 "'continue' not supported inside 'finally' clause");
4008 return;
4009 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004010 }
4011 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004012 com_error(c, PyExc_SyntaxError,
4013 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004014 }
4015 /* XXX Could allow it inside a 'finally' clause
4016 XXX if we could pop the exception still on the stack */
4017}
4018
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004019/* Return the number of default values in the argument list.
4020
4021 If a non-default argument follows a default argument, set an
4022 exception and return -1.
4023*/
4024
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004025static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004026com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004027{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004028 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004029 if (TYPE(n) == lambdef) {
4030 /* lambdef: 'lambda' [varargslist] ':' test */
4031 n = CHILD(n, 1);
4032 }
4033 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004034 REQ(n, funcdef);
4035 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4036 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004037 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4038 n = CHILD(n, 1);
4039 }
4040 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004041 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004042 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004043 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004044 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4045 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004046 ndefs = 0;
4047 for (i = 0; i < nch; i++) {
4048 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004049 if (TYPE(CHILD(n, i)) == STAR ||
4050 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004051 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004052 i++;
4053 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004054 t = RPAR; /* Anything except EQUAL or COMMA */
4055 else
4056 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004057 if (t == EQUAL) {
4058 i++;
4059 ndefs++;
4060 com_node(c, CHILD(n, i));
4061 i++;
4062 if (i >= nch)
4063 break;
4064 t = TYPE(CHILD(n, i));
4065 }
4066 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004067 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004068 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004069 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004070 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004071 return -1;
4072 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004073 }
4074 if (t != COMMA)
4075 break;
4076 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004077 return ndefs;
4078}
4079
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004080static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004081com_decorator_name(struct compiling *c, node *n)
4082{
4083 /* dotted_name: NAME ('.' NAME)* */
4084
4085 int i, nch;
4086 node *varname;
4087
4088 REQ(n, dotted_name);
4089 nch = NCH(n);
4090 assert(nch >= 1 && nch % 2 == 1);
4091
4092 varname = CHILD(n, 0);
4093 REQ(varname, NAME);
4094 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004095 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004096
4097 for (i = 1; i < nch; i += 2) {
4098 node *attrname;
4099
4100 REQ(CHILD(n, i), DOT);
4101
4102 attrname = CHILD(n, i + 1);
4103 REQ(attrname, NAME);
4104 com_addop_name(c, LOAD_ATTR, STR(attrname));
4105 }
4106}
4107
4108static void
4109com_decorator(struct compiling *c, node *n)
4110{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004111 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004112 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004113 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004114 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004115 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004116 com_decorator_name(c, CHILD(n, 1));
4117
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004118 if (nch > 3) {
4119 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004120 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004121 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004122 com_call_function(c, CHILD(n, 3));
4123 }
4124}
4125
4126static int
4127com_decorators(struct compiling *c, node *n)
4128{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004129 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004130
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004131 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004132 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004133 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004134
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004135 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004136 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004137 REQ(ch, decorator);
4138
4139 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004140 }
4141
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004142 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004143}
4144
4145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004146com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004147{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004148 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004149 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004150
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004151 REQ(n, funcdef);
4152 /* -6 -5 -4 -3 -2 -1
4153 funcdef: [decorators] 'def' NAME parameters ':' suite */
4154
4155 if (NCH(n) == 6)
4156 ndecorators = com_decorators(c, CHILD(n, 0));
4157 else
4158 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004159
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004160 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004161 if (ndefs < 0)
4162 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004163 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004164 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004165 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004166 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004167 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004168 c->c_errors++;
4169 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004170 int closure = com_make_closure(c, (PyCodeObject *)co);
4171 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004173 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004174 if (closure)
4175 com_addoparg(c, MAKE_CLOSURE, ndefs);
4176 else
4177 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004178 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004179
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004180 while (ndecorators > 0) {
4181 com_addoparg(c, CALL_FUNCTION, 1);
4182 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004183 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004184 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004185
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004186 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004187 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004188 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189 }
4190}
4191
4192static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004193com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004194{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004195 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004196 REQ(n, testlist);
4197 /* testlist: test (',' test)* [','] */
4198 for (i = 0; i < NCH(n); i += 2)
4199 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004200 i = (NCH(n)+1) / 2;
4201 com_addoparg(c, BUILD_TUPLE, i);
4202 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004203}
4204
4205static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004206com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004207{
Guido van Rossum25831651993-05-19 14:50:45 +00004208 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004209 PyObject *v;
4210 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004211 char *name;
4212
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004213 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004214 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004215 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004216 c->c_errors++;
4217 return;
4218 }
4219 /* Push the class name on the stack */
4220 i = com_addconst(c, v);
4221 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004223 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004224 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004225 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004226 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004227 com_push(c, 1);
4228 }
Guido van Rossum25831651993-05-19 14:50:45 +00004229 else
4230 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004231 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004232 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004233 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004234 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004235 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004236 c->c_errors++;
4237 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004238 int closure = com_make_closure(c, co);
4239 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004240 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004241 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004242 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004244 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004245 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004246 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004247 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004248 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004249 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004251 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004252 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004254}
4255
4256static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004257com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004258{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004259 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004260 if (c->c_errors)
4261 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262 switch (TYPE(n)) {
4263
4264 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004265
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004266 case funcdef:
4267 com_funcdef(c, n);
4268 break;
4269 case classdef:
4270 com_classdef(c, n);
4271 break;
4272
4273 /* Trivial parse tree nodes */
4274
4275 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004276 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004277 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278 n = CHILD(n, 0);
4279 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004280
4281 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004282 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004283 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004284 {
4285 int i;
4286 for (i = 0; i < NCH(n)-1; i += 2)
4287 com_node(c, CHILD(n, i));
4288 }
4289 break;
4290
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004291 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004292 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004293 n = CHILD(n, 0);
4294 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004295
4296 /* Statement nodes */
4297
4298 case expr_stmt:
4299 com_expr_stmt(c, n);
4300 break;
4301 case print_stmt:
4302 com_print_stmt(c, n);
4303 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004304 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004305 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004306 break;
4307 case pass_stmt:
4308 break;
4309 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004310 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004311 com_error(c, PyExc_SyntaxError,
4312 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004313 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004314 com_addbyte(c, BREAK_LOOP);
4315 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004316 case continue_stmt:
4317 com_continue_stmt(c, n);
4318 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004319 case return_stmt:
4320 com_return_stmt(c, n);
4321 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004322 case yield_stmt:
4323 com_yield_stmt(c, n);
4324 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004325 case raise_stmt:
4326 com_raise_stmt(c, n);
4327 break;
4328 case import_stmt:
4329 com_import_stmt(c, n);
4330 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004331 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004332 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004333 case exec_stmt:
4334 com_exec_stmt(c, n);
4335 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004336 case assert_stmt:
4337 com_assert_stmt(c, n);
4338 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339 case if_stmt:
4340 com_if_stmt(c, n);
4341 break;
4342 case while_stmt:
4343 com_while_stmt(c, n);
4344 break;
4345 case for_stmt:
4346 com_for_stmt(c, n);
4347 break;
4348 case try_stmt:
4349 com_try_stmt(c, n);
4350 break;
4351 case suite:
4352 com_suite(c, n);
4353 break;
4354
4355 /* Expression nodes */
4356
4357 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004358 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004359 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004360 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361 break;
4362 case test:
4363 com_test(c, n);
4364 break;
4365 case and_test:
4366 com_and_test(c, n);
4367 break;
4368 case not_test:
4369 com_not_test(c, n);
4370 break;
4371 case comparison:
4372 com_comparison(c, n);
4373 break;
4374 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004375 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004376 break;
4377 case expr:
4378 com_expr(c, n);
4379 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004380 case xor_expr:
4381 com_xor_expr(c, n);
4382 break;
4383 case and_expr:
4384 com_and_expr(c, n);
4385 break;
4386 case shift_expr:
4387 com_shift_expr(c, n);
4388 break;
4389 case arith_expr:
4390 com_arith_expr(c, n);
4391 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004392 case term:
4393 com_term(c, n);
4394 break;
4395 case factor:
4396 com_factor(c, n);
4397 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004398 case power:
4399 com_power(c, n);
4400 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401 case atom:
4402 com_atom(c, n);
4403 break;
4404
4405 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004406 com_error(c, PyExc_SystemError,
4407 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004408 }
4409}
4410
Tim Petersdbd9ba62000-07-09 03:09:57 +00004411static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004412
4413static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004414com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004415{
4416 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4417 if (TYPE(CHILD(n, 0)) == LPAR)
4418 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004419 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004421 com_pop(c, 1);
4422 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004423}
4424
4425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004426com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004427{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004428 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004429 if (NCH(n) == 1) {
4430 com_fpdef(c, CHILD(n, 0));
4431 }
4432 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004433 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004434 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004435 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004436 for (i = 0; i < NCH(n); i += 2)
4437 com_fpdef(c, CHILD(n, i));
4438 }
4439}
4440
4441static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004442com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004443{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004444 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004445 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004446 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004447 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004448 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004449 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004450 nch = NCH(n);
4451 /* Enter all arguments in table of locals */
4452 for (i = 0, narg = 0; i < nch; i++) {
4453 node *ch = CHILD(n, i);
4454 node *fp;
4455 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004456 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004457 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4458 fp = CHILD(ch, 0);
4459 if (TYPE(fp) != NAME) {
4460 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4461 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004462 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004463 narg++;
4464 /* all name updates handled by symtable */
4465 if (++i >= nch)
4466 break;
4467 ch = CHILD(n, i);
4468 if (TYPE(ch) == EQUAL)
4469 i += 2;
4470 else
4471 REQ(ch, COMMA);
4472 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004473 if (complex) {
4474 /* Generate code for complex arguments only after
4475 having counted the simple arguments */
4476 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004477 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004478 node *ch = CHILD(n, i);
4479 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004480 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004481 break;
4482 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4483 fp = CHILD(ch, 0);
4484 if (TYPE(fp) != NAME) {
4485 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004486 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004487 com_fpdef(c, ch);
4488 }
4489 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004490 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004491 break;
4492 ch = CHILD(n, i);
4493 if (TYPE(ch) == EQUAL)
4494 i += 2;
4495 else
4496 REQ(ch, COMMA);
4497 }
4498 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004499}
4500
4501static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004502com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503{
4504 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004505 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004506 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004507 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004508 if (doc != NULL) {
4509 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004510 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004511 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004512 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004513 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004514 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004515 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004516 for (i = 0; i < NCH(n); i++) {
4517 node *ch = CHILD(n, i);
4518 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4519 com_node(c, ch);
4520 }
4521}
4522
4523/* Top-level compile-node interface */
4524
4525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004526compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004528 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004529 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004530 REQ(n, funcdef);
4531 /* -6 -5 -4 -3 -2 -1
4532 funcdef: [decorators] 'def' NAME parameters ':' suite */
4533 c->c_name = STR(RCHILD(n, -4));
4534 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004535 if (doc != NULL) {
4536 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004537 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004538 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004539 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004540 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004541 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004542 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004543 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004544 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004545 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004546 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004547 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004548 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004549 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4550 com_push(c, 1);
4551 com_addbyte(c, RETURN_VALUE);
4552 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004553}
4554
4555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004556compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004557{
Guido van Rossum590baa41993-11-30 13:40:46 +00004558 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004559 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004560 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004561
4562 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004563 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004564 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004565 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004566 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004568 else
4569 ch = CHILD(n, 2);
4570 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004571 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004572 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004573}
4574
4575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004576compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004577{
4578 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004579 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004580 REQ(n, classdef);
4581 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4582 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004583 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004584 /* Initialize local __module__ from global __name__ */
4585 com_addop_name(c, LOAD_GLOBAL, "__name__");
4586 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004587 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004588 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004589 if (doc != NULL) {
4590 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004591 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004592 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004593 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004594 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004595 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004596 }
4597 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004598 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004599 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004600 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004601 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004602 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004603 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004604 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004605}
4606
4607static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004608compile_generator_expression(struct compiling *c, node *n)
4609{
4610 /* testlist_gexp: test gen_for */
4611 /* argument: test gen_for */
4612 REQ(CHILD(n, 0), test);
4613 REQ(CHILD(n, 1), gen_for);
4614
4615 c->c_name = "<generator expression>";
4616 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4617
4618 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4619 com_push(c, 1);
4620 com_addbyte(c, RETURN_VALUE);
4621 com_pop(c, 1);
4622}
4623
4624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004625compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004626{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004627 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004628
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004629 switch (TYPE(n)) {
4630
Guido van Rossum4c417781991-01-21 16:09:22 +00004631 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004632 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004633 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004634 n = CHILD(n, 0);
4635 if (TYPE(n) != NEWLINE)
4636 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004637 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004638 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4639 com_push(c, 1);
4640 com_addbyte(c, RETURN_VALUE);
4641 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004642 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004643 break;
4644
Guido van Rossum4c417781991-01-21 16:09:22 +00004645 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004646 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004647 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004648 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4649 com_push(c, 1);
4650 com_addbyte(c, RETURN_VALUE);
4651 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004652 break;
4653
Guido van Rossum590baa41993-11-30 13:40:46 +00004654 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004655 com_node(c, CHILD(n, 0));
4656 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004657 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004658 break;
4659
Guido van Rossum590baa41993-11-30 13:40:46 +00004660 case lambdef: /* anonymous function definition */
4661 compile_lambdef(c, n);
4662 break;
4663
Guido van Rossum4c417781991-01-21 16:09:22 +00004664 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004665 compile_funcdef(c, n);
4666 break;
4667
Guido van Rossum4c417781991-01-21 16:09:22 +00004668 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004669 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004670 break;
4671
Raymond Hettinger354433a2004-05-19 08:20:33 +00004672 case testlist_gexp: /* A generator expression */
4673 case argument: /* A generator expression */
4674 compile_generator_expression(c, n);
4675 break;
4676
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004677 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004678 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004679 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004680 }
4681}
4682
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004683static PyObject *
4684dict_keys_inorder(PyObject *dict, int offset)
4685{
4686 PyObject *tuple, *k, *v;
4687 int i, pos = 0, size = PyDict_Size(dict);
4688
4689 tuple = PyTuple_New(size);
4690 if (tuple == NULL)
4691 return NULL;
4692 while (PyDict_Next(dict, &pos, &k, &v)) {
4693 i = PyInt_AS_LONG(v);
4694 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004695 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004696 PyTuple_SET_ITEM(tuple, i - offset, k);
4697 }
4698 return tuple;
4699}
4700
Guido van Rossum79f25d91997-04-29 20:08:16 +00004701PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004702PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004703{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004704 return PyNode_CompileFlags(n, filename, NULL);
4705}
4706
4707PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004708PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004709{
4710 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004711}
4712
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004713struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004714PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004715{
4716 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004717 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004718
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004719 ff = PyNode_Future(n, filename);
4720 if (ff == NULL)
4721 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004722 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004723 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004724 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004725 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004726 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004727 return st;
4728}
4729
Guido van Rossum79f25d91997-04-29 20:08:16 +00004730static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004731icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004732{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004733 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004734}
4735
Guido van Rossum79f25d91997-04-29 20:08:16 +00004736static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004737jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004738 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004739{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004740 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004741 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004742 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004743 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004744 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4745 sc.c_encoding = "utf-8";
4746 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004747 sc.c_encoding = STR(n);
4748 n = CHILD(n, 0);
4749 } else {
4750 sc.c_encoding = NULL;
4751 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004752 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004753 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004754 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004755 /* c_symtable still points to parent's symbols */
4756 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004757 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004758 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004759 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004760 if (base->c_encoding != NULL) {
4761 assert(sc.c_encoding == NULL);
4762 sc.c_encoding = base->c_encoding;
4763 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004764 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004765 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004766 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004767 if (sc.c_future == NULL) {
4768 com_free(&sc);
4769 return NULL;
4770 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004771 if (flags) {
4772 int merged = sc.c_future->ff_features |
4773 flags->cf_flags;
4774 sc.c_future->ff_features = merged;
4775 flags->cf_flags = merged;
4776 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004777 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4778 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004779 com_free(&sc);
4780 return NULL;
4781 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004782 /* reset symbol table for second pass */
4783 sc.c_symtable->st_nscopes = 1;
4784 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004785 }
4786 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004787 if (symtable_load_symbols(&sc) < 0) {
4788 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004789 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004790 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004791 compile_node(&sc, n);
4792 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004793 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004794 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004795 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004796 consts = PyList_AsTuple(sc.c_consts);
4797 names = PyList_AsTuple(sc.c_names);
4798 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004799 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4800 freevars = dict_keys_inorder(sc.c_freevars,
4801 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004802 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004803 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004804 code = optimize_code(sc.c_code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004805 if (!PyErr_Occurred())
4806 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004807 sc.c_nlocals,
4808 sc.c_maxstacklevel,
4809 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004810 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004811 consts,
4812 names,
4813 varnames,
4814 freevars,
4815 cellvars,
4816 filename,
4817 name,
4818 sc.c_firstlineno,
4819 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004820 Py_XDECREF(consts);
4821 Py_XDECREF(names);
4822 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004823 Py_XDECREF(freevars);
4824 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004825 Py_XDECREF(filename);
4826 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004827 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004828 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004829 else if (!PyErr_Occurred()) {
4830 /* This could happen if someone called PyErr_Clear() after an
4831 error was reported above. That's not supposed to happen,
4832 but I just plugged one case and I'm not sure there can't be
4833 others. In that case, raise SystemError so that at least
4834 it gets reported instead dumping core. */
4835 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4836 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004837 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004838 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004839 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004840 sc.c_symtable = NULL;
4841 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004842 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004843 return co;
4844}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004845
4846int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004847PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004848{
4849 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004850 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004851 int line = co->co_firstlineno;
4852 int addr = 0;
4853 while (--size >= 0) {
4854 addr += *p++;
4855 if (addr > addrq)
4856 break;
4857 line += *p++;
4858 }
4859 return line;
4860}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004861
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004862/* The test for LOCAL must come before the test for FREE in order to
4863 handle classes where name is both local and free. The local var is
4864 a method and the free var is a free var referenced within a method.
4865*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004866
4867static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004868get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004870 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004871 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004872
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004873 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4874 return CELL;
4875 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4876 return LOCAL;
4877 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4878 return FREE;
4879 v = PyDict_GetItemString(c->c_globals, name);
4880 if (v) {
4881 if (v == Py_None)
4882 return GLOBAL_EXPLICIT;
4883 else {
4884 return GLOBAL_IMPLICIT;
4885 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004886 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004887 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004888 "unknown scope for %.100s in %.100s(%s) "
4889 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4890 name, c->c_name,
4891 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4892 c->c_filename,
4893 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4894 PyObject_REPR(c->c_locals),
4895 PyObject_REPR(c->c_globals)
4896 );
4897
4898 Py_FatalError(buf);
4899 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004900}
4901
Guido van Rossum207fda62001-03-02 03:30:41 +00004902/* Helper functions to issue warnings */
4903
4904static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004905issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004906{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004907 if (PyErr_Occurred()) {
4908 /* This can happen because symtable_node continues
4909 processing even after raising a SyntaxError.
4910 Calling PyErr_WarnExplicit now would clobber the
4911 pending exception; instead we fail and let that
4912 exception propagate.
4913 */
4914 return -1;
4915 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004916 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4917 lineno, NULL, NULL) < 0) {
4918 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4919 PyErr_SetString(PyExc_SyntaxError, msg);
4920 PyErr_SyntaxLocation(filename, lineno);
4921 }
4922 return -1;
4923 }
4924 return 0;
4925}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004926
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004927static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004928symtable_warn(struct symtable *st, char *msg)
4929{
Guido van Rossum207fda62001-03-02 03:30:41 +00004930 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004931 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004932 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004933 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004934 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004935}
4936
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004937/* Helper function for setting lineno and filename */
4938
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004939static struct symtable *
4940symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004941{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004942 struct symtable *st;
4943
4944 st = symtable_init();
4945 if (st == NULL)
4946 return NULL;
4947 st->st_future = ff;
4948 st->st_filename = filename;
4949 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4950 if (st->st_errors > 0)
4951 goto fail;
4952 symtable_node(st, n);
4953 if (st->st_errors > 0)
4954 goto fail;
4955 return st;
4956 fail:
4957 if (!PyErr_Occurred()) {
4958 /* This could happen because after a syntax error is
4959 detected, the symbol-table-building continues for
4960 a while, and PyErr_Clear() might erroneously be
4961 called during that process. One such case has been
4962 fixed, but there might be more (now or later).
4963 */
4964 PyErr_SetString(PyExc_SystemError, "lost exception");
4965 }
4966 st->st_future = NULL;
4967 st->st_filename = NULL;
4968 PySymtable_Free(st);
4969 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004970}
4971
4972static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004973symtable_init_compiling_symbols(struct compiling *c)
4974{
4975 PyObject *varnames;
4976
4977 varnames = c->c_symtable->st_cur->ste_varnames;
4978 if (varnames == NULL) {
4979 varnames = PyList_New(0);
4980 if (varnames == NULL)
4981 return -1;
4982 c->c_symtable->st_cur->ste_varnames = varnames;
4983 Py_INCREF(varnames);
4984 } else
4985 Py_INCREF(varnames);
4986 c->c_varnames = varnames;
4987
4988 c->c_globals = PyDict_New();
4989 if (c->c_globals == NULL)
4990 return -1;
4991 c->c_freevars = PyDict_New();
4992 if (c->c_freevars == NULL)
4993 return -1;
4994 c->c_cellvars = PyDict_New();
4995 if (c->c_cellvars == NULL)
4996 return -1;
4997 return 0;
4998}
4999
5000struct symbol_info {
5001 int si_nlocals;
5002 int si_ncells;
5003 int si_nfrees;
5004 int si_nimplicit;
5005};
5006
5007static void
5008symtable_init_info(struct symbol_info *si)
5009{
5010 si->si_nlocals = 0;
5011 si->si_ncells = 0;
5012 si->si_nfrees = 0;
5013 si->si_nimplicit = 0;
5014}
5015
5016static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005017symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005018 struct symbol_info *si)
5019{
5020 PyObject *dict, *v;
5021
5022 /* Seperate logic for DEF_FREE. If it occurs in a function,
5023 it indicates a local that we must allocate storage for (a
5024 cell var). If it occurs in a class, then the class has a
5025 method and a free variable with the same name.
5026 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005027 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005028 /* If it isn't declared locally, it can't be a cell. */
5029 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5030 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005031 v = PyInt_FromLong(si->si_ncells++);
5032 dict = c->c_cellvars;
5033 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005034 /* If it is free anyway, then there is no need to do
5035 anything here.
5036 */
5037 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005038 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005039 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005040 v = PyInt_FromLong(si->si_nfrees++);
5041 dict = c->c_freevars;
5042 }
5043 if (v == NULL)
5044 return -1;
5045 if (PyDict_SetItem(dict, name, v) < 0) {
5046 Py_DECREF(v);
5047 return -1;
5048 }
5049 Py_DECREF(v);
5050 return 0;
5051}
5052
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005053/* If a variable is a cell and an argument, make sure that appears in
5054 co_cellvars before any variable to its right in varnames.
5055*/
5056
5057
5058static int
5059symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5060 PyObject *varnames, int flags)
5061{
Tim Petersb39903b2003-03-24 17:22:24 +00005062 PyObject *v = NULL;
5063 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005064 int i, pos;
5065
5066 if (flags & CO_VARARGS)
5067 argcount++;
5068 if (flags & CO_VARKEYWORDS)
5069 argcount++;
5070 for (i = argcount; --i >= 0; ) {
5071 v = PyList_GET_ITEM(varnames, i);
5072 if (PyDict_GetItem(*cellvars, v)) {
5073 if (list == NULL) {
5074 list = PyList_New(1);
5075 if (list == NULL)
5076 return -1;
5077 PyList_SET_ITEM(list, 0, v);
5078 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005079 } else {
5080 if (PyList_Insert(list, 0, v) < 0) {
5081 Py_DECREF(list);
5082 return -1;
5083 }
5084 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005085 }
5086 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005087 if (list == NULL)
5088 return 0;
5089
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005090 /* There are cellvars that are also arguments. Create a dict
5091 to replace cellvars and put the args at the front.
5092 */
5093 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005094 if (d == NULL)
5095 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005096 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5097 v = PyInt_FromLong(i);
5098 if (v == NULL)
5099 goto fail;
5100 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5101 goto fail;
5102 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5103 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005104 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005105 }
5106 pos = 0;
5107 i = PyList_GET_SIZE(list);
5108 Py_DECREF(list);
5109 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5110 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005111 if (w == NULL)
5112 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005113 if (PyDict_SetItem(d, v, w) < 0) {
5114 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005115 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005116 goto fail;
5117 }
5118 Py_DECREF(w);
5119 }
5120 Py_DECREF(*cellvars);
5121 *cellvars = d;
5122 return 1;
5123 fail:
5124 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005125 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005126 return -1;
5127}
5128
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005129static int
5130symtable_freevar_offsets(PyObject *freevars, int offset)
5131{
5132 PyObject *name, *v;
5133 int pos;
5134
5135 /* The cell vars are the first elements of the closure,
5136 followed by the free vars. Update the offsets in
5137 c_freevars to account for number of cellvars. */
5138 pos = 0;
5139 while (PyDict_Next(freevars, &pos, &name, &v)) {
5140 int i = PyInt_AS_LONG(v) + offset;
5141 PyObject *o = PyInt_FromLong(i);
5142 if (o == NULL)
5143 return -1;
5144 if (PyDict_SetItem(freevars, name, o) < 0) {
5145 Py_DECREF(o);
5146 return -1;
5147 }
5148 Py_DECREF(o);
5149 }
5150 return 0;
5151}
5152
5153static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005154symtable_check_unoptimized(struct compiling *c,
5155 PySymtableEntryObject *ste,
5156 struct symbol_info *si)
5157{
5158 char buf[300];
5159
5160 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5161 || (ste->ste_nested && si->si_nimplicit)))
5162 return 0;
5163
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005164#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5165
5166#define ILLEGAL_IS "is a nested function"
5167
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005168#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005169"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005170
5171#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005172"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005173
5174#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005175"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005176"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005177
5178 /* XXX perhaps the linenos for these opt-breaking statements
5179 should be stored so the exception can point to them. */
5180
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005181 if (ste->ste_child_free) {
5182 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005183 PyOS_snprintf(buf, sizeof(buf),
5184 ILLEGAL_IMPORT_STAR,
5185 PyString_AS_STRING(ste->ste_name),
5186 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005187 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005188 PyOS_snprintf(buf, sizeof(buf),
5189 ILLEGAL_BARE_EXEC,
5190 PyString_AS_STRING(ste->ste_name),
5191 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005192 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005193 PyOS_snprintf(buf, sizeof(buf),
5194 ILLEGAL_EXEC_AND_IMPORT_STAR,
5195 PyString_AS_STRING(ste->ste_name),
5196 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005197 }
5198 } else {
5199 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005200 PyOS_snprintf(buf, sizeof(buf),
5201 ILLEGAL_IMPORT_STAR,
5202 PyString_AS_STRING(ste->ste_name),
5203 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005204 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005205 PyOS_snprintf(buf, sizeof(buf),
5206 ILLEGAL_BARE_EXEC,
5207 PyString_AS_STRING(ste->ste_name),
5208 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005209 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005210 PyOS_snprintf(buf, sizeof(buf),
5211 ILLEGAL_EXEC_AND_IMPORT_STAR,
5212 PyString_AS_STRING(ste->ste_name),
5213 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005214 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005215 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005216
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005217 PyErr_SetString(PyExc_SyntaxError, buf);
5218 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5219 ste->ste_opt_lineno);
5220 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005221}
5222
5223static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005224symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5225 struct symbol_info *si)
5226{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005227 if (c->c_future)
5228 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005229 if (ste->ste_generator)
5230 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005231 if (ste->ste_type != TYPE_MODULE)
5232 c->c_flags |= CO_NEWLOCALS;
5233 if (ste->ste_type == TYPE_FUNCTION) {
5234 c->c_nlocals = si->si_nlocals;
5235 if (ste->ste_optimized == 0)
5236 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005237 else if (ste->ste_optimized != OPT_EXEC)
5238 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005239 }
5240 return 0;
5241}
5242
5243static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005244symtable_error(struct symtable *st, int lineno)
5245{
5246 if (lineno == 0)
5247 lineno = st->st_cur->ste_lineno;
5248 PyErr_SyntaxLocation(st->st_filename, lineno);
5249 st->st_errors++;
5250 return -1;
5251}
5252
5253static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005254symtable_load_symbols(struct compiling *c)
5255{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005256 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005257 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005258 PyObject *name, *varnames, *v;
5259 int i, flags, pos;
5260 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005262 v = NULL;
5263
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005264 if (symtable_init_compiling_symbols(c) < 0)
5265 goto fail;
5266 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005267 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005268 si.si_nlocals = PyList_GET_SIZE(varnames);
5269 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005270
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005271 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005272 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005273 if (v == NULL)
5274 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275 if (PyDict_SetItem(c->c_locals,
5276 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005277 goto fail;
5278 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279 }
5280
5281 /* XXX The cases below define the rules for whether a name is
5282 local or global. The logic could probably be clearer. */
5283 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005284 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5285 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005286
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005287 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005288 /* undo the original DEF_FREE */
5289 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005290
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005291 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005292 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005293 2. Free variables in methods that are also class
5294 variables or declared global.
5295 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005296 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005297 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005298
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005299 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005300 c->c_argcount--;
5301 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005302 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303 c->c_argcount--;
5304 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005305 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005306 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005307 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005308 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005309 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005310 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005311 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005312 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005314 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5315 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005316 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005317 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005318 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005319 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005320 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005321 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005322 if (v == NULL)
5323 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005325 goto fail;
5326 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005327 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005329 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005330 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005331 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005332 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005333 if (v == NULL)
5334 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005335 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005336 goto fail;
5337 Py_DECREF(v);
5338 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005339 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005340 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005341 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005342 goto fail;
5343 if (st->st_nscopes != 1) {
5344 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005345 if (v == NULL)
5346 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005347 if (PyDict_SetItem(st->st_global,
5348 name, v))
5349 goto fail;
5350 Py_DECREF(v);
5351 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005352 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005353 }
5354 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005355 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5356
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005357 if (si.si_ncells > 1) { /* one cell is always in order */
5358 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5359 c->c_varnames, c->c_flags) < 0)
5360 return -1;
5361 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005362 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5363 return -1;
5364 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365 fail:
5366 /* is this always the right thing to do? */
5367 Py_XDECREF(v);
5368 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369}
5370
5371static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005372symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373{
5374 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005375
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005376 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005377 if (st == NULL)
5378 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005379 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005380
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005381 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005382 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005383 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005384 goto fail;
5385 if ((st->st_symbols = PyDict_New()) == NULL)
5386 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005387 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005388 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005389 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 st->st_private = NULL;
5391 return st;
5392 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005393 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 return NULL;
5395}
5396
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005397void
5398PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005399{
5400 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005401 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005402 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005403 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404}
5405
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005406/* When the compiler exits a scope, it must should update the scope's
5407 free variable information with the list of free variables in its
5408 children.
5409
5410 Variables that are free in children and defined in the current
5411 scope are cellvars.
5412
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005413 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 false), free variables in children that are not defined here are
5415 implicit globals.
5416
5417*/
5418
5419static int
5420symtable_update_free_vars(struct symtable *st)
5421{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005422 int i, j, def;
5423 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005424 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005425
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005426 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005427 def = DEF_FREE_CLASS;
5428 else
5429 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005430 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 int pos = 0;
5432
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005433 if (list && PyList_SetSlice(list, 0,
5434 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005435 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005436 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005437 PyList_GET_ITEM(ste->ste_children, i);
5438 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005439 int flags = PyInt_AS_LONG(o);
5440 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005441 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005442 if (list == NULL) {
5443 list = PyList_New(0);
5444 if (list == NULL)
5445 return -1;
5446 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005447 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005448 if (PyList_Append(list, name) < 0) {
5449 Py_DECREF(list);
5450 return -1;
5451 }
5452 }
5453 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005454 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005455 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005456 v = PyDict_GetItem(ste->ste_symbols, name);
5457 /* If a name N is declared global in scope A and
5458 referenced in scope B contained (perhaps
5459 indirectly) in A and there are no scopes
5460 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005461 is global in B. Unless A is a class scope,
5462 because class scopes are not considered for
5463 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005464 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005465 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005466 int flags = PyInt_AS_LONG(v);
5467 if (flags & DEF_GLOBAL) {
5468 symtable_undo_free(st, child->ste_id,
5469 name);
5470 continue;
5471 }
5472 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005473 if (ste->ste_nested) {
5474 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005475 name, def) < 0) {
5476 Py_DECREF(list);
5477 return -1;
5478 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005479 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005480 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005481 name) < 0) {
5482 Py_DECREF(list);
5483 return -1;
5484 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005485 }
5486 }
5487 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005488
5489 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005490 return 0;
5491}
5492
5493/* If the current scope is a non-nested class or if name is not
5494 defined in the current, non-nested scope, then it is an implicit
5495 global in all nested scopes.
5496*/
5497
5498static int
5499symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5500{
5501 PyObject *o;
5502 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005503 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005504
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005505 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005507 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 if (o == NULL)
5509 return symtable_undo_free(st, child, name);
5510 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005511
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005512 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 return symtable_undo_free(st, child, name);
5514 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005515 return symtable_add_def_o(st, ste->ste_symbols,
5516 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517}
5518
5519static int
5520symtable_undo_free(struct symtable *st, PyObject *id,
5521 PyObject *name)
5522{
5523 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005524 PyObject *info;
5525 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005527 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5528 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005529 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005530
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005531 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005532 if (info == NULL)
5533 return 0;
5534 v = PyInt_AS_LONG(info);
5535 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005536 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005537 DEF_FREE_GLOBAL) < 0)
5538 return -1;
5539 } else
5540 /* If the name is defined here or declared global,
5541 then the recursion stops. */
5542 return 0;
5543
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005544 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5545 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005546 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005547 PyList_GET_ITEM(ste->ste_children, i);
5548 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005549 if (x < 0)
5550 return x;
5551 }
5552 return 0;
5553}
5554
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005555/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5556 This reference is released when the scope is exited, via the DECREF
5557 in symtable_exit_scope().
5558*/
5559
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005560static int
5561symtable_exit_scope(struct symtable *st)
5562{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005563 int end;
5564
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005565 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005566 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005567 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005568 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005569 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5570 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005571 if (PySequence_DelItem(st->st_stack, end) < 0)
5572 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005573 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005574}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005576static void
5577symtable_enter_scope(struct symtable *st, char *name, int type,
5578 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005579{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005580 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005581
5582 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005583 prev = st->st_cur;
5584 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005585 st->st_errors++;
5586 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005587 }
5588 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005589 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005590 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005591 if (st->st_cur == NULL) {
5592 st->st_errors++;
5593 return;
5594 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005595 if (strcmp(name, TOP) == 0)
5596 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005597 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005598 if (PyList_Append(prev->ste_children,
5599 (PyObject *)st->st_cur) < 0)
5600 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005601 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005602}
5603
5604static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005605symtable_lookup(struct symtable *st, char *name)
5606{
5607 char buffer[MANGLE_LEN];
5608 PyObject *v;
5609 int flags;
5610
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005611 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005612 name = buffer;
5613 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5614 if (v == NULL) {
5615 if (PyErr_Occurred())
5616 return -1;
5617 else
5618 return 0;
5619 }
5620
5621 flags = PyInt_AS_LONG(v);
5622 return flags;
5623}
5624
5625static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005627{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005628 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005629 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005630 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005631
Guido van Rossumb7164622002-08-16 02:48:11 +00005632 /* Warn about None, except inside a tuple (where the assignment
5633 code already issues a warning). */
5634 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5635 *name == 'N' && strcmp(name, "None") == 0)
5636 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005637 PyErr_SetString(PyExc_SyntaxError,
5638 "Invalid syntax. Assignment to None.");
5639 symtable_error(st, 0);
5640 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005641 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005642 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005643 name = buffer;
5644 if ((s = PyString_InternFromString(name)) == NULL)
5645 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005646 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5647 Py_DECREF(s);
5648 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005649}
5650
5651/* Must only be called with mangled names */
5652
5653static int
5654symtable_add_def_o(struct symtable *st, PyObject *dict,
5655 PyObject *name, int flag)
5656{
5657 PyObject *o;
5658 int val;
5659
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005660 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005661 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005663 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005664 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005665 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005667 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005671 if (o == NULL)
5672 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005674 Py_DECREF(o);
5675 return -1;
5676 }
5677 Py_DECREF(o);
5678
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005680 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005682 } else if (flag & DEF_GLOBAL) {
5683 /* XXX need to update DEF_GLOBAL for other flags too;
5684 perhaps only DEF_FREE_GLOBAL */
5685 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005687 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005688 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005690 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005691 if (o == NULL)
5692 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005693 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005694 Py_DECREF(o);
5695 return -1;
5696 }
5697 Py_DECREF(o);
5698 }
5699 return 0;
5700}
5701
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005703
Tim Peters08a898f2001-06-28 01:52:22 +00005704/* Look for a yield stmt under n. Return 1 if found, else 0.
5705 This hack is used to look inside "if 0:" blocks (which are normally
5706 ignored) in case those are the only places a yield occurs (so that this
5707 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005708static int
5709look_for_yield(node *n)
5710{
5711 int i;
5712
5713 for (i = 0; i < NCH(n); ++i) {
5714 node *kid = CHILD(n, i);
5715
5716 switch (TYPE(kid)) {
5717
5718 case classdef:
5719 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005720 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005721 /* Stuff in nested functions and classes can't make
5722 the parent a generator. */
5723 return 0;
5724
5725 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005726 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005727
5728 default:
5729 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005730 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005731 }
5732 }
5733 return 0;
5734}
5735
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005736static void
5737symtable_node(struct symtable *st, node *n)
5738{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005739 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005740
5741 loop:
5742 switch (TYPE(n)) {
5743 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005744 char *func_name;
5745 if (NCH(n) == 6)
5746 symtable_node(st, CHILD(n, 0));
5747 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005749 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005750 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005751 symtable_funcdef(st, n);
5752 symtable_exit_scope(st);
5753 break;
5754 }
5755 case lambdef:
5756 if (NCH(n) == 4)
5757 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005758 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005759 symtable_funcdef(st, n);
5760 symtable_exit_scope(st);
5761 break;
5762 case classdef: {
5763 char *tmp, *class_name = STR(CHILD(n, 1));
5764 symtable_add_def(st, class_name, DEF_LOCAL);
5765 if (TYPE(CHILD(n, 2)) == LPAR) {
5766 node *bases = CHILD(n, 3);
5767 int i;
5768 for (i = 0; i < NCH(bases); i += 2) {
5769 symtable_node(st, CHILD(bases, i));
5770 }
5771 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005772 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005773 tmp = st->st_private;
5774 st->st_private = class_name;
5775 symtable_node(st, CHILD(n, NCH(n) - 1));
5776 st->st_private = tmp;
5777 symtable_exit_scope(st);
5778 break;
5779 }
5780 case if_stmt:
5781 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005782 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5783 if (st->st_cur->ste_generator == 0)
5784 st->st_cur->ste_generator =
5785 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005787 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005788 symtable_node(st, CHILD(n, i + 1));
5789 symtable_node(st, CHILD(n, i + 3));
5790 }
5791 if (i + 2 < NCH(n))
5792 symtable_node(st, CHILD(n, i + 2));
5793 break;
5794 case global_stmt:
5795 symtable_global(st, n);
5796 break;
5797 case import_stmt:
5798 symtable_import(st, n);
5799 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005800 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005801 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005802 symtable_node(st, CHILD(n, 1));
5803 if (NCH(n) > 2)
5804 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005805 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005806 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005807 st->st_cur->ste_opt_lineno = n->n_lineno;
5808 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005809 if (NCH(n) > 4)
5810 symtable_node(st, CHILD(n, 5));
5811 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005812
5813 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005814 case assert_stmt:
5815 if (Py_OptimizeFlag)
5816 return;
5817 if (NCH(n) == 2) {
5818 n = CHILD(n, 1);
5819 goto loop;
5820 } else {
5821 symtable_node(st, CHILD(n, 1));
5822 n = CHILD(n, 3);
5823 goto loop;
5824 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005825 case except_clause:
5826 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005827 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005828 if (NCH(n) > 1) {
5829 n = CHILD(n, 1);
5830 goto loop;
5831 }
5832 break;
5833 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005834 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005835 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005836 case yield_stmt:
5837 st->st_cur->ste_generator = 1;
5838 n = CHILD(n, 1);
5839 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005840 case expr_stmt:
5841 if (NCH(n) == 1)
5842 n = CHILD(n, 0);
5843 else {
5844 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005845 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005846 symtable_node(st, CHILD(n, 2));
5847 break;
5848 } else {
5849 int i;
5850 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005851 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005852 n = CHILD(n, NCH(n) - 1);
5853 }
5854 }
5855 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005856 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005857 /* only occurs when there are multiple for loops
5858 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005859 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005860 if (TYPE(n) == list_for)
5861 symtable_list_for(st, n);
5862 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005863 REQ(n, list_if);
5864 symtable_node(st, CHILD(n, 1));
5865 if (NCH(n) == 3) {
5866 n = CHILD(n, 2);
5867 goto loop;
5868 }
5869 }
5870 break;
5871 case for_stmt:
5872 symtable_assign(st, CHILD(n, 1), 0);
5873 for (i = 3; i < NCH(n); ++i)
5874 if (TYPE(CHILD(n, i)) >= single_input)
5875 symtable_node(st, CHILD(n, i));
5876 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005877 case arglist:
5878 if (NCH(n) > 1)
5879 for (i = 0; i < NCH(n); ++i) {
5880 node *ch = CHILD(n, i);
5881 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5882 TYPE(CHILD(ch, 1)) == gen_for) {
5883 PyErr_SetString(PyExc_SyntaxError,
5884 "invalid syntax");
5885 symtable_error(st, n->n_lineno);
5886 return;
5887 }
5888 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005889 /* The remaining cases fall through to default except in
5890 special circumstances. This requires the individual cases
5891 to be coded with great care, even though they look like
5892 rather innocuous. Each case must double-check TYPE(n).
5893 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005894 case decorator:
5895 if (TYPE(n) == decorator) {
5896 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5897 node *name, *varname;
5898 name = CHILD(n, 1);
5899 REQ(name, dotted_name);
5900 varname = CHILD(name, 0);
5901 REQ(varname, NAME);
5902 symtable_add_use(st, STR(varname));
5903 }
5904 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005905 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005906 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005907 n = CHILD(n, 2);
5908 goto loop;
5909 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005910 else if (TYPE(n) == argument && NCH(n) == 2 &&
5911 TYPE(CHILD(n, 1)) == gen_for) {
5912 symtable_generator_expression(st, n);
5913 break;
5914 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005915 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005916 case listmaker:
5917 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005918 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005919 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005920 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005921 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005922 case testlist_gexp:
5923 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5924 symtable_generator_expression(st, n);
5925 break;
5926 }
5927 /* fall through */
5928
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005929 case atom:
5930 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5931 symtable_add_use(st, STR(CHILD(n, 0)));
5932 break;
5933 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005934 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005936 /* Walk over every non-token child with a special case
5937 for one child.
5938 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005939 if (NCH(n) == 1) {
5940 n = CHILD(n, 0);
5941 goto loop;
5942 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005943 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005944 if (TYPE(CHILD(n, i)) >= single_input)
5945 symtable_node(st, CHILD(n, i));
5946 }
5947}
5948
5949static void
5950symtable_funcdef(struct symtable *st, node *n)
5951{
5952 node *body;
5953
5954 if (TYPE(n) == lambdef) {
5955 if (NCH(n) == 4)
5956 symtable_params(st, CHILD(n, 1));
5957 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005958 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005959 body = CHILD(n, NCH(n) - 1);
5960 symtable_node(st, body);
5961}
5962
5963/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005964 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005965 which are references in the defining scope. symtable_params()
5966 parses the parameter names, which are defined in the function's
5967 body.
5968
5969 varargslist:
5970 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5971 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5972*/
5973
5974static void
5975symtable_default_args(struct symtable *st, node *n)
5976{
5977 node *c;
5978 int i;
5979
5980 if (TYPE(n) == parameters) {
5981 n = CHILD(n, 1);
5982 if (TYPE(n) == RPAR)
5983 return;
5984 }
5985 REQ(n, varargslist);
5986 for (i = 0; i < NCH(n); i += 2) {
5987 c = CHILD(n, i);
5988 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5989 break;
5990 }
5991 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5992 symtable_node(st, CHILD(n, i));
5993 }
5994}
5995
5996static void
5997symtable_params(struct symtable *st, node *n)
5998{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005999 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006000 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006001
6002 if (TYPE(n) == parameters) {
6003 n = CHILD(n, 1);
6004 if (TYPE(n) == RPAR)
6005 return;
6006 }
6007 REQ(n, varargslist);
6008 for (i = 0; i < NCH(n); i += 2) {
6009 c = CHILD(n, i);
6010 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6011 ext = 1;
6012 break;
6013 }
6014 if (TYPE(c) == test) {
6015 continue;
6016 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006017 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006018 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006019 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006020 char nbuf[30];
6021 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006023 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006024 }
6025 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 if (ext) {
6027 c = CHILD(n, i);
6028 if (TYPE(c) == STAR) {
6029 i++;
6030 symtable_add_def(st, STR(CHILD(n, i)),
6031 DEF_PARAM | DEF_STAR);
6032 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006033 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006034 c = NULL;
6035 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006036 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006037 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006038 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006039 i++;
6040 symtable_add_def(st, STR(CHILD(n, i)),
6041 DEF_PARAM | DEF_DOUBLESTAR);
6042 }
6043 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006044 if (complex >= 0) {
6045 int j;
6046 for (j = 0; j <= complex; j++) {
6047 c = CHILD(n, j);
6048 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006049 c = CHILD(n, ++j);
6050 else if (TYPE(c) == EQUAL)
6051 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006052 if (TYPE(CHILD(c, 0)) == LPAR)
6053 symtable_params_fplist(st, CHILD(c, 1));
6054 }
6055 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056}
6057
6058static void
6059symtable_params_fplist(struct symtable *st, node *n)
6060{
6061 int i;
6062 node *c;
6063
6064 REQ(n, fplist);
6065 for (i = 0; i < NCH(n); i += 2) {
6066 c = CHILD(n, i);
6067 REQ(c, fpdef);
6068 if (NCH(c) == 1)
6069 symtable_add_def(st, STR(CHILD(c, 0)),
6070 DEF_PARAM | DEF_INTUPLE);
6071 else
6072 symtable_params_fplist(st, CHILD(c, 1));
6073 }
6074
6075}
6076
6077static void
6078symtable_global(struct symtable *st, node *n)
6079{
6080 int i;
6081
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006082 /* XXX It might be helpful to warn about module-level global
6083 statements, but it's hard to tell the difference between
6084 module-level and a string passed to exec.
6085 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006086
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006087 for (i = 1; i < NCH(n); i += 2) {
6088 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006089 int flags;
6090
6091 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006092 if (flags < 0)
6093 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006094 if (flags && flags != DEF_GLOBAL) {
6095 char buf[500];
6096 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006097 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006098 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006099 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006100 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006101 }
6102 else {
6103 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006104 PyOS_snprintf(buf, sizeof(buf),
6105 GLOBAL_AFTER_ASSIGN,
6106 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006107 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006108 PyOS_snprintf(buf, sizeof(buf),
6109 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006110 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006111 }
6112 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006113 symtable_add_def(st, name, DEF_GLOBAL);
6114 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006115}
6116
6117static void
6118symtable_list_comprehension(struct symtable *st, node *n)
6119{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006120 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006121 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006122
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006123 REQ(n, listmaker);
6124 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6125 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006126 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006127 symtable_list_for(st, CHILD(n, 1));
6128 symtable_node(st, CHILD(n, 0));
6129 --st->st_cur->ste_tmpname;
6130}
6131
6132static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006133symtable_generator_expression(struct symtable *st, node *n)
6134{
6135 /* testlist_gexp: test gen_for */
6136 REQ(CHILD(n, 0), test);
6137 REQ(CHILD(n, 1), gen_for);
6138
6139 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6140 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6141
6142 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6143
6144 symtable_gen_for(st, CHILD(n, 1), 1);
6145 symtable_node(st, CHILD(n, 0));
6146 symtable_exit_scope(st);
6147
6148 /* for outmost iterable precomputation */
6149 symtable_node(st, CHILD(CHILD(n, 1), 3));
6150}
6151
6152static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006153symtable_list_for(struct symtable *st, node *n)
6154{
6155 REQ(n, list_for);
6156 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006157 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006158 symtable_node(st, CHILD(n, 3));
6159 if (NCH(n) == 5)
6160 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161}
6162
6163static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006164symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6165{
6166 REQ(n, gen_for);
6167
6168 /* gen_for: for v in test [gen_iter] */
6169 symtable_assign(st, CHILD(n, 1), 0);
6170 if (is_outmost)
6171 symtable_add_use(st, "[outmost-iterable]");
6172 else
6173 symtable_node(st, CHILD(n, 3));
6174
6175 if (NCH(n) == 5)
6176 symtable_gen_iter(st, CHILD(n, 4));
6177}
6178
6179static void
6180symtable_gen_iter(struct symtable *st, node *n)
6181{
6182 REQ(n, gen_iter);
6183
6184 n = CHILD(n, 0);
6185 if (TYPE(n) == gen_for)
6186 symtable_gen_for(st, n, 0);
6187 else {
6188 REQ(n, gen_if);
6189 symtable_node(st, CHILD(n, 1));
6190
6191 if (NCH(n) == 3)
6192 symtable_gen_iter(st, CHILD(n, 2));
6193 }
6194}
6195
6196static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006197symtable_import(struct symtable *st, node *n)
6198{
6199 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006200 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006201 | 'from' dotted_name 'import'
6202 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006203 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006204 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006205 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006206 node *dotname = CHILD(n, 1);
6207 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6208 /* check for bogus imports */
6209 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6210 PyErr_SetString(PyExc_SyntaxError,
6211 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006212 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006213 return;
6214 }
6215 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006216 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006217 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006218 if (symtable_warn(st,
6219 "import * only allowed at module level") < 0)
6220 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006221 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006222 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006223 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006224 } else {
6225 for (i = 3; i < NCH(n); i += 2) {
6226 node *c = CHILD(n, i);
6227 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006228 symtable_assign(st, CHILD(c, 2),
6229 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006230 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006231 symtable_assign(st, CHILD(c, 0),
6232 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006233 }
6234 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006235 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006236 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006237 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006238 }
6239 }
6240}
6241
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006242/* The third argument to symatble_assign() is a flag to be passed to
6243 symtable_add_def() if it is eventually called. The flag is useful
6244 to specify the particular type of assignment that should be
6245 recorded, e.g. an assignment caused by import.
6246 */
6247
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006248static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006249symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006250{
6251 node *tmp;
6252 int i;
6253
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006254 loop:
6255 switch (TYPE(n)) {
6256 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006257 /* invalid assignment, e.g. lambda x:x=2. The next
6258 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006259 return;
6260 case power:
6261 if (NCH(n) > 2) {
6262 for (i = 2; i < NCH(n); ++i)
6263 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6264 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006265 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006266 if (NCH(n) > 1) {
6267 symtable_node(st, CHILD(n, 0));
6268 symtable_node(st, CHILD(n, 1));
6269 } else {
6270 n = CHILD(n, 0);
6271 goto loop;
6272 }
6273 return;
6274 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006275 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6276 /* XXX This is an error, but the next pass
6277 will catch it. */
6278 return;
6279 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006280 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006281 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006282 }
6283 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006284 case testlist_gexp:
6285 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6286 /* XXX This is an error, but the next pass
6287 will catch it. */
6288 return;
6289 } else {
6290 for (i = 0; i < NCH(n); i += 2)
6291 symtable_assign(st, CHILD(n, i), def_flag);
6292 }
6293 return;
6294
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006295 case exprlist:
6296 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006297 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006298 if (NCH(n) == 1) {
6299 n = CHILD(n, 0);
6300 goto loop;
6301 }
6302 else {
6303 int i;
6304 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006305 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006306 return;
6307 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006308 case atom:
6309 tmp = CHILD(n, 0);
6310 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6311 n = CHILD(n, 1);
6312 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006313 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006314 if (strcmp(STR(tmp), "__debug__") == 0) {
6315 PyErr_SetString(PyExc_SyntaxError,
6316 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006317 symtable_error(st, n->n_lineno);
6318 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006319 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006320 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006321 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006322 return;
6323 case dotted_as_name:
6324 if (NCH(n) == 3)
6325 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006326 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006327 else
6328 symtable_add_def(st,
6329 STR(CHILD(CHILD(n,
6330 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006331 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006332 return;
6333 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006334 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006335 return;
6336 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006337 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006338 return;
6339 default:
6340 if (NCH(n) == 0)
6341 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006342 if (NCH(n) == 1) {
6343 n = CHILD(n, 0);
6344 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006345 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006346 /* Should only occur for errors like x + 1 = 1,
6347 which will be caught in the next pass. */
6348 for (i = 0; i < NCH(n); ++i)
6349 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006350 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006351 }
6352}