blob: 16bf291708d4e9ea8f2624e6d5975a0eb6f59314 [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;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
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_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000400 Bails out with no change if one or more of the LOAD_CONSTs is missing.
401 Also works for BUILD_LIST when followed by an "in" or "not in" test.
402*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000403static int
404tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
405{
406 PyObject *newconst, *constant;
407 int i, arg, len_consts;
408
409 /* Pre-conditions */
410 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000411 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000414 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000420 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421 for (i=0 ; i<n ; i++) {
422 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000423 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430 if (PyList_Append(consts, newconst)) {
431 Py_DECREF(newconst);
432 return 0;
433 }
434 Py_DECREF(newconst);
435
436 /* Write NOPs over old LOAD_CONSTS and
437 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
438 memset(codestr, NOP, n*3);
439 codestr[n*3] = LOAD_CONST;
440 SETARG(codestr, (n*3), len_consts);
441 return 1;
442}
443
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000444/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
445 with LOAD_CONST binop(c1,c2)
446 The consts table must still be in list form so that the
447 new constant can be appended.
448 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000449 Abandons the transformation if the folding fails (i.e. 1+'a').
450 If the new constant is a sequence, only folds when the size
451 is below a threshold value. That keeps pyc files from
452 becoming large in the presence of code like: (None,)*1000.
453*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454static int
455fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
456{
457 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000458 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459
460 /* Pre-conditions */
461 assert(PyList_CheckExact(consts));
462 assert(codestr[0] == LOAD_CONST);
463 assert(codestr[3] == LOAD_CONST);
464
465 /* Create new constant */
466 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
467 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
468 opcode = codestr[6];
469 switch (opcode) {
470 case BINARY_POWER:
471 newconst = PyNumber_Power(v, w, Py_None);
472 break;
473 case BINARY_MULTIPLY:
474 newconst = PyNumber_Multiply(v, w);
475 break;
476 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000477 /* Cannot fold this operation statically since
478 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000479 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000480 case BINARY_TRUE_DIVIDE:
481 newconst = PyNumber_TrueDivide(v, w);
482 break;
483 case BINARY_FLOOR_DIVIDE:
484 newconst = PyNumber_FloorDivide(v, w);
485 break;
486 case BINARY_MODULO:
487 newconst = PyNumber_Remainder(v, w);
488 break;
489 case BINARY_ADD:
490 newconst = PyNumber_Add(v, w);
491 break;
492 case BINARY_SUBTRACT:
493 newconst = PyNumber_Subtract(v, w);
494 break;
495 case BINARY_SUBSCR:
496 newconst = PyObject_GetItem(v, w);
497 break;
498 case BINARY_LSHIFT:
499 newconst = PyNumber_Lshift(v, w);
500 break;
501 case BINARY_RSHIFT:
502 newconst = PyNumber_Rshift(v, w);
503 break;
504 case BINARY_AND:
505 newconst = PyNumber_And(v, w);
506 break;
507 case BINARY_XOR:
508 newconst = PyNumber_Xor(v, w);
509 break;
510 case BINARY_OR:
511 newconst = PyNumber_Or(v, w);
512 break;
513 default:
514 /* Called with an unknown opcode */
515 assert(0);
516 return 0;
517 }
518 if (newconst == NULL) {
519 PyErr_Clear();
520 return 0;
521 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000522 size = PyObject_Size(newconst);
523 if (size == -1)
524 PyErr_Clear();
525 else if (size > 20) {
526 Py_DECREF(newconst);
527 return 0;
528 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000529
530 /* Append folded constant into consts table */
531 len_consts = PyList_GET_SIZE(consts);
532 if (PyList_Append(consts, newconst)) {
533 Py_DECREF(newconst);
534 return 0;
535 }
536 Py_DECREF(newconst);
537
538 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
539 memset(codestr, NOP, 4);
540 codestr[4] = LOAD_CONST;
541 SETARG(codestr, 4, len_consts);
542 return 1;
543}
544
Raymond Hettinger80121492005-02-20 12:41:32 +0000545static int
546fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
547{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000548 PyObject *newconst=NULL, *v;
Raymond Hettinger80121492005-02-20 12:41:32 +0000549 int len_consts, opcode;
550
551 /* Pre-conditions */
552 assert(PyList_CheckExact(consts));
553 assert(codestr[0] == LOAD_CONST);
554
555 /* Create new constant */
556 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
557 opcode = codestr[3];
558 switch (opcode) {
559 case UNARY_NEGATIVE:
Raymond Hettingere63a0782005-02-23 13:37:55 +0000560 /* Preserve the sign of -0.0 */
561 if (PyObject_IsTrue(v) == 1)
562 newconst = PyNumber_Negative(v);
Raymond Hettinger80121492005-02-20 12:41:32 +0000563 break;
564 case UNARY_CONVERT:
565 newconst = PyObject_Repr(v);
566 break;
567 case UNARY_INVERT:
568 newconst = PyNumber_Invert(v);
569 break;
570 default:
571 /* Called with an unknown opcode */
572 assert(0);
573 return 0;
574 }
575 if (newconst == NULL) {
576 PyErr_Clear();
577 return 0;
578 }
579
580 /* Append folded constant into consts table */
581 len_consts = PyList_GET_SIZE(consts);
582 if (PyList_Append(consts, newconst)) {
583 Py_DECREF(newconst);
584 return 0;
585 }
586 Py_DECREF(newconst);
587
588 /* Write NOP LOAD_CONST newconst */
589 codestr[0] = NOP;
590 codestr[1] = LOAD_CONST;
591 SETARG(codestr, 1, len_consts);
592 return 1;
593}
594
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595static unsigned int *
596markblocks(unsigned char *code, int len)
597{
598 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000599 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000600
601 if (blocks == NULL)
602 return NULL;
603 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000604
605 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000606 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
607 opcode = code[i];
608 switch (opcode) {
609 case FOR_ITER:
610 case JUMP_FORWARD:
611 case JUMP_IF_FALSE:
612 case JUMP_IF_TRUE:
613 case JUMP_ABSOLUTE:
614 case CONTINUE_LOOP:
615 case SETUP_LOOP:
616 case SETUP_EXCEPT:
617 case SETUP_FINALLY:
618 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000619 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000620 break;
621 }
622 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000623 /* Build block numbers in the second pass */
624 for (i=0 ; i<len ; i++) {
625 blockcnt += blocks[i]; /* increment blockcnt over labels */
626 blocks[i] = blockcnt;
627 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000628 return blocks;
629}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000630
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000631/* Perform basic peephole optimizations to components of a code object.
632 The consts object should still be in list form to allow new constants
633 to be appended.
634
635 To keep the optimizer simple, it bails out (does nothing) for code
636 containing extended arguments or that has a length over 32,700. That
637 allows us to avoid overflow and sign issues. Likewise, it bails when
638 the lineno table has complex encoding for gaps >= 255.
639
640 Optimizations are restricted to simple transformations occuring within a
641 single basic block. All transformations keep the code size the same or
642 smaller. For those that reduce size, the gaps are initially filled with
643 NOPs. Later those NOPs are removed and the jump addresses retargeted in
644 a single pass. Line numbering is adjusted accordingly. */
645
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000646static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000647optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000649 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000650 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000651 unsigned char *codestr = NULL;
652 unsigned char *lineno;
653 int *addrmap = NULL;
654 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000655 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000656 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000657 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000658
Raymond Hettingereffb3932004-10-30 08:55:08 +0000659 /* Bail out if an exception is set */
660 if (PyErr_Occurred())
661 goto exitUnchanged;
662
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000663 /* Bypass optimization when the lineno table is too complex */
664 assert(PyString_Check(lineno_obj));
665 lineno = PyString_AS_STRING(lineno_obj);
666 tabsiz = PyString_GET_SIZE(lineno_obj);
667 if (memchr(lineno, 255, tabsiz) != NULL)
668 goto exitUnchanged;
669
Raymond Hettingera12fa142004-08-24 04:34:16 +0000670 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000671 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000673 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000674 goto exitUnchanged;
675
676 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000678 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000679 goto exitUnchanged;
680 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000681
Raymond Hettinger07359a72005-02-21 20:03:14 +0000682 /* Verify that RETURN_VALUE terminates the codestring. This allows
683 the various transformation patterns to look ahead several
684 instructions without additional checks to make sure they are not
685 looking beyond the end of the code string.
686 */
687 if (codestr[codelen-1] != RETURN_VALUE)
688 goto exitUnchanged;
689
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000690 /* Mapping to new jump targets after NOPs are removed */
691 addrmap = PyMem_Malloc(codelen * sizeof(int));
692 if (addrmap == NULL)
693 goto exitUnchanged;
694
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000695 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000696 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000697 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000698 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000699
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000700 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000701 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000702
703 lastlc = cumlc;
704 cumlc = 0;
705
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000706 switch (opcode) {
707
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000708 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000709 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000710 case UNARY_NOT:
711 if (codestr[i+1] != JUMP_IF_FALSE ||
712 codestr[i+4] != POP_TOP ||
713 !ISBASICBLOCK(blocks,i,5))
714 continue;
715 tgt = GETJUMPTGT(codestr, (i+1));
716 if (codestr[tgt] != POP_TOP)
717 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000718 j = GETARG(codestr, i+1) + 1;
719 codestr[i] = JUMP_IF_TRUE;
720 SETARG(codestr, i, j);
721 codestr[i+3] = POP_TOP;
722 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000723 break;
724
725 /* not a is b --> a is not b
726 not a in b --> a not in b
727 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000728 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000729 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000730 case COMPARE_OP:
731 j = GETARG(codestr, i);
732 if (j < 6 || j > 9 ||
733 codestr[i+3] != UNARY_NOT ||
734 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000735 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000736 SETARG(codestr, i, (j^1));
737 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000738 break;
739
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000740 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
741 case LOAD_NAME:
742 case LOAD_GLOBAL:
743 j = GETARG(codestr, i);
744 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
745 if (name == NULL || strcmp(name, "None") != 0)
746 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000747 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
748 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000749 codestr[i] = LOAD_CONST;
750 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000751 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000752 break;
753 }
754 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000755 break;
756
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000757 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000758 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000759 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000760 j = GETARG(codestr, i);
761 if (codestr[i+3] != JUMP_IF_FALSE ||
762 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000763 !ISBASICBLOCK(blocks,i,7) ||
764 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000765 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000766 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000767 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000768 break;
769
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000770 /* Try to fold tuples of constants (includes a case for lists
771 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000772 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000773 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
774 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000775 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000776 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000777 j = GETARG(codestr, i);
778 h = i - 3 * j;
779 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000780 j <= lastlc &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000781 ((opcode == BUILD_TUPLE &&
782 ISBASICBLOCK(blocks, h, 3*(j+1))) ||
783 (opcode == BUILD_LIST &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000784 codestr[i+3]==COMPARE_OP &&
785 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
Brett Cannon5dc8ced2005-03-03 07:01:48 +0000786 (GETARG(codestr,i+3)==6 ||
787 GETARG(codestr,i+3)==7))) &&
788 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000789 assert(codestr[i] == LOAD_CONST);
790 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000791 break;
792 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000793 if (codestr[i+3] != UNPACK_SEQUENCE ||
794 !ISBASICBLOCK(blocks,i,6) ||
795 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000796 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000797 if (j == 1) {
798 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000799 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000800 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000801 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000802 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000803 codestr[i] = ROT_THREE;
804 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000805 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000806 }
807 break;
808
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000809 /* Fold binary ops on constants.
810 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
811 case BINARY_POWER:
812 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000813 case BINARY_TRUE_DIVIDE:
814 case BINARY_FLOOR_DIVIDE:
815 case BINARY_MODULO:
816 case BINARY_ADD:
817 case BINARY_SUBTRACT:
818 case BINARY_SUBSCR:
819 case BINARY_LSHIFT:
820 case BINARY_RSHIFT:
821 case BINARY_AND:
822 case BINARY_XOR:
823 case BINARY_OR:
824 if (lastlc >= 2 &&
825 ISBASICBLOCK(blocks, i-6, 7) &&
826 fold_binops_on_constants(&codestr[i-6], consts)) {
827 i -= 2;
828 assert(codestr[i] == LOAD_CONST);
829 cumlc = 1;
830 }
831 break;
832
Raymond Hettinger80121492005-02-20 12:41:32 +0000833 /* Fold unary ops on constants.
834 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
835 case UNARY_NEGATIVE:
836 case UNARY_CONVERT:
837 case UNARY_INVERT:
838 if (lastlc >= 1 &&
839 ISBASICBLOCK(blocks, i-3, 4) &&
840 fold_unaryops_on_constants(&codestr[i-3], consts)) {
841 i -= 2;
842 assert(codestr[i] == LOAD_CONST);
843 cumlc = 1;
844 }
845 break;
846
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000847 /* Simplify conditional jump to conditional jump where the
848 result of the first test implies the success of a similar
849 test or the failure of the opposite test.
850 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000851 "if a and b:"
852 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000853 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000854 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000855 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000856 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
857 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000858 */
859 case JUMP_IF_FALSE:
860 case JUMP_IF_TRUE:
861 tgt = GETJUMPTGT(codestr, i);
862 j = codestr[tgt];
863 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
864 if (j == opcode) {
865 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
866 SETARG(codestr, i, tgttgt);
867 } else {
868 tgt -= i;
869 SETARG(codestr, i, tgt);
870 }
871 break;
872 }
873 /* Intentional fallthrough */
874
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000875 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000876 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000877 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000878 case JUMP_ABSOLUTE:
879 case CONTINUE_LOOP:
880 case SETUP_LOOP:
881 case SETUP_EXCEPT:
882 case SETUP_FINALLY:
883 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000884 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000885 continue;
886 tgttgt = GETJUMPTGT(codestr, tgt);
887 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
888 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000889 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000890 tgttgt -= i + 3; /* Calc relative jump addr */
891 if (tgttgt < 0) /* No backward relative jumps */
892 continue;
893 codestr[i] = opcode;
894 SETARG(codestr, i, tgttgt);
895 break;
896
897 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000898 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000899
900 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
901 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000902 if (i+4 >= codelen ||
903 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000904 !ISBASICBLOCK(blocks,i,5))
905 continue;
906 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000907 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000908 }
909 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000910
911 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000912 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
913 addrmap[i] = i - nops;
914 if (codestr[i] == NOP)
915 nops++;
916 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000917 cum_orig_line = 0;
918 last_line = 0;
919 for (i=0 ; i < tabsiz ; i+=2) {
920 cum_orig_line += lineno[i];
921 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000922 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000923 lineno[i] =((unsigned char)(new_line - last_line));
924 last_line = new_line;
925 }
926
927 /* Remove NOPs and fixup jump targets */
928 for (i=0, h=0 ; i<codelen ; ) {
929 opcode = codestr[i];
930 switch (opcode) {
931 case NOP:
932 i++;
933 continue;
934
935 case JUMP_ABSOLUTE:
936 case CONTINUE_LOOP:
937 j = addrmap[GETARG(codestr, i)];
938 SETARG(codestr, i, j);
939 break;
940
941 case FOR_ITER:
942 case JUMP_FORWARD:
943 case JUMP_IF_FALSE:
944 case JUMP_IF_TRUE:
945 case SETUP_LOOP:
946 case SETUP_EXCEPT:
947 case SETUP_FINALLY:
948 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
949 SETARG(codestr, i, j);
950 break;
951 }
952 adj = CODESIZE(opcode);
953 while (adj--)
954 codestr[h++] = codestr[i++];
955 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000956 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000957
958 code = PyString_FromStringAndSize((char *)codestr, h);
959 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000960 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000961 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000962 return code;
963
964exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000965 if (blocks != NULL)
966 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000967 if (addrmap != NULL)
968 PyMem_Free(addrmap);
969 if (codestr != NULL)
970 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000971 Py_INCREF(code);
972 return code;
973}
974
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000975/* End: Peephole optimizations ----------------------------------------- */
976
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000978PyCode_New(int argcount, int nlocals, int stacksize, int flags,
979 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
981 PyObject *filename, PyObject *name, int firstlineno,
982 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000983{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000985 int i;
986 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000987 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000988 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 consts == NULL || !PyTuple_Check(consts) ||
990 names == NULL || !PyTuple_Check(names) ||
991 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 freevars == NULL || !PyTuple_Check(freevars) ||
993 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 name == NULL || !PyString_Check(name) ||
995 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000996 lnotab == NULL || !PyString_Check(lnotab) ||
997 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000998 PyErr_BadInternalCall();
999 return NULL;
1000 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001001 intern_strings(names);
1002 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001003 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001004 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001005 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 for (i = PyTuple_Size(consts); --i >= 0; ) {
1007 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001009 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001010 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001011 continue;
1012 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001013 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001016 co->co_argcount = argcount;
1017 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001018 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001019 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +00001020 Py_INCREF(code);
1021 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001025 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001027 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001028 Py_INCREF(freevars);
1029 co->co_freevars = freevars;
1030 Py_INCREF(cellvars);
1031 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001033 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001035 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001036 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001038 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001039 if (PyTuple_GET_SIZE(freevars) == 0 &&
1040 PyTuple_GET_SIZE(cellvars) == 0)
1041 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001042 }
1043 return co;
1044}
1045
1046
1047/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001048
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001049/* The compiler uses two passes to generate bytecodes. The first pass
1050 builds the symbol table. The second pass generates the bytecode.
1051
1052 The first pass uses a single symtable struct. The second pass uses
1053 a compiling struct for each code block. The compiling structs
1054 share a reference to the symtable.
1055
1056 The two passes communicate via symtable_load_symbols() and via
1057 is_local() and is_global(). The former initializes several slots
1058 in the compiling struct: c_varnames, c_locals, c_nlocals,
1059 c_argcount, c_globals, and c_flags.
1060*/
1061
Tim Peters2a7f3842001-06-09 09:26:21 +00001062/* All about c_lnotab.
1063
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001064c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1065version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1066mapped to source code line #s via c_lnotab instead.
1067
Tim Peters2a7f3842001-06-09 09:26:21 +00001068The array is conceptually a list of
1069 (bytecode offset increment, line number increment)
1070pairs. The details are important and delicate, best illustrated by example:
1071
1072 byte code offset source code line number
1073 0 1
1074 6 2
1075 50 7
1076 350 307
1077 361 308
1078
1079The first trick is that these numbers aren't stored, only the increments
1080from one row to the next (this doesn't really work, but it's a start):
1081
1082 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1083
1084The second trick is that an unsigned byte can't hold negative values, or
1085values larger than 255, so (a) there's a deep assumption that byte code
1086offsets and their corresponding line #s both increase monotonically, and (b)
1087if at least one column jumps by more than 255 from one row to the next, more
1088than one pair is written to the table. In case #b, there's no way to know
1089from looking at the table later how many were written. That's the delicate
1090part. A user of c_lnotab desiring to find the source line number
1091corresponding to a bytecode address A should do something like this
1092
1093 lineno = addr = 0
1094 for addr_incr, line_incr in c_lnotab:
1095 addr += addr_incr
1096 if addr > A:
1097 return lineno
1098 lineno += line_incr
1099
1100In order for this to work, when the addr field increments by more than 255,
1101the line # increment in each pair generated must be 0 until the remaining addr
1102increment is < 256. So, in the example above, com_set_lineno should not (as
1103was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1104255, 0, 45, 255, 0, 45.
1105*/
1106
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001107struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001108 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001110 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001112 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001113 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject *c_locals; /* dictionary (value=localID) */
1115 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001116 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001117 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001118 int c_nlocals; /* index of next local */
1119 int c_argcount; /* number of top-level arguments */
1120 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121 int c_nexti; /* index into c_code */
1122 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001123 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001124 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001125 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001126 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001127 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001128 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001129 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001130 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001131 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001132 int c_stacklevel; /* Current stack level */
1133 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001134 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001136 int c_last_addr; /* last op addr seen and recorded in lnotab */
1137 int c_last_line; /* last line seen and recorded in lnotab */
1138 int c_lnotab_next; /* current length of lnotab */
1139 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001140 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001141 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001142 int c_nested; /* Is block nested funcdef or lamdef? */
1143 int c_closure; /* Is nested w/freevars? */
1144 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001145 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001146 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147};
1148
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001149static int
1150is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001151{
1152 if ((v & (USE | DEF_FREE))
1153 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1154 return 1;
1155 if (v & DEF_FREE_CLASS)
1156 return 1;
1157 return 0;
1158}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001159
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001160static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001161com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001162{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001163 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1164
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001165 if (c == NULL) {
1166 /* Error occurred via symtable call to
1167 is_constant_false */
1168 PyErr_SetString(exc, msg);
1169 return;
1170 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001171 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001172 if (c->c_lineno < 1 || c->c_interactive) {
1173 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001175 return;
1176 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001177 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001178 if (v == NULL)
1179 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001180
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001181 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001182 if (line == NULL) {
1183 Py_INCREF(Py_None);
1184 line = Py_None;
1185 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001186 if (exc == PyExc_SyntaxError) {
1187 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1188 Py_None, line);
1189 if (t == NULL)
1190 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001191 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001192 if (w == NULL)
1193 goto exit;
1194 PyErr_SetObject(exc, w);
1195 } else {
1196 /* Make sure additional exceptions are printed with
1197 file and line, also. */
1198 PyErr_SetObject(exc, v);
1199 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1200 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001201 exit:
1202 Py_XDECREF(t);
1203 Py_XDECREF(v);
1204 Py_XDECREF(w);
1205 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001206}
1207
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001208/* Interface to the block stack */
1209
1210static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001211block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001212{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001213 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 com_error(c, PyExc_SystemError,
1215 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001216 }
1217 else {
1218 c->c_block[c->c_nblocks++] = type;
1219 }
1220}
1221
1222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001223block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001224{
1225 if (c->c_nblocks > 0)
1226 c->c_nblocks--;
1227 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001229 }
1230}
1231
Guido van Rossum681d79a1995-07-18 14:51:37 +00001232/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001233
Martin v. Löwis95292d62002-12-11 14:04:59 +00001234static int issue_warning(const char *, const char *, int);
1235static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001236static void com_free(struct compiling *);
1237static void com_push(struct compiling *, int);
1238static void com_pop(struct compiling *, int);
1239static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001240static void com_node(struct compiling *, node *);
1241static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001242static void com_addbyte(struct compiling *, int);
1243static void com_addint(struct compiling *, int);
1244static void com_addoparg(struct compiling *, int, int);
1245static void com_addfwref(struct compiling *, int, int *);
1246static void com_backpatch(struct compiling *, int);
1247static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1248static int com_addconst(struct compiling *, PyObject *);
1249static int com_addname(struct compiling *, PyObject *);
1250static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001251static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001252static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001253static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001254static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001255static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001256static void com_assign(struct compiling *, node *, int, node *);
1257static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001258static int com_make_closure(struct compiling *c, PyCodeObject *co);
1259
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001260static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001261static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001262 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001263static PyObject *parsestrplus(struct compiling*, node *);
1264static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001265static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001267static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001268
1269/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001270static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001271static struct symtable *symtable_build(node *, PyFutureFeatures *,
1272 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001273static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001274static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001275static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001277static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001278static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001279
1280static void symtable_node(struct symtable *, node *);
1281static void symtable_funcdef(struct symtable *, node *);
1282static void symtable_default_args(struct symtable *, node *);
1283static void symtable_params(struct symtable *, node *);
1284static void symtable_params_fplist(struct symtable *, node *n);
1285static void symtable_global(struct symtable *, node *);
1286static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001287static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001288static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001289static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001290static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001291static void symtable_gen_for(struct symtable *, node *, int);
1292static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001293
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001294static int symtable_update_free_vars(struct symtable *);
1295static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1296static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1297
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298/* helper */
1299static void
1300do_pad(int pad)
1301{
1302 int i;
1303 for (i = 0; i < pad; ++i)
1304 fprintf(stderr, " ");
1305}
1306
1307static void
1308dump(node *n, int pad, int depth)
1309{
1310 int i;
1311 if (depth == 0)
1312 return;
1313 do_pad(pad);
1314 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1315 if (depth > 0)
1316 depth--;
1317 for (i = 0; i < NCH(n); ++i)
1318 dump(CHILD(n, i), pad + 1, depth);
1319}
1320
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001322com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001323{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001324 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1326 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001327 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001328 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001329 goto fail;
1330 if ((c->c_const_dict = PyDict_New()) == NULL)
1331 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001333 goto fail;
1334 if ((c->c_name_dict = PyDict_New()) == NULL)
1335 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001337 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1339 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001340 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001341 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001342 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001343 c->c_freevars = NULL;
1344 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001345 c->c_nlocals = 0;
1346 c->c_argcount = 0;
1347 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 c->c_nexti = 0;
1349 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001350 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001351 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001352 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001353 c->c_begin = 0;
1354 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001355 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001356 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001357 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001358 c->c_stacklevel = 0;
1359 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001360 c->c_firstlineno = 0;
1361 c->c_last_addr = 0;
1362 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001363 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001364 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001365 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001366 c->c_nested = 0;
1367 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001368 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001369 return 1;
1370
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001371 fail:
1372 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373 return 0;
1374}
1375
1376static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001377com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001378{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 Py_XDECREF(c->c_code);
1380 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001381 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001383 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 Py_XDECREF(c->c_globals);
1385 Py_XDECREF(c->c_locals);
1386 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001387 Py_XDECREF(c->c_freevars);
1388 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001390 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001391 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392}
1393
1394static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001395com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001396{
1397 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001398 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001400 /*
1401 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1402 c->c_filename, c->c_name, c->c_lineno,
1403 c->c_nexti, c->c_stacklevel, n);
1404 */
1405 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001406}
1407
1408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001410{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001411 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001413 else
1414 c->c_stacklevel -= n;
1415}
1416
1417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001418com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419{
1420 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001422 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424}
1425
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001426static int
1427com_check_size(PyObject **s, int offset)
1428{
1429 int len = PyString_GET_SIZE(*s);
1430 if (offset >= len)
1431 return _PyString_Resize(s, len * 2);
1432 return 0;
1433}
1434
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001436com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001437{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001438 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001439 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001440 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001441 if (com_check_size(&c->c_code, c->c_nexti)) {
1442 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001445 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446}
1447
1448static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001449com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001451 com_addbyte(c, x & 0xff);
1452 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001453}
1454
1455static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001456com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001457{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001458 char *p;
1459 if (c->c_lnotab == NULL)
1460 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001461 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1462 c->c_errors++;
1463 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001464 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001465 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001466 *p++ = addr;
1467 *p++ = line;
1468 c->c_lnotab_next += 2;
1469}
1470
1471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001472com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001473{
1474 c->c_lineno = lineno;
1475 if (c->c_firstlineno == 0) {
1476 c->c_firstlineno = c->c_last_line = lineno;
1477 }
1478 else {
1479 int incr_addr = c->c_nexti - c->c_last_addr;
1480 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001481 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001482 while (incr_addr > 255) {
1483 com_add_lnotab(c, 255, 0);
1484 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001485 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001486 while (incr_line > 255) {
1487 com_add_lnotab(c, incr_addr, 255);
1488 incr_line -=255;
1489 incr_addr = 0;
1490 }
1491 if (incr_addr > 0 || incr_line > 0)
1492 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001493 c->c_last_addr = c->c_nexti;
1494 c->c_last_line = lineno;
1495 }
1496}
1497
1498static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001499com_strip_lnotab(struct compiling *c)
1500{
1501 /* strip the last lnotab entry if no opcode were emitted.
1502 * This prevents a line number to be generated on a final
1503 * pass, like in the following example:
1504 *
1505 * if a:
1506 * print 5
1507 * else:
1508 * pass
1509 *
1510 * Without the fix, a line trace event would be generated
1511 * on the pass even if a is true (because of the implicit
1512 * return).
1513 */
1514 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1515 c->c_lnotab_next = c->c_lnotab_last;
1516 }
1517}
1518
1519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001520com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001521{
Fred Drakeef8ace32000-08-24 00:32:09 +00001522 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001523 if (extended_arg){
1524 com_addbyte(c, EXTENDED_ARG);
1525 com_addint(c, extended_arg);
1526 arg &= 0xffff;
1527 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001528 com_addbyte(c, op);
1529 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530}
1531
1532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001533com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534{
1535 /* Compile a forward reference for backpatching */
1536 int here;
1537 int anchor;
1538 com_addbyte(c, op);
1539 here = c->c_nexti;
1540 anchor = *p_anchor;
1541 *p_anchor = here;
1542 com_addint(c, anchor == 0 ? 0 : here - anchor);
1543}
1544
1545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001548 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550 int dist;
1551 int prev;
1552 for (;;) {
1553 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001554 prev = code[anchor] + (code[anchor+1] << 8);
1555 dist = target - (anchor+2);
1556 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001557 dist >>= 8;
1558 code[anchor+1] = dist;
1559 dist >>= 8;
1560 if (dist) {
1561 com_error(c, PyExc_SystemError,
1562 "com_backpatch: offset too large");
1563 break;
1564 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565 if (!prev)
1566 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567 anchor -= prev;
1568 }
1569}
1570
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001571/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572
1573static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001574com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001576 PyObject *w, *t, *np=NULL;
1577 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001578
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001579 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001580 if (t == NULL)
1581 goto fail;
1582 w = PyDict_GetItem(dict, t);
1583 if (w != NULL) {
1584 n = PyInt_AsLong(w);
1585 } else {
1586 n = PyList_Size(list);
1587 np = PyInt_FromLong(n);
1588 if (np == NULL)
1589 goto fail;
1590 if (PyList_Append(list, v) != 0)
1591 goto fail;
1592 if (PyDict_SetItem(dict, t, np) != 0)
1593 goto fail;
1594 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001595 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001596 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001597 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001598 fail:
1599 Py_XDECREF(np);
1600 Py_XDECREF(t);
1601 c->c_errors++;
1602 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001603}
1604
1605static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001606com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001607{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001608 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001609}
1610
1611static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001613{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001614 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001615}
1616
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001617int
1618_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001619{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001620 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001621 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001622 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1624 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001625 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001626 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001627 return 0; /* Don't mangle __extremely_long_names */
1628 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1629 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001630 /* Strip leading underscores from class name */
1631 while (*p == '_')
1632 p++;
1633 if (*p == '\0')
1634 return 0; /* Don't mangle if class is just underscores */
1635 plen = strlen(p);
1636 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001637 plen = maxlen-nlen-2; /* Truncate class name if too long */
1638 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001639 buffer[0] = '_';
1640 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001641 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001642 return 1;
1643}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001644
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001645static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001646com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001647{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001649 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001650 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001651
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001652 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001653 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001654 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001655 c->c_errors++;
1656 i = 255;
1657 }
1658 else {
1659 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001661 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001662 com_addoparg(c, op, i);
1663}
1664
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001665#define NAME_LOCAL 0
1666#define NAME_GLOBAL 1
1667#define NAME_DEFAULT 2
1668#define NAME_CLOSURE 3
1669
1670static int
1671com_lookup_arg(PyObject *dict, PyObject *name)
1672{
1673 PyObject *v = PyDict_GetItem(dict, name);
1674 if (v == NULL)
1675 return -1;
1676 else
1677 return PyInt_AS_LONG(v);
1678}
1679
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001680static int
1681none_assignment_check(struct compiling *c, char *name, int assigning)
1682{
1683 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1684 char *msg;
1685 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001686 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001687 else
1688 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001689 com_error(c, PyExc_SyntaxError, msg);
1690 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001691 }
1692 return 0;
1693}
1694
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001695static void
1696com_addop_varname(struct compiling *c, int kind, char *name)
1697{
1698 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001699 int i, reftype;
1700 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001701 int op = STOP_CODE;
1702 char buffer[MANGLE_LEN];
1703
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001704 if (kind != VAR_LOAD &&
1705 none_assignment_check(c, name, kind == VAR_STORE))
1706 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001707 i = 255;
1708 goto done;
1709 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001710 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001711 name = buffer;
1712 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1713 c->c_errors++;
1714 i = 255;
1715 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001716 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001717
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001718 reftype = get_ref_type(c, name);
1719 switch (reftype) {
1720 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001721 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001722 scope = NAME_LOCAL;
1723 break;
1724 case GLOBAL_EXPLICIT:
1725 scope = NAME_GLOBAL;
1726 break;
1727 case GLOBAL_IMPLICIT:
1728 if (c->c_flags & CO_OPTIMIZED)
1729 scope = NAME_GLOBAL;
1730 break;
1731 case FREE:
1732 case CELL:
1733 scope = NAME_CLOSURE;
1734 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001735 }
1736
1737 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001738 if (scope == NAME_LOCAL)
1739 i = com_lookup_arg(c->c_locals, v);
1740 else if (reftype == FREE)
1741 i = com_lookup_arg(c->c_freevars, v);
1742 else if (reftype == CELL)
1743 i = com_lookup_arg(c->c_cellvars, v);
1744 if (i == -1) {
1745 c->c_errors++; /* XXX no exception set */
1746 i = 255;
1747 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001748 }
1749 Py_DECREF(v);
1750
1751 switch (kind) {
1752 case VAR_LOAD:
1753 switch (scope) {
1754 case NAME_LOCAL:
1755 op = LOAD_FAST;
1756 break;
1757 case NAME_GLOBAL:
1758 op = LOAD_GLOBAL;
1759 break;
1760 case NAME_DEFAULT:
1761 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001762 break;
1763 case NAME_CLOSURE:
1764 op = LOAD_DEREF;
1765 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001766 }
1767 break;
1768 case VAR_STORE:
1769 switch (scope) {
1770 case NAME_LOCAL:
1771 op = STORE_FAST;
1772 break;
1773 case NAME_GLOBAL:
1774 op = STORE_GLOBAL;
1775 break;
1776 case NAME_DEFAULT:
1777 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001778 break;
1779 case NAME_CLOSURE:
1780 op = STORE_DEREF;
1781 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001782 }
1783 break;
1784 case VAR_DELETE:
1785 switch (scope) {
1786 case NAME_LOCAL:
1787 op = DELETE_FAST;
1788 break;
1789 case NAME_GLOBAL:
1790 op = DELETE_GLOBAL;
1791 break;
1792 case NAME_DEFAULT:
1793 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001794 break;
1795 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001796 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001797 PyOS_snprintf(buf, sizeof(buf),
1798 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001799 com_error(c, PyExc_SyntaxError, buf);
1800 i = 255;
1801 break;
1802 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001803 }
1804 break;
1805 }
1806done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001807 com_addoparg(c, op, i);
1808}
1809
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001811com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001812{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001813 char *name;
1814 char buffer[1000];
1815 /* XXX it is possible to write this code without the 1000
1816 chars on the total length of dotted names, I just can't be
1817 bothered right now */
1818 if (TYPE(n) == STAR)
1819 name = "*";
1820 else if (TYPE(n) == dotted_name) {
1821 char *p = buffer;
1822 int i;
1823 name = buffer;
1824 for (i = 0; i < NCH(n); i += 2) {
1825 char *s = STR(CHILD(n, i));
1826 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001828 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001829 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001830 break;
1831 }
1832 if (p != buffer)
1833 *p++ = '.';
1834 strcpy(p, s);
1835 p = strchr(p, '\0');
1836 }
1837 }
1838 else {
1839 REQ(n, NAME);
1840 name = STR(n);
1841 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001842 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001843}
1844
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001846parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001847{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001848 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001850 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001851#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001852 int imflag;
1853#endif
1854
Guido van Rossum282914b1991-04-04 10:42:56 +00001855 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001856 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001857#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001858 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001859#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001860 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001862 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001864 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001865 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001866 }
1867 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001868 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001870 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001871 if (errno != 0)
1872 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001874 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001875 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001876#ifndef WITHOUT_COMPLEX
1877 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001878 Py_complex z;
1879 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001880 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001881 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001882 PyFPE_END_PROTECT(z)
1883 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001884 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001885 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001886#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001887 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001888 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001889 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001890 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001893}
1894
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001896decode_utf8(char **sPtr, char *end, char* encoding)
1897{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001898#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001899 Py_FatalError("decode_utf8 should not be called in this build.");
1900 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001901#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001902 PyObject *u, *v;
1903 char *s, *t;
1904 t = s = *sPtr;
1905 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1906 while (s < end && (*s & 0x80)) s++;
1907 *sPtr = s;
1908 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1909 if (u == NULL)
1910 return NULL;
1911 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1912 Py_DECREF(u);
1913 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001914#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001915}
1916
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001917/* compiler.transformer.Transformer.decode_literal depends on what
1918 might seem like minor details of this function -- changes here
1919 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001920static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001921parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001924 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001925 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001926 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001927 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001928 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001929 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001930
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001931 if (isalpha(quote) || quote == '_') {
1932 if (quote == 'u' || quote == 'U') {
1933 quote = *++s;
1934 unicode = 1;
1935 }
1936 if (quote == 'r' || quote == 'R') {
1937 quote = *++s;
1938 rawmode = 1;
1939 }
1940 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001941 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return NULL;
1944 }
1945 s++;
1946 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001947 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001948 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001949 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001950 return NULL;
1951 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001952 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001954 return NULL;
1955 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001956 if (len >= 4 && s[0] == quote && s[1] == quote) {
1957 s += 2;
1958 len -= 2;
1959 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001961 return NULL;
1962 }
1963 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001964#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001965 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001966 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001967 char *buf;
1968 char *p;
1969 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001970 if (encoding == NULL) {
1971 buf = s;
1972 u = NULL;
1973 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1974 buf = s;
1975 u = NULL;
1976 } else {
1977 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1978 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1979 if (u == NULL)
1980 return NULL;
1981 p = buf = PyString_AsString(u);
1982 end = s + len;
1983 while (s < end) {
1984 if (*s == '\\') {
1985 *p++ = *s++;
1986 if (*s & 0x80) {
1987 strcpy(p, "u005c");
1988 p += 5;
1989 }
1990 }
1991 if (*s & 0x80) { /* XXX inefficient */
1992 char *r;
1993 int rn, i;
1994 w = decode_utf8(&s, end, "utf-16-be");
1995 if (w == NULL) {
1996 Py_DECREF(u);
1997 return NULL;
1998 }
1999 r = PyString_AsString(w);
2000 rn = PyString_Size(w);
2001 assert(rn % 2 == 0);
2002 for (i = 0; i < rn; i += 2) {
2003 sprintf(p, "\\u%02x%02x",
2004 r[i + 0] & 0xFF,
2005 r[i + 1] & 0xFF);
2006 p += 6;
2007 }
2008 Py_DECREF(w);
2009 } else {
2010 *p++ = *s++;
2011 }
2012 }
2013 len = p - buf;
2014 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002015 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002016 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002017 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002018 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
2019 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002020 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002021 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002022 return v;
2023
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002024 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002025#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002026 need_encoding = (encoding != NULL &&
2027 strcmp(encoding, "utf-8") != 0 &&
2028 strcmp(encoding, "iso-8859-1") != 0);
2029 if (rawmode || strchr(s, '\\') == NULL) {
2030 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002031#ifndef Py_USING_UNICODE
2032 /* This should not happen - we never see any other
2033 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002034 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002035#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002036 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2037 if (u == NULL)
2038 return NULL;
2039 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2040 Py_DECREF(u);
2041 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002042#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002043 } else {
2044 return PyString_FromStringAndSize(s, len);
2045 }
2046 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002047
2048 v = PyString_DecodeEscape(s, len, NULL, unicode,
2049 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002050 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002051 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002052 return v;
2053}
2054
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002056parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002057{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002058 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002059 int i;
2060 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002061 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002062 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002063 for (i = 1; i < NCH(n); i++) {
2064 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002065 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002066 if (s == NULL)
2067 goto onError;
2068 if (PyString_Check(v) && PyString_Check(s)) {
2069 PyString_ConcatAndDel(&v, s);
2070 if (v == NULL)
2071 goto onError;
2072 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002073#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002074 else {
2075 PyObject *temp;
2076 temp = PyUnicode_Concat(v, s);
2077 Py_DECREF(s);
2078 if (temp == NULL)
2079 goto onError;
2080 Py_DECREF(v);
2081 v = temp;
2082 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002083#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002084 }
2085 }
2086 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002087
2088 onError:
2089 Py_XDECREF(v);
2090 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002091}
2092
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002094com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002095{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002096 int anchor = 0;
2097 int save_begin = c->c_begin;
2098
Raymond Hettinger354433a2004-05-19 08:20:33 +00002099 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002100 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002102 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002103 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002104 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002105 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002106 c->c_loops++;
2107 com_list_iter(c, n, e, t);
2108 c->c_loops--;
2109 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2110 c->c_begin = save_begin;
2111 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002112 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002113}
2114
2115static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002116com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2117{
2118 int break_anchor = 0;
2119 int anchor = 0;
2120 int save_begin = c->c_begin;
2121
2122 REQ(n, gen_for);
2123 /* gen_for: for v in test [gen_iter] */
2124
2125 com_addfwref(c, SETUP_LOOP, &break_anchor);
2126 block_push(c, SETUP_LOOP);
2127
2128 if (is_outmost) {
2129 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2130 com_push(c, 1);
2131 }
2132 else {
2133 com_node(c, CHILD(n, 3));
2134 com_addbyte(c, GET_ITER);
2135 }
2136
2137 c->c_begin = c->c_nexti;
2138 com_set_lineno(c, c->c_last_line);
2139 com_addfwref(c, FOR_ITER, &anchor);
2140 com_push(c, 1);
2141 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2142
2143 if (NCH(n) == 5)
2144 com_gen_iter(c, CHILD(n, 4), t);
2145 else {
2146 com_test(c, t);
2147 com_addbyte(c, YIELD_VALUE);
2148 com_pop(c, 1);
2149 }
2150
2151 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2152 c->c_begin = save_begin;
2153
2154 com_backpatch(c, anchor);
2155 com_pop(c, 1); /* FOR_ITER has popped this */
2156 com_addbyte(c, POP_BLOCK);
2157 block_pop(c, SETUP_LOOP);
2158 com_backpatch(c, break_anchor);
2159}
2160
2161static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002162com_list_if(struct compiling *c, node *n, node *e, char *t)
2163{
2164 int anchor = 0;
2165 int a = 0;
2166 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002167 com_node(c, CHILD(n, 1));
2168 com_addfwref(c, JUMP_IF_FALSE, &a);
2169 com_addbyte(c, POP_TOP);
2170 com_pop(c, 1);
2171 com_list_iter(c, n, e, t);
2172 com_addfwref(c, JUMP_FORWARD, &anchor);
2173 com_backpatch(c, a);
2174 /* We jump here with an extra entry which we now pop */
2175 com_addbyte(c, POP_TOP);
2176 com_backpatch(c, anchor);
2177}
2178
2179static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002180com_gen_if(struct compiling *c, node *n, node *t)
2181{
2182 /* gen_if: 'if' test [gen_iter] */
2183 int anchor = 0;
2184 int a=0;
2185
2186 com_node(c, CHILD(n, 1));
2187 com_addfwref(c, JUMP_IF_FALSE, &a);
2188 com_addbyte(c, POP_TOP);
2189 com_pop(c, 1);
2190
2191 if (NCH(n) == 3)
2192 com_gen_iter(c, CHILD(n, 2), t);
2193 else {
2194 com_test(c, t);
2195 com_addbyte(c, YIELD_VALUE);
2196 com_pop(c, 1);
2197 }
2198 com_addfwref(c, JUMP_FORWARD, &anchor);
2199 com_backpatch(c, a);
2200 /* We jump here with an extra entry which we now pop */
2201 com_addbyte(c, POP_TOP);
2202 com_backpatch(c, anchor);
2203}
2204
2205static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002206com_list_iter(struct compiling *c,
2207 node *p, /* parent of list_iter node */
2208 node *e, /* element expression node */
2209 char *t /* name of result list temp local */)
2210{
2211 /* list_iter is the last child in a listmaker, list_for, or list_if */
2212 node *n = CHILD(p, NCH(p)-1);
2213 if (TYPE(n) == list_iter) {
2214 n = CHILD(n, 0);
2215 switch (TYPE(n)) {
2216 case list_for:
2217 com_list_for(c, n, e, t);
2218 break;
2219 case list_if:
2220 com_list_if(c, n, e, t);
2221 break;
2222 default:
2223 com_error(c, PyExc_SystemError,
2224 "invalid list_iter node type");
2225 }
2226 }
2227 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002228 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002229 com_push(c, 1);
2230 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002231 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002232 com_pop(c, 2);
2233 }
2234}
2235
2236static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002237com_gen_iter(struct compiling *c, node *n, node *t)
2238{
2239 /* gen_iter: gen_for | gen_if */
2240 node *ch;
2241 REQ(n, gen_iter);
2242
2243 ch = CHILD(n, 0);
2244
2245 switch (TYPE(ch)) {
2246 case gen_for:
2247 com_gen_for(c, ch, t, 0);
2248 break;
2249 case gen_if:
2250 com_gen_if(c, ch, t);
2251 break;
2252 default:
2253 com_error(c, PyExc_SystemError,
2254 "invalid gen_iter node type");
2255 }
2256}
2257
2258static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002259com_list_comprehension(struct compiling *c, node *n)
2260{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002261 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002262 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002263
2264 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002265 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002266 com_addoparg(c, BUILD_LIST, 0);
2267 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2268 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002269 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002270 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002271 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002272 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002273 --c->c_tmpname;
2274}
2275
2276static void
2277com_listmaker(struct compiling *c, node *n)
2278{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002279 /* listmaker: test ( list_for | (',' test)* [','] ) */
2280 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002281 com_list_comprehension(c, n);
2282 else {
2283 int len = 0;
2284 int i;
2285 for (i = 0; i < NCH(n); i += 2, len++)
2286 com_node(c, CHILD(n, i));
2287 com_addoparg(c, BUILD_LIST, len);
2288 com_pop(c, len-1);
2289 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002290}
2291
2292static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002293com_generator_expression(struct compiling *c, node *n)
2294{
2295 /* testlist_gexp: test gen_for */
2296 /* argument: test gen_for */
2297 PyCodeObject *co;
2298
2299 REQ(CHILD(n, 0), test);
2300 REQ(CHILD(n, 1), gen_for);
2301
2302 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2303 n->n_lineno);
2304 co = icompile(n, c);
2305 symtable_exit_scope(c->c_symtable);
2306
2307 if (co == NULL)
2308 c->c_errors++;
2309 else {
2310 int closure = com_make_closure(c, co);
2311 int i = com_addconst(c, (PyObject *)co);
2312
2313 com_addoparg(c, LOAD_CONST, i);
2314 com_push(c, 1);
2315 if (closure)
2316 com_addoparg(c, MAKE_CLOSURE, 0);
2317 else
2318 com_addoparg(c, MAKE_FUNCTION, 0);
2319
2320 com_test(c, CHILD(CHILD(n, 1), 3));
2321 com_addbyte(c, GET_ITER);
2322 com_addoparg(c, CALL_FUNCTION, 1);
2323 com_pop(c, 1);
2324
2325 Py_DECREF(co);
2326 }
2327}
2328
2329static void
2330com_testlist_gexp(struct compiling *c, node *n)
2331{
2332 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2333 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2334 com_generator_expression(c, n);
2335 else com_list(c, n, 0);
2336}
2337
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002338
Raymond Hettinger354433a2004-05-19 08:20:33 +00002339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002340com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002341{
2342 int i;
2343 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2344 for (i = 0; i+2 < NCH(n); i += 4) {
2345 /* We must arrange things just right for STORE_SUBSCR.
2346 It wants the stack to look like (value) (dict) (key) */
2347 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002349 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002350 com_node(c, CHILD(n, i+2)); /* value */
2351 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002352 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002354 }
2355}
2356
2357static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002358com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002359{
2360 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 int i;
2363 REQ(n, atom);
2364 ch = CHILD(n, 0);
2365 switch (TYPE(ch)) {
2366 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002369 com_push(c, 1);
2370 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002371 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002372 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002374 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002375 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 com_push(c, 1);
2378 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002380 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002382 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002384 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002385 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002386 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002387 break;
2388 case BACKQUOTE:
2389 com_node(c, CHILD(n, 1));
2390 com_addbyte(c, UNARY_CONVERT);
2391 break;
2392 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002393 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 i = 255;
2395 }
2396 else {
2397 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002399 }
2400 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002401 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 break;
2403 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002404 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002405 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002406 c->c_errors++;
2407 i = 255;
2408 }
2409 else {
2410 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002411 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 }
2413 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 break;
2416 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002417 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002418 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002419 break;
2420 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002421 com_error(c, PyExc_SystemError,
2422 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002423 }
2424}
2425
2426static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002427com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002428{
2429 if (NCH(n) == 1) {
2430 com_addbyte(c, op);
2431 }
2432 else if (NCH(n) == 2) {
2433 if (TYPE(CHILD(n, 0)) != COLON) {
2434 com_node(c, CHILD(n, 0));
2435 com_addbyte(c, op+1);
2436 }
2437 else {
2438 com_node(c, CHILD(n, 1));
2439 com_addbyte(c, op+2);
2440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002442 }
2443 else {
2444 com_node(c, CHILD(n, 0));
2445 com_node(c, CHILD(n, 2));
2446 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002447 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002448 }
2449}
2450
Guido van Rossum635abd21997-01-06 22:56:52 +00002451static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002452com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2453{
2454 if (NCH(n) == 1) {
2455 com_addbyte(c, DUP_TOP);
2456 com_push(c, 1);
2457 com_addbyte(c, SLICE);
2458 com_node(c, augn);
2459 com_addbyte(c, opcode);
2460 com_pop(c, 1);
2461 com_addbyte(c, ROT_TWO);
2462 com_addbyte(c, STORE_SLICE);
2463 com_pop(c, 2);
2464 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2465 com_node(c, CHILD(n, 0));
2466 com_addoparg(c, DUP_TOPX, 2);
2467 com_push(c, 2);
2468 com_addbyte(c, SLICE+1);
2469 com_pop(c, 1);
2470 com_node(c, augn);
2471 com_addbyte(c, opcode);
2472 com_pop(c, 1);
2473 com_addbyte(c, ROT_THREE);
2474 com_addbyte(c, STORE_SLICE+1);
2475 com_pop(c, 3);
2476 } else if (NCH(n) == 2) {
2477 com_node(c, CHILD(n, 1));
2478 com_addoparg(c, DUP_TOPX, 2);
2479 com_push(c, 2);
2480 com_addbyte(c, SLICE+2);
2481 com_pop(c, 1);
2482 com_node(c, augn);
2483 com_addbyte(c, opcode);
2484 com_pop(c, 1);
2485 com_addbyte(c, ROT_THREE);
2486 com_addbyte(c, STORE_SLICE+2);
2487 com_pop(c, 3);
2488 } else {
2489 com_node(c, CHILD(n, 0));
2490 com_node(c, CHILD(n, 2));
2491 com_addoparg(c, DUP_TOPX, 3);
2492 com_push(c, 3);
2493 com_addbyte(c, SLICE+3);
2494 com_pop(c, 2);
2495 com_node(c, augn);
2496 com_addbyte(c, opcode);
2497 com_pop(c, 1);
2498 com_addbyte(c, ROT_FOUR);
2499 com_addbyte(c, STORE_SLICE+3);
2500 com_pop(c, 4);
2501 }
2502}
2503
2504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002505com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002506{
2507 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002508 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002509 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002510 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002511 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002512 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002513 }
2514 else {
2515 com_node(c, CHILD(n, 0));
2516 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002517 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002518 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002519 if (NCH(n) == 2) {
2520 com_generator_expression(c, n);
2521 return;
2522 }
2523
Guido van Rossumf10570b1995-07-07 22:53:21 +00002524 m = n;
2525 do {
2526 m = CHILD(m, 0);
2527 } while (NCH(m) == 1);
2528 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002529 /* f(lambda x: x[0] = 3) ends up getting parsed with
2530 * LHS test = lambda x: x[0], and RHS test = 3.
2531 * SF bug 132313 points out that complaining about a keyword
2532 * then is very confusing.
2533 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002534 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002535 TYPE(m) == lambdef ?
2536 "lambda cannot contain assignment" :
2537 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002538 }
2539 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002540 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002541 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002542 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002544 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002545 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002546 else if (*pkeywords == NULL) {
2547 c->c_errors++;
2548 Py_DECREF(v);
2549 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002550 if (PyDict_GetItem(*pkeywords, v) != NULL)
2551 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002552 "duplicate keyword argument");
2553 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002554 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002555 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002556 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002557 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002558 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002559 }
2560 }
2561 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002562}
2563
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
2567 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002568 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 }
2570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002571 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002572 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002573 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002574 int star_flag = 0;
2575 int starstar_flag = 0;
2576 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002577 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002578 na = 0;
2579 nk = 0;
2580 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002581 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002582 if (TYPE(ch) == STAR ||
2583 TYPE(ch) == DOUBLESTAR)
2584 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002585 if (ch->n_lineno != lineno) {
2586 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002587 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002588 }
2589 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002590 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002591 na++;
2592 else
2593 nk++;
2594 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002595 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002596 while (i < NCH(n)) {
2597 node *tok = CHILD(n, i);
2598 node *ch = CHILD(n, i+1);
2599 i += 3;
2600 switch (TYPE(tok)) {
2601 case STAR: star_flag = 1; break;
2602 case DOUBLESTAR: starstar_flag = 1; break;
2603 }
2604 com_node(c, ch);
2605 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002606 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002607 com_error(c, PyExc_SyntaxError,
2608 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002609 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002610 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002611 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002612 star_flag + (starstar_flag << 1);
2613 else
2614 opcode = CALL_FUNCTION;
2615 com_addoparg(c, opcode, na | (nk << 8));
2616 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002617 }
2618}
2619
2620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002621com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002622{
2623 com_addopname(c, LOAD_ATTR, n);
2624}
2625
2626static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002627com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002628{
2629 int i=0;
2630 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002631 node *ch;
2632
2633 /* first argument */
2634 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002635 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002636 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002637 i++;
2638 }
2639 else {
2640 com_node(c, CHILD(n,i));
2641 i++;
2642 REQ(CHILD(n,i),COLON);
2643 i++;
2644 }
2645 /* second argument */
2646 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2647 com_node(c, CHILD(n,i));
2648 i++;
2649 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002650 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002651 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 com_push(c, 1);
2653 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002654 /* remaining arguments */
2655 for (; i < NCH(n); i++) {
2656 ns++;
2657 ch=CHILD(n,i);
2658 REQ(ch, sliceop);
2659 if (NCH(ch) == 1) {
2660 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002661 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002662 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002663 }
2664 else
2665 com_node(c, CHILD(ch,1));
2666 }
2667 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002668 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002669}
2670
2671static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002672com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002673{
2674 node *ch;
2675 REQ(n, subscript);
2676 ch = CHILD(n,0);
2677 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002678 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002679 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 com_push(c, 1);
2681 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002682 else {
2683 /* check for slice */
2684 if ((TYPE(ch) == COLON || NCH(n) > 1))
2685 com_sliceobj(c, n);
2686 else {
2687 REQ(ch, test);
2688 com_node(c, ch);
2689 }
2690 }
2691}
2692
2693static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002694com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002695{
2696 int i, op;
2697 REQ(n, subscriptlist);
2698 /* Check to make backward compatible slice behavior for '[i:j]' */
2699 if (NCH(n) == 1) {
2700 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002701 /* 'Basic' slice, should have exactly one colon. */
2702 if ((TYPE(CHILD(sub, 0)) == COLON
2703 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2704 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2705 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002706 switch (assigning) {
2707 case OP_DELETE:
2708 op = DELETE_SLICE;
2709 break;
2710 case OP_ASSIGN:
2711 op = STORE_SLICE;
2712 break;
2713 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002714 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002715 break;
2716 default:
2717 com_augassign_slice(c, sub, assigning, augn);
2718 return;
2719 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002720 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 if (op == STORE_SLICE)
2722 com_pop(c, 2);
2723 else if (op == DELETE_SLICE)
2724 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002725 return;
2726 }
2727 }
2728 /* Else normal subscriptlist. Compile each subscript. */
2729 for (i = 0; i < NCH(n); i += 2)
2730 com_subscript(c, CHILD(n, i));
2731 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002732 if (NCH(n) > 1) {
2733 i = (NCH(n)+1) / 2;
2734 com_addoparg(c, BUILD_TUPLE, i);
2735 com_pop(c, i-1);
2736 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002737 switch (assigning) {
2738 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002739 op = DELETE_SUBSCR;
2740 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002741 break;
2742 default:
2743 case OP_ASSIGN:
2744 op = STORE_SUBSCR;
2745 i = 3;
2746 break;
2747 case OP_APPLY:
2748 op = BINARY_SUBSCR;
2749 i = 1;
2750 break;
2751 }
2752 if (assigning > OP_APPLY) {
2753 com_addoparg(c, DUP_TOPX, 2);
2754 com_push(c, 2);
2755 com_addbyte(c, BINARY_SUBSCR);
2756 com_pop(c, 1);
2757 com_node(c, augn);
2758 com_addbyte(c, assigning);
2759 com_pop(c, 1);
2760 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002761 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002762 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002764}
2765
2766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002767com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768{
2769 REQ(n, trailer);
2770 switch (TYPE(CHILD(n, 0))) {
2771 case LPAR:
2772 com_call_function(c, CHILD(n, 1));
2773 break;
2774 case DOT:
2775 com_select_member(c, CHILD(n, 1));
2776 break;
2777 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002778 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779 break;
2780 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002781 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002782 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783 }
2784}
2785
2786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002787com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002788{
2789 int i;
2790 REQ(n, power);
2791 com_atom(c, CHILD(n, 0));
2792 for (i = 1; i < NCH(n); i++) {
2793 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2794 com_factor(c, CHILD(n, i+1));
2795 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002796 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002797 break;
2798 }
2799 else
2800 com_apply_trailer(c, CHILD(n, i));
2801 }
2802}
2803
2804static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002805com_invert_constant(struct compiling *c, node *n)
2806{
2807 /* Compute the inverse of int and longs and use them directly,
2808 but be prepared to generate code for all other
2809 possibilities (invalid numbers, floats, complex).
2810 */
2811 PyObject *num, *inv = NULL;
2812 int i;
2813
2814 REQ(n, NUMBER);
2815 num = parsenumber(c, STR(n));
2816 if (num == NULL)
2817 i = 255;
2818 else {
2819 inv = PyNumber_Invert(num);
2820 if (inv == NULL) {
2821 PyErr_Clear();
2822 i = com_addconst(c, num);
2823 } else {
2824 i = com_addconst(c, inv);
2825 Py_DECREF(inv);
2826 }
2827 Py_DECREF(num);
2828 }
2829 com_addoparg(c, LOAD_CONST, i);
2830 com_push(c, 1);
2831 if (num != NULL && inv == NULL)
2832 com_addbyte(c, UNARY_INVERT);
2833}
2834
Tim Peters51e26512001-09-07 08:45:55 +00002835static int
2836is_float_zero(const char *p)
2837{
2838 int found_radix_point = 0;
2839 int ch;
2840 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2841 switch (ch) {
2842 case '0':
2843 /* no reason to believe it's not 0 -- continue */
2844 break;
2845
2846 case 'e': case 'E': case 'j': case 'J':
2847 /* If this was a hex constant, we already would have
2848 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2849 must be an exponent marker, and we haven't yet
2850 seen a non-zero digit, and it doesn't matter what
2851 the exponent is then. For 'j' or 'J' similarly,
2852 except that this is an imaginary 0 then. */
2853 return 1;
2854
2855 case '.':
2856 found_radix_point = 1;
2857 break;
2858
2859 default:
2860 return 0;
2861 }
2862 }
2863 return found_radix_point;
2864}
2865
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002866static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002867com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002869 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002870 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002872 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002873 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002874 approriate value as a constant. If the value is negative,
2875 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002876 negative in the 0th position -- unless we're doing unary minus
2877 of a floating zero! In that case the sign is significant, but
2878 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002879 */
2880 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002881 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002882 && TYPE((pfactor = CHILD(n, 1))) == factor
2883 && NCH(pfactor) == 1
2884 && TYPE((ppower = CHILD(pfactor, 0))) == power
2885 && NCH(ppower) == 1
2886 && TYPE((patom = CHILD(ppower, 0))) == atom
2887 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002888 && !(childtype == MINUS &&
2889 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002890 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002891 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002892 return;
2893 }
2894 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002895 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002896 if (s == NULL) {
2897 com_error(c, PyExc_MemoryError, "");
2898 com_addbyte(c, 255);
2899 return;
2900 }
2901 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002902 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002903 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002904 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002905 }
Tim Peters51e26512001-09-07 08:45:55 +00002906 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002907 }
2908 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 com_factor(c, CHILD(n, 1));
2910 com_addbyte(c, UNARY_POSITIVE);
2911 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002912 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002913 com_factor(c, CHILD(n, 1));
2914 com_addbyte(c, UNARY_NEGATIVE);
2915 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002916 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002917 com_factor(c, CHILD(n, 1));
2918 com_addbyte(c, UNARY_INVERT);
2919 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002920 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002921 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922 }
2923}
2924
2925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002926com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002927{
2928 int i;
2929 int op;
2930 REQ(n, term);
2931 com_factor(c, CHILD(n, 0));
2932 for (i = 2; i < NCH(n); i += 2) {
2933 com_factor(c, CHILD(n, i));
2934 switch (TYPE(CHILD(n, i-1))) {
2935 case STAR:
2936 op = BINARY_MULTIPLY;
2937 break;
2938 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002939 if (c->c_flags & CO_FUTURE_DIVISION)
2940 op = BINARY_TRUE_DIVIDE;
2941 else
2942 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002943 break;
2944 case PERCENT:
2945 op = BINARY_MODULO;
2946 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002947 case DOUBLESLASH:
2948 op = BINARY_FLOOR_DIVIDE;
2949 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002951 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002952 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002953 op = 255;
2954 }
2955 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002956 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002957 }
2958}
2959
2960static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002961com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002962{
2963 int i;
2964 int op;
2965 REQ(n, arith_expr);
2966 com_term(c, CHILD(n, 0));
2967 for (i = 2; i < NCH(n); i += 2) {
2968 com_term(c, CHILD(n, i));
2969 switch (TYPE(CHILD(n, i-1))) {
2970 case PLUS:
2971 op = BINARY_ADD;
2972 break;
2973 case MINUS:
2974 op = BINARY_SUBTRACT;
2975 break;
2976 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002977 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002978 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002979 op = 255;
2980 }
2981 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002982 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002983 }
2984}
2985
2986static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002987com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002988{
2989 int i;
2990 int op;
2991 REQ(n, shift_expr);
2992 com_arith_expr(c, CHILD(n, 0));
2993 for (i = 2; i < NCH(n); i += 2) {
2994 com_arith_expr(c, CHILD(n, i));
2995 switch (TYPE(CHILD(n, i-1))) {
2996 case LEFTSHIFT:
2997 op = BINARY_LSHIFT;
2998 break;
2999 case RIGHTSHIFT:
3000 op = BINARY_RSHIFT;
3001 break;
3002 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003003 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003004 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003005 op = 255;
3006 }
3007 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003008 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003009 }
3010}
3011
3012static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003013com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003014{
3015 int i;
3016 int op;
3017 REQ(n, and_expr);
3018 com_shift_expr(c, CHILD(n, 0));
3019 for (i = 2; i < NCH(n); i += 2) {
3020 com_shift_expr(c, CHILD(n, i));
3021 if (TYPE(CHILD(n, i-1)) == AMPER) {
3022 op = BINARY_AND;
3023 }
3024 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003025 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003026 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003027 op = 255;
3028 }
3029 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003030 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003031 }
3032}
3033
3034static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003035com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003036{
3037 int i;
3038 int op;
3039 REQ(n, xor_expr);
3040 com_and_expr(c, CHILD(n, 0));
3041 for (i = 2; i < NCH(n); i += 2) {
3042 com_and_expr(c, CHILD(n, i));
3043 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3044 op = BINARY_XOR;
3045 }
3046 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003047 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003048 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 op = 255;
3050 }
3051 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003052 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053 }
3054}
3055
3056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003057com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058{
3059 int i;
3060 int op;
3061 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003062 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003064 com_xor_expr(c, CHILD(n, i));
3065 if (TYPE(CHILD(n, i-1)) == VBAR) {
3066 op = BINARY_OR;
3067 }
3068 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003070 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 op = 255;
3072 }
3073 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003074 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075 }
3076}
3077
3078static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003079cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080{
3081 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003082 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3084 if (NCH(n) == 1) {
3085 n = CHILD(n, 0);
3086 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003087 case LESS: return PyCmp_LT;
3088 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003089 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003090 case LESSEQUAL: return PyCmp_LE;
3091 case GREATEREQUAL: return PyCmp_GE;
3092 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3093 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3094 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 }
3096 }
3097 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003100 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003102 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103 }
3104 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003105 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003106}
3107
3108static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003109com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110{
3111 int i;
3112 enum cmp_op op;
3113 int anchor;
3114 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3115 com_expr(c, CHILD(n, 0));
3116 if (NCH(n) == 1)
3117 return;
3118
3119 /****************************************************************
3120 The following code is generated for all but the last
3121 comparison in a chain:
3122
3123 label: on stack: opcode: jump to:
3124
3125 a <code to load b>
3126 a, b DUP_TOP
3127 a, b, b ROT_THREE
3128 b, a, b COMPARE_OP
3129 b, 0-or-1 JUMP_IF_FALSE L1
3130 b, 1 POP_TOP
3131 b
3132
3133 We are now ready to repeat this sequence for the next
3134 comparison in the chain.
3135
3136 For the last we generate:
3137
3138 b <code to load c>
3139 b, c COMPARE_OP
3140 0-or-1
3141
3142 If there were any jumps to L1 (i.e., there was more than one
3143 comparison), we generate:
3144
3145 0-or-1 JUMP_FORWARD L2
3146 L1: b, 0 ROT_TWO
3147 0, b POP_TOP
3148 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003149 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 ****************************************************************/
3151
3152 anchor = 0;
3153
3154 for (i = 2; i < NCH(n); i += 2) {
3155 com_expr(c, CHILD(n, i));
3156 if (i+2 < NCH(n)) {
3157 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003158 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 com_addbyte(c, ROT_THREE);
3160 }
3161 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003162 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003163 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003164 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 }
3166 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003167 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168 if (i+2 < NCH(n)) {
3169 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3170 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003171 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172 }
3173 }
3174
3175 if (anchor) {
3176 int anchor2 = 0;
3177 com_addfwref(c, JUMP_FORWARD, &anchor2);
3178 com_backpatch(c, anchor);
3179 com_addbyte(c, ROT_TWO);
3180 com_addbyte(c, POP_TOP);
3181 com_backpatch(c, anchor2);
3182 }
3183}
3184
3185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003186com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187{
3188 REQ(n, not_test); /* 'not' not_test | comparison */
3189 if (NCH(n) == 1) {
3190 com_comparison(c, CHILD(n, 0));
3191 }
3192 else {
3193 com_not_test(c, CHILD(n, 1));
3194 com_addbyte(c, UNARY_NOT);
3195 }
3196}
3197
3198static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003199com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003200{
3201 int i;
3202 int anchor;
3203 REQ(n, and_test); /* not_test ('and' not_test)* */
3204 anchor = 0;
3205 i = 0;
3206 for (;;) {
3207 com_not_test(c, CHILD(n, i));
3208 if ((i += 2) >= NCH(n))
3209 break;
3210 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3211 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 }
3214 if (anchor)
3215 com_backpatch(c, anchor);
3216}
3217
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003218static int
3219com_make_closure(struct compiling *c, PyCodeObject *co)
3220{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003221 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003222 if (free == 0)
3223 return 0;
3224 for (i = 0; i < free; ++i) {
3225 /* Bypass com_addop_varname because it will generate
3226 LOAD_DEREF but LOAD_CLOSURE is needed.
3227 */
3228 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3229 int arg, reftype;
3230
3231 /* Special case: If a class contains a method with a
3232 free variable that has the same name as a method,
3233 the name will be considered free *and* local in the
3234 class. It should be handled by the closure, as
3235 well as by the normal name loookup logic.
3236 */
3237 reftype = get_ref_type(c, PyString_AS_STRING(name));
3238 if (reftype == CELL)
3239 arg = com_lookup_arg(c->c_cellvars, name);
3240 else /* (reftype == FREE) */
3241 arg = com_lookup_arg(c->c_freevars, name);
3242 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003243 fprintf(stderr, "lookup %s in %s %d %d\n"
3244 "freevars of %s: %s\n",
3245 PyObject_REPR(name),
3246 c->c_name,
3247 reftype, arg,
3248 PyString_AS_STRING(co->co_name),
3249 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003250 Py_FatalError("com_make_closure()");
3251 }
3252 com_addoparg(c, LOAD_CLOSURE, arg);
3253
3254 }
3255 com_push(c, free);
3256 return 1;
3257}
3258
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003262 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003263 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003264 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003265 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003266 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003267 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3268 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003269 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003270 if (co == NULL) {
3271 c->c_errors++;
3272 return;
3273 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003274 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003275 i = com_addconst(c, (PyObject *)co);
3276 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003277 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003278 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003279 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003280 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003281 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003282 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003283 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003284 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003285 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003287 else {
3288 int anchor = 0;
3289 int i = 0;
3290 for (;;) {
3291 com_and_test(c, CHILD(n, i));
3292 if ((i += 2) >= NCH(n))
3293 break;
3294 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3295 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003297 }
3298 if (anchor)
3299 com_backpatch(c, anchor);
3300 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301}
3302
3303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003304com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305{
3306 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003307 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 com_node(c, CHILD(n, 0));
3309 }
3310 else {
3311 int i;
3312 int len;
3313 len = (NCH(n) + 1) / 2;
3314 for (i = 0; i < NCH(n); i += 2)
3315 com_node(c, CHILD(n, i));
3316 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003317 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 }
3319}
3320
3321
3322/* Begin of assignment compilation */
3323
Thomas Wouters434d0822000-08-24 20:11:32 +00003324
3325static void
3326com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3327{
3328 com_addbyte(c, DUP_TOP);
3329 com_push(c, 1);
3330 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003331 com_node(c, augn);
3332 com_addbyte(c, opcode);
3333 com_pop(c, 1);
3334 com_addbyte(c, ROT_TWO);
3335 com_addopname(c, STORE_ATTR, n);
3336 com_pop(c, 2);
3337}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003338
3339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003340com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003342 if (none_assignment_check(c, STR(n), assigning))
3343 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003345 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346}
3347
3348static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003349com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 REQ(n, trailer);
3352 switch (TYPE(CHILD(n, 0))) {
3353 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003354 if (assigning == OP_DELETE)
3355 com_error(c, PyExc_SyntaxError,
3356 "can't delete function call");
3357 else
3358 com_error(c, PyExc_SyntaxError,
3359 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 break;
3361 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003362 if (assigning > OP_APPLY)
3363 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3364 else
3365 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003367 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003368 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 break;
3370 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003371 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003372 }
3373}
3374
3375static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003376com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
3378 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003379 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3380 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 if (assigning) {
3383 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003384 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003385 com_push(c, i-1);
3386 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003388 com_assign(c, CHILD(n, i), assigning, NULL);
3389}
3390
3391static void
3392com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3393{
3394 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003395 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003396 com_push(c, 1);
3397 com_node(c, augn);
3398 com_addbyte(c, opcode);
3399 com_pop(c, 1);
3400 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003401}
3402
3403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003404com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405{
3406 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003407 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003408 if (assigning)
3409 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410}
3411
3412static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003413com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414{
3415 /* Loop to avoid trivial recursion */
3416 for (;;) {
3417 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003418
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 case exprlist:
3420 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003421 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003422 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003424 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003425 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003426 "assign to generator expression not possible");
3427 return;
3428 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003429 if (assigning > OP_APPLY) {
3430 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003431 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003432 return;
3433 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003434 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003435 return;
3436 }
3437 n = CHILD(n, 0);
3438 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003439
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 case test:
3441 case and_test:
3442 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003445 case xor_expr:
3446 case and_expr:
3447 case shift_expr:
3448 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003450 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003452 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003453 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 return;
3455 }
3456 n = CHILD(n, 0);
3457 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003458
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003459 case power: /* atom trailer* ('**' power)*
3460 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003461 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003462 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003463 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 return;
3465 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003466 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467 int i;
3468 com_node(c, CHILD(n, 0));
3469 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003470 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003471 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003472 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003473 return;
3474 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003475 com_apply_trailer(c, CHILD(n, i));
3476 } /* NB i is still alive */
3477 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003478 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003479 return;
3480 }
3481 n = CHILD(n, 0);
3482 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003483
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 case atom:
3485 switch (TYPE(CHILD(n, 0))) {
3486 case LPAR:
3487 n = CHILD(n, 1);
3488 if (TYPE(n) == RPAR) {
3489 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003490 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003491 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 return;
3493 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003494 if (assigning > OP_APPLY) {
3495 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003496 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003497 return;
3498 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 break;
3500 case LSQB:
3501 n = CHILD(n, 1);
3502 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003503 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003504 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003505 return;
3506 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003507 if (assigning > OP_APPLY) {
3508 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003509 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003510 return;
3511 }
3512 if (NCH(n) > 1
3513 && TYPE(CHILD(n, 1)) == list_for) {
3514 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003515 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003516 return;
3517 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003518 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 return;
3520 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003521 if (assigning > OP_APPLY)
3522 com_augassign_name(c, CHILD(n, 0),
3523 assigning, augn);
3524 else
3525 com_assign_name(c, CHILD(n, 0),
3526 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 return;
3528 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003529 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003530 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 return;
3532 }
3533 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003534
3535 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003536 com_error(c, PyExc_SyntaxError,
3537 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003538 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003539
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003540 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003541 com_error(c, PyExc_SystemError,
3542 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003543 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003544
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003545 }
3546 }
3547}
Guido van Rossum7c531111997-03-11 18:42:21 +00003548
Thomas Wouters434d0822000-08-24 20:11:32 +00003549static void
3550com_augassign(struct compiling *c, node *n)
3551{
3552 int opcode;
3553
3554 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3555 case '+': opcode = INPLACE_ADD; break;
3556 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003557 case '/':
3558 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3559 opcode = INPLACE_FLOOR_DIVIDE;
3560 else if (c->c_flags & CO_FUTURE_DIVISION)
3561 opcode = INPLACE_TRUE_DIVIDE;
3562 else
3563 opcode = INPLACE_DIVIDE;
3564 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003565 case '%': opcode = INPLACE_MODULO; break;
3566 case '<': opcode = INPLACE_LSHIFT; break;
3567 case '>': opcode = INPLACE_RSHIFT; break;
3568 case '&': opcode = INPLACE_AND; break;
3569 case '^': opcode = INPLACE_XOR; break;
3570 case '|': opcode = INPLACE_OR; break;
3571 case '*':
3572 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3573 opcode = INPLACE_POWER;
3574 else
3575 opcode = INPLACE_MULTIPLY;
3576 break;
3577 default:
3578 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3579 return;
3580 }
3581 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3582}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003583
3584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003585com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586{
Thomas Wouters434d0822000-08-24 20:11:32 +00003587 REQ(n, expr_stmt);
3588 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003589 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003590 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003591 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003592 if (NCH(n) == 1) {
3593 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003594 if (c->c_interactive)
3595 com_addbyte(c, PRINT_EXPR);
3596 else
3597 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003598 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003599 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003600 else if (TYPE(CHILD(n,1)) == augassign)
3601 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003602 else {
3603 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003604 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003605 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003606 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003607 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003608 com_push(c, 1);
3609 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003610 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003611 }
3612 }
3613}
3614
3615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003617{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003618 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003619 int i;
3620 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003621 if (Py_OptimizeFlag)
3622 return;
3623 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003624
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003625 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003626 raise AssertionError [, <message>]
3627
3628 where <message> is the second test, if present.
3629 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003630 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003631 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003632 com_addbyte(c, POP_TOP);
3633 com_pop(c, 1);
3634 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003635 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003636 com_push(c, 1);
3637 i = NCH(n)/2; /* Either 2 or 4 */
3638 if (i > 1)
3639 com_node(c, CHILD(n, 3));
3640 com_addoparg(c, RAISE_VARARGS, i);
3641 com_pop(c, i);
3642 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003643 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003644 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003645 com_addbyte(c, POP_TOP);
3646}
3647
3648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003649com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003651 int i = 1;
3652 node* stream = NULL;
3653
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003654 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003655
3656 /* are we using the extended print form? */
3657 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3658 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003659 com_node(c, stream);
3660 /* stack: [...] => [... stream] */
3661 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003662 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3663 i = 4;
3664 else
3665 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003666 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003667 for (; i < NCH(n); i += 2) {
3668 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003669 com_addbyte(c, DUP_TOP);
3670 /* stack: [stream] => [stream stream] */
3671 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003672 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003673 /* stack: [stream stream] => [stream stream obj] */
3674 com_addbyte(c, ROT_TWO);
3675 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003676 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003677 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003678 com_pop(c, 2);
3679 }
3680 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003681 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003682 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003683 com_addbyte(c, PRINT_ITEM);
3684 com_pop(c, 1);
3685 }
3686 }
3687 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003688 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003689 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003690 /* must pop the extra stream object off the stack */
3691 com_addbyte(c, POP_TOP);
3692 /* stack: [... stream] => [...] */
3693 com_pop(c, 1);
3694 }
3695 }
3696 else {
3697 if (stream != NULL) {
3698 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003699 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003700 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003701 com_pop(c, 1);
3702 }
3703 else
3704 com_addbyte(c, PRINT_NEWLINE);
3705 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706}
3707
3708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003709com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003711 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003712 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003713 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003714 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003715 if (c->c_flags & CO_GENERATOR) {
3716 if (NCH(n) > 1) {
3717 com_error(c, PyExc_SyntaxError,
3718 "'return' with argument inside generator");
3719 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003720 }
3721 if (NCH(n) < 2) {
3722 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_push(c, 1);
3724 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003725 else
3726 com_node(c, CHILD(n, 1));
3727 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003728 com_pop(c, 1);
3729}
3730
3731static void
3732com_yield_stmt(struct compiling *c, node *n)
3733{
Tim Peters95c80f82001-06-23 02:07:08 +00003734 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003735 REQ(n, yield_stmt); /* 'yield' testlist */
3736 if (!c->c_infunction) {
3737 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3738 }
Tim Peters95c80f82001-06-23 02:07:08 +00003739
3740 for (i = 0; i < c->c_nblocks; ++i) {
3741 if (c->c_block[i] == SETUP_FINALLY) {
3742 com_error(c, PyExc_SyntaxError,
3743 "'yield' not allowed in a 'try' block "
3744 "with a 'finally' clause");
3745 return;
3746 }
3747 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003748 com_node(c, CHILD(n, 1));
3749 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003751}
3752
3753static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003754com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003757 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3758 if (NCH(n) > 1) {
3759 com_node(c, CHILD(n, 1));
3760 if (NCH(n) > 3) {
3761 com_node(c, CHILD(n, 3));
3762 if (NCH(n) > 5)
3763 com_node(c, CHILD(n, 5));
3764 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003765 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003766 i = NCH(n)/2;
3767 com_addoparg(c, RAISE_VARARGS, i);
3768 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003769}
3770
3771static void
Thomas Wouters52152252000-08-17 22:55:00 +00003772com_from_import(struct compiling *c, node *n)
3773{
3774 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3775 com_push(c, 1);
3776 if (NCH(n) > 1) {
3777 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3778 com_error(c, PyExc_SyntaxError, "invalid syntax");
3779 return;
3780 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003781 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003782 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003783 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003784 com_pop(c, 1);
3785}
3786
3787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003788com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003790 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003791 int i;
3792 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003793 n = CHILD(n, 0);
3794 /* import_stmt: import_name | import_from */
3795 if (TYPE(n) == import_from) {
3796 /* 'from' dotted_name 'import' ('*' |
3797 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003798 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003799 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003800 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3801 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003802 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003803 else {
3804 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3805 TYPE(CHILD(n, 3)) != LPAR) {
3806 com_error(c, PyExc_SyntaxError,
3807 "trailing comma not allowed "
3808 "without surrounding parentheses");
3809 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003810 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003811 REQ(nn, import_as_names);
3812 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003813 for (i = 0; i < NCH(nn); i += 2) {
3814 PyObject *s = PyString_FromString(
3815 STR(CHILD(CHILD(nn, i), 0)));
3816 if (s == NULL) {
3817 Py_CLEAR(tup);
3818 break;
3819 } else
3820 PyTuple_SET_ITEM(tup, i / 2, s);
3821 }
3822 if (tup == NULL) {
3823 /* Assume that failue above was MemoryError */
3824 com_error(c, PyExc_MemoryError, "");
3825 return;
3826 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003827 }
3828 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003829 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003830 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003831 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003832 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003833 com_addbyte(c, IMPORT_STAR);
3834 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003835 for (i = 0; i < NCH(nn); i += 2)
3836 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003837 com_addbyte(c, POP_TOP);
3838 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003839 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003840 }
3841 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003842 /* 'import' dotted_as_names */
3843 nn = CHILD(n, 1);
3844 REQ(nn, dotted_as_names);
3845 for (i = 0; i < NCH(nn); i += 2) {
3846 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003847 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003848 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003849 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003850 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003851 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003852 int j;
3853 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003854 com_error(c, PyExc_SyntaxError,
3855 "invalid syntax");
3856 return;
3857 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003858 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3859 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003860 CHILD(CHILD(subn, 0),
3861 j));
3862 com_addop_varname(c, VAR_STORE,
3863 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003864 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003865 com_addop_varname(c, VAR_STORE,
3866 STR(CHILD(CHILD(subn, 0),
3867 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869 }
3870 }
3871}
3872
3873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003874com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003875{
3876 REQ(n, exec_stmt);
3877 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3878 com_node(c, CHILD(n, 1));
3879 if (NCH(n) >= 4)
3880 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003882 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003883 com_push(c, 1);
3884 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003885 if (NCH(n) >= 6)
3886 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003887 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003888 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003889 com_push(c, 1);
3890 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003891 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003893}
3894
Guido van Rossum7c531111997-03-11 18:42:21 +00003895static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003896is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003897{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003899 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003900 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003901
3902 /* Label to avoid tail recursion */
3903 next:
3904 switch (TYPE(n)) {
3905
3906 case suite:
3907 if (NCH(n) == 1) {
3908 n = CHILD(n, 0);
3909 goto next;
3910 }
3911 /* Fall through */
3912 case file_input:
3913 for (i = 0; i < NCH(n); i++) {
3914 node *ch = CHILD(n, i);
3915 if (TYPE(ch) == stmt) {
3916 n = ch;
3917 goto next;
3918 }
3919 }
3920 break;
3921
3922 case stmt:
3923 case simple_stmt:
3924 case small_stmt:
3925 n = CHILD(n, 0);
3926 goto next;
3927
3928 case expr_stmt:
3929 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003930 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003931 case test:
3932 case and_test:
3933 case not_test:
3934 case comparison:
3935 case expr:
3936 case xor_expr:
3937 case and_expr:
3938 case shift_expr:
3939 case arith_expr:
3940 case term:
3941 case factor:
3942 case power:
3943 case atom:
3944 if (NCH(n) == 1) {
3945 n = CHILD(n, 0);
3946 goto next;
3947 }
3948 break;
3949
3950 case NAME:
3951 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3952 return 1;
3953 break;
3954
3955 case NUMBER:
3956 v = parsenumber(c, STR(n));
3957 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003958 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003959 break;
3960 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003961 i = PyObject_IsTrue(v);
3962 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003963 return i == 0;
3964
3965 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003966 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003967 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003968 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003969 break;
3970 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003971 i = PyObject_IsTrue(v);
3972 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003973 return i == 0;
3974
3975 }
3976 return 0;
3977}
3978
Tim Peters08a898f2001-06-28 01:52:22 +00003979
3980/* Look under n for a return stmt with an expression.
3981 * This hack is used to find illegal returns under "if 0:" blocks in
3982 * functions already known to be generators (as determined by the symtable
3983 * pass).
3984 * Return the offending return node if found, else NULL.
3985 */
3986static node *
3987look_for_offending_return(node *n)
3988{
3989 int i;
3990
3991 for (i = 0; i < NCH(n); ++i) {
3992 node *kid = CHILD(n, i);
3993
3994 switch (TYPE(kid)) {
3995 case classdef:
3996 case funcdef:
3997 case lambdef:
3998 /* Stuff in nested functions & classes doesn't
3999 affect the code block we started in. */
4000 return NULL;
4001
4002 case return_stmt:
4003 if (NCH(kid) > 1)
4004 return kid;
4005 break;
4006
4007 default: {
4008 node *bad = look_for_offending_return(kid);
4009 if (bad != NULL)
4010 return bad;
4011 }
4012 }
4013 }
4014
4015 return NULL;
4016}
4017
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004018static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004019com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020{
4021 int i;
4022 int anchor = 0;
4023 REQ(n, if_stmt);
4024 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
4025 for (i = 0; i+3 < NCH(n); i+=4) {
4026 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004027 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004028 if (is_constant_false(c, ch)) {
4029 /* We're going to skip this block. However, if this
4030 is a generator, we have to check the dead code
4031 anyway to make sure there aren't any return stmts
4032 with expressions, in the same scope. */
4033 if (c->c_flags & CO_GENERATOR) {
4034 node *p = look_for_offending_return(n);
4035 if (p != NULL) {
4036 int savelineno = c->c_lineno;
4037 c->c_lineno = p->n_lineno;
4038 com_error(c, PyExc_SyntaxError,
4039 "'return' with argument "
4040 "inside generator");
4041 c->c_lineno = savelineno;
4042 }
4043 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004044 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004045 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004046 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004047 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004048 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004049 com_addfwref(c, JUMP_IF_FALSE, &a);
4050 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004051 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004052 com_node(c, CHILD(n, i+3));
4053 com_addfwref(c, JUMP_FORWARD, &anchor);
4054 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004055 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004056 com_addbyte(c, POP_TOP);
4057 }
4058 if (i+2 < NCH(n))
4059 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004060 if (anchor)
4061 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004062}
4063
4064static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004065com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004066{
4067 int break_anchor = 0;
4068 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004069 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004070 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4071 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004072 block_push(c, SETUP_LOOP);
4073 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004074 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075 com_node(c, CHILD(n, 1));
4076 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4077 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004078 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004079 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004080 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004081 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004082 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4083 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 com_addbyte(c, POP_TOP);
4087 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004088 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 if (NCH(n) > 4)
4090 com_node(c, CHILD(n, 6));
4091 com_backpatch(c, break_anchor);
4092}
4093
4094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004095com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004096{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097 int break_anchor = 0;
4098 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004099 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004100 REQ(n, for_stmt);
4101 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4102 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004103 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004104 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004105 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004106 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004107 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004108 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004109 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004110 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004111 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004112 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004113 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004114 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4115 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004116 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004117 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004118 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004119 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004120 if (NCH(n) > 8)
4121 com_node(c, CHILD(n, 8));
4122 com_backpatch(c, break_anchor);
4123}
4124
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004125/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004126
4127 SETUP_FINALLY L
4128 <code for S>
4129 POP_BLOCK
4130 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004131 L: <code for Sf>
4132 END_FINALLY
4133
4134 The special instructions use the block stack. Each block
4135 stack entry contains the instruction that created it (here
4136 SETUP_FINALLY), the level of the value stack at the time the
4137 block stack entry was created, and a label (here L).
4138
4139 SETUP_FINALLY:
4140 Pushes the current value stack level and the label
4141 onto the block stack.
4142 POP_BLOCK:
4143 Pops en entry from the block stack, and pops the value
4144 stack until its level is the same as indicated on the
4145 block stack. (The label is ignored.)
4146 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004147 Pops a variable number of entries from the *value* stack
4148 and re-raises the exception they specify. The number of
4149 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004150
4151 The block stack is unwound when an exception is raised:
4152 when a SETUP_FINALLY entry is found, the exception is pushed
4153 onto the value stack (and the exception condition is cleared),
4154 and the interpreter jumps to the label gotten from the block
4155 stack.
4156
4157 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004158 (The contents of the value stack is shown in [], with the top
4159 at the right; 'tb' is trace-back info, 'val' the exception's
4160 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004161
4162 Value stack Label Instruction Argument
4163 [] SETUP_EXCEPT L1
4164 [] <code for S>
4165 [] POP_BLOCK
4166 [] JUMP_FORWARD L0
4167
Guido van Rossum3f5da241990-12-20 15:06:42 +00004168 [tb, val, exc] L1: DUP )
4169 [tb, val, exc, exc] <evaluate E1> )
4170 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4171 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4172 [tb, val, exc, 1] POP )
4173 [tb, val, exc] POP
4174 [tb, val] <assign to V1> (or POP if no V1)
4175 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004176 [] <code for S1>
4177 JUMP_FORWARD L0
4178
Guido van Rossum3f5da241990-12-20 15:06:42 +00004179 [tb, val, exc, 0] L2: POP
4180 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004181 .............................etc.......................
4182
Guido van Rossum3f5da241990-12-20 15:06:42 +00004183 [tb, val, exc, 0] Ln+1: POP
4184 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004185
4186 [] L0: <next statement>
4187
4188 Of course, parts are not generated if Vi or Ei is not present.
4189*/
4190
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004192com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004193{
4194 int except_anchor = 0;
4195 int end_anchor = 0;
4196 int else_anchor = 0;
4197 int i;
4198 node *ch;
4199
4200 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4201 block_push(c, SETUP_EXCEPT);
4202 com_node(c, CHILD(n, 2));
4203 com_addbyte(c, POP_BLOCK);
4204 block_pop(c, SETUP_EXCEPT);
4205 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4206 com_backpatch(c, except_anchor);
4207 for (i = 3;
4208 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4209 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004210 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004211 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004212 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004213 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004214 break;
4215 }
4216 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004217 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004218 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004219 if (NCH(ch) > 1) {
4220 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004221 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004222 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004223 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004224 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004225 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4226 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004227 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004228 }
4229 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004230 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004231 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004232 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004233 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004234 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004235 com_pop(c, 1);
4236 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004237 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004238 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004239 com_node(c, CHILD(n, i+2));
4240 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4241 if (except_anchor) {
4242 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004243 /* We come in with [tb, val, exc, 0] on the
4244 stack; one pop and it's the same as
4245 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004246 com_addbyte(c, POP_TOP);
4247 }
4248 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004249 /* We actually come in here with [tb, val, exc] but the
4250 END_FINALLY will zap those and jump around.
4251 The c_stacklevel does not reflect them so we need not pop
4252 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004253 com_addbyte(c, END_FINALLY);
4254 com_backpatch(c, else_anchor);
4255 if (i < NCH(n))
4256 com_node(c, CHILD(n, i+2));
4257 com_backpatch(c, end_anchor);
4258}
4259
4260static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004261com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262{
4263 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004264 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004265
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004266 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4267 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004268 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004269 com_addbyte(c, POP_BLOCK);
4270 block_pop(c, SETUP_FINALLY);
4271 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004272 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004273 /* While the generated code pushes only one item,
4274 the try-finally handling can enter here with
4275 up to three items. OK, here are the details:
4276 3 for an exception, 2 for RETURN, 1 for BREAK. */
4277 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004278 com_backpatch(c, finally_anchor);
4279 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004280 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004281 com_node(c, ch);
4282 com_addbyte(c, END_FINALLY);
4283 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004284 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004285}
4286
4287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004288com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004289{
4290 REQ(n, try_stmt);
4291 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4292 | 'try' ':' suite 'finally' ':' suite */
4293 if (TYPE(CHILD(n, 3)) != except_clause)
4294 com_try_finally(c, n);
4295 else
4296 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004297}
4298
Guido van Rossum8b993a91997-01-17 21:04:03 +00004299static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004300get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004301{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004302 int i;
4303
Guido van Rossum8b993a91997-01-17 21:04:03 +00004304 /* Label to avoid tail recursion */
4305 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004306 switch (TYPE(n)) {
4307
4308 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004309 if (NCH(n) == 1) {
4310 n = CHILD(n, 0);
4311 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004312 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004313 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004314 case file_input:
4315 for (i = 0; i < NCH(n); i++) {
4316 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004317 if (TYPE(ch) == stmt) {
4318 n = ch;
4319 goto next;
4320 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004321 }
4322 break;
4323
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004324 case stmt:
4325 case simple_stmt:
4326 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004327 n = CHILD(n, 0);
4328 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004329
4330 case expr_stmt:
4331 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004332 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004333 case test:
4334 case and_test:
4335 case not_test:
4336 case comparison:
4337 case expr:
4338 case xor_expr:
4339 case and_expr:
4340 case shift_expr:
4341 case arith_expr:
4342 case term:
4343 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004344 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004345 if (NCH(n) == 1) {
4346 n = CHILD(n, 0);
4347 goto next;
4348 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004349 break;
4350
4351 case atom:
4352 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004353 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004354 break;
4355
4356 }
4357 return NULL;
4358}
4359
Guido van Rossum79f25d91997-04-29 20:08:16 +00004360static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004361get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004362{
Guido van Rossum541563e1999-01-28 15:08:09 +00004363 /* Don't generate doc-strings if run with -OO */
4364 if (Py_OptimizeFlag > 1)
4365 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004366 n = get_rawdocstring(n);
4367 if (n == NULL)
4368 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004369 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004370}
4371
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004372static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004373com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004374{
4375 REQ(n, suite);
4376 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4377 if (NCH(n) == 1) {
4378 com_node(c, CHILD(n, 0));
4379 }
4380 else {
4381 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004382 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004383 node *ch = CHILD(n, i);
4384 if (TYPE(ch) == stmt)
4385 com_node(c, ch);
4386 }
4387 }
4388}
4389
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004390/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004392com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004393{
4394 int i = c->c_nblocks;
4395 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4396 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4397 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004398 else if (i <= 0) {
4399 /* at the outer level */
4400 com_error(c, PyExc_SyntaxError,
4401 "'continue' not properly in loop");
4402 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004403 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004404 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004405 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004406 if (c->c_block[j] == SETUP_LOOP)
4407 break;
4408 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004409 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004410 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004411 for (; i > j; --i) {
4412 if (c->c_block[i] == SETUP_EXCEPT ||
4413 c->c_block[i] == SETUP_FINALLY) {
4414 com_addoparg(c, CONTINUE_LOOP,
4415 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004416 return;
4417 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004418 if (c->c_block[i] == END_FINALLY) {
4419 com_error(c, PyExc_SyntaxError,
4420 "'continue' not supported inside 'finally' clause");
4421 return;
4422 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004423 }
4424 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004425 com_error(c, PyExc_SyntaxError,
4426 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004427 }
4428 /* XXX Could allow it inside a 'finally' clause
4429 XXX if we could pop the exception still on the stack */
4430}
4431
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004432/* Return the number of default values in the argument list.
4433
4434 If a non-default argument follows a default argument, set an
4435 exception and return -1.
4436*/
4437
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004438static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004439com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004440{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004441 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004442 if (TYPE(n) == lambdef) {
4443 /* lambdef: 'lambda' [varargslist] ':' test */
4444 n = CHILD(n, 1);
4445 }
4446 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004447 REQ(n, funcdef);
4448 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4449 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004450 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4451 n = CHILD(n, 1);
4452 }
4453 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004454 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004455 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004456 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004457 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4458 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004459 ndefs = 0;
4460 for (i = 0; i < nch; i++) {
4461 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004462 if (TYPE(CHILD(n, i)) == STAR ||
4463 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004464 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004465 i++;
4466 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004467 t = RPAR; /* Anything except EQUAL or COMMA */
4468 else
4469 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004470 if (t == EQUAL) {
4471 i++;
4472 ndefs++;
4473 com_node(c, CHILD(n, i));
4474 i++;
4475 if (i >= nch)
4476 break;
4477 t = TYPE(CHILD(n, i));
4478 }
4479 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004480 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004481 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004482 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004483 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004484 return -1;
4485 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004486 }
4487 if (t != COMMA)
4488 break;
4489 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004490 return ndefs;
4491}
4492
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004493static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004494com_decorator_name(struct compiling *c, node *n)
4495{
4496 /* dotted_name: NAME ('.' NAME)* */
4497
4498 int i, nch;
4499 node *varname;
4500
4501 REQ(n, dotted_name);
4502 nch = NCH(n);
4503 assert(nch >= 1 && nch % 2 == 1);
4504
4505 varname = CHILD(n, 0);
4506 REQ(varname, NAME);
4507 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004508 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004509
4510 for (i = 1; i < nch; i += 2) {
4511 node *attrname;
4512
4513 REQ(CHILD(n, i), DOT);
4514
4515 attrname = CHILD(n, i + 1);
4516 REQ(attrname, NAME);
4517 com_addop_name(c, LOAD_ATTR, STR(attrname));
4518 }
4519}
4520
4521static void
4522com_decorator(struct compiling *c, node *n)
4523{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004524 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004525 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004526 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004527 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004528 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004529 com_decorator_name(c, CHILD(n, 1));
4530
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004531 if (nch > 3) {
4532 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004533 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004534 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004535 com_call_function(c, CHILD(n, 3));
4536 }
4537}
4538
4539static int
4540com_decorators(struct compiling *c, node *n)
4541{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004542 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004543
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004544 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004545 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004546 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004547
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004548 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004549 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004550 REQ(ch, decorator);
4551
4552 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004553 }
4554
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004555 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004556}
4557
4558static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004559com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004560{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004561 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004562 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004563
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004564 REQ(n, funcdef);
4565 /* -6 -5 -4 -3 -2 -1
4566 funcdef: [decorators] 'def' NAME parameters ':' suite */
4567
4568 if (NCH(n) == 6)
4569 ndecorators = com_decorators(c, CHILD(n, 0));
4570 else
4571 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004572
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004573 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004574 if (ndefs < 0)
4575 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004576 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004577 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004578 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004579 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004580 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004581 c->c_errors++;
4582 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 int closure = com_make_closure(c, (PyCodeObject *)co);
4584 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004585 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004586 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004587 if (closure)
4588 com_addoparg(c, MAKE_CLOSURE, ndefs);
4589 else
4590 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004591 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004592
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004593 while (ndecorators > 0) {
4594 com_addoparg(c, CALL_FUNCTION, 1);
4595 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004596 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004597 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004598
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004599 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004600 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004601 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004602 }
4603}
4604
4605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004606com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004607{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004608 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004609 REQ(n, testlist);
4610 /* testlist: test (',' test)* [','] */
4611 for (i = 0; i < NCH(n); i += 2)
4612 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004613 i = (NCH(n)+1) / 2;
4614 com_addoparg(c, BUILD_TUPLE, i);
4615 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004616}
4617
4618static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004619com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004620{
Guido van Rossum25831651993-05-19 14:50:45 +00004621 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004622 PyObject *v;
4623 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004624 char *name;
4625
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004626 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004627 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004628 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004629 c->c_errors++;
4630 return;
4631 }
4632 /* Push the class name on the stack */
4633 i = com_addconst(c, v);
4634 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004635 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004636 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004637 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004638 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004639 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004640 com_push(c, 1);
4641 }
Guido van Rossum25831651993-05-19 14:50:45 +00004642 else
4643 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004644 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004645 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004646 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004647 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004648 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004649 c->c_errors++;
4650 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004651 int closure = com_make_closure(c, co);
4652 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004653 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004654 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004655 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004656 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004657 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004658 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004659 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004660 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004661 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004662 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004663 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004664 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004665 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004666 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004667}
4668
4669static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004670com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004671{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004672 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004673 if (c->c_errors)
4674 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675 switch (TYPE(n)) {
4676
4677 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004678
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004679 case funcdef:
4680 com_funcdef(c, n);
4681 break;
4682 case classdef:
4683 com_classdef(c, n);
4684 break;
4685
4686 /* Trivial parse tree nodes */
4687
4688 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004689 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004690 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004691 n = CHILD(n, 0);
4692 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004693
4694 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004695 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004696 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004697 {
4698 int i;
4699 for (i = 0; i < NCH(n)-1; i += 2)
4700 com_node(c, CHILD(n, i));
4701 }
4702 break;
4703
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004704 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004705 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004706 n = CHILD(n, 0);
4707 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004708
4709 /* Statement nodes */
4710
4711 case expr_stmt:
4712 com_expr_stmt(c, n);
4713 break;
4714 case print_stmt:
4715 com_print_stmt(c, n);
4716 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004717 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004718 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004719 break;
4720 case pass_stmt:
4721 break;
4722 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004723 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004724 com_error(c, PyExc_SyntaxError,
4725 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004726 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004727 com_addbyte(c, BREAK_LOOP);
4728 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004729 case continue_stmt:
4730 com_continue_stmt(c, n);
4731 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004732 case return_stmt:
4733 com_return_stmt(c, n);
4734 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004735 case yield_stmt:
4736 com_yield_stmt(c, n);
4737 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738 case raise_stmt:
4739 com_raise_stmt(c, n);
4740 break;
4741 case import_stmt:
4742 com_import_stmt(c, n);
4743 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004744 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004745 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004746 case exec_stmt:
4747 com_exec_stmt(c, n);
4748 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004749 case assert_stmt:
4750 com_assert_stmt(c, n);
4751 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004752 case if_stmt:
4753 com_if_stmt(c, n);
4754 break;
4755 case while_stmt:
4756 com_while_stmt(c, n);
4757 break;
4758 case for_stmt:
4759 com_for_stmt(c, n);
4760 break;
4761 case try_stmt:
4762 com_try_stmt(c, n);
4763 break;
4764 case suite:
4765 com_suite(c, n);
4766 break;
4767
4768 /* Expression nodes */
4769
4770 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004771 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004772 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004773 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004774 break;
4775 case test:
4776 com_test(c, n);
4777 break;
4778 case and_test:
4779 com_and_test(c, n);
4780 break;
4781 case not_test:
4782 com_not_test(c, n);
4783 break;
4784 case comparison:
4785 com_comparison(c, n);
4786 break;
4787 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004788 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004789 break;
4790 case expr:
4791 com_expr(c, n);
4792 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004793 case xor_expr:
4794 com_xor_expr(c, n);
4795 break;
4796 case and_expr:
4797 com_and_expr(c, n);
4798 break;
4799 case shift_expr:
4800 com_shift_expr(c, n);
4801 break;
4802 case arith_expr:
4803 com_arith_expr(c, n);
4804 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004805 case term:
4806 com_term(c, n);
4807 break;
4808 case factor:
4809 com_factor(c, n);
4810 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004811 case power:
4812 com_power(c, n);
4813 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004814 case atom:
4815 com_atom(c, n);
4816 break;
4817
4818 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004819 com_error(c, PyExc_SystemError,
4820 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004821 }
4822}
4823
Tim Petersdbd9ba62000-07-09 03:09:57 +00004824static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004825
4826static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004827com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004828{
4829 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4830 if (TYPE(CHILD(n, 0)) == LPAR)
4831 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004832 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004833 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004834 com_pop(c, 1);
4835 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004836}
4837
4838static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004839com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004840{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004841 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004842 if (NCH(n) == 1) {
4843 com_fpdef(c, CHILD(n, 0));
4844 }
4845 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004846 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004847 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004848 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004849 for (i = 0; i < NCH(n); i += 2)
4850 com_fpdef(c, CHILD(n, i));
4851 }
4852}
4853
4854static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004855com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004856{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004857 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004858 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004859 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004860 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004861 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004862 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004863 nch = NCH(n);
4864 /* Enter all arguments in table of locals */
4865 for (i = 0, narg = 0; i < nch; i++) {
4866 node *ch = CHILD(n, i);
4867 node *fp;
4868 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004869 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004870 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4871 fp = CHILD(ch, 0);
4872 if (TYPE(fp) != NAME) {
4873 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4874 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004875 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004876 narg++;
4877 /* all name updates handled by symtable */
4878 if (++i >= nch)
4879 break;
4880 ch = CHILD(n, i);
4881 if (TYPE(ch) == EQUAL)
4882 i += 2;
4883 else
4884 REQ(ch, COMMA);
4885 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004886 if (complex) {
4887 /* Generate code for complex arguments only after
4888 having counted the simple arguments */
4889 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004890 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004891 node *ch = CHILD(n, i);
4892 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004893 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004894 break;
4895 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4896 fp = CHILD(ch, 0);
4897 if (TYPE(fp) != NAME) {
4898 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004899 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004900 com_fpdef(c, ch);
4901 }
4902 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004903 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004904 break;
4905 ch = CHILD(n, i);
4906 if (TYPE(ch) == EQUAL)
4907 i += 2;
4908 else
4909 REQ(ch, COMMA);
4910 }
4911 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004912}
4913
4914static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004915com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004916{
4917 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004918 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004919 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004920 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004921 if (doc != NULL) {
4922 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004923 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004924 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004925 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004926 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004927 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004928 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004929 for (i = 0; i < NCH(n); i++) {
4930 node *ch = CHILD(n, i);
4931 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4932 com_node(c, ch);
4933 }
4934}
4935
4936/* Top-level compile-node interface */
4937
4938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004939compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004940{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004941 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004942 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004943 REQ(n, funcdef);
4944 /* -6 -5 -4 -3 -2 -1
4945 funcdef: [decorators] 'def' NAME parameters ':' suite */
4946 c->c_name = STR(RCHILD(n, -4));
4947 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004948 if (doc != NULL) {
4949 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004950 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004951 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004952 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004953 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004954 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004955 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004956 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004957 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004958 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004959 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004960 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004961 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004962 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4963 com_push(c, 1);
4964 com_addbyte(c, RETURN_VALUE);
4965 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004966}
4967
4968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004969compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004970{
Guido van Rossum590baa41993-11-30 13:40:46 +00004971 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004972 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004973 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004974
4975 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004976 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004977 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004978 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004979 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004980 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004981 else
4982 ch = CHILD(n, 2);
4983 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004984 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004985 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004986}
4987
4988static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004989compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004990{
4991 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004992 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004993 REQ(n, classdef);
4994 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4995 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004996 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004997 /* Initialize local __module__ from global __name__ */
4998 com_addop_name(c, LOAD_GLOBAL, "__name__");
4999 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005000 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005001 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005002 if (doc != NULL) {
5003 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005004 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005005 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005006 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005007 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00005008 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005009 }
5010 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00005011 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005012 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00005013 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005014 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005015 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005016 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005017 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005018}
5019
5020static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005021compile_generator_expression(struct compiling *c, node *n)
5022{
5023 /* testlist_gexp: test gen_for */
5024 /* argument: test gen_for */
5025 REQ(CHILD(n, 0), test);
5026 REQ(CHILD(n, 1), gen_for);
5027
5028 c->c_name = "<generator expression>";
5029 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5030
5031 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5032 com_push(c, 1);
5033 com_addbyte(c, RETURN_VALUE);
5034 com_pop(c, 1);
5035}
5036
5037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005038compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005039{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005040 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005042 switch (TYPE(n)) {
5043
Guido van Rossum4c417781991-01-21 16:09:22 +00005044 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005045 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005046 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005047 n = CHILD(n, 0);
5048 if (TYPE(n) != NEWLINE)
5049 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005050 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005051 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5052 com_push(c, 1);
5053 com_addbyte(c, RETURN_VALUE);
5054 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005055 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005056 break;
5057
Guido van Rossum4c417781991-01-21 16:09:22 +00005058 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005059 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005060 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005061 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5062 com_push(c, 1);
5063 com_addbyte(c, RETURN_VALUE);
5064 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005065 break;
5066
Guido van Rossum590baa41993-11-30 13:40:46 +00005067 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005068 com_node(c, CHILD(n, 0));
5069 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005070 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005071 break;
5072
Guido van Rossum590baa41993-11-30 13:40:46 +00005073 case lambdef: /* anonymous function definition */
5074 compile_lambdef(c, n);
5075 break;
5076
Guido van Rossum4c417781991-01-21 16:09:22 +00005077 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005078 compile_funcdef(c, n);
5079 break;
5080
Guido van Rossum4c417781991-01-21 16:09:22 +00005081 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005082 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005083 break;
5084
Raymond Hettinger354433a2004-05-19 08:20:33 +00005085 case testlist_gexp: /* A generator expression */
5086 case argument: /* A generator expression */
5087 compile_generator_expression(c, n);
5088 break;
5089
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005090 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005091 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005092 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005093 }
5094}
5095
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005096static PyObject *
5097dict_keys_inorder(PyObject *dict, int offset)
5098{
5099 PyObject *tuple, *k, *v;
5100 int i, pos = 0, size = PyDict_Size(dict);
5101
5102 tuple = PyTuple_New(size);
5103 if (tuple == NULL)
5104 return NULL;
5105 while (PyDict_Next(dict, &pos, &k, &v)) {
5106 i = PyInt_AS_LONG(v);
5107 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005108 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005109 PyTuple_SET_ITEM(tuple, i - offset, k);
5110 }
5111 return tuple;
5112}
5113
Guido van Rossum79f25d91997-04-29 20:08:16 +00005114PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005115PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005116{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005117 return PyNode_CompileFlags(n, filename, NULL);
5118}
5119
5120PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005121PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005122{
5123 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005124}
5125
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005126struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005127PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005128{
5129 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005130 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005131
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005132 ff = PyNode_Future(n, filename);
5133 if (ff == NULL)
5134 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005135 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005136 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005137 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005138 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005139 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005140 return st;
5141}
5142
Guido van Rossum79f25d91997-04-29 20:08:16 +00005143static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005144icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005145{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005146 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005147}
5148
Guido van Rossum79f25d91997-04-29 20:08:16 +00005149static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005150jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005151 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005152{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005153 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005154 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005155 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005156 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005157 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5158 sc.c_encoding = "utf-8";
5159 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005160 sc.c_encoding = STR(n);
5161 n = CHILD(n, 0);
5162 } else {
5163 sc.c_encoding = NULL;
5164 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005166 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005167 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005168 /* c_symtable still points to parent's symbols */
5169 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005170 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005171 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005172 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005173 if (base->c_encoding != NULL) {
5174 assert(sc.c_encoding == NULL);
5175 sc.c_encoding = base->c_encoding;
5176 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005178 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005179 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005180 if (sc.c_future == NULL) {
5181 com_free(&sc);
5182 return NULL;
5183 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005184 if (flags) {
5185 int merged = sc.c_future->ff_features |
5186 flags->cf_flags;
5187 sc.c_future->ff_features = merged;
5188 flags->cf_flags = merged;
5189 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005190 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5191 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005192 com_free(&sc);
5193 return NULL;
5194 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005195 /* reset symbol table for second pass */
5196 sc.c_symtable->st_nscopes = 1;
5197 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005198 }
5199 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005200 if (symtable_load_symbols(&sc) < 0) {
5201 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005203 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005204 compile_node(&sc, n);
5205 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005206 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005207 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005208 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005209 names = PyList_AsTuple(sc.c_names);
5210 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005211 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5212 freevars = dict_keys_inorder(sc.c_freevars,
5213 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005214 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005215 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005216 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5217 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005218 if (!PyErr_Occurred())
5219 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005220 sc.c_nlocals,
5221 sc.c_maxstacklevel,
5222 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005223 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005224 consts,
5225 names,
5226 varnames,
5227 freevars,
5228 cellvars,
5229 filename,
5230 name,
5231 sc.c_firstlineno,
5232 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005233 Py_XDECREF(consts);
5234 Py_XDECREF(names);
5235 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005236 Py_XDECREF(freevars);
5237 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005238 Py_XDECREF(filename);
5239 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005240 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005241 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005242 else if (!PyErr_Occurred()) {
5243 /* This could happen if someone called PyErr_Clear() after an
5244 error was reported above. That's not supposed to happen,
5245 but I just plugged one case and I'm not sure there can't be
5246 others. In that case, raise SystemError so that at least
5247 it gets reported instead dumping core. */
5248 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5249 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005250 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005251 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005252 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005253 sc.c_symtable = NULL;
5254 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005255 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005256 return co;
5257}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005258
5259int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005260PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005261{
5262 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005263 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005264 int line = co->co_firstlineno;
5265 int addr = 0;
5266 while (--size >= 0) {
5267 addr += *p++;
5268 if (addr > addrq)
5269 break;
5270 line += *p++;
5271 }
5272 return line;
5273}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005275/* The test for LOCAL must come before the test for FREE in order to
5276 handle classes where name is both local and free. The local var is
5277 a method and the free var is a free var referenced within a method.
5278*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005279
5280static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005281get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005282{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005283 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005284 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005285
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005286 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5287 return CELL;
5288 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5289 return LOCAL;
5290 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5291 return FREE;
5292 v = PyDict_GetItemString(c->c_globals, name);
5293 if (v) {
5294 if (v == Py_None)
5295 return GLOBAL_EXPLICIT;
5296 else {
5297 return GLOBAL_IMPLICIT;
5298 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005299 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005300 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005301 "unknown scope for %.100s in %.100s(%s) "
5302 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5303 name, c->c_name,
5304 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5305 c->c_filename,
5306 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5307 PyObject_REPR(c->c_locals),
5308 PyObject_REPR(c->c_globals)
5309 );
5310
5311 Py_FatalError(buf);
5312 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005313}
5314
Guido van Rossum207fda62001-03-02 03:30:41 +00005315/* Helper functions to issue warnings */
5316
5317static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005318issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005319{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005320 if (PyErr_Occurred()) {
5321 /* This can happen because symtable_node continues
5322 processing even after raising a SyntaxError.
5323 Calling PyErr_WarnExplicit now would clobber the
5324 pending exception; instead we fail and let that
5325 exception propagate.
5326 */
5327 return -1;
5328 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005329 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5330 lineno, NULL, NULL) < 0) {
5331 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5332 PyErr_SetString(PyExc_SyntaxError, msg);
5333 PyErr_SyntaxLocation(filename, lineno);
5334 }
5335 return -1;
5336 }
5337 return 0;
5338}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005339
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005340static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005341symtable_warn(struct symtable *st, char *msg)
5342{
Guido van Rossum207fda62001-03-02 03:30:41 +00005343 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005344 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005345 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005346 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005347 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005348}
5349
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005350/* Helper function for setting lineno and filename */
5351
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005352static struct symtable *
5353symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005354{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005355 struct symtable *st;
5356
5357 st = symtable_init();
5358 if (st == NULL)
5359 return NULL;
5360 st->st_future = ff;
5361 st->st_filename = filename;
5362 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5363 if (st->st_errors > 0)
5364 goto fail;
5365 symtable_node(st, n);
5366 if (st->st_errors > 0)
5367 goto fail;
5368 return st;
5369 fail:
5370 if (!PyErr_Occurred()) {
5371 /* This could happen because after a syntax error is
5372 detected, the symbol-table-building continues for
5373 a while, and PyErr_Clear() might erroneously be
5374 called during that process. One such case has been
5375 fixed, but there might be more (now or later).
5376 */
5377 PyErr_SetString(PyExc_SystemError, "lost exception");
5378 }
5379 st->st_future = NULL;
5380 st->st_filename = NULL;
5381 PySymtable_Free(st);
5382 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005383}
5384
5385static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005386symtable_init_compiling_symbols(struct compiling *c)
5387{
5388 PyObject *varnames;
5389
5390 varnames = c->c_symtable->st_cur->ste_varnames;
5391 if (varnames == NULL) {
5392 varnames = PyList_New(0);
5393 if (varnames == NULL)
5394 return -1;
5395 c->c_symtable->st_cur->ste_varnames = varnames;
5396 Py_INCREF(varnames);
5397 } else
5398 Py_INCREF(varnames);
5399 c->c_varnames = varnames;
5400
5401 c->c_globals = PyDict_New();
5402 if (c->c_globals == NULL)
5403 return -1;
5404 c->c_freevars = PyDict_New();
5405 if (c->c_freevars == NULL)
5406 return -1;
5407 c->c_cellvars = PyDict_New();
5408 if (c->c_cellvars == NULL)
5409 return -1;
5410 return 0;
5411}
5412
5413struct symbol_info {
5414 int si_nlocals;
5415 int si_ncells;
5416 int si_nfrees;
5417 int si_nimplicit;
5418};
5419
5420static void
5421symtable_init_info(struct symbol_info *si)
5422{
5423 si->si_nlocals = 0;
5424 si->si_ncells = 0;
5425 si->si_nfrees = 0;
5426 si->si_nimplicit = 0;
5427}
5428
5429static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005430symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005431 struct symbol_info *si)
5432{
5433 PyObject *dict, *v;
5434
5435 /* Seperate logic for DEF_FREE. If it occurs in a function,
5436 it indicates a local that we must allocate storage for (a
5437 cell var). If it occurs in a class, then the class has a
5438 method and a free variable with the same name.
5439 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005440 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005441 /* If it isn't declared locally, it can't be a cell. */
5442 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5443 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005444 v = PyInt_FromLong(si->si_ncells++);
5445 dict = c->c_cellvars;
5446 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005447 /* If it is free anyway, then there is no need to do
5448 anything here.
5449 */
5450 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005451 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005452 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005453 v = PyInt_FromLong(si->si_nfrees++);
5454 dict = c->c_freevars;
5455 }
5456 if (v == NULL)
5457 return -1;
5458 if (PyDict_SetItem(dict, name, v) < 0) {
5459 Py_DECREF(v);
5460 return -1;
5461 }
5462 Py_DECREF(v);
5463 return 0;
5464}
5465
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005466/* If a variable is a cell and an argument, make sure that appears in
5467 co_cellvars before any variable to its right in varnames.
5468*/
5469
5470
5471static int
5472symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5473 PyObject *varnames, int flags)
5474{
Tim Petersb39903b2003-03-24 17:22:24 +00005475 PyObject *v = NULL;
5476 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005477 int i, pos;
5478
5479 if (flags & CO_VARARGS)
5480 argcount++;
5481 if (flags & CO_VARKEYWORDS)
5482 argcount++;
5483 for (i = argcount; --i >= 0; ) {
5484 v = PyList_GET_ITEM(varnames, i);
5485 if (PyDict_GetItem(*cellvars, v)) {
5486 if (list == NULL) {
5487 list = PyList_New(1);
5488 if (list == NULL)
5489 return -1;
5490 PyList_SET_ITEM(list, 0, v);
5491 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005492 } else {
5493 if (PyList_Insert(list, 0, v) < 0) {
5494 Py_DECREF(list);
5495 return -1;
5496 }
5497 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005498 }
5499 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005500 if (list == NULL)
5501 return 0;
5502
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005503 /* There are cellvars that are also arguments. Create a dict
5504 to replace cellvars and put the args at the front.
5505 */
5506 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005507 if (d == NULL)
5508 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005509 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5510 v = PyInt_FromLong(i);
5511 if (v == NULL)
5512 goto fail;
5513 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5514 goto fail;
5515 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5516 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005517 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005518 }
5519 pos = 0;
5520 i = PyList_GET_SIZE(list);
5521 Py_DECREF(list);
5522 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5523 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005524 if (w == NULL)
5525 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005526 if (PyDict_SetItem(d, v, w) < 0) {
5527 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005528 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005529 goto fail;
5530 }
5531 Py_DECREF(w);
5532 }
5533 Py_DECREF(*cellvars);
5534 *cellvars = d;
5535 return 1;
5536 fail:
5537 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005538 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005539 return -1;
5540}
5541
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005542static int
5543symtable_freevar_offsets(PyObject *freevars, int offset)
5544{
5545 PyObject *name, *v;
5546 int pos;
5547
5548 /* The cell vars are the first elements of the closure,
5549 followed by the free vars. Update the offsets in
5550 c_freevars to account for number of cellvars. */
5551 pos = 0;
5552 while (PyDict_Next(freevars, &pos, &name, &v)) {
5553 int i = PyInt_AS_LONG(v) + offset;
5554 PyObject *o = PyInt_FromLong(i);
5555 if (o == NULL)
5556 return -1;
5557 if (PyDict_SetItem(freevars, name, o) < 0) {
5558 Py_DECREF(o);
5559 return -1;
5560 }
5561 Py_DECREF(o);
5562 }
5563 return 0;
5564}
5565
5566static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005567symtable_check_unoptimized(struct compiling *c,
5568 PySymtableEntryObject *ste,
5569 struct symbol_info *si)
5570{
5571 char buf[300];
5572
5573 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5574 || (ste->ste_nested && si->si_nimplicit)))
5575 return 0;
5576
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005577#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5578
5579#define ILLEGAL_IS "is a nested function"
5580
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005581#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005582"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005583
5584#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005585"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005586
5587#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005588"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005589"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005590
5591 /* XXX perhaps the linenos for these opt-breaking statements
5592 should be stored so the exception can point to them. */
5593
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005594 if (ste->ste_child_free) {
5595 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005596 PyOS_snprintf(buf, sizeof(buf),
5597 ILLEGAL_IMPORT_STAR,
5598 PyString_AS_STRING(ste->ste_name),
5599 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005600 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005601 PyOS_snprintf(buf, sizeof(buf),
5602 ILLEGAL_BARE_EXEC,
5603 PyString_AS_STRING(ste->ste_name),
5604 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005605 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005606 PyOS_snprintf(buf, sizeof(buf),
5607 ILLEGAL_EXEC_AND_IMPORT_STAR,
5608 PyString_AS_STRING(ste->ste_name),
5609 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005610 }
5611 } else {
5612 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005613 PyOS_snprintf(buf, sizeof(buf),
5614 ILLEGAL_IMPORT_STAR,
5615 PyString_AS_STRING(ste->ste_name),
5616 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005617 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005618 PyOS_snprintf(buf, sizeof(buf),
5619 ILLEGAL_BARE_EXEC,
5620 PyString_AS_STRING(ste->ste_name),
5621 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005622 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005623 PyOS_snprintf(buf, sizeof(buf),
5624 ILLEGAL_EXEC_AND_IMPORT_STAR,
5625 PyString_AS_STRING(ste->ste_name),
5626 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005627 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005628 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005629
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005630 PyErr_SetString(PyExc_SyntaxError, buf);
5631 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5632 ste->ste_opt_lineno);
5633 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005634}
5635
5636static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005637symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5638 struct symbol_info *si)
5639{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005640 if (c->c_future)
5641 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005642 if (ste->ste_generator)
5643 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005644 if (ste->ste_type != TYPE_MODULE)
5645 c->c_flags |= CO_NEWLOCALS;
5646 if (ste->ste_type == TYPE_FUNCTION) {
5647 c->c_nlocals = si->si_nlocals;
5648 if (ste->ste_optimized == 0)
5649 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005650 else if (ste->ste_optimized != OPT_EXEC)
5651 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005652 }
5653 return 0;
5654}
5655
5656static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005657symtable_error(struct symtable *st, int lineno)
5658{
5659 if (lineno == 0)
5660 lineno = st->st_cur->ste_lineno;
5661 PyErr_SyntaxLocation(st->st_filename, lineno);
5662 st->st_errors++;
5663 return -1;
5664}
5665
5666static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667symtable_load_symbols(struct compiling *c)
5668{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005670 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005671 PyObject *name, *varnames, *v;
5672 int i, flags, pos;
5673 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005674
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005675 v = NULL;
5676
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005677 if (symtable_init_compiling_symbols(c) < 0)
5678 goto fail;
5679 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005680 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005681 si.si_nlocals = PyList_GET_SIZE(varnames);
5682 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005683
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005684 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005685 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005686 if (v == NULL)
5687 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005688 if (PyDict_SetItem(c->c_locals,
5689 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690 goto fail;
5691 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692 }
5693
5694 /* XXX The cases below define the rules for whether a name is
5695 local or global. The logic could probably be clearer. */
5696 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005697 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5698 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005700 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005701 /* undo the original DEF_FREE */
5702 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005703
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005704 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005705 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005706 2. Free variables in methods that are also class
5707 variables or declared global.
5708 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005709 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005710 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005712 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005713 c->c_argcount--;
5714 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005715 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005716 c->c_argcount--;
5717 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005718 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005719 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005720 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005721 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005722 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005723 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005724 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005725 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005727 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5728 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005729 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005730 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005731 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005733 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005734 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735 if (v == NULL)
5736 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738 goto fail;
5739 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005740 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005741 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005742 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005743 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005744 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005745 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746 if (v == NULL)
5747 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005748 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005749 goto fail;
5750 Py_DECREF(v);
5751 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005752 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005753 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005754 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005755 goto fail;
5756 if (st->st_nscopes != 1) {
5757 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005758 if (v == NULL)
5759 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005760 if (PyDict_SetItem(st->st_global,
5761 name, v))
5762 goto fail;
5763 Py_DECREF(v);
5764 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005766 }
5767 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005768 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5769
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005770 if (si.si_ncells > 1) { /* one cell is always in order */
5771 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5772 c->c_varnames, c->c_flags) < 0)
5773 return -1;
5774 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005775 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5776 return -1;
5777 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005778 fail:
5779 /* is this always the right thing to do? */
5780 Py_XDECREF(v);
5781 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782}
5783
5784static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005785symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786{
5787 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005788
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005789 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005790 if (st == NULL)
5791 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005792 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005793
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005794 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005795 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005796 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005797 goto fail;
5798 if ((st->st_symbols = PyDict_New()) == NULL)
5799 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005800 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005801 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005802 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005803 st->st_private = NULL;
5804 return st;
5805 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005806 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005807 return NULL;
5808}
5809
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005810void
5811PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005812{
5813 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005814 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005815 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005816 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005817}
5818
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005819/* When the compiler exits a scope, it must should update the scope's
5820 free variable information with the list of free variables in its
5821 children.
5822
5823 Variables that are free in children and defined in the current
5824 scope are cellvars.
5825
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005826 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827 false), free variables in children that are not defined here are
5828 implicit globals.
5829
5830*/
5831
5832static int
5833symtable_update_free_vars(struct symtable *st)
5834{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005835 int i, j, def;
5836 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005837 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005838
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005839 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005840 def = DEF_FREE_CLASS;
5841 else
5842 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005843 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005844 int pos = 0;
5845
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005846 if (list && PyList_SetSlice(list, 0,
5847 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005848 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005849 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005850 PyList_GET_ITEM(ste->ste_children, i);
5851 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005852 int flags = PyInt_AS_LONG(o);
5853 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005854 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005855 if (list == NULL) {
5856 list = PyList_New(0);
5857 if (list == NULL)
5858 return -1;
5859 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005860 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005861 if (PyList_Append(list, name) < 0) {
5862 Py_DECREF(list);
5863 return -1;
5864 }
5865 }
5866 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005867 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005868 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005869 v = PyDict_GetItem(ste->ste_symbols, name);
5870 /* If a name N is declared global in scope A and
5871 referenced in scope B contained (perhaps
5872 indirectly) in A and there are no scopes
5873 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005874 is global in B. Unless A is a class scope,
5875 because class scopes are not considered for
5876 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005877 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005878 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005879 int flags = PyInt_AS_LONG(v);
5880 if (flags & DEF_GLOBAL) {
5881 symtable_undo_free(st, child->ste_id,
5882 name);
5883 continue;
5884 }
5885 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005886 if (ste->ste_nested) {
5887 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005888 name, def) < 0) {
5889 Py_DECREF(list);
5890 return -1;
5891 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005892 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005893 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005894 name) < 0) {
5895 Py_DECREF(list);
5896 return -1;
5897 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005898 }
5899 }
5900 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005901
5902 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005903 return 0;
5904}
5905
5906/* If the current scope is a non-nested class or if name is not
5907 defined in the current, non-nested scope, then it is an implicit
5908 global in all nested scopes.
5909*/
5910
5911static int
5912symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5913{
5914 PyObject *o;
5915 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005916 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005917
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005918 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005919 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005920 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005921 if (o == NULL)
5922 return symtable_undo_free(st, child, name);
5923 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005924
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005925 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005926 return symtable_undo_free(st, child, name);
5927 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005928 return symtable_add_def_o(st, ste->ste_symbols,
5929 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005930}
5931
5932static int
5933symtable_undo_free(struct symtable *st, PyObject *id,
5934 PyObject *name)
5935{
5936 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005937 PyObject *info;
5938 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005939
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005940 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5941 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005942 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005943
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005944 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005945 if (info == NULL)
5946 return 0;
5947 v = PyInt_AS_LONG(info);
5948 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005949 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005950 DEF_FREE_GLOBAL) < 0)
5951 return -1;
5952 } else
5953 /* If the name is defined here or declared global,
5954 then the recursion stops. */
5955 return 0;
5956
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005957 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5958 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005959 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005960 PyList_GET_ITEM(ste->ste_children, i);
5961 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005962 if (x < 0)
5963 return x;
5964 }
5965 return 0;
5966}
5967
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005968/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5969 This reference is released when the scope is exited, via the DECREF
5970 in symtable_exit_scope().
5971*/
5972
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005973static int
5974symtable_exit_scope(struct symtable *st)
5975{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005976 int end;
5977
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005978 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005979 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005980 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005981 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005982 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5983 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005984 if (PySequence_DelItem(st->st_stack, end) < 0)
5985 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005986 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005987}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005988
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005989static void
5990symtable_enter_scope(struct symtable *st, char *name, int type,
5991 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005992{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005993 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005994
5995 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005996 prev = st->st_cur;
5997 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005998 st->st_errors++;
5999 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006000 }
6001 }
Barry Warsaw0372af72001-02-23 18:22:59 +00006002 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006003 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006004 if (st->st_cur == NULL) {
6005 st->st_errors++;
6006 return;
6007 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006008 if (strcmp(name, TOP) == 0)
6009 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006010 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006011 if (PyList_Append(prev->ste_children,
6012 (PyObject *)st->st_cur) < 0)
6013 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006014 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006015}
6016
6017static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006018symtable_lookup(struct symtable *st, char *name)
6019{
6020 char buffer[MANGLE_LEN];
6021 PyObject *v;
6022 int flags;
6023
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006024 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006025 name = buffer;
6026 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6027 if (v == NULL) {
6028 if (PyErr_Occurred())
6029 return -1;
6030 else
6031 return 0;
6032 }
6033
6034 flags = PyInt_AS_LONG(v);
6035 return flags;
6036}
6037
6038static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006039symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006040{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006041 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006042 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006043 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006044
Guido van Rossumb7164622002-08-16 02:48:11 +00006045 /* Warn about None, except inside a tuple (where the assignment
6046 code already issues a warning). */
6047 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6048 *name == 'N' && strcmp(name, "None") == 0)
6049 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006050 PyErr_SetString(PyExc_SyntaxError,
6051 "Invalid syntax. Assignment to None.");
6052 symtable_error(st, 0);
6053 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006054 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006055 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056 name = buffer;
6057 if ((s = PyString_InternFromString(name)) == NULL)
6058 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006059 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6060 Py_DECREF(s);
6061 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006062}
6063
6064/* Must only be called with mangled names */
6065
6066static int
6067symtable_add_def_o(struct symtable *st, PyObject *dict,
6068 PyObject *name, int flag)
6069{
6070 PyObject *o;
6071 int val;
6072
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006073 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006074 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006075 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006076 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006077 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006078 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006079 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006080 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006081 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006082 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006083 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006084 if (o == NULL)
6085 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006086 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006087 Py_DECREF(o);
6088 return -1;
6089 }
6090 Py_DECREF(o);
6091
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006092 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006093 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006094 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006095 } else if (flag & DEF_GLOBAL) {
6096 /* XXX need to update DEF_GLOBAL for other flags too;
6097 perhaps only DEF_FREE_GLOBAL */
6098 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006099 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006100 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006101 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006102 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006103 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006104 if (o == NULL)
6105 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006106 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006107 Py_DECREF(o);
6108 return -1;
6109 }
6110 Py_DECREF(o);
6111 }
6112 return 0;
6113}
6114
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006115#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006116
Tim Peters08a898f2001-06-28 01:52:22 +00006117/* Look for a yield stmt under n. Return 1 if found, else 0.
6118 This hack is used to look inside "if 0:" blocks (which are normally
6119 ignored) in case those are the only places a yield occurs (so that this
6120 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006121static int
6122look_for_yield(node *n)
6123{
6124 int i;
6125
6126 for (i = 0; i < NCH(n); ++i) {
6127 node *kid = CHILD(n, i);
6128
6129 switch (TYPE(kid)) {
6130
6131 case classdef:
6132 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006133 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006134 /* Stuff in nested functions and classes can't make
6135 the parent a generator. */
6136 return 0;
6137
6138 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006139 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006140
6141 default:
6142 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006143 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006144 }
6145 }
6146 return 0;
6147}
6148
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006149static void
6150symtable_node(struct symtable *st, node *n)
6151{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006152 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153
6154 loop:
6155 switch (TYPE(n)) {
6156 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006157 char *func_name;
6158 if (NCH(n) == 6)
6159 symtable_node(st, CHILD(n, 0));
6160 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006162 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006163 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006164 symtable_funcdef(st, n);
6165 symtable_exit_scope(st);
6166 break;
6167 }
6168 case lambdef:
6169 if (NCH(n) == 4)
6170 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006171 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006172 symtable_funcdef(st, n);
6173 symtable_exit_scope(st);
6174 break;
6175 case classdef: {
6176 char *tmp, *class_name = STR(CHILD(n, 1));
6177 symtable_add_def(st, class_name, DEF_LOCAL);
6178 if (TYPE(CHILD(n, 2)) == LPAR) {
6179 node *bases = CHILD(n, 3);
6180 int i;
6181 for (i = 0; i < NCH(bases); i += 2) {
6182 symtable_node(st, CHILD(bases, i));
6183 }
6184 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006185 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006186 tmp = st->st_private;
6187 st->st_private = class_name;
6188 symtable_node(st, CHILD(n, NCH(n) - 1));
6189 st->st_private = tmp;
6190 symtable_exit_scope(st);
6191 break;
6192 }
6193 case if_stmt:
6194 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006195 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6196 if (st->st_cur->ste_generator == 0)
6197 st->st_cur->ste_generator =
6198 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006199 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006200 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006201 symtable_node(st, CHILD(n, i + 1));
6202 symtable_node(st, CHILD(n, i + 3));
6203 }
6204 if (i + 2 < NCH(n))
6205 symtable_node(st, CHILD(n, i + 2));
6206 break;
6207 case global_stmt:
6208 symtable_global(st, n);
6209 break;
6210 case import_stmt:
6211 symtable_import(st, n);
6212 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006213 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006214 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006215 symtable_node(st, CHILD(n, 1));
6216 if (NCH(n) > 2)
6217 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006218 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006219 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006220 st->st_cur->ste_opt_lineno = n->n_lineno;
6221 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006222 if (NCH(n) > 4)
6223 symtable_node(st, CHILD(n, 5));
6224 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006225
6226 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006227 case assert_stmt:
6228 if (Py_OptimizeFlag)
6229 return;
6230 if (NCH(n) == 2) {
6231 n = CHILD(n, 1);
6232 goto loop;
6233 } else {
6234 symtable_node(st, CHILD(n, 1));
6235 n = CHILD(n, 3);
6236 goto loop;
6237 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006238 case except_clause:
6239 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006240 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006241 if (NCH(n) > 1) {
6242 n = CHILD(n, 1);
6243 goto loop;
6244 }
6245 break;
6246 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006247 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006248 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006249 case yield_stmt:
6250 st->st_cur->ste_generator = 1;
6251 n = CHILD(n, 1);
6252 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006253 case expr_stmt:
6254 if (NCH(n) == 1)
6255 n = CHILD(n, 0);
6256 else {
6257 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006258 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006259 symtable_node(st, CHILD(n, 2));
6260 break;
6261 } else {
6262 int i;
6263 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006264 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006265 n = CHILD(n, NCH(n) - 1);
6266 }
6267 }
6268 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006269 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006270 /* only occurs when there are multiple for loops
6271 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006272 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006273 if (TYPE(n) == list_for)
6274 symtable_list_for(st, n);
6275 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006276 REQ(n, list_if);
6277 symtable_node(st, CHILD(n, 1));
6278 if (NCH(n) == 3) {
6279 n = CHILD(n, 2);
6280 goto loop;
6281 }
6282 }
6283 break;
6284 case for_stmt:
6285 symtable_assign(st, CHILD(n, 1), 0);
6286 for (i = 3; i < NCH(n); ++i)
6287 if (TYPE(CHILD(n, i)) >= single_input)
6288 symtable_node(st, CHILD(n, i));
6289 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006290 case arglist:
6291 if (NCH(n) > 1)
6292 for (i = 0; i < NCH(n); ++i) {
6293 node *ch = CHILD(n, i);
6294 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6295 TYPE(CHILD(ch, 1)) == gen_for) {
6296 PyErr_SetString(PyExc_SyntaxError,
6297 "invalid syntax");
6298 symtable_error(st, n->n_lineno);
6299 return;
6300 }
6301 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006302 /* The remaining cases fall through to default except in
6303 special circumstances. This requires the individual cases
6304 to be coded with great care, even though they look like
6305 rather innocuous. Each case must double-check TYPE(n).
6306 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006307 case decorator:
6308 if (TYPE(n) == decorator) {
6309 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6310 node *name, *varname;
6311 name = CHILD(n, 1);
6312 REQ(name, dotted_name);
6313 varname = CHILD(name, 0);
6314 REQ(varname, NAME);
6315 symtable_add_use(st, STR(varname));
6316 }
6317 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006318 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006319 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006320 n = CHILD(n, 2);
6321 goto loop;
6322 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006323 else if (TYPE(n) == argument && NCH(n) == 2 &&
6324 TYPE(CHILD(n, 1)) == gen_for) {
6325 symtable_generator_expression(st, n);
6326 break;
6327 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006328 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006329 case listmaker:
6330 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006331 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006332 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006333 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006334 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006335 case testlist_gexp:
6336 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6337 symtable_generator_expression(st, n);
6338 break;
6339 }
6340 /* fall through */
6341
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006342 case atom:
6343 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6344 symtable_add_use(st, STR(CHILD(n, 0)));
6345 break;
6346 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006347 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006348 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006349 /* Walk over every non-token child with a special case
6350 for one child.
6351 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006352 if (NCH(n) == 1) {
6353 n = CHILD(n, 0);
6354 goto loop;
6355 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006356 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006357 if (TYPE(CHILD(n, i)) >= single_input)
6358 symtable_node(st, CHILD(n, i));
6359 }
6360}
6361
6362static void
6363symtable_funcdef(struct symtable *st, node *n)
6364{
6365 node *body;
6366
6367 if (TYPE(n) == lambdef) {
6368 if (NCH(n) == 4)
6369 symtable_params(st, CHILD(n, 1));
6370 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006371 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006372 body = CHILD(n, NCH(n) - 1);
6373 symtable_node(st, body);
6374}
6375
6376/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006377 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006378 which are references in the defining scope. symtable_params()
6379 parses the parameter names, which are defined in the function's
6380 body.
6381
6382 varargslist:
6383 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6384 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6385*/
6386
6387static void
6388symtable_default_args(struct symtable *st, node *n)
6389{
6390 node *c;
6391 int i;
6392
6393 if (TYPE(n) == parameters) {
6394 n = CHILD(n, 1);
6395 if (TYPE(n) == RPAR)
6396 return;
6397 }
6398 REQ(n, varargslist);
6399 for (i = 0; i < NCH(n); i += 2) {
6400 c = CHILD(n, i);
6401 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6402 break;
6403 }
6404 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6405 symtable_node(st, CHILD(n, i));
6406 }
6407}
6408
6409static void
6410symtable_params(struct symtable *st, node *n)
6411{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006412 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006413 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006414
6415 if (TYPE(n) == parameters) {
6416 n = CHILD(n, 1);
6417 if (TYPE(n) == RPAR)
6418 return;
6419 }
6420 REQ(n, varargslist);
6421 for (i = 0; i < NCH(n); i += 2) {
6422 c = CHILD(n, i);
6423 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6424 ext = 1;
6425 break;
6426 }
6427 if (TYPE(c) == test) {
6428 continue;
6429 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006430 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006431 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006432 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006433 char nbuf[30];
6434 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006435 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006436 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006437 }
6438 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006439 if (ext) {
6440 c = CHILD(n, i);
6441 if (TYPE(c) == STAR) {
6442 i++;
6443 symtable_add_def(st, STR(CHILD(n, i)),
6444 DEF_PARAM | DEF_STAR);
6445 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006446 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006447 c = NULL;
6448 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006449 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006450 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006451 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006452 i++;
6453 symtable_add_def(st, STR(CHILD(n, i)),
6454 DEF_PARAM | DEF_DOUBLESTAR);
6455 }
6456 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006457 if (complex >= 0) {
6458 int j;
6459 for (j = 0; j <= complex; j++) {
6460 c = CHILD(n, j);
6461 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006462 c = CHILD(n, ++j);
6463 else if (TYPE(c) == EQUAL)
6464 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006465 if (TYPE(CHILD(c, 0)) == LPAR)
6466 symtable_params_fplist(st, CHILD(c, 1));
6467 }
6468 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006469}
6470
6471static void
6472symtable_params_fplist(struct symtable *st, node *n)
6473{
6474 int i;
6475 node *c;
6476
6477 REQ(n, fplist);
6478 for (i = 0; i < NCH(n); i += 2) {
6479 c = CHILD(n, i);
6480 REQ(c, fpdef);
6481 if (NCH(c) == 1)
6482 symtable_add_def(st, STR(CHILD(c, 0)),
6483 DEF_PARAM | DEF_INTUPLE);
6484 else
6485 symtable_params_fplist(st, CHILD(c, 1));
6486 }
6487
6488}
6489
6490static void
6491symtable_global(struct symtable *st, node *n)
6492{
6493 int i;
6494
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006495 /* XXX It might be helpful to warn about module-level global
6496 statements, but it's hard to tell the difference between
6497 module-level and a string passed to exec.
6498 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006499
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006500 for (i = 1; i < NCH(n); i += 2) {
6501 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006502 int flags;
6503
6504 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006505 if (flags < 0)
6506 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006507 if (flags && flags != DEF_GLOBAL) {
6508 char buf[500];
6509 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006510 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006511 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006512 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006513 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006514 }
6515 else {
6516 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006517 PyOS_snprintf(buf, sizeof(buf),
6518 GLOBAL_AFTER_ASSIGN,
6519 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006520 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006521 PyOS_snprintf(buf, sizeof(buf),
6522 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006523 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006524 }
6525 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006526 symtable_add_def(st, name, DEF_GLOBAL);
6527 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006528}
6529
6530static void
6531symtable_list_comprehension(struct symtable *st, node *n)
6532{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006533 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006534 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006535
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006536 REQ(n, listmaker);
6537 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6538 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006539 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006540 symtable_list_for(st, CHILD(n, 1));
6541 symtable_node(st, CHILD(n, 0));
6542 --st->st_cur->ste_tmpname;
6543}
6544
6545static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006546symtable_generator_expression(struct symtable *st, node *n)
6547{
6548 /* testlist_gexp: test gen_for */
6549 REQ(CHILD(n, 0), test);
6550 REQ(CHILD(n, 1), gen_for);
6551
6552 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6553 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6554
6555 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6556
6557 symtable_gen_for(st, CHILD(n, 1), 1);
6558 symtable_node(st, CHILD(n, 0));
6559 symtable_exit_scope(st);
6560
6561 /* for outmost iterable precomputation */
6562 symtable_node(st, CHILD(CHILD(n, 1), 3));
6563}
6564
6565static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006566symtable_list_for(struct symtable *st, node *n)
6567{
6568 REQ(n, list_for);
6569 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006570 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006571 symtable_node(st, CHILD(n, 3));
6572 if (NCH(n) == 5)
6573 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006574}
6575
6576static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006577symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6578{
6579 REQ(n, gen_for);
6580
6581 /* gen_for: for v in test [gen_iter] */
6582 symtable_assign(st, CHILD(n, 1), 0);
6583 if (is_outmost)
6584 symtable_add_use(st, "[outmost-iterable]");
6585 else
6586 symtable_node(st, CHILD(n, 3));
6587
6588 if (NCH(n) == 5)
6589 symtable_gen_iter(st, CHILD(n, 4));
6590}
6591
6592static void
6593symtable_gen_iter(struct symtable *st, node *n)
6594{
6595 REQ(n, gen_iter);
6596
6597 n = CHILD(n, 0);
6598 if (TYPE(n) == gen_for)
6599 symtable_gen_for(st, n, 0);
6600 else {
6601 REQ(n, gen_if);
6602 symtable_node(st, CHILD(n, 1));
6603
6604 if (NCH(n) == 3)
6605 symtable_gen_iter(st, CHILD(n, 2));
6606 }
6607}
6608
6609static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006610symtable_import(struct symtable *st, node *n)
6611{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006612 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006613 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006614 /* import_stmt: import_name | import_from */
6615 n = CHILD(n, 0);
6616 if (TYPE(n) == import_from) {
6617 /* import_from: 'from' dotted_name 'import' ('*' |
6618 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006619 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006620 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006621 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6622 /* check for bogus imports */
6623 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6624 PyErr_SetString(PyExc_SyntaxError,
6625 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006626 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006627 return;
6628 }
6629 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006630 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6631 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006632 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006633 if (symtable_warn(st,
6634 "import * only allowed at module level") < 0)
6635 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006636 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006637 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006638 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006639 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006640 REQ(nn, import_as_names);
6641 for (i = 0; i < NCH(nn); i += 2) {
6642 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006643 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006644 symtable_assign(st, CHILD(c, 2),
6645 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006646 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006647 symtable_assign(st, CHILD(c, 0),
6648 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006649 }
6650 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006651 } else {
6652 /* 'import' dotted_as_names */
6653 nn = CHILD(n, 1);
6654 REQ(nn, dotted_as_names);
6655 for (i = 0; i < NCH(nn); i += 2)
6656 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006657 }
6658}
6659
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006660/* The third argument to symatble_assign() is a flag to be passed to
6661 symtable_add_def() if it is eventually called. The flag is useful
6662 to specify the particular type of assignment that should be
6663 recorded, e.g. an assignment caused by import.
6664 */
6665
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006666static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006667symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006668{
6669 node *tmp;
6670 int i;
6671
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006672 loop:
6673 switch (TYPE(n)) {
6674 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006675 /* invalid assignment, e.g. lambda x:x=2. The next
6676 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006677 return;
6678 case power:
6679 if (NCH(n) > 2) {
6680 for (i = 2; i < NCH(n); ++i)
6681 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6682 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006683 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006684 if (NCH(n) > 1) {
6685 symtable_node(st, CHILD(n, 0));
6686 symtable_node(st, CHILD(n, 1));
6687 } else {
6688 n = CHILD(n, 0);
6689 goto loop;
6690 }
6691 return;
6692 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006693 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6694 /* XXX This is an error, but the next pass
6695 will catch it. */
6696 return;
6697 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006698 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006699 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006700 }
6701 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006702 case testlist_gexp:
6703 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6704 /* XXX This is an error, but the next pass
6705 will catch it. */
6706 return;
6707 } else {
6708 for (i = 0; i < NCH(n); i += 2)
6709 symtable_assign(st, CHILD(n, i), def_flag);
6710 }
6711 return;
6712
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006713 case exprlist:
6714 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006715 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006716 if (NCH(n) == 1) {
6717 n = CHILD(n, 0);
6718 goto loop;
6719 }
6720 else {
6721 int i;
6722 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006723 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006724 return;
6725 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006726 case atom:
6727 tmp = CHILD(n, 0);
6728 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6729 n = CHILD(n, 1);
6730 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006731 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006732 if (strcmp(STR(tmp), "__debug__") == 0) {
6733 PyErr_SetString(PyExc_SyntaxError,
6734 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006735 symtable_error(st, n->n_lineno);
6736 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006737 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006738 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006739 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006740 return;
6741 case dotted_as_name:
6742 if (NCH(n) == 3)
6743 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006744 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006745 else
6746 symtable_add_def(st,
6747 STR(CHILD(CHILD(n,
6748 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006749 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006750 return;
6751 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006752 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006753 return;
6754 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006755 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006756 return;
6757 default:
6758 if (NCH(n) == 0)
6759 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006760 if (NCH(n) == 1) {
6761 n = CHILD(n, 0);
6762 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006763 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006764 /* Should only occur for errors like x + 1 = 1,
6765 which will be caught in the next pass. */
6766 for (i = 0; i < NCH(n); ++i)
6767 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006768 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006769 }
6770}