blob: 5781b21ce4cde227face4144b3b263be4e1e7192 [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);
Brett Cannon409d8f22005-03-05 06:47:57 +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 */
Brett Cannon409d8f22005-03-05 06:47:57 +00004638 if (TYPE(CHILD(n, 2)) != LPAR ||
4639 TYPE(CHILD(n, 3)) == RPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004640 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004641 com_push(c, 1);
4642 }
Guido van Rossum25831651993-05-19 14:50:45 +00004643 else
4644 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004646 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004647 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004648 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004649 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004650 c->c_errors++;
4651 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004652 int closure = com_make_closure(c, co);
4653 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004654 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004655 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004656 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004657 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004658 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004659 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004660 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004661 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004662 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004663 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004664 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004665 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004666 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004667 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004668}
4669
4670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004671com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004672{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004674 if (c->c_errors)
4675 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004676 switch (TYPE(n)) {
4677
4678 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004679
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004680 case funcdef:
4681 com_funcdef(c, n);
4682 break;
4683 case classdef:
4684 com_classdef(c, n);
4685 break;
4686
4687 /* Trivial parse tree nodes */
4688
4689 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004690 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004691 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004692 n = CHILD(n, 0);
4693 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004694
4695 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004696 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004697 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004698 {
4699 int i;
4700 for (i = 0; i < NCH(n)-1; i += 2)
4701 com_node(c, CHILD(n, i));
4702 }
4703 break;
4704
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004705 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004706 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004707 n = CHILD(n, 0);
4708 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004709
4710 /* Statement nodes */
4711
4712 case expr_stmt:
4713 com_expr_stmt(c, n);
4714 break;
4715 case print_stmt:
4716 com_print_stmt(c, n);
4717 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004718 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004719 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004720 break;
4721 case pass_stmt:
4722 break;
4723 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004724 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004725 com_error(c, PyExc_SyntaxError,
4726 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004727 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004728 com_addbyte(c, BREAK_LOOP);
4729 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004730 case continue_stmt:
4731 com_continue_stmt(c, n);
4732 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004733 case return_stmt:
4734 com_return_stmt(c, n);
4735 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004736 case yield_stmt:
4737 com_yield_stmt(c, n);
4738 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004739 case raise_stmt:
4740 com_raise_stmt(c, n);
4741 break;
4742 case import_stmt:
4743 com_import_stmt(c, n);
4744 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004745 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004746 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004747 case exec_stmt:
4748 com_exec_stmt(c, n);
4749 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004750 case assert_stmt:
4751 com_assert_stmt(c, n);
4752 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004753 case if_stmt:
4754 com_if_stmt(c, n);
4755 break;
4756 case while_stmt:
4757 com_while_stmt(c, n);
4758 break;
4759 case for_stmt:
4760 com_for_stmt(c, n);
4761 break;
4762 case try_stmt:
4763 com_try_stmt(c, n);
4764 break;
4765 case suite:
4766 com_suite(c, n);
4767 break;
4768
4769 /* Expression nodes */
4770
4771 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004772 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004773 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004774 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004775 break;
4776 case test:
4777 com_test(c, n);
4778 break;
4779 case and_test:
4780 com_and_test(c, n);
4781 break;
4782 case not_test:
4783 com_not_test(c, n);
4784 break;
4785 case comparison:
4786 com_comparison(c, n);
4787 break;
4788 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004789 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004790 break;
4791 case expr:
4792 com_expr(c, n);
4793 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004794 case xor_expr:
4795 com_xor_expr(c, n);
4796 break;
4797 case and_expr:
4798 com_and_expr(c, n);
4799 break;
4800 case shift_expr:
4801 com_shift_expr(c, n);
4802 break;
4803 case arith_expr:
4804 com_arith_expr(c, n);
4805 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004806 case term:
4807 com_term(c, n);
4808 break;
4809 case factor:
4810 com_factor(c, n);
4811 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004812 case power:
4813 com_power(c, n);
4814 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004815 case atom:
4816 com_atom(c, n);
4817 break;
4818
4819 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004820 com_error(c, PyExc_SystemError,
4821 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004822 }
4823}
4824
Tim Petersdbd9ba62000-07-09 03:09:57 +00004825static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004826
4827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004828com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004829{
4830 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4831 if (TYPE(CHILD(n, 0)) == LPAR)
4832 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004833 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004834 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004835 com_pop(c, 1);
4836 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004837}
4838
4839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004840com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004841{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004842 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004843 if (NCH(n) == 1) {
4844 com_fpdef(c, CHILD(n, 0));
4845 }
4846 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004847 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004848 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004849 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004850 for (i = 0; i < NCH(n); i += 2)
4851 com_fpdef(c, CHILD(n, i));
4852 }
4853}
4854
4855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004856com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004857{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004858 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004859 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004860 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004861 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004862 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004863 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004864 nch = NCH(n);
4865 /* Enter all arguments in table of locals */
4866 for (i = 0, narg = 0; i < nch; i++) {
4867 node *ch = CHILD(n, i);
4868 node *fp;
4869 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004870 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004871 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4872 fp = CHILD(ch, 0);
4873 if (TYPE(fp) != NAME) {
4874 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4875 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004876 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004877 narg++;
4878 /* all name updates handled by symtable */
4879 if (++i >= nch)
4880 break;
4881 ch = CHILD(n, i);
4882 if (TYPE(ch) == EQUAL)
4883 i += 2;
4884 else
4885 REQ(ch, COMMA);
4886 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004887 if (complex) {
4888 /* Generate code for complex arguments only after
4889 having counted the simple arguments */
4890 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004891 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004892 node *ch = CHILD(n, i);
4893 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004894 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004895 break;
4896 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4897 fp = CHILD(ch, 0);
4898 if (TYPE(fp) != NAME) {
4899 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004900 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004901 com_fpdef(c, ch);
4902 }
4903 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004904 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004905 break;
4906 ch = CHILD(n, i);
4907 if (TYPE(ch) == EQUAL)
4908 i += 2;
4909 else
4910 REQ(ch, COMMA);
4911 }
4912 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004913}
4914
4915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004916com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004917{
4918 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004919 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004920 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004921 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004922 if (doc != NULL) {
4923 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004924 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004925 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004926 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004928 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004929 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004930 for (i = 0; i < NCH(n); i++) {
4931 node *ch = CHILD(n, i);
4932 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4933 com_node(c, ch);
4934 }
4935}
4936
4937/* Top-level compile-node interface */
4938
4939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004940compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004941{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004942 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004943 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004944 REQ(n, funcdef);
4945 /* -6 -5 -4 -3 -2 -1
4946 funcdef: [decorators] 'def' NAME parameters ':' suite */
4947 c->c_name = STR(RCHILD(n, -4));
4948 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004949 if (doc != NULL) {
4950 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004951 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004952 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004953 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004954 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004955 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004956 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004957 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004958 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004959 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004960 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004961 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004962 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004963 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4964 com_push(c, 1);
4965 com_addbyte(c, RETURN_VALUE);
4966 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004967}
4968
4969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004970compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004971{
Guido van Rossum590baa41993-11-30 13:40:46 +00004972 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004973 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004974 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004975
4976 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004977 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004978 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004979 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004980 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004981 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004982 else
4983 ch = CHILD(n, 2);
4984 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004985 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004986 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004987}
4988
4989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004990compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004991{
4992 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004993 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004994 REQ(n, classdef);
4995 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4996 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004997 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004998 /* Initialize local __module__ from global __name__ */
4999 com_addop_name(c, LOAD_GLOBAL, "__name__");
5000 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005001 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005002 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005003 if (doc != NULL) {
5004 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005005 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005006 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005007 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005008 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00005009 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005010 }
5011 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00005012 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005013 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00005014 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005015 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005016 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005017 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005018 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005019}
5020
5021static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005022compile_generator_expression(struct compiling *c, node *n)
5023{
5024 /* testlist_gexp: test gen_for */
5025 /* argument: test gen_for */
5026 REQ(CHILD(n, 0), test);
5027 REQ(CHILD(n, 1), gen_for);
5028
5029 c->c_name = "<generator expression>";
5030 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5031
5032 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5033 com_push(c, 1);
5034 com_addbyte(c, RETURN_VALUE);
5035 com_pop(c, 1);
5036}
5037
5038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005039compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005040{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005041 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005042
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005043 switch (TYPE(n)) {
5044
Guido van Rossum4c417781991-01-21 16:09:22 +00005045 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005046 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005047 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005048 n = CHILD(n, 0);
5049 if (TYPE(n) != NEWLINE)
5050 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005051 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005052 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5053 com_push(c, 1);
5054 com_addbyte(c, RETURN_VALUE);
5055 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005056 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005057 break;
5058
Guido van Rossum4c417781991-01-21 16:09:22 +00005059 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005060 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005061 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005062 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5063 com_push(c, 1);
5064 com_addbyte(c, RETURN_VALUE);
5065 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005066 break;
5067
Guido van Rossum590baa41993-11-30 13:40:46 +00005068 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005069 com_node(c, CHILD(n, 0));
5070 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005071 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005072 break;
5073
Guido van Rossum590baa41993-11-30 13:40:46 +00005074 case lambdef: /* anonymous function definition */
5075 compile_lambdef(c, n);
5076 break;
5077
Guido van Rossum4c417781991-01-21 16:09:22 +00005078 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005079 compile_funcdef(c, n);
5080 break;
5081
Guido van Rossum4c417781991-01-21 16:09:22 +00005082 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005083 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005084 break;
5085
Raymond Hettinger354433a2004-05-19 08:20:33 +00005086 case testlist_gexp: /* A generator expression */
5087 case argument: /* A generator expression */
5088 compile_generator_expression(c, n);
5089 break;
5090
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005091 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005092 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005093 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005094 }
5095}
5096
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005097static PyObject *
5098dict_keys_inorder(PyObject *dict, int offset)
5099{
5100 PyObject *tuple, *k, *v;
5101 int i, pos = 0, size = PyDict_Size(dict);
5102
5103 tuple = PyTuple_New(size);
5104 if (tuple == NULL)
5105 return NULL;
5106 while (PyDict_Next(dict, &pos, &k, &v)) {
5107 i = PyInt_AS_LONG(v);
5108 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005109 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005110 PyTuple_SET_ITEM(tuple, i - offset, k);
5111 }
5112 return tuple;
5113}
5114
Guido van Rossum79f25d91997-04-29 20:08:16 +00005115PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005116PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005117{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005118 return PyNode_CompileFlags(n, filename, NULL);
5119}
5120
5121PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005122PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005123{
5124 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005125}
5126
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005127struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005128PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005129{
5130 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005131 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005132
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005133 ff = PyNode_Future(n, filename);
5134 if (ff == NULL)
5135 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005136 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005137 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005138 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005139 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005140 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005141 return st;
5142}
5143
Guido van Rossum79f25d91997-04-29 20:08:16 +00005144static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005145icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005146{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005147 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005148}
5149
Guido van Rossum79f25d91997-04-29 20:08:16 +00005150static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005151jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005152 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005153{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005154 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005155 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005156 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005157 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005158 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5159 sc.c_encoding = "utf-8";
5160 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005161 sc.c_encoding = STR(n);
5162 n = CHILD(n, 0);
5163 } else {
5164 sc.c_encoding = NULL;
5165 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005167 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005168 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005169 /* c_symtable still points to parent's symbols */
5170 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005171 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005172 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005173 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005174 if (base->c_encoding != NULL) {
5175 assert(sc.c_encoding == NULL);
5176 sc.c_encoding = base->c_encoding;
5177 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005178 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005179 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005180 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005181 if (sc.c_future == NULL) {
5182 com_free(&sc);
5183 return NULL;
5184 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005185 if (flags) {
5186 int merged = sc.c_future->ff_features |
5187 flags->cf_flags;
5188 sc.c_future->ff_features = merged;
5189 flags->cf_flags = merged;
5190 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005191 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5192 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005193 com_free(&sc);
5194 return NULL;
5195 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005196 /* reset symbol table for second pass */
5197 sc.c_symtable->st_nscopes = 1;
5198 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199 }
5200 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005201 if (symtable_load_symbols(&sc) < 0) {
5202 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005203 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005204 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005205 compile_node(&sc, n);
5206 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005207 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005208 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005209 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005210 names = PyList_AsTuple(sc.c_names);
5211 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005212 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5213 freevars = dict_keys_inorder(sc.c_freevars,
5214 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005215 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005216 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005217 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5218 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005219 if (!PyErr_Occurred())
5220 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005221 sc.c_nlocals,
5222 sc.c_maxstacklevel,
5223 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005224 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 consts,
5226 names,
5227 varnames,
5228 freevars,
5229 cellvars,
5230 filename,
5231 name,
5232 sc.c_firstlineno,
5233 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005234 Py_XDECREF(consts);
5235 Py_XDECREF(names);
5236 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005237 Py_XDECREF(freevars);
5238 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005239 Py_XDECREF(filename);
5240 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005241 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005242 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005243 else if (!PyErr_Occurred()) {
5244 /* This could happen if someone called PyErr_Clear() after an
5245 error was reported above. That's not supposed to happen,
5246 but I just plugged one case and I'm not sure there can't be
5247 others. In that case, raise SystemError so that at least
5248 it gets reported instead dumping core. */
5249 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5250 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005252 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005253 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005254 sc.c_symtable = NULL;
5255 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005256 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005257 return co;
5258}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005259
5260int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005261PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005262{
5263 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005264 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005265 int line = co->co_firstlineno;
5266 int addr = 0;
5267 while (--size >= 0) {
5268 addr += *p++;
5269 if (addr > addrq)
5270 break;
5271 line += *p++;
5272 }
5273 return line;
5274}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005275
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005276/* The test for LOCAL must come before the test for FREE in order to
5277 handle classes where name is both local and free. The local var is
5278 a method and the free var is a free var referenced within a method.
5279*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280
5281static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005282get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005284 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005285 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005286
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005287 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5288 return CELL;
5289 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5290 return LOCAL;
5291 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5292 return FREE;
5293 v = PyDict_GetItemString(c->c_globals, name);
5294 if (v) {
5295 if (v == Py_None)
5296 return GLOBAL_EXPLICIT;
5297 else {
5298 return GLOBAL_IMPLICIT;
5299 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005300 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005301 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005302 "unknown scope for %.100s in %.100s(%s) "
5303 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5304 name, c->c_name,
5305 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5306 c->c_filename,
5307 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5308 PyObject_REPR(c->c_locals),
5309 PyObject_REPR(c->c_globals)
5310 );
5311
5312 Py_FatalError(buf);
5313 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005314}
5315
Guido van Rossum207fda62001-03-02 03:30:41 +00005316/* Helper functions to issue warnings */
5317
5318static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005319issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005320{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005321 if (PyErr_Occurred()) {
5322 /* This can happen because symtable_node continues
5323 processing even after raising a SyntaxError.
5324 Calling PyErr_WarnExplicit now would clobber the
5325 pending exception; instead we fail and let that
5326 exception propagate.
5327 */
5328 return -1;
5329 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005330 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5331 lineno, NULL, NULL) < 0) {
5332 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5333 PyErr_SetString(PyExc_SyntaxError, msg);
5334 PyErr_SyntaxLocation(filename, lineno);
5335 }
5336 return -1;
5337 }
5338 return 0;
5339}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005340
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005341static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005342symtable_warn(struct symtable *st, char *msg)
5343{
Guido van Rossum207fda62001-03-02 03:30:41 +00005344 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005345 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005346 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005347 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005348 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005349}
5350
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005351/* Helper function for setting lineno and filename */
5352
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005353static struct symtable *
5354symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005355{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005356 struct symtable *st;
5357
5358 st = symtable_init();
5359 if (st == NULL)
5360 return NULL;
5361 st->st_future = ff;
5362 st->st_filename = filename;
5363 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5364 if (st->st_errors > 0)
5365 goto fail;
5366 symtable_node(st, n);
5367 if (st->st_errors > 0)
5368 goto fail;
5369 return st;
5370 fail:
5371 if (!PyErr_Occurred()) {
5372 /* This could happen because after a syntax error is
5373 detected, the symbol-table-building continues for
5374 a while, and PyErr_Clear() might erroneously be
5375 called during that process. One such case has been
5376 fixed, but there might be more (now or later).
5377 */
5378 PyErr_SetString(PyExc_SystemError, "lost exception");
5379 }
5380 st->st_future = NULL;
5381 st->st_filename = NULL;
5382 PySymtable_Free(st);
5383 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005384}
5385
5386static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005387symtable_init_compiling_symbols(struct compiling *c)
5388{
5389 PyObject *varnames;
5390
5391 varnames = c->c_symtable->st_cur->ste_varnames;
5392 if (varnames == NULL) {
5393 varnames = PyList_New(0);
5394 if (varnames == NULL)
5395 return -1;
5396 c->c_symtable->st_cur->ste_varnames = varnames;
5397 Py_INCREF(varnames);
5398 } else
5399 Py_INCREF(varnames);
5400 c->c_varnames = varnames;
5401
5402 c->c_globals = PyDict_New();
5403 if (c->c_globals == NULL)
5404 return -1;
5405 c->c_freevars = PyDict_New();
5406 if (c->c_freevars == NULL)
5407 return -1;
5408 c->c_cellvars = PyDict_New();
5409 if (c->c_cellvars == NULL)
5410 return -1;
5411 return 0;
5412}
5413
5414struct symbol_info {
5415 int si_nlocals;
5416 int si_ncells;
5417 int si_nfrees;
5418 int si_nimplicit;
5419};
5420
5421static void
5422symtable_init_info(struct symbol_info *si)
5423{
5424 si->si_nlocals = 0;
5425 si->si_ncells = 0;
5426 si->si_nfrees = 0;
5427 si->si_nimplicit = 0;
5428}
5429
5430static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005431symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005432 struct symbol_info *si)
5433{
5434 PyObject *dict, *v;
5435
5436 /* Seperate logic for DEF_FREE. If it occurs in a function,
5437 it indicates a local that we must allocate storage for (a
5438 cell var). If it occurs in a class, then the class has a
5439 method and a free variable with the same name.
5440 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005441 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005442 /* If it isn't declared locally, it can't be a cell. */
5443 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5444 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005445 v = PyInt_FromLong(si->si_ncells++);
5446 dict = c->c_cellvars;
5447 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005448 /* If it is free anyway, then there is no need to do
5449 anything here.
5450 */
5451 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005452 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005453 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005454 v = PyInt_FromLong(si->si_nfrees++);
5455 dict = c->c_freevars;
5456 }
5457 if (v == NULL)
5458 return -1;
5459 if (PyDict_SetItem(dict, name, v) < 0) {
5460 Py_DECREF(v);
5461 return -1;
5462 }
5463 Py_DECREF(v);
5464 return 0;
5465}
5466
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005467/* If a variable is a cell and an argument, make sure that appears in
5468 co_cellvars before any variable to its right in varnames.
5469*/
5470
5471
5472static int
5473symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5474 PyObject *varnames, int flags)
5475{
Tim Petersb39903b2003-03-24 17:22:24 +00005476 PyObject *v = NULL;
5477 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005478 int i, pos;
5479
5480 if (flags & CO_VARARGS)
5481 argcount++;
5482 if (flags & CO_VARKEYWORDS)
5483 argcount++;
5484 for (i = argcount; --i >= 0; ) {
5485 v = PyList_GET_ITEM(varnames, i);
5486 if (PyDict_GetItem(*cellvars, v)) {
5487 if (list == NULL) {
5488 list = PyList_New(1);
5489 if (list == NULL)
5490 return -1;
5491 PyList_SET_ITEM(list, 0, v);
5492 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005493 } else {
5494 if (PyList_Insert(list, 0, v) < 0) {
5495 Py_DECREF(list);
5496 return -1;
5497 }
5498 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005499 }
5500 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005501 if (list == NULL)
5502 return 0;
5503
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005504 /* There are cellvars that are also arguments. Create a dict
5505 to replace cellvars and put the args at the front.
5506 */
5507 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005508 if (d == NULL)
5509 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005510 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5511 v = PyInt_FromLong(i);
5512 if (v == NULL)
5513 goto fail;
5514 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5515 goto fail;
5516 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5517 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005518 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005519 }
5520 pos = 0;
5521 i = PyList_GET_SIZE(list);
5522 Py_DECREF(list);
5523 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5524 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005525 if (w == NULL)
5526 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005527 if (PyDict_SetItem(d, v, w) < 0) {
5528 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005529 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005530 goto fail;
5531 }
5532 Py_DECREF(w);
5533 }
5534 Py_DECREF(*cellvars);
5535 *cellvars = d;
5536 return 1;
5537 fail:
5538 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005539 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005540 return -1;
5541}
5542
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005543static int
5544symtable_freevar_offsets(PyObject *freevars, int offset)
5545{
5546 PyObject *name, *v;
5547 int pos;
5548
5549 /* The cell vars are the first elements of the closure,
5550 followed by the free vars. Update the offsets in
5551 c_freevars to account for number of cellvars. */
5552 pos = 0;
5553 while (PyDict_Next(freevars, &pos, &name, &v)) {
5554 int i = PyInt_AS_LONG(v) + offset;
5555 PyObject *o = PyInt_FromLong(i);
5556 if (o == NULL)
5557 return -1;
5558 if (PyDict_SetItem(freevars, name, o) < 0) {
5559 Py_DECREF(o);
5560 return -1;
5561 }
5562 Py_DECREF(o);
5563 }
5564 return 0;
5565}
5566
5567static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005568symtable_check_unoptimized(struct compiling *c,
5569 PySymtableEntryObject *ste,
5570 struct symbol_info *si)
5571{
5572 char buf[300];
5573
5574 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5575 || (ste->ste_nested && si->si_nimplicit)))
5576 return 0;
5577
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005578#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5579
5580#define ILLEGAL_IS "is a nested function"
5581
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005582#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005583"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005584
5585#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005586"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005587
5588#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005589"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005590"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005591
5592 /* XXX perhaps the linenos for these opt-breaking statements
5593 should be stored so the exception can point to them. */
5594
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005595 if (ste->ste_child_free) {
5596 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005597 PyOS_snprintf(buf, sizeof(buf),
5598 ILLEGAL_IMPORT_STAR,
5599 PyString_AS_STRING(ste->ste_name),
5600 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005601 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005602 PyOS_snprintf(buf, sizeof(buf),
5603 ILLEGAL_BARE_EXEC,
5604 PyString_AS_STRING(ste->ste_name),
5605 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005606 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005607 PyOS_snprintf(buf, sizeof(buf),
5608 ILLEGAL_EXEC_AND_IMPORT_STAR,
5609 PyString_AS_STRING(ste->ste_name),
5610 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005611 }
5612 } else {
5613 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005614 PyOS_snprintf(buf, sizeof(buf),
5615 ILLEGAL_IMPORT_STAR,
5616 PyString_AS_STRING(ste->ste_name),
5617 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005618 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005619 PyOS_snprintf(buf, sizeof(buf),
5620 ILLEGAL_BARE_EXEC,
5621 PyString_AS_STRING(ste->ste_name),
5622 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005623 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005624 PyOS_snprintf(buf, sizeof(buf),
5625 ILLEGAL_EXEC_AND_IMPORT_STAR,
5626 PyString_AS_STRING(ste->ste_name),
5627 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005628 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005629 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005630
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005631 PyErr_SetString(PyExc_SyntaxError, buf);
5632 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5633 ste->ste_opt_lineno);
5634 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005635}
5636
5637static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005638symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5639 struct symbol_info *si)
5640{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005641 if (c->c_future)
5642 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005643 if (ste->ste_generator)
5644 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005645 if (ste->ste_type != TYPE_MODULE)
5646 c->c_flags |= CO_NEWLOCALS;
5647 if (ste->ste_type == TYPE_FUNCTION) {
5648 c->c_nlocals = si->si_nlocals;
5649 if (ste->ste_optimized == 0)
5650 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005651 else if (ste->ste_optimized != OPT_EXEC)
5652 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005653 }
5654 return 0;
5655}
5656
5657static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005658symtable_error(struct symtable *st, int lineno)
5659{
5660 if (lineno == 0)
5661 lineno = st->st_cur->ste_lineno;
5662 PyErr_SyntaxLocation(st->st_filename, lineno);
5663 st->st_errors++;
5664 return -1;
5665}
5666
5667static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668symtable_load_symbols(struct compiling *c)
5669{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005671 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672 PyObject *name, *varnames, *v;
5673 int i, flags, pos;
5674 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005675
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 v = NULL;
5677
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005678 if (symtable_init_compiling_symbols(c) < 0)
5679 goto fail;
5680 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005681 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005682 si.si_nlocals = PyList_GET_SIZE(varnames);
5683 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005685 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005687 if (v == NULL)
5688 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005689 if (PyDict_SetItem(c->c_locals,
5690 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005691 goto fail;
5692 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 }
5694
5695 /* XXX The cases below define the rules for whether a name is
5696 local or global. The logic could probably be clearer. */
5697 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005698 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5699 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005700
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005701 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005702 /* undo the original DEF_FREE */
5703 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005704
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005705 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005706 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005707 2. Free variables in methods that are also class
5708 variables or declared global.
5709 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005710 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005711 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005712
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005713 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005714 c->c_argcount--;
5715 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005716 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 c->c_argcount--;
5718 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005719 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005721 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005722 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005723 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005724 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005725 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005727 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5729 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005730 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005731 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005732 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005733 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005734 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005735 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005736 if (v == NULL)
5737 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005738 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739 goto fail;
5740 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005741 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005742 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005743 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005744 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005745 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005746 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 if (v == NULL)
5748 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005749 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005750 goto fail;
5751 Py_DECREF(v);
5752 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005753 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005754 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005755 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005756 goto fail;
5757 if (st->st_nscopes != 1) {
5758 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005759 if (v == NULL)
5760 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005761 if (PyDict_SetItem(st->st_global,
5762 name, v))
5763 goto fail;
5764 Py_DECREF(v);
5765 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005766 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767 }
5768 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005769 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5770
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005771 if (si.si_ncells > 1) { /* one cell is always in order */
5772 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5773 c->c_varnames, c->c_flags) < 0)
5774 return -1;
5775 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005776 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5777 return -1;
5778 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005779 fail:
5780 /* is this always the right thing to do? */
5781 Py_XDECREF(v);
5782 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005783}
5784
5785static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005786symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005787{
5788 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005789
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005790 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005791 if (st == NULL)
5792 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005793 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005794
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005795 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005796 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005797 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005798 goto fail;
5799 if ((st->st_symbols = PyDict_New()) == NULL)
5800 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005802 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005803 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005804 st->st_private = NULL;
5805 return st;
5806 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005807 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005808 return NULL;
5809}
5810
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005811void
5812PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005813{
5814 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005815 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005816 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005817 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005818}
5819
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005820/* When the compiler exits a scope, it must should update the scope's
5821 free variable information with the list of free variables in its
5822 children.
5823
5824 Variables that are free in children and defined in the current
5825 scope are cellvars.
5826
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005827 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005828 false), free variables in children that are not defined here are
5829 implicit globals.
5830
5831*/
5832
5833static int
5834symtable_update_free_vars(struct symtable *st)
5835{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005836 int i, j, def;
5837 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005838 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005839
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005840 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005841 def = DEF_FREE_CLASS;
5842 else
5843 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005844 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005845 int pos = 0;
5846
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005847 if (list && PyList_SetSlice(list, 0,
5848 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005849 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005850 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005851 PyList_GET_ITEM(ste->ste_children, i);
5852 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005853 int flags = PyInt_AS_LONG(o);
5854 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005855 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005856 if (list == NULL) {
5857 list = PyList_New(0);
5858 if (list == NULL)
5859 return -1;
5860 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005861 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005862 if (PyList_Append(list, name) < 0) {
5863 Py_DECREF(list);
5864 return -1;
5865 }
5866 }
5867 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005868 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005869 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005870 v = PyDict_GetItem(ste->ste_symbols, name);
5871 /* If a name N is declared global in scope A and
5872 referenced in scope B contained (perhaps
5873 indirectly) in A and there are no scopes
5874 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005875 is global in B. Unless A is a class scope,
5876 because class scopes are not considered for
5877 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005878 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005879 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005880 int flags = PyInt_AS_LONG(v);
5881 if (flags & DEF_GLOBAL) {
5882 symtable_undo_free(st, child->ste_id,
5883 name);
5884 continue;
5885 }
5886 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005887 if (ste->ste_nested) {
5888 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005889 name, def) < 0) {
5890 Py_DECREF(list);
5891 return -1;
5892 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005893 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005894 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005895 name) < 0) {
5896 Py_DECREF(list);
5897 return -1;
5898 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005899 }
5900 }
5901 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005902
5903 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904 return 0;
5905}
5906
5907/* If the current scope is a non-nested class or if name is not
5908 defined in the current, non-nested scope, then it is an implicit
5909 global in all nested scopes.
5910*/
5911
5912static int
5913symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5914{
5915 PyObject *o;
5916 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005917 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005918
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005919 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005920 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005921 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005922 if (o == NULL)
5923 return symtable_undo_free(st, child, name);
5924 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005925
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005926 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005927 return symtable_undo_free(st, child, name);
5928 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005929 return symtable_add_def_o(st, ste->ste_symbols,
5930 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005931}
5932
5933static int
5934symtable_undo_free(struct symtable *st, PyObject *id,
5935 PyObject *name)
5936{
5937 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005938 PyObject *info;
5939 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005940
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005941 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5942 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005943 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005944
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005945 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005946 if (info == NULL)
5947 return 0;
5948 v = PyInt_AS_LONG(info);
5949 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005950 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005951 DEF_FREE_GLOBAL) < 0)
5952 return -1;
5953 } else
5954 /* If the name is defined here or declared global,
5955 then the recursion stops. */
5956 return 0;
5957
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005958 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5959 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005960 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005961 PyList_GET_ITEM(ste->ste_children, i);
5962 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005963 if (x < 0)
5964 return x;
5965 }
5966 return 0;
5967}
5968
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005969/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5970 This reference is released when the scope is exited, via the DECREF
5971 in symtable_exit_scope().
5972*/
5973
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005974static int
5975symtable_exit_scope(struct symtable *st)
5976{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005977 int end;
5978
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005979 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005980 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005981 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005982 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005983 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5984 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005985 if (PySequence_DelItem(st->st_stack, end) < 0)
5986 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005987 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005988}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005989
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005990static void
5991symtable_enter_scope(struct symtable *st, char *name, int type,
5992 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005993{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005994 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005995
5996 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005997 prev = st->st_cur;
5998 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005999 st->st_errors++;
6000 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006001 }
6002 }
Barry Warsaw0372af72001-02-23 18:22:59 +00006003 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006004 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006005 if (st->st_cur == NULL) {
6006 st->st_errors++;
6007 return;
6008 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006009 if (strcmp(name, TOP) == 0)
6010 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006011 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006012 if (PyList_Append(prev->ste_children,
6013 (PyObject *)st->st_cur) < 0)
6014 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006015 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006016}
6017
6018static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006019symtable_lookup(struct symtable *st, char *name)
6020{
6021 char buffer[MANGLE_LEN];
6022 PyObject *v;
6023 int flags;
6024
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006025 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006026 name = buffer;
6027 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6028 if (v == NULL) {
6029 if (PyErr_Occurred())
6030 return -1;
6031 else
6032 return 0;
6033 }
6034
6035 flags = PyInt_AS_LONG(v);
6036 return flags;
6037}
6038
6039static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006040symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006041{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006042 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006043 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006044 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045
Guido van Rossumb7164622002-08-16 02:48:11 +00006046 /* Warn about None, except inside a tuple (where the assignment
6047 code already issues a warning). */
6048 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6049 *name == 'N' && strcmp(name, "None") == 0)
6050 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006051 PyErr_SetString(PyExc_SyntaxError,
6052 "Invalid syntax. Assignment to None.");
6053 symtable_error(st, 0);
6054 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006055 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006056 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006057 name = buffer;
6058 if ((s = PyString_InternFromString(name)) == NULL)
6059 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006060 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6061 Py_DECREF(s);
6062 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006063}
6064
6065/* Must only be called with mangled names */
6066
6067static int
6068symtable_add_def_o(struct symtable *st, PyObject *dict,
6069 PyObject *name, int flag)
6070{
6071 PyObject *o;
6072 int val;
6073
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006074 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006075 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006076 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006077 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006078 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006079 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006080 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006081 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006082 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006083 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006084 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006085 if (o == NULL)
6086 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006087 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006088 Py_DECREF(o);
6089 return -1;
6090 }
6091 Py_DECREF(o);
6092
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006093 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006094 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006095 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006096 } else if (flag & DEF_GLOBAL) {
6097 /* XXX need to update DEF_GLOBAL for other flags too;
6098 perhaps only DEF_FREE_GLOBAL */
6099 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006100 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006101 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006102 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006103 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006104 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006105 if (o == NULL)
6106 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006107 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006108 Py_DECREF(o);
6109 return -1;
6110 }
6111 Py_DECREF(o);
6112 }
6113 return 0;
6114}
6115
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006116#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006117
Tim Peters08a898f2001-06-28 01:52:22 +00006118/* Look for a yield stmt under n. Return 1 if found, else 0.
6119 This hack is used to look inside "if 0:" blocks (which are normally
6120 ignored) in case those are the only places a yield occurs (so that this
6121 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006122static int
6123look_for_yield(node *n)
6124{
6125 int i;
6126
6127 for (i = 0; i < NCH(n); ++i) {
6128 node *kid = CHILD(n, i);
6129
6130 switch (TYPE(kid)) {
6131
6132 case classdef:
6133 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006134 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006135 /* Stuff in nested functions and classes can't make
6136 the parent a generator. */
6137 return 0;
6138
6139 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006140 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006141
6142 default:
6143 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006144 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006145 }
6146 }
6147 return 0;
6148}
6149
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006150static void
6151symtable_node(struct symtable *st, node *n)
6152{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006153 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006154
6155 loop:
6156 switch (TYPE(n)) {
6157 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006158 char *func_name;
6159 if (NCH(n) == 6)
6160 symtable_node(st, CHILD(n, 0));
6161 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006162 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006163 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006164 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006165 symtable_funcdef(st, n);
6166 symtable_exit_scope(st);
6167 break;
6168 }
6169 case lambdef:
6170 if (NCH(n) == 4)
6171 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006172 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006173 symtable_funcdef(st, n);
6174 symtable_exit_scope(st);
6175 break;
6176 case classdef: {
6177 char *tmp, *class_name = STR(CHILD(n, 1));
6178 symtable_add_def(st, class_name, DEF_LOCAL);
6179 if (TYPE(CHILD(n, 2)) == LPAR) {
6180 node *bases = CHILD(n, 3);
6181 int i;
6182 for (i = 0; i < NCH(bases); i += 2) {
6183 symtable_node(st, CHILD(bases, i));
6184 }
6185 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006186 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006187 tmp = st->st_private;
6188 st->st_private = class_name;
6189 symtable_node(st, CHILD(n, NCH(n) - 1));
6190 st->st_private = tmp;
6191 symtable_exit_scope(st);
6192 break;
6193 }
6194 case if_stmt:
6195 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006196 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6197 if (st->st_cur->ste_generator == 0)
6198 st->st_cur->ste_generator =
6199 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006201 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006202 symtable_node(st, CHILD(n, i + 1));
6203 symtable_node(st, CHILD(n, i + 3));
6204 }
6205 if (i + 2 < NCH(n))
6206 symtable_node(st, CHILD(n, i + 2));
6207 break;
6208 case global_stmt:
6209 symtable_global(st, n);
6210 break;
6211 case import_stmt:
6212 symtable_import(st, n);
6213 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006214 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006215 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006216 symtable_node(st, CHILD(n, 1));
6217 if (NCH(n) > 2)
6218 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006219 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006220 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006221 st->st_cur->ste_opt_lineno = n->n_lineno;
6222 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006223 if (NCH(n) > 4)
6224 symtable_node(st, CHILD(n, 5));
6225 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006226
6227 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006228 case assert_stmt:
6229 if (Py_OptimizeFlag)
6230 return;
6231 if (NCH(n) == 2) {
6232 n = CHILD(n, 1);
6233 goto loop;
6234 } else {
6235 symtable_node(st, CHILD(n, 1));
6236 n = CHILD(n, 3);
6237 goto loop;
6238 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006239 case except_clause:
6240 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006241 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006242 if (NCH(n) > 1) {
6243 n = CHILD(n, 1);
6244 goto loop;
6245 }
6246 break;
6247 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006248 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006249 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006250 case yield_stmt:
6251 st->st_cur->ste_generator = 1;
6252 n = CHILD(n, 1);
6253 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006254 case expr_stmt:
6255 if (NCH(n) == 1)
6256 n = CHILD(n, 0);
6257 else {
6258 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006259 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006260 symtable_node(st, CHILD(n, 2));
6261 break;
6262 } else {
6263 int i;
6264 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006265 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006266 n = CHILD(n, NCH(n) - 1);
6267 }
6268 }
6269 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006270 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006271 /* only occurs when there are multiple for loops
6272 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006273 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006274 if (TYPE(n) == list_for)
6275 symtable_list_for(st, n);
6276 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006277 REQ(n, list_if);
6278 symtable_node(st, CHILD(n, 1));
6279 if (NCH(n) == 3) {
6280 n = CHILD(n, 2);
6281 goto loop;
6282 }
6283 }
6284 break;
6285 case for_stmt:
6286 symtable_assign(st, CHILD(n, 1), 0);
6287 for (i = 3; i < NCH(n); ++i)
6288 if (TYPE(CHILD(n, i)) >= single_input)
6289 symtable_node(st, CHILD(n, i));
6290 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006291 case arglist:
6292 if (NCH(n) > 1)
6293 for (i = 0; i < NCH(n); ++i) {
6294 node *ch = CHILD(n, i);
6295 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6296 TYPE(CHILD(ch, 1)) == gen_for) {
6297 PyErr_SetString(PyExc_SyntaxError,
6298 "invalid syntax");
6299 symtable_error(st, n->n_lineno);
6300 return;
6301 }
6302 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006303 /* The remaining cases fall through to default except in
6304 special circumstances. This requires the individual cases
6305 to be coded with great care, even though they look like
6306 rather innocuous. Each case must double-check TYPE(n).
6307 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006308 case decorator:
6309 if (TYPE(n) == decorator) {
6310 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6311 node *name, *varname;
6312 name = CHILD(n, 1);
6313 REQ(name, dotted_name);
6314 varname = CHILD(name, 0);
6315 REQ(varname, NAME);
6316 symtable_add_use(st, STR(varname));
6317 }
6318 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006319 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006320 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006321 n = CHILD(n, 2);
6322 goto loop;
6323 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006324 else if (TYPE(n) == argument && NCH(n) == 2 &&
6325 TYPE(CHILD(n, 1)) == gen_for) {
6326 symtable_generator_expression(st, n);
6327 break;
6328 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006329 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006330 case listmaker:
6331 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006332 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006333 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006334 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006335 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006336 case testlist_gexp:
6337 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6338 symtable_generator_expression(st, n);
6339 break;
6340 }
6341 /* fall through */
6342
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006343 case atom:
6344 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6345 symtable_add_use(st, STR(CHILD(n, 0)));
6346 break;
6347 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006348 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006349 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006350 /* Walk over every non-token child with a special case
6351 for one child.
6352 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006353 if (NCH(n) == 1) {
6354 n = CHILD(n, 0);
6355 goto loop;
6356 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006357 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006358 if (TYPE(CHILD(n, i)) >= single_input)
6359 symtable_node(st, CHILD(n, i));
6360 }
6361}
6362
6363static void
6364symtable_funcdef(struct symtable *st, node *n)
6365{
6366 node *body;
6367
6368 if (TYPE(n) == lambdef) {
6369 if (NCH(n) == 4)
6370 symtable_params(st, CHILD(n, 1));
6371 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006372 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006373 body = CHILD(n, NCH(n) - 1);
6374 symtable_node(st, body);
6375}
6376
6377/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006378 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006379 which are references in the defining scope. symtable_params()
6380 parses the parameter names, which are defined in the function's
6381 body.
6382
6383 varargslist:
6384 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6385 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6386*/
6387
6388static void
6389symtable_default_args(struct symtable *st, node *n)
6390{
6391 node *c;
6392 int i;
6393
6394 if (TYPE(n) == parameters) {
6395 n = CHILD(n, 1);
6396 if (TYPE(n) == RPAR)
6397 return;
6398 }
6399 REQ(n, varargslist);
6400 for (i = 0; i < NCH(n); i += 2) {
6401 c = CHILD(n, i);
6402 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6403 break;
6404 }
6405 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6406 symtable_node(st, CHILD(n, i));
6407 }
6408}
6409
6410static void
6411symtable_params(struct symtable *st, node *n)
6412{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006413 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006414 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006415
6416 if (TYPE(n) == parameters) {
6417 n = CHILD(n, 1);
6418 if (TYPE(n) == RPAR)
6419 return;
6420 }
6421 REQ(n, varargslist);
6422 for (i = 0; i < NCH(n); i += 2) {
6423 c = CHILD(n, i);
6424 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6425 ext = 1;
6426 break;
6427 }
6428 if (TYPE(c) == test) {
6429 continue;
6430 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006431 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006432 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006433 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006434 char nbuf[30];
6435 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006436 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006437 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006438 }
6439 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006440 if (ext) {
6441 c = CHILD(n, i);
6442 if (TYPE(c) == STAR) {
6443 i++;
6444 symtable_add_def(st, STR(CHILD(n, i)),
6445 DEF_PARAM | DEF_STAR);
6446 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006447 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006448 c = NULL;
6449 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006450 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006451 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006452 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006453 i++;
6454 symtable_add_def(st, STR(CHILD(n, i)),
6455 DEF_PARAM | DEF_DOUBLESTAR);
6456 }
6457 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006458 if (complex >= 0) {
6459 int j;
6460 for (j = 0; j <= complex; j++) {
6461 c = CHILD(n, j);
6462 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006463 c = CHILD(n, ++j);
6464 else if (TYPE(c) == EQUAL)
6465 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006466 if (TYPE(CHILD(c, 0)) == LPAR)
6467 symtable_params_fplist(st, CHILD(c, 1));
6468 }
6469 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006470}
6471
6472static void
6473symtable_params_fplist(struct symtable *st, node *n)
6474{
6475 int i;
6476 node *c;
6477
6478 REQ(n, fplist);
6479 for (i = 0; i < NCH(n); i += 2) {
6480 c = CHILD(n, i);
6481 REQ(c, fpdef);
6482 if (NCH(c) == 1)
6483 symtable_add_def(st, STR(CHILD(c, 0)),
6484 DEF_PARAM | DEF_INTUPLE);
6485 else
6486 symtable_params_fplist(st, CHILD(c, 1));
6487 }
6488
6489}
6490
6491static void
6492symtable_global(struct symtable *st, node *n)
6493{
6494 int i;
6495
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006496 /* XXX It might be helpful to warn about module-level global
6497 statements, but it's hard to tell the difference between
6498 module-level and a string passed to exec.
6499 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006500
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006501 for (i = 1; i < NCH(n); i += 2) {
6502 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006503 int flags;
6504
6505 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006506 if (flags < 0)
6507 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006508 if (flags && flags != DEF_GLOBAL) {
6509 char buf[500];
6510 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006511 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006512 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006513 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006514 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006515 }
6516 else {
6517 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006518 PyOS_snprintf(buf, sizeof(buf),
6519 GLOBAL_AFTER_ASSIGN,
6520 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006521 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006522 PyOS_snprintf(buf, sizeof(buf),
6523 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006524 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006525 }
6526 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006527 symtable_add_def(st, name, DEF_GLOBAL);
6528 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006529}
6530
6531static void
6532symtable_list_comprehension(struct symtable *st, node *n)
6533{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006534 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006535 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006536
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006537 REQ(n, listmaker);
6538 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6539 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006540 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006541 symtable_list_for(st, CHILD(n, 1));
6542 symtable_node(st, CHILD(n, 0));
6543 --st->st_cur->ste_tmpname;
6544}
6545
6546static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006547symtable_generator_expression(struct symtable *st, node *n)
6548{
6549 /* testlist_gexp: test gen_for */
6550 REQ(CHILD(n, 0), test);
6551 REQ(CHILD(n, 1), gen_for);
6552
6553 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6554 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6555
6556 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6557
6558 symtable_gen_for(st, CHILD(n, 1), 1);
6559 symtable_node(st, CHILD(n, 0));
6560 symtable_exit_scope(st);
6561
6562 /* for outmost iterable precomputation */
6563 symtable_node(st, CHILD(CHILD(n, 1), 3));
6564}
6565
6566static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006567symtable_list_for(struct symtable *st, node *n)
6568{
6569 REQ(n, list_for);
6570 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006571 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006572 symtable_node(st, CHILD(n, 3));
6573 if (NCH(n) == 5)
6574 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006575}
6576
6577static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006578symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6579{
6580 REQ(n, gen_for);
6581
6582 /* gen_for: for v in test [gen_iter] */
6583 symtable_assign(st, CHILD(n, 1), 0);
6584 if (is_outmost)
6585 symtable_add_use(st, "[outmost-iterable]");
6586 else
6587 symtable_node(st, CHILD(n, 3));
6588
6589 if (NCH(n) == 5)
6590 symtable_gen_iter(st, CHILD(n, 4));
6591}
6592
6593static void
6594symtable_gen_iter(struct symtable *st, node *n)
6595{
6596 REQ(n, gen_iter);
6597
6598 n = CHILD(n, 0);
6599 if (TYPE(n) == gen_for)
6600 symtable_gen_for(st, n, 0);
6601 else {
6602 REQ(n, gen_if);
6603 symtable_node(st, CHILD(n, 1));
6604
6605 if (NCH(n) == 3)
6606 symtable_gen_iter(st, CHILD(n, 2));
6607 }
6608}
6609
6610static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006611symtable_import(struct symtable *st, node *n)
6612{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006613 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006614 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006615 /* import_stmt: import_name | import_from */
6616 n = CHILD(n, 0);
6617 if (TYPE(n) == import_from) {
6618 /* import_from: 'from' dotted_name 'import' ('*' |
6619 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006620 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006621 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006622 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6623 /* check for bogus imports */
6624 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6625 PyErr_SetString(PyExc_SyntaxError,
6626 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006627 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006628 return;
6629 }
6630 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006631 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6632 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006633 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006634 if (symtable_warn(st,
6635 "import * only allowed at module level") < 0)
6636 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006637 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006638 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006639 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006640 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006641 REQ(nn, import_as_names);
6642 for (i = 0; i < NCH(nn); i += 2) {
6643 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006644 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006645 symtable_assign(st, CHILD(c, 2),
6646 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006647 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006648 symtable_assign(st, CHILD(c, 0),
6649 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006650 }
6651 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006652 } else {
6653 /* 'import' dotted_as_names */
6654 nn = CHILD(n, 1);
6655 REQ(nn, dotted_as_names);
6656 for (i = 0; i < NCH(nn); i += 2)
6657 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006658 }
6659}
6660
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006661/* The third argument to symatble_assign() is a flag to be passed to
6662 symtable_add_def() if it is eventually called. The flag is useful
6663 to specify the particular type of assignment that should be
6664 recorded, e.g. an assignment caused by import.
6665 */
6666
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006667static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006668symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006669{
6670 node *tmp;
6671 int i;
6672
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006673 loop:
6674 switch (TYPE(n)) {
6675 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006676 /* invalid assignment, e.g. lambda x:x=2. The next
6677 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006678 return;
6679 case power:
6680 if (NCH(n) > 2) {
6681 for (i = 2; i < NCH(n); ++i)
6682 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6683 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006684 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006685 if (NCH(n) > 1) {
6686 symtable_node(st, CHILD(n, 0));
6687 symtable_node(st, CHILD(n, 1));
6688 } else {
6689 n = CHILD(n, 0);
6690 goto loop;
6691 }
6692 return;
6693 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006694 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6695 /* XXX This is an error, but the next pass
6696 will catch it. */
6697 return;
6698 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006699 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006700 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006701 }
6702 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006703 case testlist_gexp:
6704 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6705 /* XXX This is an error, but the next pass
6706 will catch it. */
6707 return;
6708 } else {
6709 for (i = 0; i < NCH(n); i += 2)
6710 symtable_assign(st, CHILD(n, i), def_flag);
6711 }
6712 return;
6713
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006714 case exprlist:
6715 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006716 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006717 if (NCH(n) == 1) {
6718 n = CHILD(n, 0);
6719 goto loop;
6720 }
6721 else {
6722 int i;
6723 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006724 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006725 return;
6726 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006727 case atom:
6728 tmp = CHILD(n, 0);
6729 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6730 n = CHILD(n, 1);
6731 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006732 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006733 if (strcmp(STR(tmp), "__debug__") == 0) {
6734 PyErr_SetString(PyExc_SyntaxError,
6735 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006736 symtable_error(st, n->n_lineno);
6737 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006738 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006739 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006740 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006741 return;
6742 case dotted_as_name:
6743 if (NCH(n) == 3)
6744 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006745 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006746 else
6747 symtable_add_def(st,
6748 STR(CHILD(CHILD(n,
6749 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006750 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006751 return;
6752 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006753 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006754 return;
6755 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006756 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006757 return;
6758 default:
6759 if (NCH(n) == 0)
6760 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006761 if (NCH(n) == 1) {
6762 n = CHILD(n, 0);
6763 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006764 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006765 /* Should only occur for errors like x + 1 = 1,
6766 which will be caught in the next pass. */
6767 for (i = 0; i < NCH(n); ++i)
6768 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006769 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006770 }
6771}