blob: 6d384442465b0626bbc79712203c925876078c01 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
429 int i, j, codelen;
430 int tgt, tgttgt, opcode;
431 unsigned char *codestr;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000432 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000433 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000434
435 /* Make a modifiable copy of the code string */
436 if (!PyString_Check(code))
437 goto exitUnchanged;
438 codelen = PyString_Size(code);
439 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000440 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000441 goto exitUnchanged;
442 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000443
444 /* Avoid situations where jump retargeting could overflow */
445 if (codelen > 65000)
446 goto exitUnchanged;
447
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000448 blocks = markblocks(codestr, codelen);
449 if (blocks == NULL) {
450 PyMem_Free(codestr);
451 goto exitUnchanged;
452 }
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000453 assert(PyTuple_Check(consts));
454
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000455 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000456 opcode = codestr[i];
457 switch (opcode) {
458
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000459 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
460 with JUMP_IF_TRUE POP_TOP NOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000461 case UNARY_NOT:
462 if (codestr[i+1] != JUMP_IF_FALSE ||
463 codestr[i+4] != POP_TOP ||
464 !ISBASICBLOCK(blocks,i,5))
465 continue;
466 tgt = GETJUMPTGT(codestr, (i+1));
467 if (codestr[tgt] != POP_TOP)
468 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000469 j = GETARG(codestr, i+1) + 1;
470 codestr[i] = JUMP_IF_TRUE;
471 SETARG(codestr, i, j);
472 codestr[i+3] = POP_TOP;
473 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000474 break;
475
476 /* not a is b --> a is not b
477 not a in b --> a not in b
478 not a is not b --> a is b
479 not a not in b --> a in b */
480 case COMPARE_OP:
481 j = GETARG(codestr, i);
482 if (j < 6 || j > 9 ||
483 codestr[i+3] != UNARY_NOT ||
484 !ISBASICBLOCK(blocks,i,4))
485 continue;
486 SETARG(codestr, i, (j^1));
487 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000488 break;
489
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000490 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
491 case LOAD_NAME:
492 case LOAD_GLOBAL:
493 j = GETARG(codestr, i);
494 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
495 if (name == NULL || strcmp(name, "None") != 0)
496 continue;
497 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
498 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
499 codestr[i] = LOAD_CONST;
500 SETARG(codestr, i, j);
501 break;
502 }
503 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000504 break;
505
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000506 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP.
507 Note, only the first opcode is changed, the others still
508 perform normally if they happen to be jump targets. */
509 case LOAD_CONST:
510 j = GETARG(codestr, i);
511 if (codestr[i+3] != JUMP_IF_FALSE ||
512 codestr[i+6] != POP_TOP ||
513 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
514 continue;
515 codestr[i] = JUMP_FORWARD;
516 SETARG(codestr, i, 4);
517 break;
518
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000519 /* Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2 JMP+2 NOP NOP.
520 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2 JMP+1 NOP. */
521 case BUILD_TUPLE:
522 case BUILD_LIST:
523 if (codestr[i+3] != UNPACK_SEQUENCE)
524 continue;
525 if (!ISBASICBLOCK(blocks,i,6))
526 continue;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000527 if (GETARG(codestr, i) == 2 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000528 GETARG(codestr, i+3) == 2) {
529 codestr[i] = ROT_TWO;
530 codestr[i+1] = JUMP_FORWARD;
531 SETARG(codestr, i+1, 2);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000532 codestr[i+4] = NOP;
533 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000534 continue;
535 }
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000536 if (GETARG(codestr, i) == 3 &&
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537 GETARG(codestr, i+3) == 3) {
538 codestr[i] = ROT_THREE;
539 codestr[i+1] = ROT_TWO;
540 codestr[i+2] = JUMP_FORWARD;
541 SETARG(codestr, i+2, 1);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000542 codestr[i+5] = NOP;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000543 }
544 break;
545
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000546 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000547 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000548 case JUMP_FORWARD:
549 case JUMP_IF_FALSE:
550 case JUMP_IF_TRUE:
551 case JUMP_ABSOLUTE:
552 case CONTINUE_LOOP:
553 case SETUP_LOOP:
554 case SETUP_EXCEPT:
555 case SETUP_FINALLY:
556 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000557 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000558 continue;
559 tgttgt = GETJUMPTGT(codestr, tgt);
560 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
561 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000562 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000563 tgttgt -= i + 3; /* Calc relative jump addr */
564 if (tgttgt < 0) /* No backward relative jumps */
565 continue;
566 codestr[i] = opcode;
567 SETARG(codestr, i, tgttgt);
568 break;
569
570 case EXTENDED_ARG:
571 PyMem_Free(codestr);
572 goto exitUnchanged;
573 }
574 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000575 code = PyString_FromStringAndSize((char *)codestr, codelen);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000576 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000577 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000578 return code;
579
580exitUnchanged:
581 Py_INCREF(code);
582 return code;
583}
584
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000586PyCode_New(int argcount, int nlocals, int stacksize, int flags,
587 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000588 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
589 PyObject *filename, PyObject *name, int firstlineno,
590 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000591{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000593 int i;
594 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000595 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000596 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 consts == NULL || !PyTuple_Check(consts) ||
598 names == NULL || !PyTuple_Check(names) ||
599 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000600 freevars == NULL || !PyTuple_Check(freevars) ||
601 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 name == NULL || !PyString_Check(name) ||
603 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000604 lnotab == NULL || !PyString_Check(lnotab) ||
605 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000606 PyErr_BadInternalCall();
607 return NULL;
608 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000609 intern_strings(names);
610 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000611 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000612 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000613 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 for (i = PyTuple_Size(consts); --i >= 0; ) {
615 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000617 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000618 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000619 continue;
620 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000621 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000623 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000624 co->co_argcount = argcount;
625 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000626 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000627 co->co_flags = flags;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000628 co->co_code = optimize_code(code, consts, names);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000630 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000632 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000634 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000635 Py_INCREF(freevars);
636 co->co_freevars = freevars;
637 Py_INCREF(cellvars);
638 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000640 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000642 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000643 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000645 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000646 if (PyTuple_GET_SIZE(freevars) == 0 &&
647 PyTuple_GET_SIZE(cellvars) == 0)
648 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000649 }
650 return co;
651}
652
653
654/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000655
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000656/* The compiler uses two passes to generate bytecodes. The first pass
657 builds the symbol table. The second pass generates the bytecode.
658
659 The first pass uses a single symtable struct. The second pass uses
660 a compiling struct for each code block. The compiling structs
661 share a reference to the symtable.
662
663 The two passes communicate via symtable_load_symbols() and via
664 is_local() and is_global(). The former initializes several slots
665 in the compiling struct: c_varnames, c_locals, c_nlocals,
666 c_argcount, c_globals, and c_flags.
667*/
668
Tim Peters2a7f3842001-06-09 09:26:21 +0000669/* All about c_lnotab.
670
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000671c_lnotab is an array of unsigned bytes disguised as a Python string. Since
672version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
673mapped to source code line #s via c_lnotab instead.
674
Tim Peters2a7f3842001-06-09 09:26:21 +0000675The array is conceptually a list of
676 (bytecode offset increment, line number increment)
677pairs. The details are important and delicate, best illustrated by example:
678
679 byte code offset source code line number
680 0 1
681 6 2
682 50 7
683 350 307
684 361 308
685
686The first trick is that these numbers aren't stored, only the increments
687from one row to the next (this doesn't really work, but it's a start):
688
689 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
690
691The second trick is that an unsigned byte can't hold negative values, or
692values larger than 255, so (a) there's a deep assumption that byte code
693offsets and their corresponding line #s both increase monotonically, and (b)
694if at least one column jumps by more than 255 from one row to the next, more
695than one pair is written to the table. In case #b, there's no way to know
696from looking at the table later how many were written. That's the delicate
697part. A user of c_lnotab desiring to find the source line number
698corresponding to a bytecode address A should do something like this
699
700 lineno = addr = 0
701 for addr_incr, line_incr in c_lnotab:
702 addr += addr_incr
703 if addr > A:
704 return lineno
705 lineno += line_incr
706
707In order for this to work, when the addr field increments by more than 255,
708the line # increment in each pair generated must be 0 until the remaining addr
709increment is < 256. So, in the example above, com_set_lineno should not (as
710was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
711255, 0, 45, 255, 0, 45.
712*/
713
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000715 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000717 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000719 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000720 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 PyObject *c_locals; /* dictionary (value=localID) */
722 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000723 PyObject *c_freevars; /* dictionary (value=None) */
724 PyObject *c_cellvars; /* list */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000725 int c_nlocals; /* index of next local */
726 int c_argcount; /* number of top-level arguments */
727 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 int c_nexti; /* index into c_code */
729 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000730 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000731 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000732 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000733 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000734 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000735 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000736 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000737 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000738 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000739 int c_stacklevel; /* Current stack level */
740 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000741 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000743 int c_last_addr; /* last op addr seen and recorded in lnotab */
744 int c_last_line; /* last line seen and recorded in lnotab */
745 int c_lnotab_next; /* current length of lnotab */
746 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000747 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000748 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000749 int c_nested; /* Is block nested funcdef or lamdef? */
750 int c_closure; /* Is nested w/freevars? */
751 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000752 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000753 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000754};
755
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000756static int
757is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000758{
759 if ((v & (USE | DEF_FREE))
760 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
761 return 1;
762 if (v & DEF_FREE_CLASS)
763 return 1;
764 return 0;
765}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000766
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000767static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000768com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000769{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000770 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
771
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000772 if (c == NULL) {
773 /* Error occurred via symtable call to
774 is_constant_false */
775 PyErr_SetString(exc, msg);
776 return;
777 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000778 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000779 if (c->c_lineno < 1 || c->c_interactive) {
780 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000782 return;
783 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000784 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000785 if (v == NULL)
786 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000787
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000788 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000789 if (line == NULL) {
790 Py_INCREF(Py_None);
791 line = Py_None;
792 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000793 if (exc == PyExc_SyntaxError) {
794 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
795 Py_None, line);
796 if (t == NULL)
797 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000798 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000799 if (w == NULL)
800 goto exit;
801 PyErr_SetObject(exc, w);
802 } else {
803 /* Make sure additional exceptions are printed with
804 file and line, also. */
805 PyErr_SetObject(exc, v);
806 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
807 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000808 exit:
809 Py_XDECREF(t);
810 Py_XDECREF(v);
811 Py_XDECREF(w);
812 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000813}
814
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000815/* Interface to the block stack */
816
817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000818block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000819{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000820 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 com_error(c, PyExc_SystemError,
822 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000823 }
824 else {
825 c->c_block[c->c_nblocks++] = type;
826 }
827}
828
829static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000830block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000831{
832 if (c->c_nblocks > 0)
833 c->c_nblocks--;
834 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000836 }
837}
838
Guido van Rossum681d79a1995-07-18 14:51:37 +0000839/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000840
Martin v. Löwis95292d62002-12-11 14:04:59 +0000841static int issue_warning(const char *, const char *, int);
842static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000843static void com_free(struct compiling *);
844static void com_push(struct compiling *, int);
845static void com_pop(struct compiling *, int);
846static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000847static void com_node(struct compiling *, node *);
848static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000849static void com_addbyte(struct compiling *, int);
850static void com_addint(struct compiling *, int);
851static void com_addoparg(struct compiling *, int, int);
852static void com_addfwref(struct compiling *, int, int *);
853static void com_backpatch(struct compiling *, int);
854static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
855static int com_addconst(struct compiling *, PyObject *);
856static int com_addname(struct compiling *, PyObject *);
857static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000858static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000859static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000860static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000861static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000862static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000863static void com_assign(struct compiling *, node *, int, node *);
864static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000865static int com_make_closure(struct compiling *c, PyCodeObject *co);
866
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000867static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000868static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000869 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000870static PyObject *parsestrplus(struct compiling*, node *);
871static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000872static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000873
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000874static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000875
876/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000877static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000878static struct symtable *symtable_build(node *, PyFutureFeatures *,
879 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000880static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000881static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000882static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000883static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000884static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000885static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000886
887static void symtable_node(struct symtable *, node *);
888static void symtable_funcdef(struct symtable *, node *);
889static void symtable_default_args(struct symtable *, node *);
890static void symtable_params(struct symtable *, node *);
891static void symtable_params_fplist(struct symtable *, node *n);
892static void symtable_global(struct symtable *, node *);
893static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000894static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000895static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000896static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000897static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000898static void symtable_gen_for(struct symtable *, node *, int);
899static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000900
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000901static int symtable_update_free_vars(struct symtable *);
902static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
903static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
904
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000905/* helper */
906static void
907do_pad(int pad)
908{
909 int i;
910 for (i = 0; i < pad; ++i)
911 fprintf(stderr, " ");
912}
913
914static void
915dump(node *n, int pad, int depth)
916{
917 int i;
918 if (depth == 0)
919 return;
920 do_pad(pad);
921 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
922 if (depth > 0)
923 depth--;
924 for (i = 0; i < NCH(n); ++i)
925 dump(CHILD(n, i), pad + 1, depth);
926}
927
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000928static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000929com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000931 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
933 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000934 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000936 goto fail;
937 if ((c->c_const_dict = PyDict_New()) == NULL)
938 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000940 goto fail;
941 if ((c->c_name_dict = PyDict_New()) == NULL)
942 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000944 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
946 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000947 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000949 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000950 c->c_freevars = NULL;
951 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000952 c->c_nlocals = 0;
953 c->c_argcount = 0;
954 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000955 c->c_nexti = 0;
956 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000957 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000958 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000959 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000960 c->c_begin = 0;
961 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000963 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +0000964 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000965 c->c_stacklevel = 0;
966 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000967 c->c_firstlineno = 0;
968 c->c_last_addr = 0;
969 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +0000970 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +0000971 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +0000972 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000973 c->c_nested = 0;
974 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000976 return 1;
977
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000978 fail:
979 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980 return 0;
981}
982
983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000984com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 Py_XDECREF(c->c_code);
987 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000988 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000990 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 Py_XDECREF(c->c_globals);
992 Py_XDECREF(c->c_locals);
993 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000994 Py_XDECREF(c->c_freevars);
995 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +0000997 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +0000998 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000999}
1000
1001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001002com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001003{
1004 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001005 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001006 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001007 /*
1008 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1009 c->c_filename, c->c_name, c->c_lineno,
1010 c->c_nexti, c->c_stacklevel, n);
1011 */
1012 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001013}
1014
1015static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001016com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001017{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001018 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001019 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001020 else
1021 c->c_stacklevel -= n;
1022}
1023
1024static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001025com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
1027 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001029 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031}
1032
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001033static int
1034com_check_size(PyObject **s, int offset)
1035{
1036 int len = PyString_GET_SIZE(*s);
1037 if (offset >= len)
1038 return _PyString_Resize(s, len * 2);
1039 return 0;
1040}
1041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001043com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001045 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001046 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001047 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001048 if (com_check_size(&c->c_code, c->c_nexti)) {
1049 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001050 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001052 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053}
1054
1055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001056com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001058 com_addbyte(c, x & 0xff);
1059 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001060}
1061
1062static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001063com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001064{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001065 char *p;
1066 if (c->c_lnotab == NULL)
1067 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001068 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1069 c->c_errors++;
1070 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001071 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001072 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001073 *p++ = addr;
1074 *p++ = line;
1075 c->c_lnotab_next += 2;
1076}
1077
1078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001079com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001080{
1081 c->c_lineno = lineno;
1082 if (c->c_firstlineno == 0) {
1083 c->c_firstlineno = c->c_last_line = lineno;
1084 }
1085 else {
1086 int incr_addr = c->c_nexti - c->c_last_addr;
1087 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001088 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001089 while (incr_addr > 255) {
1090 com_add_lnotab(c, 255, 0);
1091 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001092 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001093 while (incr_line > 255) {
1094 com_add_lnotab(c, incr_addr, 255);
1095 incr_line -=255;
1096 incr_addr = 0;
1097 }
1098 if (incr_addr > 0 || incr_line > 0)
1099 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001100 c->c_last_addr = c->c_nexti;
1101 c->c_last_line = lineno;
1102 }
1103}
1104
1105static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001106com_strip_lnotab(struct compiling *c)
1107{
1108 /* strip the last lnotab entry if no opcode were emitted.
1109 * This prevents a line number to be generated on a final
1110 * pass, like in the following example:
1111 *
1112 * if a:
1113 * print 5
1114 * else:
1115 * pass
1116 *
1117 * Without the fix, a line trace event would be generated
1118 * on the pass even if a is true (because of the implicit
1119 * return).
1120 */
1121 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1122 c->c_lnotab_next = c->c_lnotab_last;
1123 }
1124}
1125
1126static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001127com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128{
Fred Drakeef8ace32000-08-24 00:32:09 +00001129 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001130 if (extended_arg){
1131 com_addbyte(c, EXTENDED_ARG);
1132 com_addint(c, extended_arg);
1133 arg &= 0xffff;
1134 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001135 com_addbyte(c, op);
1136 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001137}
1138
1139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141{
1142 /* Compile a forward reference for backpatching */
1143 int here;
1144 int anchor;
1145 com_addbyte(c, op);
1146 here = c->c_nexti;
1147 anchor = *p_anchor;
1148 *p_anchor = here;
1149 com_addint(c, anchor == 0 ? 0 : here - anchor);
1150}
1151
1152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001153com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001154{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001155 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001157 int dist;
1158 int prev;
1159 for (;;) {
1160 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001161 prev = code[anchor] + (code[anchor+1] << 8);
1162 dist = target - (anchor+2);
1163 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001164 dist >>= 8;
1165 code[anchor+1] = dist;
1166 dist >>= 8;
1167 if (dist) {
1168 com_error(c, PyExc_SystemError,
1169 "com_backpatch: offset too large");
1170 break;
1171 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001172 if (!prev)
1173 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001174 anchor -= prev;
1175 }
1176}
1177
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001178/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001179
1180static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001181com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001182{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001183 PyObject *w, *t, *np=NULL;
1184 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001185
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001186 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001187 if (t == NULL)
1188 goto fail;
1189 w = PyDict_GetItem(dict, t);
1190 if (w != NULL) {
1191 n = PyInt_AsLong(w);
1192 } else {
1193 n = PyList_Size(list);
1194 np = PyInt_FromLong(n);
1195 if (np == NULL)
1196 goto fail;
1197 if (PyList_Append(list, v) != 0)
1198 goto fail;
1199 if (PyDict_SetItem(dict, t, np) != 0)
1200 goto fail;
1201 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001202 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001203 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001204 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001205 fail:
1206 Py_XDECREF(np);
1207 Py_XDECREF(t);
1208 c->c_errors++;
1209 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210}
1211
1212static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001213com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001214{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001215 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001216}
1217
1218static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001219com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001221 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222}
1223
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001224int
1225_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001226{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001227 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001228 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001229 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001230 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1231 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001232 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001233 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001234 return 0; /* Don't mangle __extremely_long_names */
1235 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1236 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001237 /* Strip leading underscores from class name */
1238 while (*p == '_')
1239 p++;
1240 if (*p == '\0')
1241 return 0; /* Don't mangle if class is just underscores */
1242 plen = strlen(p);
1243 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001244 plen = maxlen-nlen-2; /* Truncate class name if too long */
1245 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001246 buffer[0] = '_';
1247 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001248 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001249 return 1;
1250}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001251
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001253com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001254{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001256 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001257 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001258
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001259 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001260 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001261 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001262 c->c_errors++;
1263 i = 255;
1264 }
1265 else {
1266 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001269 com_addoparg(c, op, i);
1270}
1271
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001272#define NAME_LOCAL 0
1273#define NAME_GLOBAL 1
1274#define NAME_DEFAULT 2
1275#define NAME_CLOSURE 3
1276
1277static int
1278com_lookup_arg(PyObject *dict, PyObject *name)
1279{
1280 PyObject *v = PyDict_GetItem(dict, name);
1281 if (v == NULL)
1282 return -1;
1283 else
1284 return PyInt_AS_LONG(v);
1285}
1286
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001287static int
1288none_assignment_check(struct compiling *c, char *name, int assigning)
1289{
1290 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1291 char *msg;
1292 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001293 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001294 else
1295 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001296 com_error(c, PyExc_SyntaxError, msg);
1297 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001298 }
1299 return 0;
1300}
1301
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001302static void
1303com_addop_varname(struct compiling *c, int kind, char *name)
1304{
1305 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001306 int i, reftype;
1307 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001308 int op = STOP_CODE;
1309 char buffer[MANGLE_LEN];
1310
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001311 if (kind != VAR_LOAD &&
1312 none_assignment_check(c, name, kind == VAR_STORE))
1313 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001314 i = 255;
1315 goto done;
1316 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001317 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001318 name = buffer;
1319 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1320 c->c_errors++;
1321 i = 255;
1322 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001323 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001324
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001325 reftype = get_ref_type(c, name);
1326 switch (reftype) {
1327 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001328 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001329 scope = NAME_LOCAL;
1330 break;
1331 case GLOBAL_EXPLICIT:
1332 scope = NAME_GLOBAL;
1333 break;
1334 case GLOBAL_IMPLICIT:
1335 if (c->c_flags & CO_OPTIMIZED)
1336 scope = NAME_GLOBAL;
1337 break;
1338 case FREE:
1339 case CELL:
1340 scope = NAME_CLOSURE;
1341 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001342 }
1343
1344 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001345 if (scope == NAME_LOCAL)
1346 i = com_lookup_arg(c->c_locals, v);
1347 else if (reftype == FREE)
1348 i = com_lookup_arg(c->c_freevars, v);
1349 else if (reftype == CELL)
1350 i = com_lookup_arg(c->c_cellvars, v);
1351 if (i == -1) {
1352 c->c_errors++; /* XXX no exception set */
1353 i = 255;
1354 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001355 }
1356 Py_DECREF(v);
1357
1358 switch (kind) {
1359 case VAR_LOAD:
1360 switch (scope) {
1361 case NAME_LOCAL:
1362 op = LOAD_FAST;
1363 break;
1364 case NAME_GLOBAL:
1365 op = LOAD_GLOBAL;
1366 break;
1367 case NAME_DEFAULT:
1368 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001369 break;
1370 case NAME_CLOSURE:
1371 op = LOAD_DEREF;
1372 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001373 }
1374 break;
1375 case VAR_STORE:
1376 switch (scope) {
1377 case NAME_LOCAL:
1378 op = STORE_FAST;
1379 break;
1380 case NAME_GLOBAL:
1381 op = STORE_GLOBAL;
1382 break;
1383 case NAME_DEFAULT:
1384 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001385 break;
1386 case NAME_CLOSURE:
1387 op = STORE_DEREF;
1388 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001389 }
1390 break;
1391 case VAR_DELETE:
1392 switch (scope) {
1393 case NAME_LOCAL:
1394 op = DELETE_FAST;
1395 break;
1396 case NAME_GLOBAL:
1397 op = DELETE_GLOBAL;
1398 break;
1399 case NAME_DEFAULT:
1400 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001401 break;
1402 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001403 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001404 PyOS_snprintf(buf, sizeof(buf),
1405 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001406 com_error(c, PyExc_SyntaxError, buf);
1407 i = 255;
1408 break;
1409 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001410 }
1411 break;
1412 }
1413done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414 com_addoparg(c, op, i);
1415}
1416
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001419{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001420 char *name;
1421 char buffer[1000];
1422 /* XXX it is possible to write this code without the 1000
1423 chars on the total length of dotted names, I just can't be
1424 bothered right now */
1425 if (TYPE(n) == STAR)
1426 name = "*";
1427 else if (TYPE(n) == dotted_name) {
1428 char *p = buffer;
1429 int i;
1430 name = buffer;
1431 for (i = 0; i < NCH(n); i += 2) {
1432 char *s = STR(CHILD(n, i));
1433 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001435 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001436 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001437 break;
1438 }
1439 if (p != buffer)
1440 *p++ = '.';
1441 strcpy(p, s);
1442 p = strchr(p, '\0');
1443 }
1444 }
1445 else {
1446 REQ(n, NAME);
1447 name = STR(n);
1448 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001449 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001450}
1451
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001453parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001455 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001456 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001457 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001458#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001459 int imflag;
1460#endif
1461
Guido van Rossum282914b1991-04-04 10:42:56 +00001462 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001463 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001464#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001465 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001466#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001467 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001469 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001471 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001472 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001473 }
1474 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001475 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001477 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001478 if (errno != 0)
1479 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001481 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001482 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001483#ifndef WITHOUT_COMPLEX
1484 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001485 Py_complex z;
1486 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001487 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001488 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001489 PyFPE_END_PROTECT(z)
1490 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001491 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001492 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001493#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001494 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001495 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001496 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001497 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001499 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500}
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001503decode_utf8(char **sPtr, char *end, char* encoding)
1504{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001505#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001506 Py_FatalError("decode_utf8 should not be called in this build.");
1507 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001508#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001509 PyObject *u, *v;
1510 char *s, *t;
1511 t = s = *sPtr;
1512 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1513 while (s < end && (*s & 0x80)) s++;
1514 *sPtr = s;
1515 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1516 if (u == NULL)
1517 return NULL;
1518 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1519 Py_DECREF(u);
1520 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001521#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001522}
1523
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001524/* compiler.transformer.Transformer.decode_literal depends on what
1525 might seem like minor details of this function -- changes here
1526 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001527static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001528parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001531 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001532 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001533 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001534 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001535 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001536 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001537
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001538 if (isalpha(quote) || quote == '_') {
1539 if (quote == 'u' || quote == 'U') {
1540 quote = *++s;
1541 unicode = 1;
1542 }
1543 if (quote == 'r' || quote == 'R') {
1544 quote = *++s;
1545 rawmode = 1;
1546 }
1547 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001548 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001549 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 return NULL;
1551 }
1552 s++;
1553 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001554 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001555 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001556 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001557 return NULL;
1558 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001559 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561 return NULL;
1562 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001563 if (len >= 4 && s[0] == quote && s[1] == quote) {
1564 s += 2;
1565 len -= 2;
1566 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001568 return NULL;
1569 }
1570 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001571#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001572 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001573 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001574 char *buf;
1575 char *p;
1576 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001577 if (encoding == NULL) {
1578 buf = s;
1579 u = NULL;
1580 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1581 buf = s;
1582 u = NULL;
1583 } else {
1584 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1585 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1586 if (u == NULL)
1587 return NULL;
1588 p = buf = PyString_AsString(u);
1589 end = s + len;
1590 while (s < end) {
1591 if (*s == '\\') {
1592 *p++ = *s++;
1593 if (*s & 0x80) {
1594 strcpy(p, "u005c");
1595 p += 5;
1596 }
1597 }
1598 if (*s & 0x80) { /* XXX inefficient */
1599 char *r;
1600 int rn, i;
1601 w = decode_utf8(&s, end, "utf-16-be");
1602 if (w == NULL) {
1603 Py_DECREF(u);
1604 return NULL;
1605 }
1606 r = PyString_AsString(w);
1607 rn = PyString_Size(w);
1608 assert(rn % 2 == 0);
1609 for (i = 0; i < rn; i += 2) {
1610 sprintf(p, "\\u%02x%02x",
1611 r[i + 0] & 0xFF,
1612 r[i + 1] & 0xFF);
1613 p += 6;
1614 }
1615 Py_DECREF(w);
1616 } else {
1617 *p++ = *s++;
1618 }
1619 }
1620 len = p - buf;
1621 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001622 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001623 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001624 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001625 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1626 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001627 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001628 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001629 return v;
1630
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001631 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001632#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001633 need_encoding = (encoding != NULL &&
1634 strcmp(encoding, "utf-8") != 0 &&
1635 strcmp(encoding, "iso-8859-1") != 0);
1636 if (rawmode || strchr(s, '\\') == NULL) {
1637 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001638#ifndef Py_USING_UNICODE
1639 /* This should not happen - we never see any other
1640 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001641 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001642#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001643 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1644 if (u == NULL)
1645 return NULL;
1646 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1647 Py_DECREF(u);
1648 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001649#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001650 } else {
1651 return PyString_FromStringAndSize(s, len);
1652 }
1653 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001654
1655 v = PyString_DecodeEscape(s, len, NULL, unicode,
1656 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001657 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001658 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001659 return v;
1660}
1661
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001663parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001664{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001666 int i;
1667 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001668 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001669 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001670 for (i = 1; i < NCH(n); i++) {
1671 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001672 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001673 if (s == NULL)
1674 goto onError;
1675 if (PyString_Check(v) && PyString_Check(s)) {
1676 PyString_ConcatAndDel(&v, s);
1677 if (v == NULL)
1678 goto onError;
1679 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001680#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001681 else {
1682 PyObject *temp;
1683 temp = PyUnicode_Concat(v, s);
1684 Py_DECREF(s);
1685 if (temp == NULL)
1686 goto onError;
1687 Py_DECREF(v);
1688 v = temp;
1689 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001690#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001691 }
1692 }
1693 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001694
1695 onError:
1696 Py_XDECREF(v);
1697 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001698}
1699
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001700static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001701com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001702{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001703 int anchor = 0;
1704 int save_begin = c->c_begin;
1705
Raymond Hettinger354433a2004-05-19 08:20:33 +00001706 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001707 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001708 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001709 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001710 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001711 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001712 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001713 c->c_loops++;
1714 com_list_iter(c, n, e, t);
1715 c->c_loops--;
1716 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1717 c->c_begin = save_begin;
1718 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001719 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001720}
1721
1722static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001723com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1724{
1725 int break_anchor = 0;
1726 int anchor = 0;
1727 int save_begin = c->c_begin;
1728
1729 REQ(n, gen_for);
1730 /* gen_for: for v in test [gen_iter] */
1731
1732 com_addfwref(c, SETUP_LOOP, &break_anchor);
1733 block_push(c, SETUP_LOOP);
1734
1735 if (is_outmost) {
1736 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1737 com_push(c, 1);
1738 }
1739 else {
1740 com_node(c, CHILD(n, 3));
1741 com_addbyte(c, GET_ITER);
1742 }
1743
1744 c->c_begin = c->c_nexti;
1745 com_set_lineno(c, c->c_last_line);
1746 com_addfwref(c, FOR_ITER, &anchor);
1747 com_push(c, 1);
1748 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1749
1750 if (NCH(n) == 5)
1751 com_gen_iter(c, CHILD(n, 4), t);
1752 else {
1753 com_test(c, t);
1754 com_addbyte(c, YIELD_VALUE);
1755 com_pop(c, 1);
1756 }
1757
1758 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1759 c->c_begin = save_begin;
1760
1761 com_backpatch(c, anchor);
1762 com_pop(c, 1); /* FOR_ITER has popped this */
1763 com_addbyte(c, POP_BLOCK);
1764 block_pop(c, SETUP_LOOP);
1765 com_backpatch(c, break_anchor);
1766}
1767
1768static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001769com_list_if(struct compiling *c, node *n, node *e, char *t)
1770{
1771 int anchor = 0;
1772 int a = 0;
1773 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001774 com_node(c, CHILD(n, 1));
1775 com_addfwref(c, JUMP_IF_FALSE, &a);
1776 com_addbyte(c, POP_TOP);
1777 com_pop(c, 1);
1778 com_list_iter(c, n, e, t);
1779 com_addfwref(c, JUMP_FORWARD, &anchor);
1780 com_backpatch(c, a);
1781 /* We jump here with an extra entry which we now pop */
1782 com_addbyte(c, POP_TOP);
1783 com_backpatch(c, anchor);
1784}
1785
1786static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001787com_gen_if(struct compiling *c, node *n, node *t)
1788{
1789 /* gen_if: 'if' test [gen_iter] */
1790 int anchor = 0;
1791 int a=0;
1792
1793 com_node(c, CHILD(n, 1));
1794 com_addfwref(c, JUMP_IF_FALSE, &a);
1795 com_addbyte(c, POP_TOP);
1796 com_pop(c, 1);
1797
1798 if (NCH(n) == 3)
1799 com_gen_iter(c, CHILD(n, 2), t);
1800 else {
1801 com_test(c, t);
1802 com_addbyte(c, YIELD_VALUE);
1803 com_pop(c, 1);
1804 }
1805 com_addfwref(c, JUMP_FORWARD, &anchor);
1806 com_backpatch(c, a);
1807 /* We jump here with an extra entry which we now pop */
1808 com_addbyte(c, POP_TOP);
1809 com_backpatch(c, anchor);
1810}
1811
1812static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001813com_list_iter(struct compiling *c,
1814 node *p, /* parent of list_iter node */
1815 node *e, /* element expression node */
1816 char *t /* name of result list temp local */)
1817{
1818 /* list_iter is the last child in a listmaker, list_for, or list_if */
1819 node *n = CHILD(p, NCH(p)-1);
1820 if (TYPE(n) == list_iter) {
1821 n = CHILD(n, 0);
1822 switch (TYPE(n)) {
1823 case list_for:
1824 com_list_for(c, n, e, t);
1825 break;
1826 case list_if:
1827 com_list_if(c, n, e, t);
1828 break;
1829 default:
1830 com_error(c, PyExc_SystemError,
1831 "invalid list_iter node type");
1832 }
1833 }
1834 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001835 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001836 com_push(c, 1);
1837 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001838 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001839 com_pop(c, 2);
1840 }
1841}
1842
1843static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001844com_gen_iter(struct compiling *c, node *n, node *t)
1845{
1846 /* gen_iter: gen_for | gen_if */
1847 node *ch;
1848 REQ(n, gen_iter);
1849
1850 ch = CHILD(n, 0);
1851
1852 switch (TYPE(ch)) {
1853 case gen_for:
1854 com_gen_for(c, ch, t, 0);
1855 break;
1856 case gen_if:
1857 com_gen_if(c, ch, t);
1858 break;
1859 default:
1860 com_error(c, PyExc_SystemError,
1861 "invalid gen_iter node type");
1862 }
1863}
1864
1865static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001866com_list_comprehension(struct compiling *c, node *n)
1867{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001868 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001869 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001870
1871 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001872 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001873 com_addoparg(c, BUILD_LIST, 0);
1874 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1875 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001876 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001877 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001878 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001879 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001880 --c->c_tmpname;
1881}
1882
1883static void
1884com_listmaker(struct compiling *c, node *n)
1885{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001886 /* listmaker: test ( list_for | (',' test)* [','] ) */
1887 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001888 com_list_comprehension(c, n);
1889 else {
1890 int len = 0;
1891 int i;
1892 for (i = 0; i < NCH(n); i += 2, len++)
1893 com_node(c, CHILD(n, i));
1894 com_addoparg(c, BUILD_LIST, len);
1895 com_pop(c, len-1);
1896 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001897}
1898
1899static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001900com_generator_expression(struct compiling *c, node *n)
1901{
1902 /* testlist_gexp: test gen_for */
1903 /* argument: test gen_for */
1904 PyCodeObject *co;
1905
1906 REQ(CHILD(n, 0), test);
1907 REQ(CHILD(n, 1), gen_for);
1908
1909 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1910 n->n_lineno);
1911 co = icompile(n, c);
1912 symtable_exit_scope(c->c_symtable);
1913
1914 if (co == NULL)
1915 c->c_errors++;
1916 else {
1917 int closure = com_make_closure(c, co);
1918 int i = com_addconst(c, (PyObject *)co);
1919
1920 com_addoparg(c, LOAD_CONST, i);
1921 com_push(c, 1);
1922 if (closure)
1923 com_addoparg(c, MAKE_CLOSURE, 0);
1924 else
1925 com_addoparg(c, MAKE_FUNCTION, 0);
1926
1927 com_test(c, CHILD(CHILD(n, 1), 3));
1928 com_addbyte(c, GET_ITER);
1929 com_addoparg(c, CALL_FUNCTION, 1);
1930 com_pop(c, 1);
1931
1932 Py_DECREF(co);
1933 }
1934}
1935
1936static void
1937com_testlist_gexp(struct compiling *c, node *n)
1938{
1939 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
1940 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
1941 com_generator_expression(c, n);
1942 else com_list(c, n, 0);
1943}
1944
Anthony Baxterc2a5a632004-08-02 06:10:11 +00001945
Raymond Hettinger354433a2004-05-19 08:20:33 +00001946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001947com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001948{
1949 int i;
1950 /* dictmaker: test ':' test (',' test ':' value)* [','] */
1951 for (i = 0; i+2 < NCH(n); i += 4) {
1952 /* We must arrange things just right for STORE_SUBSCR.
1953 It wants the stack to look like (value) (dict) (key) */
1954 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001955 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001956 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00001957 com_node(c, CHILD(n, i+2)); /* value */
1958 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001959 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001960 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001961 }
1962}
1963
1964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001965com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001966{
1967 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001969 int i;
1970 REQ(n, atom);
1971 ch = CHILD(n, 0);
1972 switch (TYPE(ch)) {
1973 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00001974 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001975 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001976 com_push(c, 1);
1977 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001978 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00001979 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001980 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001981 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001982 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001983 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001984 com_push(c, 1);
1985 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001986 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00001987 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001989 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001990 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00001991 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001992 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001993 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001994 break;
1995 case BACKQUOTE:
1996 com_node(c, CHILD(n, 1));
1997 com_addbyte(c, UNARY_CONVERT);
1998 break;
1999 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002000 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002001 i = 255;
2002 }
2003 else {
2004 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002006 }
2007 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002008 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002009 break;
2010 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002011 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002012 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013 c->c_errors++;
2014 i = 255;
2015 }
2016 else {
2017 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 }
2020 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002021 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022 break;
2023 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002024 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002025 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002026 break;
2027 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 com_error(c, PyExc_SystemError,
2029 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002030 }
2031}
2032
2033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002034com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002035{
2036 if (NCH(n) == 1) {
2037 com_addbyte(c, op);
2038 }
2039 else if (NCH(n) == 2) {
2040 if (TYPE(CHILD(n, 0)) != COLON) {
2041 com_node(c, CHILD(n, 0));
2042 com_addbyte(c, op+1);
2043 }
2044 else {
2045 com_node(c, CHILD(n, 1));
2046 com_addbyte(c, op+2);
2047 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002048 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002049 }
2050 else {
2051 com_node(c, CHILD(n, 0));
2052 com_node(c, CHILD(n, 2));
2053 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002054 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002055 }
2056}
2057
Guido van Rossum635abd21997-01-06 22:56:52 +00002058static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002059com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2060{
2061 if (NCH(n) == 1) {
2062 com_addbyte(c, DUP_TOP);
2063 com_push(c, 1);
2064 com_addbyte(c, SLICE);
2065 com_node(c, augn);
2066 com_addbyte(c, opcode);
2067 com_pop(c, 1);
2068 com_addbyte(c, ROT_TWO);
2069 com_addbyte(c, STORE_SLICE);
2070 com_pop(c, 2);
2071 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2072 com_node(c, CHILD(n, 0));
2073 com_addoparg(c, DUP_TOPX, 2);
2074 com_push(c, 2);
2075 com_addbyte(c, SLICE+1);
2076 com_pop(c, 1);
2077 com_node(c, augn);
2078 com_addbyte(c, opcode);
2079 com_pop(c, 1);
2080 com_addbyte(c, ROT_THREE);
2081 com_addbyte(c, STORE_SLICE+1);
2082 com_pop(c, 3);
2083 } else if (NCH(n) == 2) {
2084 com_node(c, CHILD(n, 1));
2085 com_addoparg(c, DUP_TOPX, 2);
2086 com_push(c, 2);
2087 com_addbyte(c, SLICE+2);
2088 com_pop(c, 1);
2089 com_node(c, augn);
2090 com_addbyte(c, opcode);
2091 com_pop(c, 1);
2092 com_addbyte(c, ROT_THREE);
2093 com_addbyte(c, STORE_SLICE+2);
2094 com_pop(c, 3);
2095 } else {
2096 com_node(c, CHILD(n, 0));
2097 com_node(c, CHILD(n, 2));
2098 com_addoparg(c, DUP_TOPX, 3);
2099 com_push(c, 3);
2100 com_addbyte(c, SLICE+3);
2101 com_pop(c, 2);
2102 com_node(c, augn);
2103 com_addbyte(c, opcode);
2104 com_pop(c, 1);
2105 com_addbyte(c, ROT_FOUR);
2106 com_addbyte(c, STORE_SLICE+3);
2107 com_pop(c, 4);
2108 }
2109}
2110
2111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002112com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002113{
2114 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002115 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002116 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002117 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002118 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002119 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002120 }
2121 else {
2122 com_node(c, CHILD(n, 0));
2123 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002124 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002125 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002126 if (NCH(n) == 2) {
2127 com_generator_expression(c, n);
2128 return;
2129 }
2130
Guido van Rossumf10570b1995-07-07 22:53:21 +00002131 m = n;
2132 do {
2133 m = CHILD(m, 0);
2134 } while (NCH(m) == 1);
2135 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002136 /* f(lambda x: x[0] = 3) ends up getting parsed with
2137 * LHS test = lambda x: x[0], and RHS test = 3.
2138 * SF bug 132313 points out that complaining about a keyword
2139 * then is very confusing.
2140 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002141 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002142 TYPE(m) == lambdef ?
2143 "lambda cannot contain assignment" :
2144 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002145 }
2146 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002147 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002148 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002149 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002150 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002151 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002152 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002153 else if (*pkeywords == NULL) {
2154 c->c_errors++;
2155 Py_DECREF(v);
2156 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002157 if (PyDict_GetItem(*pkeywords, v) != NULL)
2158 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002159 "duplicate keyword argument");
2160 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002161 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002162 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002163 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002164 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002165 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002166 }
2167 }
2168 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002169}
2170
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002172com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002173{
2174 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002175 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002176 }
2177 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002178 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002179 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002180 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002181 int star_flag = 0;
2182 int starstar_flag = 0;
2183 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002184 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002185 na = 0;
2186 nk = 0;
2187 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002188 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002189 if (TYPE(ch) == STAR ||
2190 TYPE(ch) == DOUBLESTAR)
2191 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002192 if (ch->n_lineno != lineno) {
2193 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002194 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002195 }
2196 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002197 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002198 na++;
2199 else
2200 nk++;
2201 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002203 while (i < NCH(n)) {
2204 node *tok = CHILD(n, i);
2205 node *ch = CHILD(n, i+1);
2206 i += 3;
2207 switch (TYPE(tok)) {
2208 case STAR: star_flag = 1; break;
2209 case DOUBLESTAR: starstar_flag = 1; break;
2210 }
2211 com_node(c, ch);
2212 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002213 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 com_error(c, PyExc_SyntaxError,
2215 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002217 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002218 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002219 star_flag + (starstar_flag << 1);
2220 else
2221 opcode = CALL_FUNCTION;
2222 com_addoparg(c, opcode, na | (nk << 8));
2223 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002224 }
2225}
2226
2227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002228com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002229{
2230 com_addopname(c, LOAD_ATTR, n);
2231}
2232
2233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002234com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002235{
2236 int i=0;
2237 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002238 node *ch;
2239
2240 /* first argument */
2241 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002243 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002244 i++;
2245 }
2246 else {
2247 com_node(c, CHILD(n,i));
2248 i++;
2249 REQ(CHILD(n,i),COLON);
2250 i++;
2251 }
2252 /* second argument */
2253 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2254 com_node(c, CHILD(n,i));
2255 i++;
2256 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002257 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002258 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002259 com_push(c, 1);
2260 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002261 /* remaining arguments */
2262 for (; i < NCH(n); i++) {
2263 ns++;
2264 ch=CHILD(n,i);
2265 REQ(ch, sliceop);
2266 if (NCH(ch) == 1) {
2267 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002268 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002269 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002270 }
2271 else
2272 com_node(c, CHILD(ch,1));
2273 }
2274 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002276}
2277
2278static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002279com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002280{
2281 node *ch;
2282 REQ(n, subscript);
2283 ch = CHILD(n,0);
2284 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002285 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002286 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 com_push(c, 1);
2288 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002289 else {
2290 /* check for slice */
2291 if ((TYPE(ch) == COLON || NCH(n) > 1))
2292 com_sliceobj(c, n);
2293 else {
2294 REQ(ch, test);
2295 com_node(c, ch);
2296 }
2297 }
2298}
2299
2300static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002301com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002302{
2303 int i, op;
2304 REQ(n, subscriptlist);
2305 /* Check to make backward compatible slice behavior for '[i:j]' */
2306 if (NCH(n) == 1) {
2307 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002308 /* 'Basic' slice, should have exactly one colon. */
2309 if ((TYPE(CHILD(sub, 0)) == COLON
2310 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2311 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2312 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002313 switch (assigning) {
2314 case OP_DELETE:
2315 op = DELETE_SLICE;
2316 break;
2317 case OP_ASSIGN:
2318 op = STORE_SLICE;
2319 break;
2320 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002321 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002322 break;
2323 default:
2324 com_augassign_slice(c, sub, assigning, augn);
2325 return;
2326 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002327 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 if (op == STORE_SLICE)
2329 com_pop(c, 2);
2330 else if (op == DELETE_SLICE)
2331 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002332 return;
2333 }
2334 }
2335 /* Else normal subscriptlist. Compile each subscript. */
2336 for (i = 0; i < NCH(n); i += 2)
2337 com_subscript(c, CHILD(n, i));
2338 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 if (NCH(n) > 1) {
2340 i = (NCH(n)+1) / 2;
2341 com_addoparg(c, BUILD_TUPLE, i);
2342 com_pop(c, i-1);
2343 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002344 switch (assigning) {
2345 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 op = DELETE_SUBSCR;
2347 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002348 break;
2349 default:
2350 case OP_ASSIGN:
2351 op = STORE_SUBSCR;
2352 i = 3;
2353 break;
2354 case OP_APPLY:
2355 op = BINARY_SUBSCR;
2356 i = 1;
2357 break;
2358 }
2359 if (assigning > OP_APPLY) {
2360 com_addoparg(c, DUP_TOPX, 2);
2361 com_push(c, 2);
2362 com_addbyte(c, BINARY_SUBSCR);
2363 com_pop(c, 1);
2364 com_node(c, augn);
2365 com_addbyte(c, assigning);
2366 com_pop(c, 1);
2367 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002369 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002370 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002371}
2372
2373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002374com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375{
2376 REQ(n, trailer);
2377 switch (TYPE(CHILD(n, 0))) {
2378 case LPAR:
2379 com_call_function(c, CHILD(n, 1));
2380 break;
2381 case DOT:
2382 com_select_member(c, CHILD(n, 1));
2383 break;
2384 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002385 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 break;
2387 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002389 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 }
2391}
2392
2393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002395{
2396 int i;
2397 REQ(n, power);
2398 com_atom(c, CHILD(n, 0));
2399 for (i = 1; i < NCH(n); i++) {
2400 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2401 com_factor(c, CHILD(n, i+1));
2402 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002404 break;
2405 }
2406 else
2407 com_apply_trailer(c, CHILD(n, i));
2408 }
2409}
2410
2411static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002412com_invert_constant(struct compiling *c, node *n)
2413{
2414 /* Compute the inverse of int and longs and use them directly,
2415 but be prepared to generate code for all other
2416 possibilities (invalid numbers, floats, complex).
2417 */
2418 PyObject *num, *inv = NULL;
2419 int i;
2420
2421 REQ(n, NUMBER);
2422 num = parsenumber(c, STR(n));
2423 if (num == NULL)
2424 i = 255;
2425 else {
2426 inv = PyNumber_Invert(num);
2427 if (inv == NULL) {
2428 PyErr_Clear();
2429 i = com_addconst(c, num);
2430 } else {
2431 i = com_addconst(c, inv);
2432 Py_DECREF(inv);
2433 }
2434 Py_DECREF(num);
2435 }
2436 com_addoparg(c, LOAD_CONST, i);
2437 com_push(c, 1);
2438 if (num != NULL && inv == NULL)
2439 com_addbyte(c, UNARY_INVERT);
2440}
2441
Tim Peters51e26512001-09-07 08:45:55 +00002442static int
2443is_float_zero(const char *p)
2444{
2445 int found_radix_point = 0;
2446 int ch;
2447 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2448 switch (ch) {
2449 case '0':
2450 /* no reason to believe it's not 0 -- continue */
2451 break;
2452
2453 case 'e': case 'E': case 'j': case 'J':
2454 /* If this was a hex constant, we already would have
2455 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2456 must be an exponent marker, and we haven't yet
2457 seen a non-zero digit, and it doesn't matter what
2458 the exponent is then. For 'j' or 'J' similarly,
2459 except that this is an imaginary 0 then. */
2460 return 1;
2461
2462 case '.':
2463 found_radix_point = 1;
2464 break;
2465
2466 default:
2467 return 0;
2468 }
2469 }
2470 return found_radix_point;
2471}
2472
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002473static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002474com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002475{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002476 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002477 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002479 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002480 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002481 approriate value as a constant. If the value is negative,
2482 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002483 negative in the 0th position -- unless we're doing unary minus
2484 of a floating zero! In that case the sign is significant, but
2485 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002486 */
2487 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002488 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002489 && TYPE((pfactor = CHILD(n, 1))) == factor
2490 && NCH(pfactor) == 1
2491 && TYPE((ppower = CHILD(pfactor, 0))) == power
2492 && NCH(ppower) == 1
2493 && TYPE((patom = CHILD(ppower, 0))) == atom
2494 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002495 && !(childtype == MINUS &&
2496 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002497 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002498 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002499 return;
2500 }
2501 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002502 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002503 if (s == NULL) {
2504 com_error(c, PyExc_MemoryError, "");
2505 com_addbyte(c, 255);
2506 return;
2507 }
2508 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002509 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002510 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002511 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002512 }
Tim Peters51e26512001-09-07 08:45:55 +00002513 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002514 }
2515 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002516 com_factor(c, CHILD(n, 1));
2517 com_addbyte(c, UNARY_POSITIVE);
2518 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002519 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002520 com_factor(c, CHILD(n, 1));
2521 com_addbyte(c, UNARY_NEGATIVE);
2522 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002523 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002524 com_factor(c, CHILD(n, 1));
2525 com_addbyte(c, UNARY_INVERT);
2526 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002527 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002528 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002529 }
2530}
2531
2532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002533com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002534{
2535 int i;
2536 int op;
2537 REQ(n, term);
2538 com_factor(c, CHILD(n, 0));
2539 for (i = 2; i < NCH(n); i += 2) {
2540 com_factor(c, CHILD(n, i));
2541 switch (TYPE(CHILD(n, i-1))) {
2542 case STAR:
2543 op = BINARY_MULTIPLY;
2544 break;
2545 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002546 if (c->c_flags & CO_FUTURE_DIVISION)
2547 op = BINARY_TRUE_DIVIDE;
2548 else
2549 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002550 break;
2551 case PERCENT:
2552 op = BINARY_MODULO;
2553 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002554 case DOUBLESLASH:
2555 op = BINARY_FLOOR_DIVIDE;
2556 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002557 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002558 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002559 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002560 op = 255;
2561 }
2562 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002564 }
2565}
2566
2567static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002568com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002569{
2570 int i;
2571 int op;
2572 REQ(n, arith_expr);
2573 com_term(c, CHILD(n, 0));
2574 for (i = 2; i < NCH(n); i += 2) {
2575 com_term(c, CHILD(n, i));
2576 switch (TYPE(CHILD(n, i-1))) {
2577 case PLUS:
2578 op = BINARY_ADD;
2579 break;
2580 case MINUS:
2581 op = BINARY_SUBTRACT;
2582 break;
2583 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002584 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002585 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002586 op = 255;
2587 }
2588 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002590 }
2591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002595{
2596 int i;
2597 int op;
2598 REQ(n, shift_expr);
2599 com_arith_expr(c, CHILD(n, 0));
2600 for (i = 2; i < NCH(n); i += 2) {
2601 com_arith_expr(c, CHILD(n, i));
2602 switch (TYPE(CHILD(n, i-1))) {
2603 case LEFTSHIFT:
2604 op = BINARY_LSHIFT;
2605 break;
2606 case RIGHTSHIFT:
2607 op = BINARY_RSHIFT;
2608 break;
2609 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002610 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002611 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002612 op = 255;
2613 }
2614 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002616 }
2617}
2618
2619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002621{
2622 int i;
2623 int op;
2624 REQ(n, and_expr);
2625 com_shift_expr(c, CHILD(n, 0));
2626 for (i = 2; i < NCH(n); i += 2) {
2627 com_shift_expr(c, CHILD(n, i));
2628 if (TYPE(CHILD(n, i-1)) == AMPER) {
2629 op = BINARY_AND;
2630 }
2631 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002632 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002633 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002634 op = 255;
2635 }
2636 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002637 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002638 }
2639}
2640
2641static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002642com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002643{
2644 int i;
2645 int op;
2646 REQ(n, xor_expr);
2647 com_and_expr(c, CHILD(n, 0));
2648 for (i = 2; i < NCH(n); i += 2) {
2649 com_and_expr(c, CHILD(n, i));
2650 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2651 op = BINARY_XOR;
2652 }
2653 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002654 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002655 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002656 op = 255;
2657 }
2658 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002660 }
2661}
2662
2663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002665{
2666 int i;
2667 int op;
2668 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002669 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002670 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002671 com_xor_expr(c, CHILD(n, i));
2672 if (TYPE(CHILD(n, i-1)) == VBAR) {
2673 op = BINARY_OR;
2674 }
2675 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002676 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002677 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002678 op = 255;
2679 }
2680 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002682 }
2683}
2684
2685static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002686cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002687{
2688 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002689 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002690 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2691 if (NCH(n) == 1) {
2692 n = CHILD(n, 0);
2693 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002694 case LESS: return PyCmp_LT;
2695 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002696 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002697 case LESSEQUAL: return PyCmp_LE;
2698 case GREATEREQUAL: return PyCmp_GE;
2699 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2700 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2701 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002702 }
2703 }
2704 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002707 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002708 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002709 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
2711 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002712 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002717{
2718 int i;
2719 enum cmp_op op;
2720 int anchor;
2721 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2722 com_expr(c, CHILD(n, 0));
2723 if (NCH(n) == 1)
2724 return;
2725
2726 /****************************************************************
2727 The following code is generated for all but the last
2728 comparison in a chain:
2729
2730 label: on stack: opcode: jump to:
2731
2732 a <code to load b>
2733 a, b DUP_TOP
2734 a, b, b ROT_THREE
2735 b, a, b COMPARE_OP
2736 b, 0-or-1 JUMP_IF_FALSE L1
2737 b, 1 POP_TOP
2738 b
2739
2740 We are now ready to repeat this sequence for the next
2741 comparison in the chain.
2742
2743 For the last we generate:
2744
2745 b <code to load c>
2746 b, c COMPARE_OP
2747 0-or-1
2748
2749 If there were any jumps to L1 (i.e., there was more than one
2750 comparison), we generate:
2751
2752 0-or-1 JUMP_FORWARD L2
2753 L1: b, 0 ROT_TWO
2754 0, b POP_TOP
2755 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002756 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757 ****************************************************************/
2758
2759 anchor = 0;
2760
2761 for (i = 2; i < NCH(n); i += 2) {
2762 com_expr(c, CHILD(n, i));
2763 if (i+2 < NCH(n)) {
2764 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 com_addbyte(c, ROT_THREE);
2767 }
2768 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002769 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002770 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002771 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 }
2773 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002774 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002775 if (i+2 < NCH(n)) {
2776 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2777 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002778 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 }
2780 }
2781
2782 if (anchor) {
2783 int anchor2 = 0;
2784 com_addfwref(c, JUMP_FORWARD, &anchor2);
2785 com_backpatch(c, anchor);
2786 com_addbyte(c, ROT_TWO);
2787 com_addbyte(c, POP_TOP);
2788 com_backpatch(c, anchor2);
2789 }
2790}
2791
2792static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002793com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794{
2795 REQ(n, not_test); /* 'not' not_test | comparison */
2796 if (NCH(n) == 1) {
2797 com_comparison(c, CHILD(n, 0));
2798 }
2799 else {
2800 com_not_test(c, CHILD(n, 1));
2801 com_addbyte(c, UNARY_NOT);
2802 }
2803}
2804
2805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002806com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002807{
2808 int i;
2809 int anchor;
2810 REQ(n, and_test); /* not_test ('and' not_test)* */
2811 anchor = 0;
2812 i = 0;
2813 for (;;) {
2814 com_not_test(c, CHILD(n, i));
2815 if ((i += 2) >= NCH(n))
2816 break;
2817 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2818 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002819 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002820 }
2821 if (anchor)
2822 com_backpatch(c, anchor);
2823}
2824
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002825static int
2826com_make_closure(struct compiling *c, PyCodeObject *co)
2827{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002828 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002829 if (free == 0)
2830 return 0;
2831 for (i = 0; i < free; ++i) {
2832 /* Bypass com_addop_varname because it will generate
2833 LOAD_DEREF but LOAD_CLOSURE is needed.
2834 */
2835 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2836 int arg, reftype;
2837
2838 /* Special case: If a class contains a method with a
2839 free variable that has the same name as a method,
2840 the name will be considered free *and* local in the
2841 class. It should be handled by the closure, as
2842 well as by the normal name loookup logic.
2843 */
2844 reftype = get_ref_type(c, PyString_AS_STRING(name));
2845 if (reftype == CELL)
2846 arg = com_lookup_arg(c->c_cellvars, name);
2847 else /* (reftype == FREE) */
2848 arg = com_lookup_arg(c->c_freevars, name);
2849 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002850 fprintf(stderr, "lookup %s in %s %d %d\n"
2851 "freevars of %s: %s\n",
2852 PyObject_REPR(name),
2853 c->c_name,
2854 reftype, arg,
2855 PyString_AS_STRING(co->co_name),
2856 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002857 Py_FatalError("com_make_closure()");
2858 }
2859 com_addoparg(c, LOAD_CLOSURE, arg);
2860
2861 }
2862 com_push(c, free);
2863 return 1;
2864}
2865
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002870 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002871 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002872 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002873 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002874 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2875 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002876 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002877 if (co == NULL) {
2878 c->c_errors++;
2879 return;
2880 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002881 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002882 i = com_addconst(c, (PyObject *)co);
2883 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002884 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002885 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002886 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002887 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002888 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002889 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002890 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002891 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002892 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002894 else {
2895 int anchor = 0;
2896 int i = 0;
2897 for (;;) {
2898 com_and_test(c, CHILD(n, i));
2899 if ((i += 2) >= NCH(n))
2900 break;
2901 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2902 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002903 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002904 }
2905 if (anchor)
2906 com_backpatch(c, anchor);
2907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908}
2909
2910static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002911com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912{
2913 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002914 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002915 com_node(c, CHILD(n, 0));
2916 }
2917 else {
2918 int i;
2919 int len;
2920 len = (NCH(n) + 1) / 2;
2921 for (i = 0; i < NCH(n); i += 2)
2922 com_node(c, CHILD(n, i));
2923 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002924 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002925 }
2926}
2927
2928
2929/* Begin of assignment compilation */
2930
Thomas Wouters434d0822000-08-24 20:11:32 +00002931
2932static void
2933com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
2934{
2935 com_addbyte(c, DUP_TOP);
2936 com_push(c, 1);
2937 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00002938 com_node(c, augn);
2939 com_addbyte(c, opcode);
2940 com_pop(c, 1);
2941 com_addbyte(c, ROT_TWO);
2942 com_addopname(c, STORE_ATTR, n);
2943 com_pop(c, 2);
2944}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002945
2946static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002947com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00002949 if (none_assignment_check(c, STR(n), assigning))
2950 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002952 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002953}
2954
2955static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002956com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958 REQ(n, trailer);
2959 switch (TYPE(CHILD(n, 0))) {
2960 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00002961 if (assigning == OP_DELETE)
2962 com_error(c, PyExc_SyntaxError,
2963 "can't delete function call");
2964 else
2965 com_error(c, PyExc_SyntaxError,
2966 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002967 break;
2968 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00002969 if (assigning > OP_APPLY)
2970 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
2971 else
2972 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00002974 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00002975 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 break;
2977 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002978 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002979 }
2980}
2981
2982static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002983com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984{
2985 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002986 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
2987 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002988 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002989 if (assigning) {
2990 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00002991 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_push(c, i-1);
2993 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002994 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00002995 com_assign(c, CHILD(n, i), assigning, NULL);
2996}
2997
2998static void
2999com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3000{
3001 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003002 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003003 com_push(c, 1);
3004 com_node(c, augn);
3005 com_addbyte(c, opcode);
3006 com_pop(c, 1);
3007 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008}
3009
3010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003011com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003012{
3013 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003014 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 if (assigning)
3016 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017}
3018
3019static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003020com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021{
3022 /* Loop to avoid trivial recursion */
3023 for (;;) {
3024 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003025
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 case exprlist:
3027 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003028 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003029 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003031 if (TYPE(CHILD(n, 1)) == gen_for) {
3032 com_error(c, PyExc_SystemError,
3033 "assign to generator expression not possible");
3034 return;
3035 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003036 if (assigning > OP_APPLY) {
3037 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003038 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003039 return;
3040 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003041 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 return;
3043 }
3044 n = CHILD(n, 0);
3045 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003046
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 case test:
3048 case and_test:
3049 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003051 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003052 case xor_expr:
3053 case and_expr:
3054 case shift_expr:
3055 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003057 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003059 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003060 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003061 return;
3062 }
3063 n = CHILD(n, 0);
3064 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003065
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003066 case power: /* atom trailer* ('**' power)*
3067 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003068 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003070 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 return;
3072 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003073 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 int i;
3075 com_node(c, CHILD(n, 0));
3076 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003077 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003078 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003079 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003080 return;
3081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 com_apply_trailer(c, CHILD(n, i));
3083 } /* NB i is still alive */
3084 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003085 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 return;
3087 }
3088 n = CHILD(n, 0);
3089 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 case atom:
3092 switch (TYPE(CHILD(n, 0))) {
3093 case LPAR:
3094 n = CHILD(n, 1);
3095 if (TYPE(n) == RPAR) {
3096 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003097 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003098 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 return;
3100 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003101 if (assigning > OP_APPLY) {
3102 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003103 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003104 return;
3105 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106 break;
3107 case LSQB:
3108 n = CHILD(n, 1);
3109 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003110 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003111 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112 return;
3113 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003114 if (assigning > OP_APPLY) {
3115 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003116 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003117 return;
3118 }
3119 if (NCH(n) > 1
3120 && TYPE(CHILD(n, 1)) == list_for) {
3121 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003122 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003123 return;
3124 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003125 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 return;
3127 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003128 if (assigning > OP_APPLY)
3129 com_augassign_name(c, CHILD(n, 0),
3130 assigning, augn);
3131 else
3132 com_assign_name(c, CHILD(n, 0),
3133 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 return;
3135 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003137 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 return;
3139 }
3140 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003141
3142 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003143 com_error(c, PyExc_SyntaxError,
3144 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003145 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003146
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003148 com_error(c, PyExc_SystemError,
3149 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003151
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 }
3153 }
3154}
Guido van Rossum7c531111997-03-11 18:42:21 +00003155
Thomas Wouters434d0822000-08-24 20:11:32 +00003156static void
3157com_augassign(struct compiling *c, node *n)
3158{
3159 int opcode;
3160
3161 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3162 case '+': opcode = INPLACE_ADD; break;
3163 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003164 case '/':
3165 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3166 opcode = INPLACE_FLOOR_DIVIDE;
3167 else if (c->c_flags & CO_FUTURE_DIVISION)
3168 opcode = INPLACE_TRUE_DIVIDE;
3169 else
3170 opcode = INPLACE_DIVIDE;
3171 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003172 case '%': opcode = INPLACE_MODULO; break;
3173 case '<': opcode = INPLACE_LSHIFT; break;
3174 case '>': opcode = INPLACE_RSHIFT; break;
3175 case '&': opcode = INPLACE_AND; break;
3176 case '^': opcode = INPLACE_XOR; break;
3177 case '|': opcode = INPLACE_OR; break;
3178 case '*':
3179 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3180 opcode = INPLACE_POWER;
3181 else
3182 opcode = INPLACE_MULTIPLY;
3183 break;
3184 default:
3185 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3186 return;
3187 }
3188 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3189}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190
3191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003192com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193{
Thomas Wouters434d0822000-08-24 20:11:32 +00003194 REQ(n, expr_stmt);
3195 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003196 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003197 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003199 if (NCH(n) == 1) {
3200 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003201 if (c->c_interactive)
3202 com_addbyte(c, PRINT_EXPR);
3203 else
3204 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003207 else if (TYPE(CHILD(n,1)) == augassign)
3208 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003209 else {
3210 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003211 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003212 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003213 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003215 com_push(c, 1);
3216 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003217 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 }
3219 }
3220}
3221
3222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003223com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003224{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003225 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003226 int i;
3227 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003228 if (Py_OptimizeFlag)
3229 return;
3230 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003231
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003232 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003233 raise AssertionError [, <message>]
3234
3235 where <message> is the second test, if present.
3236 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003237 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003238 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003239 com_addbyte(c, POP_TOP);
3240 com_pop(c, 1);
3241 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003242 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003243 com_push(c, 1);
3244 i = NCH(n)/2; /* Either 2 or 4 */
3245 if (i > 1)
3246 com_node(c, CHILD(n, 3));
3247 com_addoparg(c, RAISE_VARARGS, i);
3248 com_pop(c, i);
3249 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003250 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003251 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003252 com_addbyte(c, POP_TOP);
3253}
3254
3255static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003256com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003257{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003258 int i = 1;
3259 node* stream = NULL;
3260
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003261 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003262
3263 /* are we using the extended print form? */
3264 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3265 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003266 com_node(c, stream);
3267 /* stack: [...] => [... stream] */
3268 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003269 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3270 i = 4;
3271 else
3272 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003274 for (; i < NCH(n); i += 2) {
3275 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003276 com_addbyte(c, DUP_TOP);
3277 /* stack: [stream] => [stream stream] */
3278 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003279 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003280 /* stack: [stream stream] => [stream stream obj] */
3281 com_addbyte(c, ROT_TWO);
3282 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003283 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003284 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003285 com_pop(c, 2);
3286 }
3287 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003288 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003289 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003290 com_addbyte(c, PRINT_ITEM);
3291 com_pop(c, 1);
3292 }
3293 }
3294 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003295 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003296 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003297 /* must pop the extra stream object off the stack */
3298 com_addbyte(c, POP_TOP);
3299 /* stack: [... stream] => [...] */
3300 com_pop(c, 1);
3301 }
3302 }
3303 else {
3304 if (stream != NULL) {
3305 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003306 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003307 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003308 com_pop(c, 1);
3309 }
3310 else
3311 com_addbyte(c, PRINT_NEWLINE);
3312 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313}
3314
3315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003316com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003318 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003319 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003321 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003322 if (c->c_flags & CO_GENERATOR) {
3323 if (NCH(n) > 1) {
3324 com_error(c, PyExc_SyntaxError,
3325 "'return' with argument inside generator");
3326 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003327 }
3328 if (NCH(n) < 2) {
3329 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003330 com_push(c, 1);
3331 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003332 else
3333 com_node(c, CHILD(n, 1));
3334 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003335 com_pop(c, 1);
3336}
3337
3338static void
3339com_yield_stmt(struct compiling *c, node *n)
3340{
Tim Peters95c80f82001-06-23 02:07:08 +00003341 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003342 REQ(n, yield_stmt); /* 'yield' testlist */
3343 if (!c->c_infunction) {
3344 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3345 }
Tim Peters95c80f82001-06-23 02:07:08 +00003346
3347 for (i = 0; i < c->c_nblocks; ++i) {
3348 if (c->c_block[i] == SETUP_FINALLY) {
3349 com_error(c, PyExc_SyntaxError,
3350 "'yield' not allowed in a 'try' block "
3351 "with a 'finally' clause");
3352 return;
3353 }
3354 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003355 com_node(c, CHILD(n, 1));
3356 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003357 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358}
3359
3360static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003361com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003363 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003364 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3365 if (NCH(n) > 1) {
3366 com_node(c, CHILD(n, 1));
3367 if (NCH(n) > 3) {
3368 com_node(c, CHILD(n, 3));
3369 if (NCH(n) > 5)
3370 com_node(c, CHILD(n, 5));
3371 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003372 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003373 i = NCH(n)/2;
3374 com_addoparg(c, RAISE_VARARGS, i);
3375 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376}
3377
3378static void
Thomas Wouters52152252000-08-17 22:55:00 +00003379com_from_import(struct compiling *c, node *n)
3380{
3381 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3382 com_push(c, 1);
3383 if (NCH(n) > 1) {
3384 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3385 com_error(c, PyExc_SyntaxError, "invalid syntax");
3386 return;
3387 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003388 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003389 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003390 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003391 com_pop(c, 1);
3392}
3393
3394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003395com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396{
3397 int i;
3398 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003399 /* 'import' dotted_name (',' dotted_name)* |
3400 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003402 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003403 /* 'from' dotted_name 'import' ... */
3404 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003405
3406 if (TYPE(CHILD(n, 3)) == STAR) {
3407 tup = Py_BuildValue("(s)", "*");
3408 } else {
3409 tup = PyTuple_New((NCH(n) - 2)/2);
3410 for (i = 3; i < NCH(n); i += 2) {
3411 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003412 PyString_FromString(STR(
3413 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003414 }
3415 }
3416 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003417 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003418 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003419 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003420 if (TYPE(CHILD(n, 3)) == STAR)
3421 com_addbyte(c, IMPORT_STAR);
3422 else {
3423 for (i = 3; i < NCH(n); i += 2)
3424 com_from_import(c, CHILD(n, i));
3425 com_addbyte(c, POP_TOP);
3426 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003427 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 }
3429 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003430 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003432 node *subn = CHILD(n, i);
3433 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003434 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003435 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003436 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003437 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003438 int j;
3439 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003440 com_error(c, PyExc_SyntaxError,
3441 "invalid syntax");
3442 return;
3443 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003444 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3445 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003446 CHILD(CHILD(subn, 0),
3447 j));
3448 com_addop_varname(c, VAR_STORE,
3449 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003450 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003451 com_addop_varname(c, VAR_STORE,
3452 STR(CHILD(CHILD(subn, 0),
3453 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003455 }
3456 }
3457}
3458
3459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003460com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003461{
3462 REQ(n, exec_stmt);
3463 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3464 com_node(c, CHILD(n, 1));
3465 if (NCH(n) >= 4)
3466 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003467 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 com_push(c, 1);
3470 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003471 if (NCH(n) >= 6)
3472 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003473 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003474 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003475 com_push(c, 1);
3476 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003477 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003478 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003479}
3480
Guido van Rossum7c531111997-03-11 18:42:21 +00003481static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003482is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003483{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003484 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003485 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003486 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003487
3488 /* Label to avoid tail recursion */
3489 next:
3490 switch (TYPE(n)) {
3491
3492 case suite:
3493 if (NCH(n) == 1) {
3494 n = CHILD(n, 0);
3495 goto next;
3496 }
3497 /* Fall through */
3498 case file_input:
3499 for (i = 0; i < NCH(n); i++) {
3500 node *ch = CHILD(n, i);
3501 if (TYPE(ch) == stmt) {
3502 n = ch;
3503 goto next;
3504 }
3505 }
3506 break;
3507
3508 case stmt:
3509 case simple_stmt:
3510 case small_stmt:
3511 n = CHILD(n, 0);
3512 goto next;
3513
3514 case expr_stmt:
3515 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003516 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003517 case test:
3518 case and_test:
3519 case not_test:
3520 case comparison:
3521 case expr:
3522 case xor_expr:
3523 case and_expr:
3524 case shift_expr:
3525 case arith_expr:
3526 case term:
3527 case factor:
3528 case power:
3529 case atom:
3530 if (NCH(n) == 1) {
3531 n = CHILD(n, 0);
3532 goto next;
3533 }
3534 break;
3535
3536 case NAME:
3537 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3538 return 1;
3539 break;
3540
3541 case NUMBER:
3542 v = parsenumber(c, STR(n));
3543 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003544 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003545 break;
3546 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003547 i = PyObject_IsTrue(v);
3548 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003549 return i == 0;
3550
3551 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003552 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003553 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003554 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003555 break;
3556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003557 i = PyObject_IsTrue(v);
3558 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003559 return i == 0;
3560
3561 }
3562 return 0;
3563}
3564
Tim Peters08a898f2001-06-28 01:52:22 +00003565
3566/* Look under n for a return stmt with an expression.
3567 * This hack is used to find illegal returns under "if 0:" blocks in
3568 * functions already known to be generators (as determined by the symtable
3569 * pass).
3570 * Return the offending return node if found, else NULL.
3571 */
3572static node *
3573look_for_offending_return(node *n)
3574{
3575 int i;
3576
3577 for (i = 0; i < NCH(n); ++i) {
3578 node *kid = CHILD(n, i);
3579
3580 switch (TYPE(kid)) {
3581 case classdef:
3582 case funcdef:
3583 case lambdef:
3584 /* Stuff in nested functions & classes doesn't
3585 affect the code block we started in. */
3586 return NULL;
3587
3588 case return_stmt:
3589 if (NCH(kid) > 1)
3590 return kid;
3591 break;
3592
3593 default: {
3594 node *bad = look_for_offending_return(kid);
3595 if (bad != NULL)
3596 return bad;
3597 }
3598 }
3599 }
3600
3601 return NULL;
3602}
3603
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606{
3607 int i;
3608 int anchor = 0;
3609 REQ(n, if_stmt);
3610 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3611 for (i = 0; i+3 < NCH(n); i+=4) {
3612 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003613 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003614 if (is_constant_false(c, ch)) {
3615 /* We're going to skip this block. However, if this
3616 is a generator, we have to check the dead code
3617 anyway to make sure there aren't any return stmts
3618 with expressions, in the same scope. */
3619 if (c->c_flags & CO_GENERATOR) {
3620 node *p = look_for_offending_return(n);
3621 if (p != NULL) {
3622 int savelineno = c->c_lineno;
3623 c->c_lineno = p->n_lineno;
3624 com_error(c, PyExc_SyntaxError,
3625 "'return' with argument "
3626 "inside generator");
3627 c->c_lineno = savelineno;
3628 }
3629 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003630 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003631 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003633 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003634 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003635 com_addfwref(c, JUMP_IF_FALSE, &a);
3636 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003637 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003638 com_node(c, CHILD(n, i+3));
3639 com_addfwref(c, JUMP_FORWARD, &anchor);
3640 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003641 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642 com_addbyte(c, POP_TOP);
3643 }
3644 if (i+2 < NCH(n))
3645 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003646 if (anchor)
3647 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003648}
3649
3650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003651com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003652{
3653 int break_anchor = 0;
3654 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003655 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003656 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3657 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003658 block_push(c, SETUP_LOOP);
3659 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003660 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003661 com_node(c, CHILD(n, 1));
3662 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3663 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003665 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003667 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003668 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3669 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003670 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003671 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003672 com_addbyte(c, POP_TOP);
3673 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003674 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675 if (NCH(n) > 4)
3676 com_node(c, CHILD(n, 6));
3677 com_backpatch(c, break_anchor);
3678}
3679
3680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003681com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683 int break_anchor = 0;
3684 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003685 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003686 REQ(n, for_stmt);
3687 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3688 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003689 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003690 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003691 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003692 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003693 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003694 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003695 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003696 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003697 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003699 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003700 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3701 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003703 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003704 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003705 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706 if (NCH(n) > 8)
3707 com_node(c, CHILD(n, 8));
3708 com_backpatch(c, break_anchor);
3709}
3710
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003711/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003712
3713 SETUP_FINALLY L
3714 <code for S>
3715 POP_BLOCK
3716 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003717 L: <code for Sf>
3718 END_FINALLY
3719
3720 The special instructions use the block stack. Each block
3721 stack entry contains the instruction that created it (here
3722 SETUP_FINALLY), the level of the value stack at the time the
3723 block stack entry was created, and a label (here L).
3724
3725 SETUP_FINALLY:
3726 Pushes the current value stack level and the label
3727 onto the block stack.
3728 POP_BLOCK:
3729 Pops en entry from the block stack, and pops the value
3730 stack until its level is the same as indicated on the
3731 block stack. (The label is ignored.)
3732 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003733 Pops a variable number of entries from the *value* stack
3734 and re-raises the exception they specify. The number of
3735 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003736
3737 The block stack is unwound when an exception is raised:
3738 when a SETUP_FINALLY entry is found, the exception is pushed
3739 onto the value stack (and the exception condition is cleared),
3740 and the interpreter jumps to the label gotten from the block
3741 stack.
3742
3743 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003744 (The contents of the value stack is shown in [], with the top
3745 at the right; 'tb' is trace-back info, 'val' the exception's
3746 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003747
3748 Value stack Label Instruction Argument
3749 [] SETUP_EXCEPT L1
3750 [] <code for S>
3751 [] POP_BLOCK
3752 [] JUMP_FORWARD L0
3753
Guido van Rossum3f5da241990-12-20 15:06:42 +00003754 [tb, val, exc] L1: DUP )
3755 [tb, val, exc, exc] <evaluate E1> )
3756 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3757 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3758 [tb, val, exc, 1] POP )
3759 [tb, val, exc] POP
3760 [tb, val] <assign to V1> (or POP if no V1)
3761 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003762 [] <code for S1>
3763 JUMP_FORWARD L0
3764
Guido van Rossum3f5da241990-12-20 15:06:42 +00003765 [tb, val, exc, 0] L2: POP
3766 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003767 .............................etc.......................
3768
Guido van Rossum3f5da241990-12-20 15:06:42 +00003769 [tb, val, exc, 0] Ln+1: POP
3770 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003771
3772 [] L0: <next statement>
3773
3774 Of course, parts are not generated if Vi or Ei is not present.
3775*/
3776
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003778com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003779{
3780 int except_anchor = 0;
3781 int end_anchor = 0;
3782 int else_anchor = 0;
3783 int i;
3784 node *ch;
3785
3786 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3787 block_push(c, SETUP_EXCEPT);
3788 com_node(c, CHILD(n, 2));
3789 com_addbyte(c, POP_BLOCK);
3790 block_pop(c, SETUP_EXCEPT);
3791 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3792 com_backpatch(c, except_anchor);
3793 for (i = 3;
3794 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3795 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003796 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003797 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003798 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003799 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003800 break;
3801 }
3802 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003803 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003804 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003805 if (NCH(ch) > 1) {
3806 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003807 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003808 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003809 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003811 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3812 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003813 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003814 }
3815 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003817 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003818 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003820 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003821 com_pop(c, 1);
3822 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003823 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003825 com_node(c, CHILD(n, i+2));
3826 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3827 if (except_anchor) {
3828 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003829 /* We come in with [tb, val, exc, 0] on the
3830 stack; one pop and it's the same as
3831 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003832 com_addbyte(c, POP_TOP);
3833 }
3834 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003835 /* We actually come in here with [tb, val, exc] but the
3836 END_FINALLY will zap those and jump around.
3837 The c_stacklevel does not reflect them so we need not pop
3838 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003839 com_addbyte(c, END_FINALLY);
3840 com_backpatch(c, else_anchor);
3841 if (i < NCH(n))
3842 com_node(c, CHILD(n, i+2));
3843 com_backpatch(c, end_anchor);
3844}
3845
3846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003847com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848{
3849 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003850 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003851
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003852 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3853 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003854 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003855 com_addbyte(c, POP_BLOCK);
3856 block_pop(c, SETUP_FINALLY);
3857 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003858 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 /* While the generated code pushes only one item,
3860 the try-finally handling can enter here with
3861 up to three items. OK, here are the details:
3862 3 for an exception, 2 for RETURN, 1 for BREAK. */
3863 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003864 com_backpatch(c, finally_anchor);
3865 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003866 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003867 com_node(c, ch);
3868 com_addbyte(c, END_FINALLY);
3869 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003870 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003871}
3872
3873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003874com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003875{
3876 REQ(n, try_stmt);
3877 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3878 | 'try' ':' suite 'finally' ':' suite */
3879 if (TYPE(CHILD(n, 3)) != except_clause)
3880 com_try_finally(c, n);
3881 else
3882 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003883}
3884
Guido van Rossum8b993a91997-01-17 21:04:03 +00003885static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003886get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003887{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003888 int i;
3889
Guido van Rossum8b993a91997-01-17 21:04:03 +00003890 /* Label to avoid tail recursion */
3891 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003892 switch (TYPE(n)) {
3893
3894 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895 if (NCH(n) == 1) {
3896 n = CHILD(n, 0);
3897 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003898 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003900 case file_input:
3901 for (i = 0; i < NCH(n); i++) {
3902 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 if (TYPE(ch) == stmt) {
3904 n = ch;
3905 goto next;
3906 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003907 }
3908 break;
3909
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003910 case stmt:
3911 case simple_stmt:
3912 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003913 n = CHILD(n, 0);
3914 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003915
3916 case expr_stmt:
3917 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003918 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003919 case test:
3920 case and_test:
3921 case not_test:
3922 case comparison:
3923 case expr:
3924 case xor_expr:
3925 case and_expr:
3926 case shift_expr:
3927 case arith_expr:
3928 case term:
3929 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003930 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003931 if (NCH(n) == 1) {
3932 n = CHILD(n, 0);
3933 goto next;
3934 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003935 break;
3936
3937 case atom:
3938 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003939 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003940 break;
3941
3942 }
3943 return NULL;
3944}
3945
Guido van Rossum79f25d91997-04-29 20:08:16 +00003946static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003947get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003948{
Guido van Rossum541563e1999-01-28 15:08:09 +00003949 /* Don't generate doc-strings if run with -OO */
3950 if (Py_OptimizeFlag > 1)
3951 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003952 n = get_rawdocstring(n);
3953 if (n == NULL)
3954 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003955 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003956}
3957
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003959com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003960{
3961 REQ(n, suite);
3962 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
3963 if (NCH(n) == 1) {
3964 com_node(c, CHILD(n, 0));
3965 }
3966 else {
3967 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003968 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 node *ch = CHILD(n, i);
3970 if (TYPE(ch) == stmt)
3971 com_node(c, ch);
3972 }
3973 }
3974}
3975
Guido van Rossumf1aeab71992-03-27 17:28:26 +00003976/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003979{
3980 int i = c->c_nblocks;
3981 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
3982 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3983 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00003984 else if (i <= 0) {
3985 /* at the outer level */
3986 com_error(c, PyExc_SyntaxError,
3987 "'continue' not properly in loop");
3988 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003989 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003990 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003991 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003992 if (c->c_block[j] == SETUP_LOOP)
3993 break;
3994 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003995 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00003996 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00003997 for (; i > j; --i) {
3998 if (c->c_block[i] == SETUP_EXCEPT ||
3999 c->c_block[i] == SETUP_FINALLY) {
4000 com_addoparg(c, CONTINUE_LOOP,
4001 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004002 return;
4003 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004004 if (c->c_block[i] == END_FINALLY) {
4005 com_error(c, PyExc_SyntaxError,
4006 "'continue' not supported inside 'finally' clause");
4007 return;
4008 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004009 }
4010 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004011 com_error(c, PyExc_SyntaxError,
4012 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004013 }
4014 /* XXX Could allow it inside a 'finally' clause
4015 XXX if we could pop the exception still on the stack */
4016}
4017
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004018/* Return the number of default values in the argument list.
4019
4020 If a non-default argument follows a default argument, set an
4021 exception and return -1.
4022*/
4023
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004024static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004025com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004026{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004027 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004028 if (TYPE(n) == lambdef) {
4029 /* lambdef: 'lambda' [varargslist] ':' test */
4030 n = CHILD(n, 1);
4031 }
4032 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004033 REQ(n, funcdef);
4034 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4035 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004036 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4037 n = CHILD(n, 1);
4038 }
4039 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004040 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004041 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004042 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004043 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4044 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004045 ndefs = 0;
4046 for (i = 0; i < nch; i++) {
4047 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004048 if (TYPE(CHILD(n, i)) == STAR ||
4049 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004050 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004051 i++;
4052 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004053 t = RPAR; /* Anything except EQUAL or COMMA */
4054 else
4055 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004056 if (t == EQUAL) {
4057 i++;
4058 ndefs++;
4059 com_node(c, CHILD(n, i));
4060 i++;
4061 if (i >= nch)
4062 break;
4063 t = TYPE(CHILD(n, i));
4064 }
4065 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004066 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004067 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004068 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004069 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004070 return -1;
4071 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004072 }
4073 if (t != COMMA)
4074 break;
4075 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004076 return ndefs;
4077}
4078
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004079static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004080com_decorator_name(struct compiling *c, node *n)
4081{
4082 /* dotted_name: NAME ('.' NAME)* */
4083
4084 int i, nch;
4085 node *varname;
4086
4087 REQ(n, dotted_name);
4088 nch = NCH(n);
4089 assert(nch >= 1 && nch % 2 == 1);
4090
4091 varname = CHILD(n, 0);
4092 REQ(varname, NAME);
4093 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004094 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004095
4096 for (i = 1; i < nch; i += 2) {
4097 node *attrname;
4098
4099 REQ(CHILD(n, i), DOT);
4100
4101 attrname = CHILD(n, i + 1);
4102 REQ(attrname, NAME);
4103 com_addop_name(c, LOAD_ATTR, STR(attrname));
4104 }
4105}
4106
4107static void
4108com_decorator(struct compiling *c, node *n)
4109{
4110 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
4111 int nch = NCH(n);
4112 assert(nch >= 2);
4113 REQ(CHILD(n, 0), AT);
4114 com_decorator_name(c, CHILD(n, 1));
4115
4116 if (nch > 2) {
4117 assert(nch == 4 || nch == 5);
4118 REQ(CHILD(n, 2), LPAR);
4119 REQ(CHILD(n, nch - 1), RPAR);
4120 com_call_function(c, CHILD(n, 3));
4121 }
4122}
4123
4124static int
4125com_decorators(struct compiling *c, node *n)
4126{
4127 int i, nch, ndecorators;
4128
4129 /* decorator ([NEWLINE] decorator)* NEWLINE */
4130 nch = NCH(n);
4131 assert(nch >= 2);
4132 REQ(CHILD(n, nch - 1), NEWLINE);
4133
4134 ndecorators = 0;
4135 for (i = NCH(n) - 1; i >= 0; --i) {
4136 node *ch = CHILD(n, i);
4137 if (TYPE(ch) != NEWLINE) {
4138 com_decorator(c, ch);
4139 ++ndecorators;
4140 }
4141 }
4142
4143 return ndecorators;
4144}
4145
4146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004147com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004148{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004149 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004150 int ndefs, ndecorators;
4151 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;
4159
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);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004179 while (ndecorators > 0) {
4180 com_addoparg(c, CALL_FUNCTION, 1);
4181 com_pop(c, 1);
4182 ndecorators--;
4183 }
4184 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004185 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004186 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004187 }
4188}
4189
4190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004191com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004192{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004193 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004194 REQ(n, testlist);
4195 /* testlist: test (',' test)* [','] */
4196 for (i = 0; i < NCH(n); i += 2)
4197 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004198 i = (NCH(n)+1) / 2;
4199 com_addoparg(c, BUILD_TUPLE, i);
4200 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004201}
4202
4203static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004204com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004205{
Guido van Rossum25831651993-05-19 14:50:45 +00004206 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004207 PyObject *v;
4208 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004209 char *name;
4210
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004211 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004212 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004213 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004214 c->c_errors++;
4215 return;
4216 }
4217 /* Push the class name on the stack */
4218 i = com_addconst(c, v);
4219 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004220 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004221 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004222 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004223 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004224 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004225 com_push(c, 1);
4226 }
Guido van Rossum25831651993-05-19 14:50:45 +00004227 else
4228 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004229 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004230 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004231 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004232 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004233 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004234 c->c_errors++;
4235 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004236 int closure = com_make_closure(c, co);
4237 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004238 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004239 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004240 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004242 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004243 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004244 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004245 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004246 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004247 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004248 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004249 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004250 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004251 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004252}
4253
4254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004255com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004257 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004258 if (c->c_errors)
4259 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004260 switch (TYPE(n)) {
4261
4262 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004263
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264 case funcdef:
4265 com_funcdef(c, n);
4266 break;
4267 case classdef:
4268 com_classdef(c, n);
4269 break;
4270
4271 /* Trivial parse tree nodes */
4272
4273 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004274 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004275 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004276 n = CHILD(n, 0);
4277 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004278
4279 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004280 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004281 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004282 {
4283 int i;
4284 for (i = 0; i < NCH(n)-1; i += 2)
4285 com_node(c, CHILD(n, i));
4286 }
4287 break;
4288
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004289 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004290 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004291 n = CHILD(n, 0);
4292 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004293
4294 /* Statement nodes */
4295
4296 case expr_stmt:
4297 com_expr_stmt(c, n);
4298 break;
4299 case print_stmt:
4300 com_print_stmt(c, n);
4301 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004302 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004303 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004304 break;
4305 case pass_stmt:
4306 break;
4307 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004308 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004309 com_error(c, PyExc_SyntaxError,
4310 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004311 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004312 com_addbyte(c, BREAK_LOOP);
4313 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004314 case continue_stmt:
4315 com_continue_stmt(c, n);
4316 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004317 case return_stmt:
4318 com_return_stmt(c, n);
4319 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004320 case yield_stmt:
4321 com_yield_stmt(c, n);
4322 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004323 case raise_stmt:
4324 com_raise_stmt(c, n);
4325 break;
4326 case import_stmt:
4327 com_import_stmt(c, n);
4328 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004329 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004330 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004331 case exec_stmt:
4332 com_exec_stmt(c, n);
4333 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004334 case assert_stmt:
4335 com_assert_stmt(c, n);
4336 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004337 case if_stmt:
4338 com_if_stmt(c, n);
4339 break;
4340 case while_stmt:
4341 com_while_stmt(c, n);
4342 break;
4343 case for_stmt:
4344 com_for_stmt(c, n);
4345 break;
4346 case try_stmt:
4347 com_try_stmt(c, n);
4348 break;
4349 case suite:
4350 com_suite(c, n);
4351 break;
4352
4353 /* Expression nodes */
4354
4355 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004356 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004357 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004358 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004359 break;
4360 case test:
4361 com_test(c, n);
4362 break;
4363 case and_test:
4364 com_and_test(c, n);
4365 break;
4366 case not_test:
4367 com_not_test(c, n);
4368 break;
4369 case comparison:
4370 com_comparison(c, n);
4371 break;
4372 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004373 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004374 break;
4375 case expr:
4376 com_expr(c, n);
4377 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004378 case xor_expr:
4379 com_xor_expr(c, n);
4380 break;
4381 case and_expr:
4382 com_and_expr(c, n);
4383 break;
4384 case shift_expr:
4385 com_shift_expr(c, n);
4386 break;
4387 case arith_expr:
4388 com_arith_expr(c, n);
4389 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004390 case term:
4391 com_term(c, n);
4392 break;
4393 case factor:
4394 com_factor(c, n);
4395 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004396 case power:
4397 com_power(c, n);
4398 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004399 case atom:
4400 com_atom(c, n);
4401 break;
4402
4403 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004404 com_error(c, PyExc_SystemError,
4405 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004406 }
4407}
4408
Tim Petersdbd9ba62000-07-09 03:09:57 +00004409static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004410
4411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004412com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004413{
4414 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4415 if (TYPE(CHILD(n, 0)) == LPAR)
4416 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004417 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004418 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004419 com_pop(c, 1);
4420 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004421}
4422
4423static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004424com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004425{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004426 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004427 if (NCH(n) == 1) {
4428 com_fpdef(c, CHILD(n, 0));
4429 }
4430 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004431 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004432 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004433 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004434 for (i = 0; i < NCH(n); i += 2)
4435 com_fpdef(c, CHILD(n, i));
4436 }
4437}
4438
4439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004440com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004441{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004442 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004443 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004444 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004445 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004446 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004447 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004448 nch = NCH(n);
4449 /* Enter all arguments in table of locals */
4450 for (i = 0, narg = 0; i < nch; i++) {
4451 node *ch = CHILD(n, i);
4452 node *fp;
4453 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004454 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004455 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4456 fp = CHILD(ch, 0);
4457 if (TYPE(fp) != NAME) {
4458 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4459 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004460 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004461 narg++;
4462 /* all name updates handled by symtable */
4463 if (++i >= nch)
4464 break;
4465 ch = CHILD(n, i);
4466 if (TYPE(ch) == EQUAL)
4467 i += 2;
4468 else
4469 REQ(ch, COMMA);
4470 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004471 if (complex) {
4472 /* Generate code for complex arguments only after
4473 having counted the simple arguments */
4474 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004475 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004476 node *ch = CHILD(n, i);
4477 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004478 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004479 break;
4480 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4481 fp = CHILD(ch, 0);
4482 if (TYPE(fp) != NAME) {
4483 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004484 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004485 com_fpdef(c, ch);
4486 }
4487 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004488 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004489 break;
4490 ch = CHILD(n, i);
4491 if (TYPE(ch) == EQUAL)
4492 i += 2;
4493 else
4494 REQ(ch, COMMA);
4495 }
4496 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004497}
4498
4499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004500com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004501{
4502 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004503 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004504 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004505 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004506 if (doc != NULL) {
4507 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004508 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004509 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004510 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004511 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004512 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004513 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004514 for (i = 0; i < NCH(n); i++) {
4515 node *ch = CHILD(n, i);
4516 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4517 com_node(c, ch);
4518 }
4519}
4520
4521/* Top-level compile-node interface */
4522
4523static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004524compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004525{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004526 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004528 REQ(n, funcdef);
4529 /* -6 -5 -4 -3 -2 -1
4530 funcdef: [decorators] 'def' NAME parameters ':' suite */
4531 c->c_name = STR(RCHILD(n, -4));
4532 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004533 if (doc != NULL) {
4534 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004535 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004536 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004537 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004538 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004539 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004540 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004541 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004542 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004543 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004544 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004545 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004546 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004547 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4548 com_push(c, 1);
4549 com_addbyte(c, RETURN_VALUE);
4550 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004551}
4552
4553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004554compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004555{
Guido van Rossum590baa41993-11-30 13:40:46 +00004556 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004557 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004558 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004559
4560 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004561 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004562 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004563 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004564 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004565 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004566 else
4567 ch = CHILD(n, 2);
4568 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004569 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004570 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004571}
4572
4573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004574compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004575{
4576 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004577 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004578 REQ(n, classdef);
4579 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4580 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004581 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004582 /* Initialize local __module__ from global __name__ */
4583 com_addop_name(c, LOAD_GLOBAL, "__name__");
4584 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004585 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004586 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004587 if (doc != NULL) {
4588 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004589 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004590 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004591 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004592 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004593 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004594 }
4595 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004596 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004597 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004598 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004599 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004600 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004601 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004602 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004603}
4604
4605static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004606compile_generator_expression(struct compiling *c, node *n)
4607{
4608 /* testlist_gexp: test gen_for */
4609 /* argument: test gen_for */
4610 REQ(CHILD(n, 0), test);
4611 REQ(CHILD(n, 1), gen_for);
4612
4613 c->c_name = "<generator expression>";
4614 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4615
4616 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4617 com_push(c, 1);
4618 com_addbyte(c, RETURN_VALUE);
4619 com_pop(c, 1);
4620}
4621
4622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004623compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004624{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004625 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004626
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004627 switch (TYPE(n)) {
4628
Guido van Rossum4c417781991-01-21 16:09:22 +00004629 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004630 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004631 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004632 n = CHILD(n, 0);
4633 if (TYPE(n) != NEWLINE)
4634 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004635 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004636 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4637 com_push(c, 1);
4638 com_addbyte(c, RETURN_VALUE);
4639 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004640 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004641 break;
4642
Guido van Rossum4c417781991-01-21 16:09:22 +00004643 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004644 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004645 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004646 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4647 com_push(c, 1);
4648 com_addbyte(c, RETURN_VALUE);
4649 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004650 break;
4651
Guido van Rossum590baa41993-11-30 13:40:46 +00004652 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004653 com_node(c, CHILD(n, 0));
4654 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004655 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004656 break;
4657
Guido van Rossum590baa41993-11-30 13:40:46 +00004658 case lambdef: /* anonymous function definition */
4659 compile_lambdef(c, n);
4660 break;
4661
Guido van Rossum4c417781991-01-21 16:09:22 +00004662 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004663 compile_funcdef(c, n);
4664 break;
4665
Guido van Rossum4c417781991-01-21 16:09:22 +00004666 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004667 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004668 break;
4669
Raymond Hettinger354433a2004-05-19 08:20:33 +00004670 case testlist_gexp: /* A generator expression */
4671 case argument: /* A generator expression */
4672 compile_generator_expression(c, n);
4673 break;
4674
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004676 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004677 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004678 }
4679}
4680
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004681static PyObject *
4682dict_keys_inorder(PyObject *dict, int offset)
4683{
4684 PyObject *tuple, *k, *v;
4685 int i, pos = 0, size = PyDict_Size(dict);
4686
4687 tuple = PyTuple_New(size);
4688 if (tuple == NULL)
4689 return NULL;
4690 while (PyDict_Next(dict, &pos, &k, &v)) {
4691 i = PyInt_AS_LONG(v);
4692 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004693 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004694 PyTuple_SET_ITEM(tuple, i - offset, k);
4695 }
4696 return tuple;
4697}
4698
Guido van Rossum79f25d91997-04-29 20:08:16 +00004699PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004700PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004701{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004702 return PyNode_CompileFlags(n, filename, NULL);
4703}
4704
4705PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004706PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004707{
4708 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004709}
4710
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004711struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004712PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004713{
4714 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004715 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004716
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004717 ff = PyNode_Future(n, filename);
4718 if (ff == NULL)
4719 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004720 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004721 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004722 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004723 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004724 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004725 return st;
4726}
4727
Guido van Rossum79f25d91997-04-29 20:08:16 +00004728static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004729icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004730{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004731 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004732}
4733
Guido van Rossum79f25d91997-04-29 20:08:16 +00004734static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004735jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004736 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004737{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004739 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004740 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004742 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4743 sc.c_encoding = "utf-8";
4744 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004745 sc.c_encoding = STR(n);
4746 n = CHILD(n, 0);
4747 } else {
4748 sc.c_encoding = NULL;
4749 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004750 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004751 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004752 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004753 /* c_symtable still points to parent's symbols */
4754 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004755 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004756 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004757 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004758 if (base->c_encoding != NULL) {
4759 assert(sc.c_encoding == NULL);
4760 sc.c_encoding = base->c_encoding;
4761 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004762 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004763 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004764 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004765 if (sc.c_future == NULL) {
4766 com_free(&sc);
4767 return NULL;
4768 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004769 if (flags) {
4770 int merged = sc.c_future->ff_features |
4771 flags->cf_flags;
4772 sc.c_future->ff_features = merged;
4773 flags->cf_flags = merged;
4774 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004775 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4776 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004777 com_free(&sc);
4778 return NULL;
4779 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004780 /* reset symbol table for second pass */
4781 sc.c_symtable->st_nscopes = 1;
4782 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004783 }
4784 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004785 if (symtable_load_symbols(&sc) < 0) {
4786 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004787 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004788 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004789 compile_node(&sc, n);
4790 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004791 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004792 PyObject *consts, *names, *varnames, *filename, *name,
4793 *freevars, *cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004794 consts = PyList_AsTuple(sc.c_consts);
4795 names = PyList_AsTuple(sc.c_names);
4796 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004797 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4798 freevars = dict_keys_inorder(sc.c_freevars,
4799 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004800 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004801 name = PyString_InternFromString(sc.c_name);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004802 if (!PyErr_Occurred())
4803 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004804 sc.c_nlocals,
4805 sc.c_maxstacklevel,
4806 sc.c_flags,
4807 sc.c_code,
4808 consts,
4809 names,
4810 varnames,
4811 freevars,
4812 cellvars,
4813 filename,
4814 name,
4815 sc.c_firstlineno,
4816 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004817 Py_XDECREF(consts);
4818 Py_XDECREF(names);
4819 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004820 Py_XDECREF(freevars);
4821 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004822 Py_XDECREF(filename);
4823 Py_XDECREF(name);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004824 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004825 else if (!PyErr_Occurred()) {
4826 /* This could happen if someone called PyErr_Clear() after an
4827 error was reported above. That's not supposed to happen,
4828 but I just plugged one case and I'm not sure there can't be
4829 others. In that case, raise SystemError so that at least
4830 it gets reported instead dumping core. */
4831 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4832 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004834 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004835 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004836 sc.c_symtable = NULL;
4837 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004839 return co;
4840}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004841
4842int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004843PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004844{
4845 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004846 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004847 int line = co->co_firstlineno;
4848 int addr = 0;
4849 while (--size >= 0) {
4850 addr += *p++;
4851 if (addr > addrq)
4852 break;
4853 line += *p++;
4854 }
4855 return line;
4856}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004857
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004858/* The test for LOCAL must come before the test for FREE in order to
4859 handle classes where name is both local and free. The local var is
4860 a method and the free var is a free var referenced within a method.
4861*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004862
4863static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004864get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004865{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004866 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004867 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004868
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004869 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4870 return CELL;
4871 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4872 return LOCAL;
4873 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4874 return FREE;
4875 v = PyDict_GetItemString(c->c_globals, name);
4876 if (v) {
4877 if (v == Py_None)
4878 return GLOBAL_EXPLICIT;
4879 else {
4880 return GLOBAL_IMPLICIT;
4881 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004882 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004883 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004884 "unknown scope for %.100s in %.100s(%s) "
4885 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4886 name, c->c_name,
4887 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4888 c->c_filename,
4889 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4890 PyObject_REPR(c->c_locals),
4891 PyObject_REPR(c->c_globals)
4892 );
4893
4894 Py_FatalError(buf);
4895 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004896}
4897
Guido van Rossum207fda62001-03-02 03:30:41 +00004898/* Helper functions to issue warnings */
4899
4900static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004901issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004902{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004903 if (PyErr_Occurred()) {
4904 /* This can happen because symtable_node continues
4905 processing even after raising a SyntaxError.
4906 Calling PyErr_WarnExplicit now would clobber the
4907 pending exception; instead we fail and let that
4908 exception propagate.
4909 */
4910 return -1;
4911 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004912 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4913 lineno, NULL, NULL) < 0) {
4914 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4915 PyErr_SetString(PyExc_SyntaxError, msg);
4916 PyErr_SyntaxLocation(filename, lineno);
4917 }
4918 return -1;
4919 }
4920 return 0;
4921}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004922
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004923static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004924symtable_warn(struct symtable *st, char *msg)
4925{
Guido van Rossum207fda62001-03-02 03:30:41 +00004926 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004927 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004928 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004929 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004930 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00004931}
4932
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00004933/* Helper function for setting lineno and filename */
4934
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004935static struct symtable *
4936symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004937{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004938 struct symtable *st;
4939
4940 st = symtable_init();
4941 if (st == NULL)
4942 return NULL;
4943 st->st_future = ff;
4944 st->st_filename = filename;
4945 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
4946 if (st->st_errors > 0)
4947 goto fail;
4948 symtable_node(st, n);
4949 if (st->st_errors > 0)
4950 goto fail;
4951 return st;
4952 fail:
4953 if (!PyErr_Occurred()) {
4954 /* This could happen because after a syntax error is
4955 detected, the symbol-table-building continues for
4956 a while, and PyErr_Clear() might erroneously be
4957 called during that process. One such case has been
4958 fixed, but there might be more (now or later).
4959 */
4960 PyErr_SetString(PyExc_SystemError, "lost exception");
4961 }
4962 st->st_future = NULL;
4963 st->st_filename = NULL;
4964 PySymtable_Free(st);
4965 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004966}
4967
4968static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00004969symtable_init_compiling_symbols(struct compiling *c)
4970{
4971 PyObject *varnames;
4972
4973 varnames = c->c_symtable->st_cur->ste_varnames;
4974 if (varnames == NULL) {
4975 varnames = PyList_New(0);
4976 if (varnames == NULL)
4977 return -1;
4978 c->c_symtable->st_cur->ste_varnames = varnames;
4979 Py_INCREF(varnames);
4980 } else
4981 Py_INCREF(varnames);
4982 c->c_varnames = varnames;
4983
4984 c->c_globals = PyDict_New();
4985 if (c->c_globals == NULL)
4986 return -1;
4987 c->c_freevars = PyDict_New();
4988 if (c->c_freevars == NULL)
4989 return -1;
4990 c->c_cellvars = PyDict_New();
4991 if (c->c_cellvars == NULL)
4992 return -1;
4993 return 0;
4994}
4995
4996struct symbol_info {
4997 int si_nlocals;
4998 int si_ncells;
4999 int si_nfrees;
5000 int si_nimplicit;
5001};
5002
5003static void
5004symtable_init_info(struct symbol_info *si)
5005{
5006 si->si_nlocals = 0;
5007 si->si_ncells = 0;
5008 si->si_nfrees = 0;
5009 si->si_nimplicit = 0;
5010}
5011
5012static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005013symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005014 struct symbol_info *si)
5015{
5016 PyObject *dict, *v;
5017
5018 /* Seperate logic for DEF_FREE. If it occurs in a function,
5019 it indicates a local that we must allocate storage for (a
5020 cell var). If it occurs in a class, then the class has a
5021 method and a free variable with the same name.
5022 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005023 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005024 /* If it isn't declared locally, it can't be a cell. */
5025 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5026 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005027 v = PyInt_FromLong(si->si_ncells++);
5028 dict = c->c_cellvars;
5029 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005030 /* If it is free anyway, then there is no need to do
5031 anything here.
5032 */
5033 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005034 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005035 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005036 v = PyInt_FromLong(si->si_nfrees++);
5037 dict = c->c_freevars;
5038 }
5039 if (v == NULL)
5040 return -1;
5041 if (PyDict_SetItem(dict, name, v) < 0) {
5042 Py_DECREF(v);
5043 return -1;
5044 }
5045 Py_DECREF(v);
5046 return 0;
5047}
5048
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005049/* If a variable is a cell and an argument, make sure that appears in
5050 co_cellvars before any variable to its right in varnames.
5051*/
5052
5053
5054static int
5055symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5056 PyObject *varnames, int flags)
5057{
Tim Petersb39903b2003-03-24 17:22:24 +00005058 PyObject *v = NULL;
5059 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005060 int i, pos;
5061
5062 if (flags & CO_VARARGS)
5063 argcount++;
5064 if (flags & CO_VARKEYWORDS)
5065 argcount++;
5066 for (i = argcount; --i >= 0; ) {
5067 v = PyList_GET_ITEM(varnames, i);
5068 if (PyDict_GetItem(*cellvars, v)) {
5069 if (list == NULL) {
5070 list = PyList_New(1);
5071 if (list == NULL)
5072 return -1;
5073 PyList_SET_ITEM(list, 0, v);
5074 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005075 } else {
5076 if (PyList_Insert(list, 0, v) < 0) {
5077 Py_DECREF(list);
5078 return -1;
5079 }
5080 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005081 }
5082 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005083 if (list == NULL)
5084 return 0;
5085
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005086 /* There are cellvars that are also arguments. Create a dict
5087 to replace cellvars and put the args at the front.
5088 */
5089 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005090 if (d == NULL)
5091 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005092 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5093 v = PyInt_FromLong(i);
5094 if (v == NULL)
5095 goto fail;
5096 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5097 goto fail;
5098 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5099 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005100 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005101 }
5102 pos = 0;
5103 i = PyList_GET_SIZE(list);
5104 Py_DECREF(list);
5105 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5106 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005107 if (w == NULL)
5108 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005109 if (PyDict_SetItem(d, v, w) < 0) {
5110 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005111 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005112 goto fail;
5113 }
5114 Py_DECREF(w);
5115 }
5116 Py_DECREF(*cellvars);
5117 *cellvars = d;
5118 return 1;
5119 fail:
5120 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005121 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005122 return -1;
5123}
5124
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005125static int
5126symtable_freevar_offsets(PyObject *freevars, int offset)
5127{
5128 PyObject *name, *v;
5129 int pos;
5130
5131 /* The cell vars are the first elements of the closure,
5132 followed by the free vars. Update the offsets in
5133 c_freevars to account for number of cellvars. */
5134 pos = 0;
5135 while (PyDict_Next(freevars, &pos, &name, &v)) {
5136 int i = PyInt_AS_LONG(v) + offset;
5137 PyObject *o = PyInt_FromLong(i);
5138 if (o == NULL)
5139 return -1;
5140 if (PyDict_SetItem(freevars, name, o) < 0) {
5141 Py_DECREF(o);
5142 return -1;
5143 }
5144 Py_DECREF(o);
5145 }
5146 return 0;
5147}
5148
5149static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005150symtable_check_unoptimized(struct compiling *c,
5151 PySymtableEntryObject *ste,
5152 struct symbol_info *si)
5153{
5154 char buf[300];
5155
5156 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5157 || (ste->ste_nested && si->si_nimplicit)))
5158 return 0;
5159
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005160#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5161
5162#define ILLEGAL_IS "is a nested function"
5163
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005164#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005165"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005166
5167#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005168"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005169
5170#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005171"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005172"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005173
5174 /* XXX perhaps the linenos for these opt-breaking statements
5175 should be stored so the exception can point to them. */
5176
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005177 if (ste->ste_child_free) {
5178 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005179 PyOS_snprintf(buf, sizeof(buf),
5180 ILLEGAL_IMPORT_STAR,
5181 PyString_AS_STRING(ste->ste_name),
5182 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005183 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005184 PyOS_snprintf(buf, sizeof(buf),
5185 ILLEGAL_BARE_EXEC,
5186 PyString_AS_STRING(ste->ste_name),
5187 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005188 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005189 PyOS_snprintf(buf, sizeof(buf),
5190 ILLEGAL_EXEC_AND_IMPORT_STAR,
5191 PyString_AS_STRING(ste->ste_name),
5192 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005193 }
5194 } else {
5195 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005196 PyOS_snprintf(buf, sizeof(buf),
5197 ILLEGAL_IMPORT_STAR,
5198 PyString_AS_STRING(ste->ste_name),
5199 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005200 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005201 PyOS_snprintf(buf, sizeof(buf),
5202 ILLEGAL_BARE_EXEC,
5203 PyString_AS_STRING(ste->ste_name),
5204 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005205 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005206 PyOS_snprintf(buf, sizeof(buf),
5207 ILLEGAL_EXEC_AND_IMPORT_STAR,
5208 PyString_AS_STRING(ste->ste_name),
5209 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005210 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005211 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005212
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005213 PyErr_SetString(PyExc_SyntaxError, buf);
5214 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5215 ste->ste_opt_lineno);
5216 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005217}
5218
5219static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005220symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5221 struct symbol_info *si)
5222{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005223 if (c->c_future)
5224 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005225 if (ste->ste_generator)
5226 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005227 if (ste->ste_type != TYPE_MODULE)
5228 c->c_flags |= CO_NEWLOCALS;
5229 if (ste->ste_type == TYPE_FUNCTION) {
5230 c->c_nlocals = si->si_nlocals;
5231 if (ste->ste_optimized == 0)
5232 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005233 else if (ste->ste_optimized != OPT_EXEC)
5234 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005235 }
5236 return 0;
5237}
5238
5239static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005240symtable_error(struct symtable *st, int lineno)
5241{
5242 if (lineno == 0)
5243 lineno = st->st_cur->ste_lineno;
5244 PyErr_SyntaxLocation(st->st_filename, lineno);
5245 st->st_errors++;
5246 return -1;
5247}
5248
5249static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250symtable_load_symbols(struct compiling *c)
5251{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005253 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005254 PyObject *name, *varnames, *v;
5255 int i, flags, pos;
5256 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005257
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005258 v = NULL;
5259
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005260 if (symtable_init_compiling_symbols(c) < 0)
5261 goto fail;
5262 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005263 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005264 si.si_nlocals = PyList_GET_SIZE(varnames);
5265 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005266
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005267 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005269 if (v == NULL)
5270 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271 if (PyDict_SetItem(c->c_locals,
5272 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005273 goto fail;
5274 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275 }
5276
5277 /* XXX The cases below define the rules for whether a name is
5278 local or global. The logic could probably be clearer. */
5279 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005280 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5281 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005283 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005284 /* undo the original DEF_FREE */
5285 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005286
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005287 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005288 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005289 2. Free variables in methods that are also class
5290 variables or declared global.
5291 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005292 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005293 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005294
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005295 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005296 c->c_argcount--;
5297 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005298 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005299 c->c_argcount--;
5300 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005301 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005302 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005303 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005304 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005305 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005306 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005307 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005308 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005309 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005310 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5311 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005312 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005313 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005314 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005315 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005316 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005317 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005318 if (v == NULL)
5319 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005320 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005321 goto fail;
5322 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005323 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005324 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005325 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005326 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005327 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005328 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005329 if (v == NULL)
5330 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005331 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005332 goto fail;
5333 Py_DECREF(v);
5334 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005335 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005336 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005337 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005338 goto fail;
5339 if (st->st_nscopes != 1) {
5340 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005341 if (v == NULL)
5342 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005343 if (PyDict_SetItem(st->st_global,
5344 name, v))
5345 goto fail;
5346 Py_DECREF(v);
5347 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005348 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349 }
5350 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005351 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5352
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005353 if (si.si_ncells > 1) { /* one cell is always in order */
5354 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5355 c->c_varnames, c->c_flags) < 0)
5356 return -1;
5357 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005358 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5359 return -1;
5360 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005361 fail:
5362 /* is this always the right thing to do? */
5363 Py_XDECREF(v);
5364 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365}
5366
5367static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005368symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369{
5370 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005371
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005372 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373 if (st == NULL)
5374 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005375 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005376
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005377 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005378 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005379 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005380 goto fail;
5381 if ((st->st_symbols = PyDict_New()) == NULL)
5382 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005383 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005384 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005385 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005386 st->st_private = NULL;
5387 return st;
5388 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005389 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 return NULL;
5391}
5392
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005393void
5394PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395{
5396 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005397 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005398 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005399 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005400}
5401
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005402/* When the compiler exits a scope, it must should update the scope's
5403 free variable information with the list of free variables in its
5404 children.
5405
5406 Variables that are free in children and defined in the current
5407 scope are cellvars.
5408
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005409 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005410 false), free variables in children that are not defined here are
5411 implicit globals.
5412
5413*/
5414
5415static int
5416symtable_update_free_vars(struct symtable *st)
5417{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005418 int i, j, def;
5419 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005420 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005421
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005422 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005423 def = DEF_FREE_CLASS;
5424 else
5425 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005426 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005427 int pos = 0;
5428
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005429 if (list && PyList_SetSlice(list, 0,
5430 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005431 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005432 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005433 PyList_GET_ITEM(ste->ste_children, i);
5434 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005435 int flags = PyInt_AS_LONG(o);
5436 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005437 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005438 if (list == NULL) {
5439 list = PyList_New(0);
5440 if (list == NULL)
5441 return -1;
5442 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005443 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005444 if (PyList_Append(list, name) < 0) {
5445 Py_DECREF(list);
5446 return -1;
5447 }
5448 }
5449 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005450 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005451 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005452 v = PyDict_GetItem(ste->ste_symbols, name);
5453 /* If a name N is declared global in scope A and
5454 referenced in scope B contained (perhaps
5455 indirectly) in A and there are no scopes
5456 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005457 is global in B. Unless A is a class scope,
5458 because class scopes are not considered for
5459 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005460 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005461 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005462 int flags = PyInt_AS_LONG(v);
5463 if (flags & DEF_GLOBAL) {
5464 symtable_undo_free(st, child->ste_id,
5465 name);
5466 continue;
5467 }
5468 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005469 if (ste->ste_nested) {
5470 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005471 name, def) < 0) {
5472 Py_DECREF(list);
5473 return -1;
5474 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005475 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005476 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005477 name) < 0) {
5478 Py_DECREF(list);
5479 return -1;
5480 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005481 }
5482 }
5483 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005484
5485 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005486 return 0;
5487}
5488
5489/* If the current scope is a non-nested class or if name is not
5490 defined in the current, non-nested scope, then it is an implicit
5491 global in all nested scopes.
5492*/
5493
5494static int
5495symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5496{
5497 PyObject *o;
5498 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005499 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005500
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005501 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005502 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005503 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 if (o == NULL)
5505 return symtable_undo_free(st, child, name);
5506 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005507
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005508 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509 return symtable_undo_free(st, child, name);
5510 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005511 return symtable_add_def_o(st, ste->ste_symbols,
5512 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513}
5514
5515static int
5516symtable_undo_free(struct symtable *st, PyObject *id,
5517 PyObject *name)
5518{
5519 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005520 PyObject *info;
5521 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005523 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5524 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005525 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005526
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005527 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005528 if (info == NULL)
5529 return 0;
5530 v = PyInt_AS_LONG(info);
5531 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005532 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005533 DEF_FREE_GLOBAL) < 0)
5534 return -1;
5535 } else
5536 /* If the name is defined here or declared global,
5537 then the recursion stops. */
5538 return 0;
5539
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005540 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5541 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005542 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005543 PyList_GET_ITEM(ste->ste_children, i);
5544 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005545 if (x < 0)
5546 return x;
5547 }
5548 return 0;
5549}
5550
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005551/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5552 This reference is released when the scope is exited, via the DECREF
5553 in symtable_exit_scope().
5554*/
5555
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005556static int
5557symtable_exit_scope(struct symtable *st)
5558{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005559 int end;
5560
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005561 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005562 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005563 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005564 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005565 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5566 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005567 if (PySequence_DelItem(st->st_stack, end) < 0)
5568 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005569 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005570}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005572static void
5573symtable_enter_scope(struct symtable *st, char *name, int type,
5574 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005576 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005577
5578 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005579 prev = st->st_cur;
5580 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005581 st->st_errors++;
5582 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005583 }
5584 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005585 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005586 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005587 if (st->st_cur == NULL) {
5588 st->st_errors++;
5589 return;
5590 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005591 if (strcmp(name, TOP) == 0)
5592 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005593 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005594 if (PyList_Append(prev->ste_children,
5595 (PyObject *)st->st_cur) < 0)
5596 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005597 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598}
5599
5600static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005601symtable_lookup(struct symtable *st, char *name)
5602{
5603 char buffer[MANGLE_LEN];
5604 PyObject *v;
5605 int flags;
5606
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005607 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005608 name = buffer;
5609 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5610 if (v == NULL) {
5611 if (PyErr_Occurred())
5612 return -1;
5613 else
5614 return 0;
5615 }
5616
5617 flags = PyInt_AS_LONG(v);
5618 return flags;
5619}
5620
5621static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005623{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005625 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005626 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005627
Guido van Rossumb7164622002-08-16 02:48:11 +00005628 /* Warn about None, except inside a tuple (where the assignment
5629 code already issues a warning). */
5630 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5631 *name == 'N' && strcmp(name, "None") == 0)
5632 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005633 PyErr_SetString(PyExc_SyntaxError,
5634 "Invalid syntax. Assignment to None.");
5635 symtable_error(st, 0);
5636 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005637 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005638 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005639 name = buffer;
5640 if ((s = PyString_InternFromString(name)) == NULL)
5641 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005642 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5643 Py_DECREF(s);
5644 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005645}
5646
5647/* Must only be called with mangled names */
5648
5649static int
5650symtable_add_def_o(struct symtable *st, PyObject *dict,
5651 PyObject *name, int flag)
5652{
5653 PyObject *o;
5654 int val;
5655
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005656 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005659 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005660 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005661 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005664 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005665 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005667 if (o == NULL)
5668 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670 Py_DECREF(o);
5671 return -1;
5672 }
5673 Py_DECREF(o);
5674
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005675 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005676 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005677 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 } else if (flag & DEF_GLOBAL) {
5679 /* XXX need to update DEF_GLOBAL for other flags too;
5680 perhaps only DEF_FREE_GLOBAL */
5681 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005682 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005683 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005685 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005687 if (o == NULL)
5688 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005690 Py_DECREF(o);
5691 return -1;
5692 }
5693 Py_DECREF(o);
5694 }
5695 return 0;
5696}
5697
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005698#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005699
Tim Peters08a898f2001-06-28 01:52:22 +00005700/* Look for a yield stmt under n. Return 1 if found, else 0.
5701 This hack is used to look inside "if 0:" blocks (which are normally
5702 ignored) in case those are the only places a yield occurs (so that this
5703 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005704static int
5705look_for_yield(node *n)
5706{
5707 int i;
5708
5709 for (i = 0; i < NCH(n); ++i) {
5710 node *kid = CHILD(n, i);
5711
5712 switch (TYPE(kid)) {
5713
5714 case classdef:
5715 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005716 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005717 /* Stuff in nested functions and classes can't make
5718 the parent a generator. */
5719 return 0;
5720
5721 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005722 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005723
5724 default:
5725 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005726 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005727 }
5728 }
5729 return 0;
5730}
5731
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732static void
5733symtable_node(struct symtable *st, node *n)
5734{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005735 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005736
5737 loop:
5738 switch (TYPE(n)) {
5739 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005740 char *func_name;
5741 if (NCH(n) == 6)
5742 symtable_node(st, CHILD(n, 0));
5743 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005744 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005745 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005746 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005747 symtable_funcdef(st, n);
5748 symtable_exit_scope(st);
5749 break;
5750 }
5751 case lambdef:
5752 if (NCH(n) == 4)
5753 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005754 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 symtable_funcdef(st, n);
5756 symtable_exit_scope(st);
5757 break;
5758 case classdef: {
5759 char *tmp, *class_name = STR(CHILD(n, 1));
5760 symtable_add_def(st, class_name, DEF_LOCAL);
5761 if (TYPE(CHILD(n, 2)) == LPAR) {
5762 node *bases = CHILD(n, 3);
5763 int i;
5764 for (i = 0; i < NCH(bases); i += 2) {
5765 symtable_node(st, CHILD(bases, i));
5766 }
5767 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005768 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769 tmp = st->st_private;
5770 st->st_private = class_name;
5771 symtable_node(st, CHILD(n, NCH(n) - 1));
5772 st->st_private = tmp;
5773 symtable_exit_scope(st);
5774 break;
5775 }
5776 case if_stmt:
5777 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005778 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5779 if (st->st_cur->ste_generator == 0)
5780 st->st_cur->ste_generator =
5781 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005783 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005784 symtable_node(st, CHILD(n, i + 1));
5785 symtable_node(st, CHILD(n, i + 3));
5786 }
5787 if (i + 2 < NCH(n))
5788 symtable_node(st, CHILD(n, i + 2));
5789 break;
5790 case global_stmt:
5791 symtable_global(st, n);
5792 break;
5793 case import_stmt:
5794 symtable_import(st, n);
5795 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005796 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005797 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005798 symtable_node(st, CHILD(n, 1));
5799 if (NCH(n) > 2)
5800 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005801 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005802 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005803 st->st_cur->ste_opt_lineno = n->n_lineno;
5804 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005805 if (NCH(n) > 4)
5806 symtable_node(st, CHILD(n, 5));
5807 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005808
5809 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005810 case assert_stmt:
5811 if (Py_OptimizeFlag)
5812 return;
5813 if (NCH(n) == 2) {
5814 n = CHILD(n, 1);
5815 goto loop;
5816 } else {
5817 symtable_node(st, CHILD(n, 1));
5818 n = CHILD(n, 3);
5819 goto loop;
5820 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005821 case except_clause:
5822 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005823 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005824 if (NCH(n) > 1) {
5825 n = CHILD(n, 1);
5826 goto loop;
5827 }
5828 break;
5829 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005830 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005831 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005832 case yield_stmt:
5833 st->st_cur->ste_generator = 1;
5834 n = CHILD(n, 1);
5835 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005836 case expr_stmt:
5837 if (NCH(n) == 1)
5838 n = CHILD(n, 0);
5839 else {
5840 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005841 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 symtable_node(st, CHILD(n, 2));
5843 break;
5844 } else {
5845 int i;
5846 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005847 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005848 n = CHILD(n, NCH(n) - 1);
5849 }
5850 }
5851 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005852 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005853 /* only occurs when there are multiple for loops
5854 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005855 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005856 if (TYPE(n) == list_for)
5857 symtable_list_for(st, n);
5858 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005859 REQ(n, list_if);
5860 symtable_node(st, CHILD(n, 1));
5861 if (NCH(n) == 3) {
5862 n = CHILD(n, 2);
5863 goto loop;
5864 }
5865 }
5866 break;
5867 case for_stmt:
5868 symtable_assign(st, CHILD(n, 1), 0);
5869 for (i = 3; i < NCH(n); ++i)
5870 if (TYPE(CHILD(n, i)) >= single_input)
5871 symtable_node(st, CHILD(n, i));
5872 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005873 case arglist:
5874 if (NCH(n) > 1)
5875 for (i = 0; i < NCH(n); ++i) {
5876 node *ch = CHILD(n, i);
5877 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5878 TYPE(CHILD(ch, 1)) == gen_for) {
5879 PyErr_SetString(PyExc_SyntaxError,
5880 "invalid syntax");
5881 symtable_error(st, n->n_lineno);
5882 return;
5883 }
5884 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005885 /* The remaining cases fall through to default except in
5886 special circumstances. This requires the individual cases
5887 to be coded with great care, even though they look like
5888 rather innocuous. Each case must double-check TYPE(n).
5889 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005890 case decorator:
5891 if (TYPE(n) == decorator) {
5892 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5893 node *name, *varname;
5894 name = CHILD(n, 1);
5895 REQ(name, dotted_name);
5896 varname = CHILD(name, 0);
5897 REQ(varname, NAME);
5898 symtable_add_use(st, STR(varname));
5899 }
5900 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005901 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005902 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005903 n = CHILD(n, 2);
5904 goto loop;
5905 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005906 else if (TYPE(n) == argument && NCH(n) == 2 &&
5907 TYPE(CHILD(n, 1)) == gen_for) {
5908 symtable_generator_expression(st, n);
5909 break;
5910 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005911 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005912 case listmaker:
5913 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005914 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005915 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005916 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005917 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005918 case testlist_gexp:
5919 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5920 symtable_generator_expression(st, n);
5921 break;
5922 }
5923 /* fall through */
5924
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005925 case atom:
5926 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5927 symtable_add_use(st, STR(CHILD(n, 0)));
5928 break;
5929 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005930 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005932 /* Walk over every non-token child with a special case
5933 for one child.
5934 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935 if (NCH(n) == 1) {
5936 n = CHILD(n, 0);
5937 goto loop;
5938 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005939 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005940 if (TYPE(CHILD(n, i)) >= single_input)
5941 symtable_node(st, CHILD(n, i));
5942 }
5943}
5944
5945static void
5946symtable_funcdef(struct symtable *st, node *n)
5947{
5948 node *body;
5949
5950 if (TYPE(n) == lambdef) {
5951 if (NCH(n) == 4)
5952 symtable_params(st, CHILD(n, 1));
5953 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005954 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005955 body = CHILD(n, NCH(n) - 1);
5956 symtable_node(st, body);
5957}
5958
5959/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00005960 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005961 which are references in the defining scope. symtable_params()
5962 parses the parameter names, which are defined in the function's
5963 body.
5964
5965 varargslist:
5966 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
5967 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
5968*/
5969
5970static void
5971symtable_default_args(struct symtable *st, node *n)
5972{
5973 node *c;
5974 int i;
5975
5976 if (TYPE(n) == parameters) {
5977 n = CHILD(n, 1);
5978 if (TYPE(n) == RPAR)
5979 return;
5980 }
5981 REQ(n, varargslist);
5982 for (i = 0; i < NCH(n); i += 2) {
5983 c = CHILD(n, i);
5984 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
5985 break;
5986 }
5987 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
5988 symtable_node(st, CHILD(n, i));
5989 }
5990}
5991
5992static void
5993symtable_params(struct symtable *st, node *n)
5994{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00005995 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00005996 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005997
5998 if (TYPE(n) == parameters) {
5999 n = CHILD(n, 1);
6000 if (TYPE(n) == RPAR)
6001 return;
6002 }
6003 REQ(n, varargslist);
6004 for (i = 0; i < NCH(n); i += 2) {
6005 c = CHILD(n, i);
6006 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6007 ext = 1;
6008 break;
6009 }
6010 if (TYPE(c) == test) {
6011 continue;
6012 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006013 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006015 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006016 char nbuf[30];
6017 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006018 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006019 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006020 }
6021 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 if (ext) {
6023 c = CHILD(n, i);
6024 if (TYPE(c) == STAR) {
6025 i++;
6026 symtable_add_def(st, STR(CHILD(n, i)),
6027 DEF_PARAM | DEF_STAR);
6028 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006029 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006030 c = NULL;
6031 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006032 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006033 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006034 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006035 i++;
6036 symtable_add_def(st, STR(CHILD(n, i)),
6037 DEF_PARAM | DEF_DOUBLESTAR);
6038 }
6039 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006040 if (complex >= 0) {
6041 int j;
6042 for (j = 0; j <= complex; j++) {
6043 c = CHILD(n, j);
6044 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006045 c = CHILD(n, ++j);
6046 else if (TYPE(c) == EQUAL)
6047 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006048 if (TYPE(CHILD(c, 0)) == LPAR)
6049 symtable_params_fplist(st, CHILD(c, 1));
6050 }
6051 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006052}
6053
6054static void
6055symtable_params_fplist(struct symtable *st, node *n)
6056{
6057 int i;
6058 node *c;
6059
6060 REQ(n, fplist);
6061 for (i = 0; i < NCH(n); i += 2) {
6062 c = CHILD(n, i);
6063 REQ(c, fpdef);
6064 if (NCH(c) == 1)
6065 symtable_add_def(st, STR(CHILD(c, 0)),
6066 DEF_PARAM | DEF_INTUPLE);
6067 else
6068 symtable_params_fplist(st, CHILD(c, 1));
6069 }
6070
6071}
6072
6073static void
6074symtable_global(struct symtable *st, node *n)
6075{
6076 int i;
6077
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006078 /* XXX It might be helpful to warn about module-level global
6079 statements, but it's hard to tell the difference between
6080 module-level and a string passed to exec.
6081 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006082
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006083 for (i = 1; i < NCH(n); i += 2) {
6084 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006085 int flags;
6086
6087 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006088 if (flags < 0)
6089 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006090 if (flags && flags != DEF_GLOBAL) {
6091 char buf[500];
6092 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006093 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006094 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006095 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006096 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006097 }
6098 else {
6099 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006100 PyOS_snprintf(buf, sizeof(buf),
6101 GLOBAL_AFTER_ASSIGN,
6102 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006103 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006104 PyOS_snprintf(buf, sizeof(buf),
6105 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006106 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006107 }
6108 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006109 symtable_add_def(st, name, DEF_GLOBAL);
6110 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006111}
6112
6113static void
6114symtable_list_comprehension(struct symtable *st, node *n)
6115{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006116 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006117 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006118
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006119 REQ(n, listmaker);
6120 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6121 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006122 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006123 symtable_list_for(st, CHILD(n, 1));
6124 symtable_node(st, CHILD(n, 0));
6125 --st->st_cur->ste_tmpname;
6126}
6127
6128static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006129symtable_generator_expression(struct symtable *st, node *n)
6130{
6131 /* testlist_gexp: test gen_for */
6132 REQ(CHILD(n, 0), test);
6133 REQ(CHILD(n, 1), gen_for);
6134
6135 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6136 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6137
6138 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6139
6140 symtable_gen_for(st, CHILD(n, 1), 1);
6141 symtable_node(st, CHILD(n, 0));
6142 symtable_exit_scope(st);
6143
6144 /* for outmost iterable precomputation */
6145 symtable_node(st, CHILD(CHILD(n, 1), 3));
6146}
6147
6148static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006149symtable_list_for(struct symtable *st, node *n)
6150{
6151 REQ(n, list_for);
6152 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006153 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006154 symtable_node(st, CHILD(n, 3));
6155 if (NCH(n) == 5)
6156 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006157}
6158
6159static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006160symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6161{
6162 REQ(n, gen_for);
6163
6164 /* gen_for: for v in test [gen_iter] */
6165 symtable_assign(st, CHILD(n, 1), 0);
6166 if (is_outmost)
6167 symtable_add_use(st, "[outmost-iterable]");
6168 else
6169 symtable_node(st, CHILD(n, 3));
6170
6171 if (NCH(n) == 5)
6172 symtable_gen_iter(st, CHILD(n, 4));
6173}
6174
6175static void
6176symtable_gen_iter(struct symtable *st, node *n)
6177{
6178 REQ(n, gen_iter);
6179
6180 n = CHILD(n, 0);
6181 if (TYPE(n) == gen_for)
6182 symtable_gen_for(st, n, 0);
6183 else {
6184 REQ(n, gen_if);
6185 symtable_node(st, CHILD(n, 1));
6186
6187 if (NCH(n) == 3)
6188 symtable_gen_iter(st, CHILD(n, 2));
6189 }
6190}
6191
6192static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006193symtable_import(struct symtable *st, node *n)
6194{
6195 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006196 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006197 | 'from' dotted_name 'import'
6198 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006199 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006201 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006202 node *dotname = CHILD(n, 1);
6203 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6204 /* check for bogus imports */
6205 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6206 PyErr_SetString(PyExc_SyntaxError,
6207 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006208 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006209 return;
6210 }
6211 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006212 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006213 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006214 if (symtable_warn(st,
6215 "import * only allowed at module level") < 0)
6216 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006217 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006218 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006219 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006220 } else {
6221 for (i = 3; i < NCH(n); i += 2) {
6222 node *c = CHILD(n, i);
6223 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006224 symtable_assign(st, CHILD(c, 2),
6225 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006226 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006227 symtable_assign(st, CHILD(c, 0),
6228 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006229 }
6230 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006231 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006233 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006234 }
6235 }
6236}
6237
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006238/* The third argument to symatble_assign() is a flag to be passed to
6239 symtable_add_def() if it is eventually called. The flag is useful
6240 to specify the particular type of assignment that should be
6241 recorded, e.g. an assignment caused by import.
6242 */
6243
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006244static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006245symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006246{
6247 node *tmp;
6248 int i;
6249
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006250 loop:
6251 switch (TYPE(n)) {
6252 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006253 /* invalid assignment, e.g. lambda x:x=2. The next
6254 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006255 return;
6256 case power:
6257 if (NCH(n) > 2) {
6258 for (i = 2; i < NCH(n); ++i)
6259 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6260 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006261 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006262 if (NCH(n) > 1) {
6263 symtable_node(st, CHILD(n, 0));
6264 symtable_node(st, CHILD(n, 1));
6265 } else {
6266 n = CHILD(n, 0);
6267 goto loop;
6268 }
6269 return;
6270 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006271 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6272 /* XXX This is an error, but the next pass
6273 will catch it. */
6274 return;
6275 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006276 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006277 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006278 }
6279 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006280 case testlist_gexp:
6281 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6282 /* XXX This is an error, but the next pass
6283 will catch it. */
6284 return;
6285 } else {
6286 for (i = 0; i < NCH(n); i += 2)
6287 symtable_assign(st, CHILD(n, i), def_flag);
6288 }
6289 return;
6290
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006291 case exprlist:
6292 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006293 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006294 if (NCH(n) == 1) {
6295 n = CHILD(n, 0);
6296 goto loop;
6297 }
6298 else {
6299 int i;
6300 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006301 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006302 return;
6303 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006304 case atom:
6305 tmp = CHILD(n, 0);
6306 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6307 n = CHILD(n, 1);
6308 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006309 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006310 if (strcmp(STR(tmp), "__debug__") == 0) {
6311 PyErr_SetString(PyExc_SyntaxError,
6312 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006313 symtable_error(st, n->n_lineno);
6314 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006315 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006316 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006317 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006318 return;
6319 case dotted_as_name:
6320 if (NCH(n) == 3)
6321 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006322 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006323 else
6324 symtable_add_def(st,
6325 STR(CHILD(CHILD(n,
6326 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006327 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006328 return;
6329 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006330 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006331 return;
6332 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006333 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006334 return;
6335 default:
6336 if (NCH(n) == 0)
6337 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006338 if (NCH(n) == 1) {
6339 n = CHILD(n, 0);
6340 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006341 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006342 /* Should only occur for errors like x + 1 = 1,
6343 which will be caught in the next pass. */
6344 for (i = 0; i < NCH(n); ++i)
6345 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006346 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006347 }
6348}