blob: b458f7319a60aca7064b2cc480d92fe66dfee6d9 [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{
548 PyObject *newconst, *v;
549 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:
560 newconst = PyNumber_Negative(v);
561 break;
562 case UNARY_CONVERT:
563 newconst = PyObject_Repr(v);
564 break;
565 case UNARY_INVERT:
566 newconst = PyNumber_Invert(v);
567 break;
568 default:
569 /* Called with an unknown opcode */
570 assert(0);
571 return 0;
572 }
573 if (newconst == NULL) {
574 PyErr_Clear();
575 return 0;
576 }
577
578 /* Append folded constant into consts table */
579 len_consts = PyList_GET_SIZE(consts);
580 if (PyList_Append(consts, newconst)) {
581 Py_DECREF(newconst);
582 return 0;
583 }
584 Py_DECREF(newconst);
585
586 /* Write NOP LOAD_CONST newconst */
587 codestr[0] = NOP;
588 codestr[1] = LOAD_CONST;
589 SETARG(codestr, 1, len_consts);
590 return 1;
591}
592
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000593static unsigned int *
594markblocks(unsigned char *code, int len)
595{
596 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000597 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000598
599 if (blocks == NULL)
600 return NULL;
601 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000602
603 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000604 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
605 opcode = code[i];
606 switch (opcode) {
607 case FOR_ITER:
608 case JUMP_FORWARD:
609 case JUMP_IF_FALSE:
610 case JUMP_IF_TRUE:
611 case JUMP_ABSOLUTE:
612 case CONTINUE_LOOP:
613 case SETUP_LOOP:
614 case SETUP_EXCEPT:
615 case SETUP_FINALLY:
616 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000617 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000618 break;
619 }
620 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000621 /* Build block numbers in the second pass */
622 for (i=0 ; i<len ; i++) {
623 blockcnt += blocks[i]; /* increment blockcnt over labels */
624 blocks[i] = blockcnt;
625 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000626 return blocks;
627}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000628
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000629/* Perform basic peephole optimizations to components of a code object.
630 The consts object should still be in list form to allow new constants
631 to be appended.
632
633 To keep the optimizer simple, it bails out (does nothing) for code
634 containing extended arguments or that has a length over 32,700. That
635 allows us to avoid overflow and sign issues. Likewise, it bails when
636 the lineno table has complex encoding for gaps >= 255.
637
638 Optimizations are restricted to simple transformations occuring within a
639 single basic block. All transformations keep the code size the same or
640 smaller. For those that reduce size, the gaps are initially filled with
641 NOPs. Later those NOPs are removed and the jump addresses retargeted in
642 a single pass. Line numbering is adjusted accordingly. */
643
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000644static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000645optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000646{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000647 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000649 unsigned char *codestr = NULL;
650 unsigned char *lineno;
651 int *addrmap = NULL;
652 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000653 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000654 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000655 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000656
Raymond Hettingereffb3932004-10-30 08:55:08 +0000657 /* Bail out if an exception is set */
658 if (PyErr_Occurred())
659 goto exitUnchanged;
660
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000661 /* Bypass optimization when the lineno table is too complex */
662 assert(PyString_Check(lineno_obj));
663 lineno = PyString_AS_STRING(lineno_obj);
664 tabsiz = PyString_GET_SIZE(lineno_obj);
665 if (memchr(lineno, 255, tabsiz) != NULL)
666 goto exitUnchanged;
667
Raymond Hettingera12fa142004-08-24 04:34:16 +0000668 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000669 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000670 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000671 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000672 goto exitUnchanged;
673
674 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000675 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000676 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 goto exitUnchanged;
678 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000679
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000680 /* Mapping to new jump targets after NOPs are removed */
681 addrmap = PyMem_Malloc(codelen * sizeof(int));
682 if (addrmap == NULL)
683 goto exitUnchanged;
684
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000685 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000686 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000687 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000688 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000689
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000690 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000691 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000692
693 lastlc = cumlc;
694 cumlc = 0;
695
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000696 switch (opcode) {
697
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000698 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000699 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000700 case UNARY_NOT:
701 if (codestr[i+1] != JUMP_IF_FALSE ||
702 codestr[i+4] != POP_TOP ||
703 !ISBASICBLOCK(blocks,i,5))
704 continue;
705 tgt = GETJUMPTGT(codestr, (i+1));
706 if (codestr[tgt] != POP_TOP)
707 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000708 j = GETARG(codestr, i+1) + 1;
709 codestr[i] = JUMP_IF_TRUE;
710 SETARG(codestr, i, j);
711 codestr[i+3] = POP_TOP;
712 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000713 break;
714
715 /* not a is b --> a is not b
716 not a in b --> a not in b
717 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000718 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000719 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000720 case COMPARE_OP:
721 j = GETARG(codestr, i);
722 if (j < 6 || j > 9 ||
723 codestr[i+3] != UNARY_NOT ||
724 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000725 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000726 SETARG(codestr, i, (j^1));
727 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000728 break;
729
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000730 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
731 case LOAD_NAME:
732 case LOAD_GLOBAL:
733 j = GETARG(codestr, i);
734 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
735 if (name == NULL || strcmp(name, "None") != 0)
736 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000737 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
738 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000739 codestr[i] = LOAD_CONST;
740 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000741 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000742 break;
743 }
744 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000745 break;
746
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000747 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000748 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000749 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000750 j = GETARG(codestr, i);
751 if (codestr[i+3] != JUMP_IF_FALSE ||
752 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000753 !ISBASICBLOCK(blocks,i,7) ||
754 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000755 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000756 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000757 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000758 break;
759
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000760 /* Try to fold tuples of constants (includes a case for lists
761 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000762 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000763 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
764 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000765 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000766 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000767 j = GETARG(codestr, i);
768 h = i - 3 * j;
769 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000770 j <= lastlc &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000771 (opcode == BUILD_TUPLE &&
772 ISBASICBLOCK(blocks, h, 3*(j+1)) ||
773 opcode == BUILD_LIST &&
774 codestr[i+3]==COMPARE_OP &&
775 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
776 (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000777 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000778 assert(codestr[i] == LOAD_CONST);
779 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000780 break;
781 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000782 if (codestr[i+3] != UNPACK_SEQUENCE ||
783 !ISBASICBLOCK(blocks,i,6) ||
784 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000785 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000786 if (j == 1) {
787 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000788 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000789 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000790 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000791 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000792 codestr[i] = ROT_THREE;
793 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000794 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000795 }
796 break;
797
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000798 /* Fold binary ops on constants.
799 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
800 case BINARY_POWER:
801 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000802 case BINARY_TRUE_DIVIDE:
803 case BINARY_FLOOR_DIVIDE:
804 case BINARY_MODULO:
805 case BINARY_ADD:
806 case BINARY_SUBTRACT:
807 case BINARY_SUBSCR:
808 case BINARY_LSHIFT:
809 case BINARY_RSHIFT:
810 case BINARY_AND:
811 case BINARY_XOR:
812 case BINARY_OR:
813 if (lastlc >= 2 &&
814 ISBASICBLOCK(blocks, i-6, 7) &&
815 fold_binops_on_constants(&codestr[i-6], consts)) {
816 i -= 2;
817 assert(codestr[i] == LOAD_CONST);
818 cumlc = 1;
819 }
820 break;
821
Raymond Hettinger80121492005-02-20 12:41:32 +0000822 /* Fold unary ops on constants.
823 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
824 case UNARY_NEGATIVE:
825 case UNARY_CONVERT:
826 case UNARY_INVERT:
827 if (lastlc >= 1 &&
828 ISBASICBLOCK(blocks, i-3, 4) &&
829 fold_unaryops_on_constants(&codestr[i-3], consts)) {
830 i -= 2;
831 assert(codestr[i] == LOAD_CONST);
832 cumlc = 1;
833 }
834 break;
835
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000836 /* Simplify conditional jump to conditional jump where the
837 result of the first test implies the success of a similar
838 test or the failure of the opposite test.
839 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000840 "if a and b:"
841 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000842 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000843 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000844 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000845 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
846 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000847 */
848 case JUMP_IF_FALSE:
849 case JUMP_IF_TRUE:
850 tgt = GETJUMPTGT(codestr, i);
851 j = codestr[tgt];
852 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
853 if (j == opcode) {
854 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
855 SETARG(codestr, i, tgttgt);
856 } else {
857 tgt -= i;
858 SETARG(codestr, i, tgt);
859 }
860 break;
861 }
862 /* Intentional fallthrough */
863
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000864 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000865 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000866 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000867 case JUMP_ABSOLUTE:
868 case CONTINUE_LOOP:
869 case SETUP_LOOP:
870 case SETUP_EXCEPT:
871 case SETUP_FINALLY:
872 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000873 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000874 continue;
875 tgttgt = GETJUMPTGT(codestr, tgt);
876 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
877 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000878 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000879 tgttgt -= i + 3; /* Calc relative jump addr */
880 if (tgttgt < 0) /* No backward relative jumps */
881 continue;
882 codestr[i] = opcode;
883 SETARG(codestr, i, tgttgt);
884 break;
885
886 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000887 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000888
889 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
890 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000891 if (i+4 >= codelen ||
892 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000893 !ISBASICBLOCK(blocks,i,5))
894 continue;
895 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000896 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000897 }
898 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000899
900 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000901 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
902 addrmap[i] = i - nops;
903 if (codestr[i] == NOP)
904 nops++;
905 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000906 cum_orig_line = 0;
907 last_line = 0;
908 for (i=0 ; i < tabsiz ; i+=2) {
909 cum_orig_line += lineno[i];
910 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000911 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000912 lineno[i] =((unsigned char)(new_line - last_line));
913 last_line = new_line;
914 }
915
916 /* Remove NOPs and fixup jump targets */
917 for (i=0, h=0 ; i<codelen ; ) {
918 opcode = codestr[i];
919 switch (opcode) {
920 case NOP:
921 i++;
922 continue;
923
924 case JUMP_ABSOLUTE:
925 case CONTINUE_LOOP:
926 j = addrmap[GETARG(codestr, i)];
927 SETARG(codestr, i, j);
928 break;
929
930 case FOR_ITER:
931 case JUMP_FORWARD:
932 case JUMP_IF_FALSE:
933 case JUMP_IF_TRUE:
934 case SETUP_LOOP:
935 case SETUP_EXCEPT:
936 case SETUP_FINALLY:
937 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
938 SETARG(codestr, i, j);
939 break;
940 }
941 adj = CODESIZE(opcode);
942 while (adj--)
943 codestr[h++] = codestr[i++];
944 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000945 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000946
947 code = PyString_FromStringAndSize((char *)codestr, h);
948 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000949 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000950 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000951 return code;
952
953exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000954 if (blocks != NULL)
955 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000956 if (addrmap != NULL)
957 PyMem_Free(addrmap);
958 if (codestr != NULL)
959 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000960 Py_INCREF(code);
961 return code;
962}
963
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000964/* End: Peephole optimizations ----------------------------------------- */
965
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000967PyCode_New(int argcount, int nlocals, int stacksize, int flags,
968 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000969 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
970 PyObject *filename, PyObject *name, int firstlineno,
971 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000972{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000974 int i;
975 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000976 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000977 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 consts == NULL || !PyTuple_Check(consts) ||
979 names == NULL || !PyTuple_Check(names) ||
980 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000981 freevars == NULL || !PyTuple_Check(freevars) ||
982 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 name == NULL || !PyString_Check(name) ||
984 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000985 lnotab == NULL || !PyString_Check(lnotab) ||
986 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000987 PyErr_BadInternalCall();
988 return NULL;
989 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000990 intern_strings(names);
991 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000993 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000994 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 for (i = PyTuple_Size(consts); --i >= 0; ) {
996 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000998 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000999 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001000 continue;
1001 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001004 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001005 co->co_argcount = argcount;
1006 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001007 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001008 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +00001009 Py_INCREF(code);
1010 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001012 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001016 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001017 Py_INCREF(freevars);
1018 co->co_freevars = freevars;
1019 Py_INCREF(cellvars);
1020 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001022 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001024 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001025 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001027 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001028 if (PyTuple_GET_SIZE(freevars) == 0 &&
1029 PyTuple_GET_SIZE(cellvars) == 0)
1030 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001031 }
1032 return co;
1033}
1034
1035
1036/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001037
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001038/* The compiler uses two passes to generate bytecodes. The first pass
1039 builds the symbol table. The second pass generates the bytecode.
1040
1041 The first pass uses a single symtable struct. The second pass uses
1042 a compiling struct for each code block. The compiling structs
1043 share a reference to the symtable.
1044
1045 The two passes communicate via symtable_load_symbols() and via
1046 is_local() and is_global(). The former initializes several slots
1047 in the compiling struct: c_varnames, c_locals, c_nlocals,
1048 c_argcount, c_globals, and c_flags.
1049*/
1050
Tim Peters2a7f3842001-06-09 09:26:21 +00001051/* All about c_lnotab.
1052
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001053c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1054version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1055mapped to source code line #s via c_lnotab instead.
1056
Tim Peters2a7f3842001-06-09 09:26:21 +00001057The array is conceptually a list of
1058 (bytecode offset increment, line number increment)
1059pairs. The details are important and delicate, best illustrated by example:
1060
1061 byte code offset source code line number
1062 0 1
1063 6 2
1064 50 7
1065 350 307
1066 361 308
1067
1068The first trick is that these numbers aren't stored, only the increments
1069from one row to the next (this doesn't really work, but it's a start):
1070
1071 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1072
1073The second trick is that an unsigned byte can't hold negative values, or
1074values larger than 255, so (a) there's a deep assumption that byte code
1075offsets and their corresponding line #s both increase monotonically, and (b)
1076if at least one column jumps by more than 255 from one row to the next, more
1077than one pair is written to the table. In case #b, there's no way to know
1078from looking at the table later how many were written. That's the delicate
1079part. A user of c_lnotab desiring to find the source line number
1080corresponding to a bytecode address A should do something like this
1081
1082 lineno = addr = 0
1083 for addr_incr, line_incr in c_lnotab:
1084 addr += addr_incr
1085 if addr > A:
1086 return lineno
1087 lineno += line_incr
1088
1089In order for this to work, when the addr field increments by more than 255,
1090the line # increment in each pair generated must be 0 until the remaining addr
1091increment is < 256. So, in the example above, com_set_lineno should not (as
1092was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1093255, 0, 45, 255, 0, 45.
1094*/
1095
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001096struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001097 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001099 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001101 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001102 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 PyObject *c_locals; /* dictionary (value=localID) */
1104 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001105 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001106 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001107 int c_nlocals; /* index of next local */
1108 int c_argcount; /* number of top-level arguments */
1109 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110 int c_nexti; /* index into c_code */
1111 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001113 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001114 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001115 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001116 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001117 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001118 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001120 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001121 int c_stacklevel; /* Current stack level */
1122 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001123 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001125 int c_last_addr; /* last op addr seen and recorded in lnotab */
1126 int c_last_line; /* last line seen and recorded in lnotab */
1127 int c_lnotab_next; /* current length of lnotab */
1128 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001129 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001130 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001131 int c_nested; /* Is block nested funcdef or lamdef? */
1132 int c_closure; /* Is nested w/freevars? */
1133 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001134 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001135 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136};
1137
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001138static int
1139is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001140{
1141 if ((v & (USE | DEF_FREE))
1142 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1143 return 1;
1144 if (v & DEF_FREE_CLASS)
1145 return 1;
1146 return 0;
1147}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001148
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001150com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001151{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001152 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1153
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001154 if (c == NULL) {
1155 /* Error occurred via symtable call to
1156 is_constant_false */
1157 PyErr_SetString(exc, msg);
1158 return;
1159 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001160 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001161 if (c->c_lineno < 1 || c->c_interactive) {
1162 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001164 return;
1165 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001166 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001167 if (v == NULL)
1168 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001169
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001170 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001171 if (line == NULL) {
1172 Py_INCREF(Py_None);
1173 line = Py_None;
1174 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001175 if (exc == PyExc_SyntaxError) {
1176 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1177 Py_None, line);
1178 if (t == NULL)
1179 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001180 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001181 if (w == NULL)
1182 goto exit;
1183 PyErr_SetObject(exc, w);
1184 } else {
1185 /* Make sure additional exceptions are printed with
1186 file and line, also. */
1187 PyErr_SetObject(exc, v);
1188 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1189 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001190 exit:
1191 Py_XDECREF(t);
1192 Py_XDECREF(v);
1193 Py_XDECREF(w);
1194 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001195}
1196
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001197/* Interface to the block stack */
1198
1199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001200block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001201{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001202 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 com_error(c, PyExc_SystemError,
1204 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001205 }
1206 else {
1207 c->c_block[c->c_nblocks++] = type;
1208 }
1209}
1210
1211static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001212block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001213{
1214 if (c->c_nblocks > 0)
1215 c->c_nblocks--;
1216 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001218 }
1219}
1220
Guido van Rossum681d79a1995-07-18 14:51:37 +00001221/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001222
Martin v. Löwis95292d62002-12-11 14:04:59 +00001223static int issue_warning(const char *, const char *, int);
1224static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001225static void com_free(struct compiling *);
1226static void com_push(struct compiling *, int);
1227static void com_pop(struct compiling *, int);
1228static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001229static void com_node(struct compiling *, node *);
1230static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001231static void com_addbyte(struct compiling *, int);
1232static void com_addint(struct compiling *, int);
1233static void com_addoparg(struct compiling *, int, int);
1234static void com_addfwref(struct compiling *, int, int *);
1235static void com_backpatch(struct compiling *, int);
1236static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1237static int com_addconst(struct compiling *, PyObject *);
1238static int com_addname(struct compiling *, PyObject *);
1239static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001240static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001241static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001242static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001243static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001244static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001245static void com_assign(struct compiling *, node *, int, node *);
1246static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001247static int com_make_closure(struct compiling *c, PyCodeObject *co);
1248
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001249static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001250static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001251 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001252static PyObject *parsestrplus(struct compiling*, node *);
1253static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001254static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001255
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001256static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001257
1258/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001259static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001260static struct symtable *symtable_build(node *, PyFutureFeatures *,
1261 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001262static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001263static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001264static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001265static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001266static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001267static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001268
1269static void symtable_node(struct symtable *, node *);
1270static void symtable_funcdef(struct symtable *, node *);
1271static void symtable_default_args(struct symtable *, node *);
1272static void symtable_params(struct symtable *, node *);
1273static void symtable_params_fplist(struct symtable *, node *n);
1274static void symtable_global(struct symtable *, node *);
1275static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001276static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001277static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001278static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001279static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001280static void symtable_gen_for(struct symtable *, node *, int);
1281static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001282
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001283static int symtable_update_free_vars(struct symtable *);
1284static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1285static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1286
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001287/* helper */
1288static void
1289do_pad(int pad)
1290{
1291 int i;
1292 for (i = 0; i < pad; ++i)
1293 fprintf(stderr, " ");
1294}
1295
1296static void
1297dump(node *n, int pad, int depth)
1298{
1299 int i;
1300 if (depth == 0)
1301 return;
1302 do_pad(pad);
1303 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1304 if (depth > 0)
1305 depth--;
1306 for (i = 0; i < NCH(n); ++i)
1307 dump(CHILD(n, i), pad + 1, depth);
1308}
1309
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001311com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001313 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1315 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001316 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001318 goto fail;
1319 if ((c->c_const_dict = PyDict_New()) == NULL)
1320 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001322 goto fail;
1323 if ((c->c_name_dict = PyDict_New()) == NULL)
1324 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001326 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1328 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001329 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001330 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001331 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001332 c->c_freevars = NULL;
1333 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001334 c->c_nlocals = 0;
1335 c->c_argcount = 0;
1336 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001337 c->c_nexti = 0;
1338 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001339 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001340 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001342 c->c_begin = 0;
1343 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001344 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001345 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001346 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001347 c->c_stacklevel = 0;
1348 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001349 c->c_firstlineno = 0;
1350 c->c_last_addr = 0;
1351 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001352 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001353 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001354 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001355 c->c_nested = 0;
1356 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001357 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 return 1;
1359
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001360 fail:
1361 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362 return 0;
1363}
1364
1365static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001366com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001367{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 Py_XDECREF(c->c_code);
1369 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001370 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001371 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001372 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 Py_XDECREF(c->c_globals);
1374 Py_XDECREF(c->c_locals);
1375 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001376 Py_XDECREF(c->c_freevars);
1377 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001379 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001380 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001381}
1382
1383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001384com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001385{
1386 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001387 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001388 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001389 /*
1390 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1391 c->c_filename, c->c_name, c->c_lineno,
1392 c->c_nexti, c->c_stacklevel, n);
1393 */
1394 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395}
1396
1397static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001398com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001399{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001400 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001401 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001402 else
1403 c->c_stacklevel -= n;
1404}
1405
1406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001407com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408{
1409 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001411 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413}
1414
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001415static int
1416com_check_size(PyObject **s, int offset)
1417{
1418 int len = PyString_GET_SIZE(*s);
1419 if (offset >= len)
1420 return _PyString_Resize(s, len * 2);
1421 return 0;
1422}
1423
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001424static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001425com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001427 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001428 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001429 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001430 if (com_check_size(&c->c_code, c->c_nexti)) {
1431 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001433 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001434 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001435}
1436
1437static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001438com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001439{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001440 com_addbyte(c, x & 0xff);
1441 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442}
1443
1444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001445com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001446{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001447 char *p;
1448 if (c->c_lnotab == NULL)
1449 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001450 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1451 c->c_errors++;
1452 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001453 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001454 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001455 *p++ = addr;
1456 *p++ = line;
1457 c->c_lnotab_next += 2;
1458}
1459
1460static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001462{
1463 c->c_lineno = lineno;
1464 if (c->c_firstlineno == 0) {
1465 c->c_firstlineno = c->c_last_line = lineno;
1466 }
1467 else {
1468 int incr_addr = c->c_nexti - c->c_last_addr;
1469 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001470 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001471 while (incr_addr > 255) {
1472 com_add_lnotab(c, 255, 0);
1473 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001474 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001475 while (incr_line > 255) {
1476 com_add_lnotab(c, incr_addr, 255);
1477 incr_line -=255;
1478 incr_addr = 0;
1479 }
1480 if (incr_addr > 0 || incr_line > 0)
1481 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001482 c->c_last_addr = c->c_nexti;
1483 c->c_last_line = lineno;
1484 }
1485}
1486
1487static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001488com_strip_lnotab(struct compiling *c)
1489{
1490 /* strip the last lnotab entry if no opcode were emitted.
1491 * This prevents a line number to be generated on a final
1492 * pass, like in the following example:
1493 *
1494 * if a:
1495 * print 5
1496 * else:
1497 * pass
1498 *
1499 * Without the fix, a line trace event would be generated
1500 * on the pass even if a is true (because of the implicit
1501 * return).
1502 */
1503 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1504 c->c_lnotab_next = c->c_lnotab_last;
1505 }
1506}
1507
1508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001509com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510{
Fred Drakeef8ace32000-08-24 00:32:09 +00001511 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001512 if (extended_arg){
1513 com_addbyte(c, EXTENDED_ARG);
1514 com_addint(c, extended_arg);
1515 arg &= 0xffff;
1516 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001517 com_addbyte(c, op);
1518 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001519}
1520
1521static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001522com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523{
1524 /* Compile a forward reference for backpatching */
1525 int here;
1526 int anchor;
1527 com_addbyte(c, op);
1528 here = c->c_nexti;
1529 anchor = *p_anchor;
1530 *p_anchor = here;
1531 com_addint(c, anchor == 0 ? 0 : here - anchor);
1532}
1533
1534static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001535com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001537 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539 int dist;
1540 int prev;
1541 for (;;) {
1542 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001543 prev = code[anchor] + (code[anchor+1] << 8);
1544 dist = target - (anchor+2);
1545 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001546 dist >>= 8;
1547 code[anchor+1] = dist;
1548 dist >>= 8;
1549 if (dist) {
1550 com_error(c, PyExc_SystemError,
1551 "com_backpatch: offset too large");
1552 break;
1553 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554 if (!prev)
1555 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001556 anchor -= prev;
1557 }
1558}
1559
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001560/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001561
1562static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001563com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001565 PyObject *w, *t, *np=NULL;
1566 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001567
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001568 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001569 if (t == NULL)
1570 goto fail;
1571 w = PyDict_GetItem(dict, t);
1572 if (w != NULL) {
1573 n = PyInt_AsLong(w);
1574 } else {
1575 n = PyList_Size(list);
1576 np = PyInt_FromLong(n);
1577 if (np == NULL)
1578 goto fail;
1579 if (PyList_Append(list, v) != 0)
1580 goto fail;
1581 if (PyDict_SetItem(dict, t, np) != 0)
1582 goto fail;
1583 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001584 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001585 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001586 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001587 fail:
1588 Py_XDECREF(np);
1589 Py_XDECREF(t);
1590 c->c_errors++;
1591 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592}
1593
1594static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001597 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598}
1599
1600static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001601com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001603 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001604}
1605
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001606int
1607_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001608{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001609 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001610 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001611 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001612 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1613 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001614 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001615 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001616 return 0; /* Don't mangle __extremely_long_names */
1617 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1618 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001619 /* Strip leading underscores from class name */
1620 while (*p == '_')
1621 p++;
1622 if (*p == '\0')
1623 return 0; /* Don't mangle if class is just underscores */
1624 plen = strlen(p);
1625 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001626 plen = maxlen-nlen-2; /* Truncate class name if too long */
1627 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001628 buffer[0] = '_';
1629 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001630 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001631 return 1;
1632}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001633
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001635com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001636{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001637 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001639 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001640
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001641 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001642 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001643 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644 c->c_errors++;
1645 i = 255;
1646 }
1647 else {
1648 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001649 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001650 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001651 com_addoparg(c, op, i);
1652}
1653
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001654#define NAME_LOCAL 0
1655#define NAME_GLOBAL 1
1656#define NAME_DEFAULT 2
1657#define NAME_CLOSURE 3
1658
1659static int
1660com_lookup_arg(PyObject *dict, PyObject *name)
1661{
1662 PyObject *v = PyDict_GetItem(dict, name);
1663 if (v == NULL)
1664 return -1;
1665 else
1666 return PyInt_AS_LONG(v);
1667}
1668
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001669static int
1670none_assignment_check(struct compiling *c, char *name, int assigning)
1671{
1672 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1673 char *msg;
1674 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001675 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001676 else
1677 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001678 com_error(c, PyExc_SyntaxError, msg);
1679 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001680 }
1681 return 0;
1682}
1683
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001684static void
1685com_addop_varname(struct compiling *c, int kind, char *name)
1686{
1687 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001688 int i, reftype;
1689 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001690 int op = STOP_CODE;
1691 char buffer[MANGLE_LEN];
1692
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001693 if (kind != VAR_LOAD &&
1694 none_assignment_check(c, name, kind == VAR_STORE))
1695 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001696 i = 255;
1697 goto done;
1698 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001699 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001700 name = buffer;
1701 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1702 c->c_errors++;
1703 i = 255;
1704 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001705 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001706
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001707 reftype = get_ref_type(c, name);
1708 switch (reftype) {
1709 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001710 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001711 scope = NAME_LOCAL;
1712 break;
1713 case GLOBAL_EXPLICIT:
1714 scope = NAME_GLOBAL;
1715 break;
1716 case GLOBAL_IMPLICIT:
1717 if (c->c_flags & CO_OPTIMIZED)
1718 scope = NAME_GLOBAL;
1719 break;
1720 case FREE:
1721 case CELL:
1722 scope = NAME_CLOSURE;
1723 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001724 }
1725
1726 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001727 if (scope == NAME_LOCAL)
1728 i = com_lookup_arg(c->c_locals, v);
1729 else if (reftype == FREE)
1730 i = com_lookup_arg(c->c_freevars, v);
1731 else if (reftype == CELL)
1732 i = com_lookup_arg(c->c_cellvars, v);
1733 if (i == -1) {
1734 c->c_errors++; /* XXX no exception set */
1735 i = 255;
1736 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001737 }
1738 Py_DECREF(v);
1739
1740 switch (kind) {
1741 case VAR_LOAD:
1742 switch (scope) {
1743 case NAME_LOCAL:
1744 op = LOAD_FAST;
1745 break;
1746 case NAME_GLOBAL:
1747 op = LOAD_GLOBAL;
1748 break;
1749 case NAME_DEFAULT:
1750 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001751 break;
1752 case NAME_CLOSURE:
1753 op = LOAD_DEREF;
1754 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001755 }
1756 break;
1757 case VAR_STORE:
1758 switch (scope) {
1759 case NAME_LOCAL:
1760 op = STORE_FAST;
1761 break;
1762 case NAME_GLOBAL:
1763 op = STORE_GLOBAL;
1764 break;
1765 case NAME_DEFAULT:
1766 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001767 break;
1768 case NAME_CLOSURE:
1769 op = STORE_DEREF;
1770 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001771 }
1772 break;
1773 case VAR_DELETE:
1774 switch (scope) {
1775 case NAME_LOCAL:
1776 op = DELETE_FAST;
1777 break;
1778 case NAME_GLOBAL:
1779 op = DELETE_GLOBAL;
1780 break;
1781 case NAME_DEFAULT:
1782 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001783 break;
1784 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001785 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001786 PyOS_snprintf(buf, sizeof(buf),
1787 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001788 com_error(c, PyExc_SyntaxError, buf);
1789 i = 255;
1790 break;
1791 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001792 }
1793 break;
1794 }
1795done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796 com_addoparg(c, op, i);
1797}
1798
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001800com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001801{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001802 char *name;
1803 char buffer[1000];
1804 /* XXX it is possible to write this code without the 1000
1805 chars on the total length of dotted names, I just can't be
1806 bothered right now */
1807 if (TYPE(n) == STAR)
1808 name = "*";
1809 else if (TYPE(n) == dotted_name) {
1810 char *p = buffer;
1811 int i;
1812 name = buffer;
1813 for (i = 0; i < NCH(n); i += 2) {
1814 char *s = STR(CHILD(n, i));
1815 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001817 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001818 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001819 break;
1820 }
1821 if (p != buffer)
1822 *p++ = '.';
1823 strcpy(p, s);
1824 p = strchr(p, '\0');
1825 }
1826 }
1827 else {
1828 REQ(n, NAME);
1829 name = STR(n);
1830 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001831 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001832}
1833
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001835parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001836{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001837 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001838 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001839 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001840#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001841 int imflag;
1842#endif
1843
Guido van Rossum282914b1991-04-04 10:42:56 +00001844 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001845 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001846#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001847 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001848#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001849 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001851 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001853 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001854 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001855 }
1856 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001857 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001859 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001860 if (errno != 0)
1861 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001863 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001864 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001865#ifndef WITHOUT_COMPLEX
1866 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001867 Py_complex z;
1868 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001869 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001870 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001871 PyFPE_END_PROTECT(z)
1872 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001873 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001874 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001875#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001876 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001877 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001878 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001879 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001881 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001882}
1883
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001885decode_utf8(char **sPtr, char *end, char* encoding)
1886{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001887#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001888 Py_FatalError("decode_utf8 should not be called in this build.");
1889 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001890#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001891 PyObject *u, *v;
1892 char *s, *t;
1893 t = s = *sPtr;
1894 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1895 while (s < end && (*s & 0x80)) s++;
1896 *sPtr = s;
1897 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1898 if (u == NULL)
1899 return NULL;
1900 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1901 Py_DECREF(u);
1902 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001903#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001904}
1905
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001906/* compiler.transformer.Transformer.decode_literal depends on what
1907 might seem like minor details of this function -- changes here
1908 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001909static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001910parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001911{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001912 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001913 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001914 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001915 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001916 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001917 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001918 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001919
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001920 if (isalpha(quote) || quote == '_') {
1921 if (quote == 'u' || quote == 'U') {
1922 quote = *++s;
1923 unicode = 1;
1924 }
1925 if (quote == 'r' || quote == 'R') {
1926 quote = *++s;
1927 rawmode = 1;
1928 }
1929 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001930 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001932 return NULL;
1933 }
1934 s++;
1935 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001936 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001937 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001938 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001939 return NULL;
1940 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001941 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001943 return NULL;
1944 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001945 if (len >= 4 && s[0] == quote && s[1] == quote) {
1946 s += 2;
1947 len -= 2;
1948 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001950 return NULL;
1951 }
1952 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001953#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001954 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001955 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001956 char *buf;
1957 char *p;
1958 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001959 if (encoding == NULL) {
1960 buf = s;
1961 u = NULL;
1962 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1963 buf = s;
1964 u = NULL;
1965 } else {
1966 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1967 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1968 if (u == NULL)
1969 return NULL;
1970 p = buf = PyString_AsString(u);
1971 end = s + len;
1972 while (s < end) {
1973 if (*s == '\\') {
1974 *p++ = *s++;
1975 if (*s & 0x80) {
1976 strcpy(p, "u005c");
1977 p += 5;
1978 }
1979 }
1980 if (*s & 0x80) { /* XXX inefficient */
1981 char *r;
1982 int rn, i;
1983 w = decode_utf8(&s, end, "utf-16-be");
1984 if (w == NULL) {
1985 Py_DECREF(u);
1986 return NULL;
1987 }
1988 r = PyString_AsString(w);
1989 rn = PyString_Size(w);
1990 assert(rn % 2 == 0);
1991 for (i = 0; i < rn; i += 2) {
1992 sprintf(p, "\\u%02x%02x",
1993 r[i + 0] & 0xFF,
1994 r[i + 1] & 0xFF);
1995 p += 6;
1996 }
1997 Py_DECREF(w);
1998 } else {
1999 *p++ = *s++;
2000 }
2001 }
2002 len = p - buf;
2003 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002004 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002005 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002006 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002007 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
2008 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002009 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002010 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002011 return v;
2012
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002013 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002014#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002015 need_encoding = (encoding != NULL &&
2016 strcmp(encoding, "utf-8") != 0 &&
2017 strcmp(encoding, "iso-8859-1") != 0);
2018 if (rawmode || strchr(s, '\\') == NULL) {
2019 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002020#ifndef Py_USING_UNICODE
2021 /* This should not happen - we never see any other
2022 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002023 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002024#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002025 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2026 if (u == NULL)
2027 return NULL;
2028 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2029 Py_DECREF(u);
2030 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002031#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002032 } else {
2033 return PyString_FromStringAndSize(s, len);
2034 }
2035 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002036
2037 v = PyString_DecodeEscape(s, len, NULL, unicode,
2038 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002039 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002040 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002041 return v;
2042}
2043
Guido van Rossum79f25d91997-04-29 20:08:16 +00002044static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002045parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002046{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002047 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002048 int i;
2049 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002050 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002051 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002052 for (i = 1; i < NCH(n); i++) {
2053 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002054 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002055 if (s == NULL)
2056 goto onError;
2057 if (PyString_Check(v) && PyString_Check(s)) {
2058 PyString_ConcatAndDel(&v, s);
2059 if (v == NULL)
2060 goto onError;
2061 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002062#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002063 else {
2064 PyObject *temp;
2065 temp = PyUnicode_Concat(v, s);
2066 Py_DECREF(s);
2067 if (temp == NULL)
2068 goto onError;
2069 Py_DECREF(v);
2070 v = temp;
2071 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002072#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002073 }
2074 }
2075 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002076
2077 onError:
2078 Py_XDECREF(v);
2079 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002080}
2081
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002083com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002085 int anchor = 0;
2086 int save_begin = c->c_begin;
2087
Raymond Hettinger354433a2004-05-19 08:20:33 +00002088 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002089 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002090 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002091 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002092 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002093 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002094 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002095 c->c_loops++;
2096 com_list_iter(c, n, e, t);
2097 c->c_loops--;
2098 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2099 c->c_begin = save_begin;
2100 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002101 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002102}
2103
2104static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002105com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2106{
2107 int break_anchor = 0;
2108 int anchor = 0;
2109 int save_begin = c->c_begin;
2110
2111 REQ(n, gen_for);
2112 /* gen_for: for v in test [gen_iter] */
2113
2114 com_addfwref(c, SETUP_LOOP, &break_anchor);
2115 block_push(c, SETUP_LOOP);
2116
2117 if (is_outmost) {
2118 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2119 com_push(c, 1);
2120 }
2121 else {
2122 com_node(c, CHILD(n, 3));
2123 com_addbyte(c, GET_ITER);
2124 }
2125
2126 c->c_begin = c->c_nexti;
2127 com_set_lineno(c, c->c_last_line);
2128 com_addfwref(c, FOR_ITER, &anchor);
2129 com_push(c, 1);
2130 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2131
2132 if (NCH(n) == 5)
2133 com_gen_iter(c, CHILD(n, 4), t);
2134 else {
2135 com_test(c, t);
2136 com_addbyte(c, YIELD_VALUE);
2137 com_pop(c, 1);
2138 }
2139
2140 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2141 c->c_begin = save_begin;
2142
2143 com_backpatch(c, anchor);
2144 com_pop(c, 1); /* FOR_ITER has popped this */
2145 com_addbyte(c, POP_BLOCK);
2146 block_pop(c, SETUP_LOOP);
2147 com_backpatch(c, break_anchor);
2148}
2149
2150static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002151com_list_if(struct compiling *c, node *n, node *e, char *t)
2152{
2153 int anchor = 0;
2154 int a = 0;
2155 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002156 com_node(c, CHILD(n, 1));
2157 com_addfwref(c, JUMP_IF_FALSE, &a);
2158 com_addbyte(c, POP_TOP);
2159 com_pop(c, 1);
2160 com_list_iter(c, n, e, t);
2161 com_addfwref(c, JUMP_FORWARD, &anchor);
2162 com_backpatch(c, a);
2163 /* We jump here with an extra entry which we now pop */
2164 com_addbyte(c, POP_TOP);
2165 com_backpatch(c, anchor);
2166}
2167
2168static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002169com_gen_if(struct compiling *c, node *n, node *t)
2170{
2171 /* gen_if: 'if' test [gen_iter] */
2172 int anchor = 0;
2173 int a=0;
2174
2175 com_node(c, CHILD(n, 1));
2176 com_addfwref(c, JUMP_IF_FALSE, &a);
2177 com_addbyte(c, POP_TOP);
2178 com_pop(c, 1);
2179
2180 if (NCH(n) == 3)
2181 com_gen_iter(c, CHILD(n, 2), t);
2182 else {
2183 com_test(c, t);
2184 com_addbyte(c, YIELD_VALUE);
2185 com_pop(c, 1);
2186 }
2187 com_addfwref(c, JUMP_FORWARD, &anchor);
2188 com_backpatch(c, a);
2189 /* We jump here with an extra entry which we now pop */
2190 com_addbyte(c, POP_TOP);
2191 com_backpatch(c, anchor);
2192}
2193
2194static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002195com_list_iter(struct compiling *c,
2196 node *p, /* parent of list_iter node */
2197 node *e, /* element expression node */
2198 char *t /* name of result list temp local */)
2199{
2200 /* list_iter is the last child in a listmaker, list_for, or list_if */
2201 node *n = CHILD(p, NCH(p)-1);
2202 if (TYPE(n) == list_iter) {
2203 n = CHILD(n, 0);
2204 switch (TYPE(n)) {
2205 case list_for:
2206 com_list_for(c, n, e, t);
2207 break;
2208 case list_if:
2209 com_list_if(c, n, e, t);
2210 break;
2211 default:
2212 com_error(c, PyExc_SystemError,
2213 "invalid list_iter node type");
2214 }
2215 }
2216 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002217 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002218 com_push(c, 1);
2219 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002220 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002221 com_pop(c, 2);
2222 }
2223}
2224
2225static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002226com_gen_iter(struct compiling *c, node *n, node *t)
2227{
2228 /* gen_iter: gen_for | gen_if */
2229 node *ch;
2230 REQ(n, gen_iter);
2231
2232 ch = CHILD(n, 0);
2233
2234 switch (TYPE(ch)) {
2235 case gen_for:
2236 com_gen_for(c, ch, t, 0);
2237 break;
2238 case gen_if:
2239 com_gen_if(c, ch, t);
2240 break;
2241 default:
2242 com_error(c, PyExc_SystemError,
2243 "invalid gen_iter node type");
2244 }
2245}
2246
2247static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002248com_list_comprehension(struct compiling *c, node *n)
2249{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002250 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002251 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002252
2253 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002254 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002255 com_addoparg(c, BUILD_LIST, 0);
2256 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2257 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002258 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002259 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002260 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002261 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002262 --c->c_tmpname;
2263}
2264
2265static void
2266com_listmaker(struct compiling *c, node *n)
2267{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002268 /* listmaker: test ( list_for | (',' test)* [','] ) */
2269 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002270 com_list_comprehension(c, n);
2271 else {
2272 int len = 0;
2273 int i;
2274 for (i = 0; i < NCH(n); i += 2, len++)
2275 com_node(c, CHILD(n, i));
2276 com_addoparg(c, BUILD_LIST, len);
2277 com_pop(c, len-1);
2278 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279}
2280
2281static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002282com_generator_expression(struct compiling *c, node *n)
2283{
2284 /* testlist_gexp: test gen_for */
2285 /* argument: test gen_for */
2286 PyCodeObject *co;
2287
2288 REQ(CHILD(n, 0), test);
2289 REQ(CHILD(n, 1), gen_for);
2290
2291 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2292 n->n_lineno);
2293 co = icompile(n, c);
2294 symtable_exit_scope(c->c_symtable);
2295
2296 if (co == NULL)
2297 c->c_errors++;
2298 else {
2299 int closure = com_make_closure(c, co);
2300 int i = com_addconst(c, (PyObject *)co);
2301
2302 com_addoparg(c, LOAD_CONST, i);
2303 com_push(c, 1);
2304 if (closure)
2305 com_addoparg(c, MAKE_CLOSURE, 0);
2306 else
2307 com_addoparg(c, MAKE_FUNCTION, 0);
2308
2309 com_test(c, CHILD(CHILD(n, 1), 3));
2310 com_addbyte(c, GET_ITER);
2311 com_addoparg(c, CALL_FUNCTION, 1);
2312 com_pop(c, 1);
2313
2314 Py_DECREF(co);
2315 }
2316}
2317
2318static void
2319com_testlist_gexp(struct compiling *c, node *n)
2320{
2321 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2322 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2323 com_generator_expression(c, n);
2324 else com_list(c, n, 0);
2325}
2326
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002327
Raymond Hettinger354433a2004-05-19 08:20:33 +00002328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002329com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002330{
2331 int i;
2332 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2333 for (i = 0; i+2 < NCH(n); i += 4) {
2334 /* We must arrange things just right for STORE_SUBSCR.
2335 It wants the stack to look like (value) (dict) (key) */
2336 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002337 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002338 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002339 com_node(c, CHILD(n, i+2)); /* value */
2340 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002341 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002343 }
2344}
2345
2346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002347com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348{
2349 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002351 int i;
2352 REQ(n, atom);
2353 ch = CHILD(n, 0);
2354 switch (TYPE(ch)) {
2355 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002358 com_push(c, 1);
2359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002361 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002363 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002364 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002365 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 com_push(c, 1);
2367 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002369 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002371 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002373 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002374 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002375 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002376 break;
2377 case BACKQUOTE:
2378 com_node(c, CHILD(n, 1));
2379 com_addbyte(c, UNARY_CONVERT);
2380 break;
2381 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002382 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002383 i = 255;
2384 }
2385 else {
2386 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002387 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 }
2389 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002390 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 break;
2392 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002393 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002394 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395 c->c_errors++;
2396 i = 255;
2397 }
2398 else {
2399 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 }
2402 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002403 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002404 break;
2405 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002406 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 break;
2409 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 com_error(c, PyExc_SystemError,
2411 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002412 }
2413}
2414
2415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002416com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002417{
2418 if (NCH(n) == 1) {
2419 com_addbyte(c, op);
2420 }
2421 else if (NCH(n) == 2) {
2422 if (TYPE(CHILD(n, 0)) != COLON) {
2423 com_node(c, CHILD(n, 0));
2424 com_addbyte(c, op+1);
2425 }
2426 else {
2427 com_node(c, CHILD(n, 1));
2428 com_addbyte(c, op+2);
2429 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002430 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002431 }
2432 else {
2433 com_node(c, CHILD(n, 0));
2434 com_node(c, CHILD(n, 2));
2435 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002437 }
2438}
2439
Guido van Rossum635abd21997-01-06 22:56:52 +00002440static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002441com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2442{
2443 if (NCH(n) == 1) {
2444 com_addbyte(c, DUP_TOP);
2445 com_push(c, 1);
2446 com_addbyte(c, SLICE);
2447 com_node(c, augn);
2448 com_addbyte(c, opcode);
2449 com_pop(c, 1);
2450 com_addbyte(c, ROT_TWO);
2451 com_addbyte(c, STORE_SLICE);
2452 com_pop(c, 2);
2453 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2454 com_node(c, CHILD(n, 0));
2455 com_addoparg(c, DUP_TOPX, 2);
2456 com_push(c, 2);
2457 com_addbyte(c, SLICE+1);
2458 com_pop(c, 1);
2459 com_node(c, augn);
2460 com_addbyte(c, opcode);
2461 com_pop(c, 1);
2462 com_addbyte(c, ROT_THREE);
2463 com_addbyte(c, STORE_SLICE+1);
2464 com_pop(c, 3);
2465 } else if (NCH(n) == 2) {
2466 com_node(c, CHILD(n, 1));
2467 com_addoparg(c, DUP_TOPX, 2);
2468 com_push(c, 2);
2469 com_addbyte(c, SLICE+2);
2470 com_pop(c, 1);
2471 com_node(c, augn);
2472 com_addbyte(c, opcode);
2473 com_pop(c, 1);
2474 com_addbyte(c, ROT_THREE);
2475 com_addbyte(c, STORE_SLICE+2);
2476 com_pop(c, 3);
2477 } else {
2478 com_node(c, CHILD(n, 0));
2479 com_node(c, CHILD(n, 2));
2480 com_addoparg(c, DUP_TOPX, 3);
2481 com_push(c, 3);
2482 com_addbyte(c, SLICE+3);
2483 com_pop(c, 2);
2484 com_node(c, augn);
2485 com_addbyte(c, opcode);
2486 com_pop(c, 1);
2487 com_addbyte(c, ROT_FOUR);
2488 com_addbyte(c, STORE_SLICE+3);
2489 com_pop(c, 4);
2490 }
2491}
2492
2493static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002494com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002495{
2496 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002497 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002498 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002499 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002500 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002501 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002502 }
2503 else {
2504 com_node(c, CHILD(n, 0));
2505 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002506 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002507 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002508 if (NCH(n) == 2) {
2509 com_generator_expression(c, n);
2510 return;
2511 }
2512
Guido van Rossumf10570b1995-07-07 22:53:21 +00002513 m = n;
2514 do {
2515 m = CHILD(m, 0);
2516 } while (NCH(m) == 1);
2517 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002518 /* f(lambda x: x[0] = 3) ends up getting parsed with
2519 * LHS test = lambda x: x[0], and RHS test = 3.
2520 * SF bug 132313 points out that complaining about a keyword
2521 * then is very confusing.
2522 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002524 TYPE(m) == lambdef ?
2525 "lambda cannot contain assignment" :
2526 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002527 }
2528 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002530 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002531 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002532 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002533 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002534 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002535 else if (*pkeywords == NULL) {
2536 c->c_errors++;
2537 Py_DECREF(v);
2538 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002539 if (PyDict_GetItem(*pkeywords, v) != NULL)
2540 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002541 "duplicate keyword argument");
2542 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002543 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002544 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002545 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002547 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002548 }
2549 }
2550 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002551}
2552
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002555{
2556 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002557 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002558 }
2559 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002560 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002561 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002562 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002563 int star_flag = 0;
2564 int starstar_flag = 0;
2565 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002566 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002567 na = 0;
2568 nk = 0;
2569 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002570 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002571 if (TYPE(ch) == STAR ||
2572 TYPE(ch) == DOUBLESTAR)
2573 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002574 if (ch->n_lineno != lineno) {
2575 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002576 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002577 }
2578 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002579 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002580 na++;
2581 else
2582 nk++;
2583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002584 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002585 while (i < NCH(n)) {
2586 node *tok = CHILD(n, i);
2587 node *ch = CHILD(n, i+1);
2588 i += 3;
2589 switch (TYPE(tok)) {
2590 case STAR: star_flag = 1; break;
2591 case DOUBLESTAR: starstar_flag = 1; break;
2592 }
2593 com_node(c, ch);
2594 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002595 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002596 com_error(c, PyExc_SyntaxError,
2597 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002598 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002599 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002600 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002601 star_flag + (starstar_flag << 1);
2602 else
2603 opcode = CALL_FUNCTION;
2604 com_addoparg(c, opcode, na | (nk << 8));
2605 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002606 }
2607}
2608
2609static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002610com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611{
2612 com_addopname(c, LOAD_ATTR, n);
2613}
2614
2615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002616com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002617{
2618 int i=0;
2619 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002620 node *ch;
2621
2622 /* first argument */
2623 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002624 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002625 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002626 i++;
2627 }
2628 else {
2629 com_node(c, CHILD(n,i));
2630 i++;
2631 REQ(CHILD(n,i),COLON);
2632 i++;
2633 }
2634 /* second argument */
2635 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2636 com_node(c, CHILD(n,i));
2637 i++;
2638 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002639 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002640 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 com_push(c, 1);
2642 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002643 /* remaining arguments */
2644 for (; i < NCH(n); i++) {
2645 ns++;
2646 ch=CHILD(n,i);
2647 REQ(ch, sliceop);
2648 if (NCH(ch) == 1) {
2649 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002650 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002652 }
2653 else
2654 com_node(c, CHILD(ch,1));
2655 }
2656 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002658}
2659
2660static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002661com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002662{
2663 node *ch;
2664 REQ(n, subscript);
2665 ch = CHILD(n,0);
2666 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002668 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002669 com_push(c, 1);
2670 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002671 else {
2672 /* check for slice */
2673 if ((TYPE(ch) == COLON || NCH(n) > 1))
2674 com_sliceobj(c, n);
2675 else {
2676 REQ(ch, test);
2677 com_node(c, ch);
2678 }
2679 }
2680}
2681
2682static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002683com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002684{
2685 int i, op;
2686 REQ(n, subscriptlist);
2687 /* Check to make backward compatible slice behavior for '[i:j]' */
2688 if (NCH(n) == 1) {
2689 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002690 /* 'Basic' slice, should have exactly one colon. */
2691 if ((TYPE(CHILD(sub, 0)) == COLON
2692 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2693 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2694 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002695 switch (assigning) {
2696 case OP_DELETE:
2697 op = DELETE_SLICE;
2698 break;
2699 case OP_ASSIGN:
2700 op = STORE_SLICE;
2701 break;
2702 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002703 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002704 break;
2705 default:
2706 com_augassign_slice(c, sub, assigning, augn);
2707 return;
2708 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002709 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002710 if (op == STORE_SLICE)
2711 com_pop(c, 2);
2712 else if (op == DELETE_SLICE)
2713 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002714 return;
2715 }
2716 }
2717 /* Else normal subscriptlist. Compile each subscript. */
2718 for (i = 0; i < NCH(n); i += 2)
2719 com_subscript(c, CHILD(n, i));
2720 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002721 if (NCH(n) > 1) {
2722 i = (NCH(n)+1) / 2;
2723 com_addoparg(c, BUILD_TUPLE, i);
2724 com_pop(c, i-1);
2725 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002726 switch (assigning) {
2727 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 op = DELETE_SUBSCR;
2729 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002730 break;
2731 default:
2732 case OP_ASSIGN:
2733 op = STORE_SUBSCR;
2734 i = 3;
2735 break;
2736 case OP_APPLY:
2737 op = BINARY_SUBSCR;
2738 i = 1;
2739 break;
2740 }
2741 if (assigning > OP_APPLY) {
2742 com_addoparg(c, DUP_TOPX, 2);
2743 com_push(c, 2);
2744 com_addbyte(c, BINARY_SUBSCR);
2745 com_pop(c, 1);
2746 com_node(c, augn);
2747 com_addbyte(c, assigning);
2748 com_pop(c, 1);
2749 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002751 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002752 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002753}
2754
2755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757{
2758 REQ(n, trailer);
2759 switch (TYPE(CHILD(n, 0))) {
2760 case LPAR:
2761 com_call_function(c, CHILD(n, 1));
2762 break;
2763 case DOT:
2764 com_select_member(c, CHILD(n, 1));
2765 break;
2766 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002767 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002768 break;
2769 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002770 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002771 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002772 }
2773}
2774
2775static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002776com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002777{
2778 int i;
2779 REQ(n, power);
2780 com_atom(c, CHILD(n, 0));
2781 for (i = 1; i < NCH(n); i++) {
2782 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2783 com_factor(c, CHILD(n, i+1));
2784 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002785 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002786 break;
2787 }
2788 else
2789 com_apply_trailer(c, CHILD(n, i));
2790 }
2791}
2792
2793static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002794com_invert_constant(struct compiling *c, node *n)
2795{
2796 /* Compute the inverse of int and longs and use them directly,
2797 but be prepared to generate code for all other
2798 possibilities (invalid numbers, floats, complex).
2799 */
2800 PyObject *num, *inv = NULL;
2801 int i;
2802
2803 REQ(n, NUMBER);
2804 num = parsenumber(c, STR(n));
2805 if (num == NULL)
2806 i = 255;
2807 else {
2808 inv = PyNumber_Invert(num);
2809 if (inv == NULL) {
2810 PyErr_Clear();
2811 i = com_addconst(c, num);
2812 } else {
2813 i = com_addconst(c, inv);
2814 Py_DECREF(inv);
2815 }
2816 Py_DECREF(num);
2817 }
2818 com_addoparg(c, LOAD_CONST, i);
2819 com_push(c, 1);
2820 if (num != NULL && inv == NULL)
2821 com_addbyte(c, UNARY_INVERT);
2822}
2823
Tim Peters51e26512001-09-07 08:45:55 +00002824static int
2825is_float_zero(const char *p)
2826{
2827 int found_radix_point = 0;
2828 int ch;
2829 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2830 switch (ch) {
2831 case '0':
2832 /* no reason to believe it's not 0 -- continue */
2833 break;
2834
2835 case 'e': case 'E': case 'j': case 'J':
2836 /* If this was a hex constant, we already would have
2837 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2838 must be an exponent marker, and we haven't yet
2839 seen a non-zero digit, and it doesn't matter what
2840 the exponent is then. For 'j' or 'J' similarly,
2841 except that this is an imaginary 0 then. */
2842 return 1;
2843
2844 case '.':
2845 found_radix_point = 1;
2846 break;
2847
2848 default:
2849 return 0;
2850 }
2851 }
2852 return found_radix_point;
2853}
2854
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002855static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002856com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002858 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002859 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002860 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002861 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002862 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002863 approriate value as a constant. If the value is negative,
2864 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002865 negative in the 0th position -- unless we're doing unary minus
2866 of a floating zero! In that case the sign is significant, but
2867 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002868 */
2869 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002870 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002871 && TYPE((pfactor = CHILD(n, 1))) == factor
2872 && NCH(pfactor) == 1
2873 && TYPE((ppower = CHILD(pfactor, 0))) == power
2874 && NCH(ppower) == 1
2875 && TYPE((patom = CHILD(ppower, 0))) == atom
2876 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002877 && !(childtype == MINUS &&
2878 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002879 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002880 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002881 return;
2882 }
2883 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002884 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002885 if (s == NULL) {
2886 com_error(c, PyExc_MemoryError, "");
2887 com_addbyte(c, 255);
2888 return;
2889 }
2890 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002891 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002892 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002893 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002894 }
Tim Peters51e26512001-09-07 08:45:55 +00002895 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002896 }
2897 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898 com_factor(c, CHILD(n, 1));
2899 com_addbyte(c, UNARY_POSITIVE);
2900 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002901 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002902 com_factor(c, CHILD(n, 1));
2903 com_addbyte(c, UNARY_NEGATIVE);
2904 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002905 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002906 com_factor(c, CHILD(n, 1));
2907 com_addbyte(c, UNARY_INVERT);
2908 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002909 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002910 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 }
2912}
2913
2914static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002915com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916{
2917 int i;
2918 int op;
2919 REQ(n, term);
2920 com_factor(c, CHILD(n, 0));
2921 for (i = 2; i < NCH(n); i += 2) {
2922 com_factor(c, CHILD(n, i));
2923 switch (TYPE(CHILD(n, i-1))) {
2924 case STAR:
2925 op = BINARY_MULTIPLY;
2926 break;
2927 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002928 if (c->c_flags & CO_FUTURE_DIVISION)
2929 op = BINARY_TRUE_DIVIDE;
2930 else
2931 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002932 break;
2933 case PERCENT:
2934 op = BINARY_MODULO;
2935 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002936 case DOUBLESLASH:
2937 op = BINARY_FLOOR_DIVIDE;
2938 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002939 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002940 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002941 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002942 op = 255;
2943 }
2944 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002945 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002946 }
2947}
2948
2949static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002950com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002951{
2952 int i;
2953 int op;
2954 REQ(n, arith_expr);
2955 com_term(c, CHILD(n, 0));
2956 for (i = 2; i < NCH(n); i += 2) {
2957 com_term(c, CHILD(n, i));
2958 switch (TYPE(CHILD(n, i-1))) {
2959 case PLUS:
2960 op = BINARY_ADD;
2961 break;
2962 case MINUS:
2963 op = BINARY_SUBTRACT;
2964 break;
2965 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002966 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002967 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002968 op = 255;
2969 }
2970 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002971 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002972 }
2973}
2974
2975static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002976com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002977{
2978 int i;
2979 int op;
2980 REQ(n, shift_expr);
2981 com_arith_expr(c, CHILD(n, 0));
2982 for (i = 2; i < NCH(n); i += 2) {
2983 com_arith_expr(c, CHILD(n, i));
2984 switch (TYPE(CHILD(n, i-1))) {
2985 case LEFTSHIFT:
2986 op = BINARY_LSHIFT;
2987 break;
2988 case RIGHTSHIFT:
2989 op = BINARY_RSHIFT;
2990 break;
2991 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002993 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002994 op = 255;
2995 }
2996 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002998 }
2999}
3000
3001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003003{
3004 int i;
3005 int op;
3006 REQ(n, and_expr);
3007 com_shift_expr(c, CHILD(n, 0));
3008 for (i = 2; i < NCH(n); i += 2) {
3009 com_shift_expr(c, CHILD(n, i));
3010 if (TYPE(CHILD(n, i-1)) == AMPER) {
3011 op = BINARY_AND;
3012 }
3013 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003014 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003015 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003016 op = 255;
3017 }
3018 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003020 }
3021}
3022
3023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003025{
3026 int i;
3027 int op;
3028 REQ(n, xor_expr);
3029 com_and_expr(c, CHILD(n, 0));
3030 for (i = 2; i < NCH(n); i += 2) {
3031 com_and_expr(c, CHILD(n, i));
3032 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3033 op = BINARY_XOR;
3034 }
3035 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003037 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 op = 255;
3039 }
3040 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 }
3043}
3044
3045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047{
3048 int i;
3049 int op;
3050 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003051 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003053 com_xor_expr(c, CHILD(n, i));
3054 if (TYPE(CHILD(n, i-1)) == VBAR) {
3055 op = BINARY_OR;
3056 }
3057 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003058 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003059 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003060 op = 255;
3061 }
3062 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003063 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 }
3065}
3066
3067static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003068cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069{
3070 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003071 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3073 if (NCH(n) == 1) {
3074 n = CHILD(n, 0);
3075 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003076 case LESS: return PyCmp_LT;
3077 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003078 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003079 case LESSEQUAL: return PyCmp_LE;
3080 case GREATEREQUAL: return PyCmp_GE;
3081 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3082 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3083 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 }
3085 }
3086 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003087 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003089 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003091 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 }
3093 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003094 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095}
3096
3097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003098com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099{
3100 int i;
3101 enum cmp_op op;
3102 int anchor;
3103 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3104 com_expr(c, CHILD(n, 0));
3105 if (NCH(n) == 1)
3106 return;
3107
3108 /****************************************************************
3109 The following code is generated for all but the last
3110 comparison in a chain:
3111
3112 label: on stack: opcode: jump to:
3113
3114 a <code to load b>
3115 a, b DUP_TOP
3116 a, b, b ROT_THREE
3117 b, a, b COMPARE_OP
3118 b, 0-or-1 JUMP_IF_FALSE L1
3119 b, 1 POP_TOP
3120 b
3121
3122 We are now ready to repeat this sequence for the next
3123 comparison in the chain.
3124
3125 For the last we generate:
3126
3127 b <code to load c>
3128 b, c COMPARE_OP
3129 0-or-1
3130
3131 If there were any jumps to L1 (i.e., there was more than one
3132 comparison), we generate:
3133
3134 0-or-1 JUMP_FORWARD L2
3135 L1: b, 0 ROT_TWO
3136 0, b POP_TOP
3137 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 ****************************************************************/
3140
3141 anchor = 0;
3142
3143 for (i = 2; i < NCH(n); i += 2) {
3144 com_expr(c, CHILD(n, i));
3145 if (i+2 < NCH(n)) {
3146 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003147 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 com_addbyte(c, ROT_THREE);
3149 }
3150 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003151 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003152 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003153 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 }
3155 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003156 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 if (i+2 < NCH(n)) {
3158 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3159 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003160 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003161 }
3162 }
3163
3164 if (anchor) {
3165 int anchor2 = 0;
3166 com_addfwref(c, JUMP_FORWARD, &anchor2);
3167 com_backpatch(c, anchor);
3168 com_addbyte(c, ROT_TWO);
3169 com_addbyte(c, POP_TOP);
3170 com_backpatch(c, anchor2);
3171 }
3172}
3173
3174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003175com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003176{
3177 REQ(n, not_test); /* 'not' not_test | comparison */
3178 if (NCH(n) == 1) {
3179 com_comparison(c, CHILD(n, 0));
3180 }
3181 else {
3182 com_not_test(c, CHILD(n, 1));
3183 com_addbyte(c, UNARY_NOT);
3184 }
3185}
3186
3187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003188com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003189{
3190 int i;
3191 int anchor;
3192 REQ(n, and_test); /* not_test ('and' not_test)* */
3193 anchor = 0;
3194 i = 0;
3195 for (;;) {
3196 com_not_test(c, CHILD(n, i));
3197 if ((i += 2) >= NCH(n))
3198 break;
3199 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3200 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003201 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 }
3203 if (anchor)
3204 com_backpatch(c, anchor);
3205}
3206
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003207static int
3208com_make_closure(struct compiling *c, PyCodeObject *co)
3209{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003210 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003211 if (free == 0)
3212 return 0;
3213 for (i = 0; i < free; ++i) {
3214 /* Bypass com_addop_varname because it will generate
3215 LOAD_DEREF but LOAD_CLOSURE is needed.
3216 */
3217 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3218 int arg, reftype;
3219
3220 /* Special case: If a class contains a method with a
3221 free variable that has the same name as a method,
3222 the name will be considered free *and* local in the
3223 class. It should be handled by the closure, as
3224 well as by the normal name loookup logic.
3225 */
3226 reftype = get_ref_type(c, PyString_AS_STRING(name));
3227 if (reftype == CELL)
3228 arg = com_lookup_arg(c->c_cellvars, name);
3229 else /* (reftype == FREE) */
3230 arg = com_lookup_arg(c->c_freevars, name);
3231 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003232 fprintf(stderr, "lookup %s in %s %d %d\n"
3233 "freevars of %s: %s\n",
3234 PyObject_REPR(name),
3235 c->c_name,
3236 reftype, arg,
3237 PyString_AS_STRING(co->co_name),
3238 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003239 Py_FatalError("com_make_closure()");
3240 }
3241 com_addoparg(c, LOAD_CLOSURE, arg);
3242
3243 }
3244 com_push(c, free);
3245 return 1;
3246}
3247
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003249com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003252 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003253 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003254 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003255 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003256 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3257 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003258 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003259 if (co == NULL) {
3260 c->c_errors++;
3261 return;
3262 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003263 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003264 i = com_addconst(c, (PyObject *)co);
3265 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003266 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003267 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003268 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003269 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003270 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003271 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003272 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003273 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003274 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003276 else {
3277 int anchor = 0;
3278 int i = 0;
3279 for (;;) {
3280 com_and_test(c, CHILD(n, i));
3281 if ((i += 2) >= NCH(n))
3282 break;
3283 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3284 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003285 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003286 }
3287 if (anchor)
3288 com_backpatch(c, anchor);
3289 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290}
3291
3292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003293com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003294{
3295 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003296 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 com_node(c, CHILD(n, 0));
3298 }
3299 else {
3300 int i;
3301 int len;
3302 len = (NCH(n) + 1) / 2;
3303 for (i = 0; i < NCH(n); i += 2)
3304 com_node(c, CHILD(n, i));
3305 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 }
3308}
3309
3310
3311/* Begin of assignment compilation */
3312
Thomas Wouters434d0822000-08-24 20:11:32 +00003313
3314static void
3315com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3316{
3317 com_addbyte(c, DUP_TOP);
3318 com_push(c, 1);
3319 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003320 com_node(c, augn);
3321 com_addbyte(c, opcode);
3322 com_pop(c, 1);
3323 com_addbyte(c, ROT_TWO);
3324 com_addopname(c, STORE_ATTR, n);
3325 com_pop(c, 2);
3326}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327
3328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003329com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003331 if (none_assignment_check(c, STR(n), assigning))
3332 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003334 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003335}
3336
3337static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003338com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340 REQ(n, trailer);
3341 switch (TYPE(CHILD(n, 0))) {
3342 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003343 if (assigning == OP_DELETE)
3344 com_error(c, PyExc_SyntaxError,
3345 "can't delete function call");
3346 else
3347 com_error(c, PyExc_SyntaxError,
3348 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349 break;
3350 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003351 if (assigning > OP_APPLY)
3352 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3353 else
3354 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003356 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003357 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003358 break;
3359 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003360 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003361 }
3362}
3363
3364static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003365com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366{
3367 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003368 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3369 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003371 if (assigning) {
3372 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003373 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 com_push(c, i-1);
3375 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003377 com_assign(c, CHILD(n, i), assigning, NULL);
3378}
3379
3380static void
3381com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3382{
3383 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003384 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003385 com_push(c, 1);
3386 com_node(c, augn);
3387 com_addbyte(c, opcode);
3388 com_pop(c, 1);
3389 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390}
3391
3392static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003393com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394{
3395 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003396 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 if (assigning)
3398 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399}
3400
3401static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003402com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003403{
3404 /* Loop to avoid trivial recursion */
3405 for (;;) {
3406 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003407
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 case exprlist:
3409 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003410 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003411 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003413 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003414 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003415 "assign to generator expression not possible");
3416 return;
3417 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003418 if (assigning > OP_APPLY) {
3419 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003420 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003421 return;
3422 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003423 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 return;
3425 }
3426 n = CHILD(n, 0);
3427 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003428
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003429 case test:
3430 case and_test:
3431 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003434 case xor_expr:
3435 case and_expr:
3436 case shift_expr:
3437 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003438 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003439 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003441 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003442 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 return;
3444 }
3445 n = CHILD(n, 0);
3446 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003447
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003448 case power: /* atom trailer* ('**' power)*
3449 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003450 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003451 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003452 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 return;
3454 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003455 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003456 int i;
3457 com_node(c, CHILD(n, 0));
3458 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003459 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003460 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003461 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003462 return;
3463 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464 com_apply_trailer(c, CHILD(n, i));
3465 } /* NB i is still alive */
3466 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003467 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003468 return;
3469 }
3470 n = CHILD(n, 0);
3471 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003472
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003473 case atom:
3474 switch (TYPE(CHILD(n, 0))) {
3475 case LPAR:
3476 n = CHILD(n, 1);
3477 if (TYPE(n) == RPAR) {
3478 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003479 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003480 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003481 return;
3482 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003483 if (assigning > OP_APPLY) {
3484 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003485 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003486 return;
3487 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488 break;
3489 case LSQB:
3490 n = CHILD(n, 1);
3491 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003492 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003493 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 return;
3495 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003496 if (assigning > OP_APPLY) {
3497 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003498 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003499 return;
3500 }
3501 if (NCH(n) > 1
3502 && TYPE(CHILD(n, 1)) == list_for) {
3503 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003504 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003505 return;
3506 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003507 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003508 return;
3509 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003510 if (assigning > OP_APPLY)
3511 com_augassign_name(c, CHILD(n, 0),
3512 assigning, augn);
3513 else
3514 com_assign_name(c, CHILD(n, 0),
3515 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 return;
3517 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003518 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003519 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 return;
3521 }
3522 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003523
3524 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003525 com_error(c, PyExc_SyntaxError,
3526 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003527 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003528
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003530 com_error(c, PyExc_SystemError,
3531 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003532 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003533
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534 }
3535 }
3536}
Guido van Rossum7c531111997-03-11 18:42:21 +00003537
Thomas Wouters434d0822000-08-24 20:11:32 +00003538static void
3539com_augassign(struct compiling *c, node *n)
3540{
3541 int opcode;
3542
3543 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3544 case '+': opcode = INPLACE_ADD; break;
3545 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003546 case '/':
3547 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3548 opcode = INPLACE_FLOOR_DIVIDE;
3549 else if (c->c_flags & CO_FUTURE_DIVISION)
3550 opcode = INPLACE_TRUE_DIVIDE;
3551 else
3552 opcode = INPLACE_DIVIDE;
3553 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003554 case '%': opcode = INPLACE_MODULO; break;
3555 case '<': opcode = INPLACE_LSHIFT; break;
3556 case '>': opcode = INPLACE_RSHIFT; break;
3557 case '&': opcode = INPLACE_AND; break;
3558 case '^': opcode = INPLACE_XOR; break;
3559 case '|': opcode = INPLACE_OR; break;
3560 case '*':
3561 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3562 opcode = INPLACE_POWER;
3563 else
3564 opcode = INPLACE_MULTIPLY;
3565 break;
3566 default:
3567 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3568 return;
3569 }
3570 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3571}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572
3573static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003574com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575{
Thomas Wouters434d0822000-08-24 20:11:32 +00003576 REQ(n, expr_stmt);
3577 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003578 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003579 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003580 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003581 if (NCH(n) == 1) {
3582 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003583 if (c->c_interactive)
3584 com_addbyte(c, PRINT_EXPR);
3585 else
3586 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003588 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003589 else if (TYPE(CHILD(n,1)) == augassign)
3590 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003591 else {
3592 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003593 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003594 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003595 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003596 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003597 com_push(c, 1);
3598 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003599 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003600 }
3601 }
3602}
3603
3604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003605com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003606{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003607 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003608 int i;
3609 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003610 if (Py_OptimizeFlag)
3611 return;
3612 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003613
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003614 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003615 raise AssertionError [, <message>]
3616
3617 where <message> is the second test, if present.
3618 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003619 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003620 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003621 com_addbyte(c, POP_TOP);
3622 com_pop(c, 1);
3623 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003624 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003625 com_push(c, 1);
3626 i = NCH(n)/2; /* Either 2 or 4 */
3627 if (i > 1)
3628 com_node(c, CHILD(n, 3));
3629 com_addoparg(c, RAISE_VARARGS, i);
3630 com_pop(c, i);
3631 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003632 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003633 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003634 com_addbyte(c, POP_TOP);
3635}
3636
3637static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003638com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003640 int i = 1;
3641 node* stream = NULL;
3642
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003643 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003644
3645 /* are we using the extended print form? */
3646 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3647 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003648 com_node(c, stream);
3649 /* stack: [...] => [... stream] */
3650 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003651 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3652 i = 4;
3653 else
3654 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003655 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003656 for (; i < NCH(n); i += 2) {
3657 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003658 com_addbyte(c, DUP_TOP);
3659 /* stack: [stream] => [stream stream] */
3660 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003661 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003662 /* stack: [stream stream] => [stream stream obj] */
3663 com_addbyte(c, ROT_TWO);
3664 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003665 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003666 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003667 com_pop(c, 2);
3668 }
3669 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003670 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003671 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003672 com_addbyte(c, PRINT_ITEM);
3673 com_pop(c, 1);
3674 }
3675 }
3676 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003677 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003678 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003679 /* must pop the extra stream object off the stack */
3680 com_addbyte(c, POP_TOP);
3681 /* stack: [... stream] => [...] */
3682 com_pop(c, 1);
3683 }
3684 }
3685 else {
3686 if (stream != NULL) {
3687 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003688 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003689 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003690 com_pop(c, 1);
3691 }
3692 else
3693 com_addbyte(c, PRINT_NEWLINE);
3694 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003695}
3696
3697static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003698com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003699{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003700 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003701 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003702 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003703 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003704 if (c->c_flags & CO_GENERATOR) {
3705 if (NCH(n) > 1) {
3706 com_error(c, PyExc_SyntaxError,
3707 "'return' with argument inside generator");
3708 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003709 }
3710 if (NCH(n) < 2) {
3711 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003712 com_push(c, 1);
3713 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003714 else
3715 com_node(c, CHILD(n, 1));
3716 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003717 com_pop(c, 1);
3718}
3719
3720static void
3721com_yield_stmt(struct compiling *c, node *n)
3722{
Tim Peters95c80f82001-06-23 02:07:08 +00003723 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003724 REQ(n, yield_stmt); /* 'yield' testlist */
3725 if (!c->c_infunction) {
3726 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3727 }
Tim Peters95c80f82001-06-23 02:07:08 +00003728
3729 for (i = 0; i < c->c_nblocks; ++i) {
3730 if (c->c_block[i] == SETUP_FINALLY) {
3731 com_error(c, PyExc_SyntaxError,
3732 "'yield' not allowed in a 'try' block "
3733 "with a 'finally' clause");
3734 return;
3735 }
3736 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003737 com_node(c, CHILD(n, 1));
3738 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740}
3741
3742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003743com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003746 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3747 if (NCH(n) > 1) {
3748 com_node(c, CHILD(n, 1));
3749 if (NCH(n) > 3) {
3750 com_node(c, CHILD(n, 3));
3751 if (NCH(n) > 5)
3752 com_node(c, CHILD(n, 5));
3753 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003754 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 i = NCH(n)/2;
3756 com_addoparg(c, RAISE_VARARGS, i);
3757 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758}
3759
3760static void
Thomas Wouters52152252000-08-17 22:55:00 +00003761com_from_import(struct compiling *c, node *n)
3762{
3763 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3764 com_push(c, 1);
3765 if (NCH(n) > 1) {
3766 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3767 com_error(c, PyExc_SyntaxError, "invalid syntax");
3768 return;
3769 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003770 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003771 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003772 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003773 com_pop(c, 1);
3774}
3775
3776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003777com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003779 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003780 int i;
3781 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003782 n = CHILD(n, 0);
3783 /* import_stmt: import_name | import_from */
3784 if (TYPE(n) == import_from) {
3785 /* 'from' dotted_name 'import' ('*' |
3786 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003787 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003788 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003789 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3790 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003791 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003792 else {
3793 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3794 TYPE(CHILD(n, 3)) != LPAR) {
3795 com_error(c, PyExc_SyntaxError,
3796 "trailing comma not allowed "
3797 "without surrounding parentheses");
3798 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003799 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003800 REQ(nn, import_as_names);
3801 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003802 for (i = 0; i < NCH(nn); i += 2) {
3803 PyObject *s = PyString_FromString(
3804 STR(CHILD(CHILD(nn, i), 0)));
3805 if (s == NULL) {
3806 Py_CLEAR(tup);
3807 break;
3808 } else
3809 PyTuple_SET_ITEM(tup, i / 2, s);
3810 }
3811 if (tup == NULL) {
3812 /* Assume that failue above was MemoryError */
3813 com_error(c, PyExc_MemoryError, "");
3814 return;
3815 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003816 }
3817 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003818 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003820 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003821 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003822 com_addbyte(c, IMPORT_STAR);
3823 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003824 for (i = 0; i < NCH(nn); i += 2)
3825 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003826 com_addbyte(c, POP_TOP);
3827 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 }
3830 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003831 /* 'import' dotted_as_names */
3832 nn = CHILD(n, 1);
3833 REQ(nn, dotted_as_names);
3834 for (i = 0; i < NCH(nn); i += 2) {
3835 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003836 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003837 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003838 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003839 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003840 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003841 int j;
3842 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003843 com_error(c, PyExc_SyntaxError,
3844 "invalid syntax");
3845 return;
3846 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003847 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3848 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003849 CHILD(CHILD(subn, 0),
3850 j));
3851 com_addop_varname(c, VAR_STORE,
3852 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003853 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003854 com_addop_varname(c, VAR_STORE,
3855 STR(CHILD(CHILD(subn, 0),
3856 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003857 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003858 }
3859 }
3860}
3861
3862static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003863com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003864{
3865 REQ(n, exec_stmt);
3866 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3867 com_node(c, CHILD(n, 1));
3868 if (NCH(n) >= 4)
3869 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003870 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003872 com_push(c, 1);
3873 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003874 if (NCH(n) >= 6)
3875 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003876 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003877 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003878 com_push(c, 1);
3879 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003880 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003882}
3883
Guido van Rossum7c531111997-03-11 18:42:21 +00003884static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003885is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003886{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003887 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003888 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003889 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003890
3891 /* Label to avoid tail recursion */
3892 next:
3893 switch (TYPE(n)) {
3894
3895 case suite:
3896 if (NCH(n) == 1) {
3897 n = CHILD(n, 0);
3898 goto next;
3899 }
3900 /* Fall through */
3901 case file_input:
3902 for (i = 0; i < NCH(n); i++) {
3903 node *ch = CHILD(n, i);
3904 if (TYPE(ch) == stmt) {
3905 n = ch;
3906 goto next;
3907 }
3908 }
3909 break;
3910
3911 case stmt:
3912 case simple_stmt:
3913 case small_stmt:
3914 n = CHILD(n, 0);
3915 goto next;
3916
3917 case expr_stmt:
3918 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003919 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003920 case test:
3921 case and_test:
3922 case not_test:
3923 case comparison:
3924 case expr:
3925 case xor_expr:
3926 case and_expr:
3927 case shift_expr:
3928 case arith_expr:
3929 case term:
3930 case factor:
3931 case power:
3932 case atom:
3933 if (NCH(n) == 1) {
3934 n = CHILD(n, 0);
3935 goto next;
3936 }
3937 break;
3938
3939 case NAME:
3940 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3941 return 1;
3942 break;
3943
3944 case NUMBER:
3945 v = parsenumber(c, STR(n));
3946 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003947 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003948 break;
3949 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003950 i = PyObject_IsTrue(v);
3951 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003952 return i == 0;
3953
3954 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003955 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003956 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003958 break;
3959 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003960 i = PyObject_IsTrue(v);
3961 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003962 return i == 0;
3963
3964 }
3965 return 0;
3966}
3967
Tim Peters08a898f2001-06-28 01:52:22 +00003968
3969/* Look under n for a return stmt with an expression.
3970 * This hack is used to find illegal returns under "if 0:" blocks in
3971 * functions already known to be generators (as determined by the symtable
3972 * pass).
3973 * Return the offending return node if found, else NULL.
3974 */
3975static node *
3976look_for_offending_return(node *n)
3977{
3978 int i;
3979
3980 for (i = 0; i < NCH(n); ++i) {
3981 node *kid = CHILD(n, i);
3982
3983 switch (TYPE(kid)) {
3984 case classdef:
3985 case funcdef:
3986 case lambdef:
3987 /* Stuff in nested functions & classes doesn't
3988 affect the code block we started in. */
3989 return NULL;
3990
3991 case return_stmt:
3992 if (NCH(kid) > 1)
3993 return kid;
3994 break;
3995
3996 default: {
3997 node *bad = look_for_offending_return(kid);
3998 if (bad != NULL)
3999 return bad;
4000 }
4001 }
4002 }
4003
4004 return NULL;
4005}
4006
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004008com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009{
4010 int i;
4011 int anchor = 0;
4012 REQ(n, if_stmt);
4013 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
4014 for (i = 0; i+3 < NCH(n); i+=4) {
4015 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004016 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004017 if (is_constant_false(c, ch)) {
4018 /* We're going to skip this block. However, if this
4019 is a generator, we have to check the dead code
4020 anyway to make sure there aren't any return stmts
4021 with expressions, in the same scope. */
4022 if (c->c_flags & CO_GENERATOR) {
4023 node *p = look_for_offending_return(n);
4024 if (p != NULL) {
4025 int savelineno = c->c_lineno;
4026 c->c_lineno = p->n_lineno;
4027 com_error(c, PyExc_SyntaxError,
4028 "'return' with argument "
4029 "inside generator");
4030 c->c_lineno = savelineno;
4031 }
4032 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004033 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004034 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004035 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004036 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004037 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004038 com_addfwref(c, JUMP_IF_FALSE, &a);
4039 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004040 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041 com_node(c, CHILD(n, i+3));
4042 com_addfwref(c, JUMP_FORWARD, &anchor);
4043 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004044 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004045 com_addbyte(c, POP_TOP);
4046 }
4047 if (i+2 < NCH(n))
4048 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004049 if (anchor)
4050 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051}
4052
4053static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004054com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004055{
4056 int break_anchor = 0;
4057 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004058 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4060 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004061 block_push(c, SETUP_LOOP);
4062 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004063 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064 com_node(c, CHILD(n, 1));
4065 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4066 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004067 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004068 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004070 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004071 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4072 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004074 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075 com_addbyte(c, POP_TOP);
4076 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004077 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078 if (NCH(n) > 4)
4079 com_node(c, CHILD(n, 6));
4080 com_backpatch(c, break_anchor);
4081}
4082
4083static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004084com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004086 int break_anchor = 0;
4087 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004088 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 REQ(n, for_stmt);
4090 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4091 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004092 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004093 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004094 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004095 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004096 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004097 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004098 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004099 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004100 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004101 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004102 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004103 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4104 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004105 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004106 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004107 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004108 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004109 if (NCH(n) > 8)
4110 com_node(c, CHILD(n, 8));
4111 com_backpatch(c, break_anchor);
4112}
4113
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004114/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004115
4116 SETUP_FINALLY L
4117 <code for S>
4118 POP_BLOCK
4119 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004120 L: <code for Sf>
4121 END_FINALLY
4122
4123 The special instructions use the block stack. Each block
4124 stack entry contains the instruction that created it (here
4125 SETUP_FINALLY), the level of the value stack at the time the
4126 block stack entry was created, and a label (here L).
4127
4128 SETUP_FINALLY:
4129 Pushes the current value stack level and the label
4130 onto the block stack.
4131 POP_BLOCK:
4132 Pops en entry from the block stack, and pops the value
4133 stack until its level is the same as indicated on the
4134 block stack. (The label is ignored.)
4135 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004136 Pops a variable number of entries from the *value* stack
4137 and re-raises the exception they specify. The number of
4138 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004139
4140 The block stack is unwound when an exception is raised:
4141 when a SETUP_FINALLY entry is found, the exception is pushed
4142 onto the value stack (and the exception condition is cleared),
4143 and the interpreter jumps to the label gotten from the block
4144 stack.
4145
4146 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004147 (The contents of the value stack is shown in [], with the top
4148 at the right; 'tb' is trace-back info, 'val' the exception's
4149 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004150
4151 Value stack Label Instruction Argument
4152 [] SETUP_EXCEPT L1
4153 [] <code for S>
4154 [] POP_BLOCK
4155 [] JUMP_FORWARD L0
4156
Guido van Rossum3f5da241990-12-20 15:06:42 +00004157 [tb, val, exc] L1: DUP )
4158 [tb, val, exc, exc] <evaluate E1> )
4159 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4160 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4161 [tb, val, exc, 1] POP )
4162 [tb, val, exc] POP
4163 [tb, val] <assign to V1> (or POP if no V1)
4164 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004165 [] <code for S1>
4166 JUMP_FORWARD L0
4167
Guido van Rossum3f5da241990-12-20 15:06:42 +00004168 [tb, val, exc, 0] L2: POP
4169 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004170 .............................etc.......................
4171
Guido van Rossum3f5da241990-12-20 15:06:42 +00004172 [tb, val, exc, 0] Ln+1: POP
4173 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004174
4175 [] L0: <next statement>
4176
4177 Of course, parts are not generated if Vi or Ei is not present.
4178*/
4179
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004181com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004182{
4183 int except_anchor = 0;
4184 int end_anchor = 0;
4185 int else_anchor = 0;
4186 int i;
4187 node *ch;
4188
4189 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4190 block_push(c, SETUP_EXCEPT);
4191 com_node(c, CHILD(n, 2));
4192 com_addbyte(c, POP_BLOCK);
4193 block_pop(c, SETUP_EXCEPT);
4194 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4195 com_backpatch(c, except_anchor);
4196 for (i = 3;
4197 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4198 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004199 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004200 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004201 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004202 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004203 break;
4204 }
4205 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004206 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004207 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004208 if (NCH(ch) > 1) {
4209 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004210 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004211 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004212 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004213 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004214 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4215 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004216 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004217 }
4218 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004219 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004220 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004221 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004223 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004224 com_pop(c, 1);
4225 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004226 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 com_node(c, CHILD(n, i+2));
4229 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4230 if (except_anchor) {
4231 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004232 /* We come in with [tb, val, exc, 0] on the
4233 stack; one pop and it's the same as
4234 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004235 com_addbyte(c, POP_TOP);
4236 }
4237 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004238 /* We actually come in here with [tb, val, exc] but the
4239 END_FINALLY will zap those and jump around.
4240 The c_stacklevel does not reflect them so we need not pop
4241 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004242 com_addbyte(c, END_FINALLY);
4243 com_backpatch(c, else_anchor);
4244 if (i < NCH(n))
4245 com_node(c, CHILD(n, i+2));
4246 com_backpatch(c, end_anchor);
4247}
4248
4249static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004250com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004251{
4252 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004253 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004254
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004255 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4256 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004257 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004258 com_addbyte(c, POP_BLOCK);
4259 block_pop(c, SETUP_FINALLY);
4260 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004261 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004262 /* While the generated code pushes only one item,
4263 the try-finally handling can enter here with
4264 up to three items. OK, here are the details:
4265 3 for an exception, 2 for RETURN, 1 for BREAK. */
4266 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004267 com_backpatch(c, finally_anchor);
4268 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004269 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004270 com_node(c, ch);
4271 com_addbyte(c, END_FINALLY);
4272 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004273 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004274}
4275
4276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004277com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004278{
4279 REQ(n, try_stmt);
4280 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4281 | 'try' ':' suite 'finally' ':' suite */
4282 if (TYPE(CHILD(n, 3)) != except_clause)
4283 com_try_finally(c, n);
4284 else
4285 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004286}
4287
Guido van Rossum8b993a91997-01-17 21:04:03 +00004288static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004289get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004290{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004291 int i;
4292
Guido van Rossum8b993a91997-01-17 21:04:03 +00004293 /* Label to avoid tail recursion */
4294 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004295 switch (TYPE(n)) {
4296
4297 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004298 if (NCH(n) == 1) {
4299 n = CHILD(n, 0);
4300 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004301 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004302 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004303 case file_input:
4304 for (i = 0; i < NCH(n); i++) {
4305 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004306 if (TYPE(ch) == stmt) {
4307 n = ch;
4308 goto next;
4309 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004310 }
4311 break;
4312
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004313 case stmt:
4314 case simple_stmt:
4315 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004316 n = CHILD(n, 0);
4317 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004318
4319 case expr_stmt:
4320 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004321 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004322 case test:
4323 case and_test:
4324 case not_test:
4325 case comparison:
4326 case expr:
4327 case xor_expr:
4328 case and_expr:
4329 case shift_expr:
4330 case arith_expr:
4331 case term:
4332 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004333 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004334 if (NCH(n) == 1) {
4335 n = CHILD(n, 0);
4336 goto next;
4337 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004338 break;
4339
4340 case atom:
4341 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004342 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004343 break;
4344
4345 }
4346 return NULL;
4347}
4348
Guido van Rossum79f25d91997-04-29 20:08:16 +00004349static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004350get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004351{
Guido van Rossum541563e1999-01-28 15:08:09 +00004352 /* Don't generate doc-strings if run with -OO */
4353 if (Py_OptimizeFlag > 1)
4354 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004355 n = get_rawdocstring(n);
4356 if (n == NULL)
4357 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004358 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004359}
4360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004362com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004363{
4364 REQ(n, suite);
4365 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4366 if (NCH(n) == 1) {
4367 com_node(c, CHILD(n, 0));
4368 }
4369 else {
4370 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004371 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004372 node *ch = CHILD(n, i);
4373 if (TYPE(ch) == stmt)
4374 com_node(c, ch);
4375 }
4376 }
4377}
4378
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004379/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004380static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004381com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004382{
4383 int i = c->c_nblocks;
4384 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4385 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4386 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004387 else if (i <= 0) {
4388 /* at the outer level */
4389 com_error(c, PyExc_SyntaxError,
4390 "'continue' not properly in loop");
4391 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004392 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004393 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004394 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004395 if (c->c_block[j] == SETUP_LOOP)
4396 break;
4397 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004398 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004399 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004400 for (; i > j; --i) {
4401 if (c->c_block[i] == SETUP_EXCEPT ||
4402 c->c_block[i] == SETUP_FINALLY) {
4403 com_addoparg(c, CONTINUE_LOOP,
4404 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004405 return;
4406 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004407 if (c->c_block[i] == END_FINALLY) {
4408 com_error(c, PyExc_SyntaxError,
4409 "'continue' not supported inside 'finally' clause");
4410 return;
4411 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004412 }
4413 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004414 com_error(c, PyExc_SyntaxError,
4415 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004416 }
4417 /* XXX Could allow it inside a 'finally' clause
4418 XXX if we could pop the exception still on the stack */
4419}
4420
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004421/* Return the number of default values in the argument list.
4422
4423 If a non-default argument follows a default argument, set an
4424 exception and return -1.
4425*/
4426
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004427static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004428com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004429{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004430 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004431 if (TYPE(n) == lambdef) {
4432 /* lambdef: 'lambda' [varargslist] ':' test */
4433 n = CHILD(n, 1);
4434 }
4435 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004436 REQ(n, funcdef);
4437 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4438 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004439 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4440 n = CHILD(n, 1);
4441 }
4442 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004443 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004444 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004445 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004446 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4447 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004448 ndefs = 0;
4449 for (i = 0; i < nch; i++) {
4450 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004451 if (TYPE(CHILD(n, i)) == STAR ||
4452 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004453 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004454 i++;
4455 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004456 t = RPAR; /* Anything except EQUAL or COMMA */
4457 else
4458 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004459 if (t == EQUAL) {
4460 i++;
4461 ndefs++;
4462 com_node(c, CHILD(n, i));
4463 i++;
4464 if (i >= nch)
4465 break;
4466 t = TYPE(CHILD(n, i));
4467 }
4468 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004469 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004470 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004471 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004472 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004473 return -1;
4474 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004475 }
4476 if (t != COMMA)
4477 break;
4478 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004479 return ndefs;
4480}
4481
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004482static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004483com_decorator_name(struct compiling *c, node *n)
4484{
4485 /* dotted_name: NAME ('.' NAME)* */
4486
4487 int i, nch;
4488 node *varname;
4489
4490 REQ(n, dotted_name);
4491 nch = NCH(n);
4492 assert(nch >= 1 && nch % 2 == 1);
4493
4494 varname = CHILD(n, 0);
4495 REQ(varname, NAME);
4496 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004497 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004498
4499 for (i = 1; i < nch; i += 2) {
4500 node *attrname;
4501
4502 REQ(CHILD(n, i), DOT);
4503
4504 attrname = CHILD(n, i + 1);
4505 REQ(attrname, NAME);
4506 com_addop_name(c, LOAD_ATTR, STR(attrname));
4507 }
4508}
4509
4510static void
4511com_decorator(struct compiling *c, node *n)
4512{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004513 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004514 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004515 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004516 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004517 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004518 com_decorator_name(c, CHILD(n, 1));
4519
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004520 if (nch > 3) {
4521 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004522 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004523 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004524 com_call_function(c, CHILD(n, 3));
4525 }
4526}
4527
4528static int
4529com_decorators(struct compiling *c, node *n)
4530{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004531 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004532
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004533 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004534 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004535 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004536
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004537 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004538 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004539 REQ(ch, decorator);
4540
4541 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004542 }
4543
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004544 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004545}
4546
4547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004548com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004549{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004551 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004552
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004553 REQ(n, funcdef);
4554 /* -6 -5 -4 -3 -2 -1
4555 funcdef: [decorators] 'def' NAME parameters ':' suite */
4556
4557 if (NCH(n) == 6)
4558 ndecorators = com_decorators(c, CHILD(n, 0));
4559 else
4560 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004561
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004562 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004563 if (ndefs < 0)
4564 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004565 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004566 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004567 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004568 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004569 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004570 c->c_errors++;
4571 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004572 int closure = com_make_closure(c, (PyCodeObject *)co);
4573 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004574 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004575 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004576 if (closure)
4577 com_addoparg(c, MAKE_CLOSURE, ndefs);
4578 else
4579 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004580 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004581
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004582 while (ndecorators > 0) {
4583 com_addoparg(c, CALL_FUNCTION, 1);
4584 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004585 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004586 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004587
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004588 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004589 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004590 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004591 }
4592}
4593
4594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004595com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004596{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004597 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004598 REQ(n, testlist);
4599 /* testlist: test (',' test)* [','] */
4600 for (i = 0; i < NCH(n); i += 2)
4601 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004602 i = (NCH(n)+1) / 2;
4603 com_addoparg(c, BUILD_TUPLE, i);
4604 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004605}
4606
4607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004608com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609{
Guido van Rossum25831651993-05-19 14:50:45 +00004610 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004611 PyObject *v;
4612 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004613 char *name;
4614
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004615 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004616 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004617 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004618 c->c_errors++;
4619 return;
4620 }
4621 /* Push the class name on the stack */
4622 i = com_addconst(c, v);
4623 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004624 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004625 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004626 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004627 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004628 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004629 com_push(c, 1);
4630 }
Guido van Rossum25831651993-05-19 14:50:45 +00004631 else
4632 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004634 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004635 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004636 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004637 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004638 c->c_errors++;
4639 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004640 int closure = com_make_closure(c, co);
4641 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004642 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004643 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004644 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004645 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004646 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004647 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004648 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004649 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004650 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004651 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004652 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004653 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004654 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004655 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004656}
4657
4658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004659com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004660{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004662 if (c->c_errors)
4663 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004664 switch (TYPE(n)) {
4665
4666 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004667
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004668 case funcdef:
4669 com_funcdef(c, n);
4670 break;
4671 case classdef:
4672 com_classdef(c, n);
4673 break;
4674
4675 /* Trivial parse tree nodes */
4676
4677 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004678 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004679 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004680 n = CHILD(n, 0);
4681 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004682
4683 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004684 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004685 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004686 {
4687 int i;
4688 for (i = 0; i < NCH(n)-1; i += 2)
4689 com_node(c, CHILD(n, i));
4690 }
4691 break;
4692
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004693 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004694 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004695 n = CHILD(n, 0);
4696 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004697
4698 /* Statement nodes */
4699
4700 case expr_stmt:
4701 com_expr_stmt(c, n);
4702 break;
4703 case print_stmt:
4704 com_print_stmt(c, n);
4705 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004706 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004707 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004708 break;
4709 case pass_stmt:
4710 break;
4711 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004712 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004713 com_error(c, PyExc_SyntaxError,
4714 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004715 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004716 com_addbyte(c, BREAK_LOOP);
4717 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004718 case continue_stmt:
4719 com_continue_stmt(c, n);
4720 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004721 case return_stmt:
4722 com_return_stmt(c, n);
4723 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004724 case yield_stmt:
4725 com_yield_stmt(c, n);
4726 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004727 case raise_stmt:
4728 com_raise_stmt(c, n);
4729 break;
4730 case import_stmt:
4731 com_import_stmt(c, n);
4732 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004733 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004734 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004735 case exec_stmt:
4736 com_exec_stmt(c, n);
4737 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004738 case assert_stmt:
4739 com_assert_stmt(c, n);
4740 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 case if_stmt:
4742 com_if_stmt(c, n);
4743 break;
4744 case while_stmt:
4745 com_while_stmt(c, n);
4746 break;
4747 case for_stmt:
4748 com_for_stmt(c, n);
4749 break;
4750 case try_stmt:
4751 com_try_stmt(c, n);
4752 break;
4753 case suite:
4754 com_suite(c, n);
4755 break;
4756
4757 /* Expression nodes */
4758
4759 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004760 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004761 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004762 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004763 break;
4764 case test:
4765 com_test(c, n);
4766 break;
4767 case and_test:
4768 com_and_test(c, n);
4769 break;
4770 case not_test:
4771 com_not_test(c, n);
4772 break;
4773 case comparison:
4774 com_comparison(c, n);
4775 break;
4776 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004777 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004778 break;
4779 case expr:
4780 com_expr(c, n);
4781 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004782 case xor_expr:
4783 com_xor_expr(c, n);
4784 break;
4785 case and_expr:
4786 com_and_expr(c, n);
4787 break;
4788 case shift_expr:
4789 com_shift_expr(c, n);
4790 break;
4791 case arith_expr:
4792 com_arith_expr(c, n);
4793 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004794 case term:
4795 com_term(c, n);
4796 break;
4797 case factor:
4798 com_factor(c, n);
4799 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004800 case power:
4801 com_power(c, n);
4802 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004803 case atom:
4804 com_atom(c, n);
4805 break;
4806
4807 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004808 com_error(c, PyExc_SystemError,
4809 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004810 }
4811}
4812
Tim Petersdbd9ba62000-07-09 03:09:57 +00004813static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004814
4815static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004816com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004817{
4818 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4819 if (TYPE(CHILD(n, 0)) == LPAR)
4820 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004821 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004822 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004823 com_pop(c, 1);
4824 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004825}
4826
4827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004828com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004829{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004830 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004831 if (NCH(n) == 1) {
4832 com_fpdef(c, CHILD(n, 0));
4833 }
4834 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004835 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004836 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004837 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 for (i = 0; i < NCH(n); i += 2)
4839 com_fpdef(c, CHILD(n, i));
4840 }
4841}
4842
4843static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004844com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004845{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004846 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004847 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004848 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004849 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004850 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004851 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004852 nch = NCH(n);
4853 /* Enter all arguments in table of locals */
4854 for (i = 0, narg = 0; i < nch; i++) {
4855 node *ch = CHILD(n, i);
4856 node *fp;
4857 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004858 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004859 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4860 fp = CHILD(ch, 0);
4861 if (TYPE(fp) != NAME) {
4862 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4863 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004864 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004865 narg++;
4866 /* all name updates handled by symtable */
4867 if (++i >= nch)
4868 break;
4869 ch = CHILD(n, i);
4870 if (TYPE(ch) == EQUAL)
4871 i += 2;
4872 else
4873 REQ(ch, COMMA);
4874 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004875 if (complex) {
4876 /* Generate code for complex arguments only after
4877 having counted the simple arguments */
4878 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004879 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004880 node *ch = CHILD(n, i);
4881 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004882 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004883 break;
4884 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4885 fp = CHILD(ch, 0);
4886 if (TYPE(fp) != NAME) {
4887 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004888 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004889 com_fpdef(c, ch);
4890 }
4891 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004892 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004893 break;
4894 ch = CHILD(n, i);
4895 if (TYPE(ch) == EQUAL)
4896 i += 2;
4897 else
4898 REQ(ch, COMMA);
4899 }
4900 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004901}
4902
4903static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004904com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004905{
4906 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004907 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004908 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004909 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004910 if (doc != NULL) {
4911 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004912 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004913 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004914 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004915 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004916 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004917 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004918 for (i = 0; i < NCH(n); i++) {
4919 node *ch = CHILD(n, i);
4920 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4921 com_node(c, ch);
4922 }
4923}
4924
4925/* Top-level compile-node interface */
4926
4927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004928compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004929{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004930 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004931 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004932 REQ(n, funcdef);
4933 /* -6 -5 -4 -3 -2 -1
4934 funcdef: [decorators] 'def' NAME parameters ':' suite */
4935 c->c_name = STR(RCHILD(n, -4));
4936 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004937 if (doc != NULL) {
4938 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004939 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004940 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004941 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004942 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004943 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004944 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004945 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004946 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004947 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004948 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004949 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004950 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004951 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4952 com_push(c, 1);
4953 com_addbyte(c, RETURN_VALUE);
4954 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004955}
4956
4957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004958compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004959{
Guido van Rossum590baa41993-11-30 13:40:46 +00004960 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004961 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004962 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004963
4964 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004965 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004966 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004967 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004968 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004969 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004970 else
4971 ch = CHILD(n, 2);
4972 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004973 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004974 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004975}
4976
4977static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004978compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004979{
4980 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004981 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004982 REQ(n, classdef);
4983 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4984 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004985 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004986 /* Initialize local __module__ from global __name__ */
4987 com_addop_name(c, LOAD_GLOBAL, "__name__");
4988 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004989 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004990 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004991 if (doc != NULL) {
4992 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004993 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004994 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004995 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004996 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004997 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004998 }
4999 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00005000 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005001 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00005002 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005003 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005004 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005005 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005006 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005007}
5008
5009static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005010compile_generator_expression(struct compiling *c, node *n)
5011{
5012 /* testlist_gexp: test gen_for */
5013 /* argument: test gen_for */
5014 REQ(CHILD(n, 0), test);
5015 REQ(CHILD(n, 1), gen_for);
5016
5017 c->c_name = "<generator expression>";
5018 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5019
5020 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5021 com_push(c, 1);
5022 com_addbyte(c, RETURN_VALUE);
5023 com_pop(c, 1);
5024}
5025
5026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005027compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005028{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005029 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005030
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005031 switch (TYPE(n)) {
5032
Guido van Rossum4c417781991-01-21 16:09:22 +00005033 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005034 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005035 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005036 n = CHILD(n, 0);
5037 if (TYPE(n) != NEWLINE)
5038 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005039 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005040 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5041 com_push(c, 1);
5042 com_addbyte(c, RETURN_VALUE);
5043 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005044 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005045 break;
5046
Guido van Rossum4c417781991-01-21 16:09:22 +00005047 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005048 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005049 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005050 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5051 com_push(c, 1);
5052 com_addbyte(c, RETURN_VALUE);
5053 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005054 break;
5055
Guido van Rossum590baa41993-11-30 13:40:46 +00005056 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005057 com_node(c, CHILD(n, 0));
5058 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005059 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005060 break;
5061
Guido van Rossum590baa41993-11-30 13:40:46 +00005062 case lambdef: /* anonymous function definition */
5063 compile_lambdef(c, n);
5064 break;
5065
Guido van Rossum4c417781991-01-21 16:09:22 +00005066 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005067 compile_funcdef(c, n);
5068 break;
5069
Guido van Rossum4c417781991-01-21 16:09:22 +00005070 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005071 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005072 break;
5073
Raymond Hettinger354433a2004-05-19 08:20:33 +00005074 case testlist_gexp: /* A generator expression */
5075 case argument: /* A generator expression */
5076 compile_generator_expression(c, n);
5077 break;
5078
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005079 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005080 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005081 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005082 }
5083}
5084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005085static PyObject *
5086dict_keys_inorder(PyObject *dict, int offset)
5087{
5088 PyObject *tuple, *k, *v;
5089 int i, pos = 0, size = PyDict_Size(dict);
5090
5091 tuple = PyTuple_New(size);
5092 if (tuple == NULL)
5093 return NULL;
5094 while (PyDict_Next(dict, &pos, &k, &v)) {
5095 i = PyInt_AS_LONG(v);
5096 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005097 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098 PyTuple_SET_ITEM(tuple, i - offset, k);
5099 }
5100 return tuple;
5101}
5102
Guido van Rossum79f25d91997-04-29 20:08:16 +00005103PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005104PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005105{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005106 return PyNode_CompileFlags(n, filename, NULL);
5107}
5108
5109PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005110PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005111{
5112 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005113}
5114
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005115struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005116PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005117{
5118 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005119 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005120
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005121 ff = PyNode_Future(n, filename);
5122 if (ff == NULL)
5123 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005124 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005125 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005126 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005127 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005128 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005129 return st;
5130}
5131
Guido van Rossum79f25d91997-04-29 20:08:16 +00005132static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005133icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005134{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005135 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005136}
5137
Guido van Rossum79f25d91997-04-29 20:08:16 +00005138static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005139jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005140 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005141{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005142 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005143 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005144 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005145 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005146 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5147 sc.c_encoding = "utf-8";
5148 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005149 sc.c_encoding = STR(n);
5150 n = CHILD(n, 0);
5151 } else {
5152 sc.c_encoding = NULL;
5153 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005154 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005155 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005157 /* c_symtable still points to parent's symbols */
5158 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005159 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005160 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005161 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005162 if (base->c_encoding != NULL) {
5163 assert(sc.c_encoding == NULL);
5164 sc.c_encoding = base->c_encoding;
5165 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005167 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005168 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005169 if (sc.c_future == NULL) {
5170 com_free(&sc);
5171 return NULL;
5172 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005173 if (flags) {
5174 int merged = sc.c_future->ff_features |
5175 flags->cf_flags;
5176 sc.c_future->ff_features = merged;
5177 flags->cf_flags = merged;
5178 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005179 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5180 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 com_free(&sc);
5182 return NULL;
5183 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005184 /* reset symbol table for second pass */
5185 sc.c_symtable->st_nscopes = 1;
5186 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005187 }
5188 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005189 if (symtable_load_symbols(&sc) < 0) {
5190 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005192 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005193 compile_node(&sc, n);
5194 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005195 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005196 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005197 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005198 names = PyList_AsTuple(sc.c_names);
5199 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005200 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5201 freevars = dict_keys_inorder(sc.c_freevars,
5202 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005203 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005204 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005205 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5206 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005207 if (!PyErr_Occurred())
5208 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 sc.c_nlocals,
5210 sc.c_maxstacklevel,
5211 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005212 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005213 consts,
5214 names,
5215 varnames,
5216 freevars,
5217 cellvars,
5218 filename,
5219 name,
5220 sc.c_firstlineno,
5221 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005222 Py_XDECREF(consts);
5223 Py_XDECREF(names);
5224 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005225 Py_XDECREF(freevars);
5226 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005227 Py_XDECREF(filename);
5228 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005229 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005230 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005231 else if (!PyErr_Occurred()) {
5232 /* This could happen if someone called PyErr_Clear() after an
5233 error was reported above. That's not supposed to happen,
5234 but I just plugged one case and I'm not sure there can't be
5235 others. In that case, raise SystemError so that at least
5236 it gets reported instead dumping core. */
5237 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5238 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005239 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005240 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005241 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005242 sc.c_symtable = NULL;
5243 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005244 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005245 return co;
5246}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005247
5248int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005249PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005250{
5251 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005252 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005253 int line = co->co_firstlineno;
5254 int addr = 0;
5255 while (--size >= 0) {
5256 addr += *p++;
5257 if (addr > addrq)
5258 break;
5259 line += *p++;
5260 }
5261 return line;
5262}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005264/* The test for LOCAL must come before the test for FREE in order to
5265 handle classes where name is both local and free. The local var is
5266 a method and the free var is a free var referenced within a method.
5267*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005268
5269static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005270get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005271{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005272 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005273 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005274
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005275 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5276 return CELL;
5277 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5278 return LOCAL;
5279 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5280 return FREE;
5281 v = PyDict_GetItemString(c->c_globals, name);
5282 if (v) {
5283 if (v == Py_None)
5284 return GLOBAL_EXPLICIT;
5285 else {
5286 return GLOBAL_IMPLICIT;
5287 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005288 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005289 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005290 "unknown scope for %.100s in %.100s(%s) "
5291 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5292 name, c->c_name,
5293 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5294 c->c_filename,
5295 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5296 PyObject_REPR(c->c_locals),
5297 PyObject_REPR(c->c_globals)
5298 );
5299
5300 Py_FatalError(buf);
5301 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005302}
5303
Guido van Rossum207fda62001-03-02 03:30:41 +00005304/* Helper functions to issue warnings */
5305
5306static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005307issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005308{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005309 if (PyErr_Occurred()) {
5310 /* This can happen because symtable_node continues
5311 processing even after raising a SyntaxError.
5312 Calling PyErr_WarnExplicit now would clobber the
5313 pending exception; instead we fail and let that
5314 exception propagate.
5315 */
5316 return -1;
5317 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005318 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5319 lineno, NULL, NULL) < 0) {
5320 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5321 PyErr_SetString(PyExc_SyntaxError, msg);
5322 PyErr_SyntaxLocation(filename, lineno);
5323 }
5324 return -1;
5325 }
5326 return 0;
5327}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005328
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005329static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005330symtable_warn(struct symtable *st, char *msg)
5331{
Guido van Rossum207fda62001-03-02 03:30:41 +00005332 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005333 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005334 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005335 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005336 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005337}
5338
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005339/* Helper function for setting lineno and filename */
5340
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005341static struct symtable *
5342symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005343{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005344 struct symtable *st;
5345
5346 st = symtable_init();
5347 if (st == NULL)
5348 return NULL;
5349 st->st_future = ff;
5350 st->st_filename = filename;
5351 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5352 if (st->st_errors > 0)
5353 goto fail;
5354 symtable_node(st, n);
5355 if (st->st_errors > 0)
5356 goto fail;
5357 return st;
5358 fail:
5359 if (!PyErr_Occurred()) {
5360 /* This could happen because after a syntax error is
5361 detected, the symbol-table-building continues for
5362 a while, and PyErr_Clear() might erroneously be
5363 called during that process. One such case has been
5364 fixed, but there might be more (now or later).
5365 */
5366 PyErr_SetString(PyExc_SystemError, "lost exception");
5367 }
5368 st->st_future = NULL;
5369 st->st_filename = NULL;
5370 PySymtable_Free(st);
5371 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005372}
5373
5374static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005375symtable_init_compiling_symbols(struct compiling *c)
5376{
5377 PyObject *varnames;
5378
5379 varnames = c->c_symtable->st_cur->ste_varnames;
5380 if (varnames == NULL) {
5381 varnames = PyList_New(0);
5382 if (varnames == NULL)
5383 return -1;
5384 c->c_symtable->st_cur->ste_varnames = varnames;
5385 Py_INCREF(varnames);
5386 } else
5387 Py_INCREF(varnames);
5388 c->c_varnames = varnames;
5389
5390 c->c_globals = PyDict_New();
5391 if (c->c_globals == NULL)
5392 return -1;
5393 c->c_freevars = PyDict_New();
5394 if (c->c_freevars == NULL)
5395 return -1;
5396 c->c_cellvars = PyDict_New();
5397 if (c->c_cellvars == NULL)
5398 return -1;
5399 return 0;
5400}
5401
5402struct symbol_info {
5403 int si_nlocals;
5404 int si_ncells;
5405 int si_nfrees;
5406 int si_nimplicit;
5407};
5408
5409static void
5410symtable_init_info(struct symbol_info *si)
5411{
5412 si->si_nlocals = 0;
5413 si->si_ncells = 0;
5414 si->si_nfrees = 0;
5415 si->si_nimplicit = 0;
5416}
5417
5418static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005419symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005420 struct symbol_info *si)
5421{
5422 PyObject *dict, *v;
5423
5424 /* Seperate logic for DEF_FREE. If it occurs in a function,
5425 it indicates a local that we must allocate storage for (a
5426 cell var). If it occurs in a class, then the class has a
5427 method and a free variable with the same name.
5428 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005429 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005430 /* If it isn't declared locally, it can't be a cell. */
5431 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5432 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005433 v = PyInt_FromLong(si->si_ncells++);
5434 dict = c->c_cellvars;
5435 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005436 /* If it is free anyway, then there is no need to do
5437 anything here.
5438 */
5439 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005440 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005441 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005442 v = PyInt_FromLong(si->si_nfrees++);
5443 dict = c->c_freevars;
5444 }
5445 if (v == NULL)
5446 return -1;
5447 if (PyDict_SetItem(dict, name, v) < 0) {
5448 Py_DECREF(v);
5449 return -1;
5450 }
5451 Py_DECREF(v);
5452 return 0;
5453}
5454
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005455/* If a variable is a cell and an argument, make sure that appears in
5456 co_cellvars before any variable to its right in varnames.
5457*/
5458
5459
5460static int
5461symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5462 PyObject *varnames, int flags)
5463{
Tim Petersb39903b2003-03-24 17:22:24 +00005464 PyObject *v = NULL;
5465 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005466 int i, pos;
5467
5468 if (flags & CO_VARARGS)
5469 argcount++;
5470 if (flags & CO_VARKEYWORDS)
5471 argcount++;
5472 for (i = argcount; --i >= 0; ) {
5473 v = PyList_GET_ITEM(varnames, i);
5474 if (PyDict_GetItem(*cellvars, v)) {
5475 if (list == NULL) {
5476 list = PyList_New(1);
5477 if (list == NULL)
5478 return -1;
5479 PyList_SET_ITEM(list, 0, v);
5480 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005481 } else {
5482 if (PyList_Insert(list, 0, v) < 0) {
5483 Py_DECREF(list);
5484 return -1;
5485 }
5486 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005487 }
5488 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005489 if (list == NULL)
5490 return 0;
5491
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005492 /* There are cellvars that are also arguments. Create a dict
5493 to replace cellvars and put the args at the front.
5494 */
5495 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005496 if (d == NULL)
5497 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005498 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5499 v = PyInt_FromLong(i);
5500 if (v == NULL)
5501 goto fail;
5502 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5503 goto fail;
5504 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5505 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005506 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005507 }
5508 pos = 0;
5509 i = PyList_GET_SIZE(list);
5510 Py_DECREF(list);
5511 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5512 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005513 if (w == NULL)
5514 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005515 if (PyDict_SetItem(d, v, w) < 0) {
5516 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005517 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005518 goto fail;
5519 }
5520 Py_DECREF(w);
5521 }
5522 Py_DECREF(*cellvars);
5523 *cellvars = d;
5524 return 1;
5525 fail:
5526 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005527 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005528 return -1;
5529}
5530
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005531static int
5532symtable_freevar_offsets(PyObject *freevars, int offset)
5533{
5534 PyObject *name, *v;
5535 int pos;
5536
5537 /* The cell vars are the first elements of the closure,
5538 followed by the free vars. Update the offsets in
5539 c_freevars to account for number of cellvars. */
5540 pos = 0;
5541 while (PyDict_Next(freevars, &pos, &name, &v)) {
5542 int i = PyInt_AS_LONG(v) + offset;
5543 PyObject *o = PyInt_FromLong(i);
5544 if (o == NULL)
5545 return -1;
5546 if (PyDict_SetItem(freevars, name, o) < 0) {
5547 Py_DECREF(o);
5548 return -1;
5549 }
5550 Py_DECREF(o);
5551 }
5552 return 0;
5553}
5554
5555static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005556symtable_check_unoptimized(struct compiling *c,
5557 PySymtableEntryObject *ste,
5558 struct symbol_info *si)
5559{
5560 char buf[300];
5561
5562 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5563 || (ste->ste_nested && si->si_nimplicit)))
5564 return 0;
5565
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005566#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5567
5568#define ILLEGAL_IS "is a nested function"
5569
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005570#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005571"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005572
5573#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005574"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005575
5576#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005577"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005578"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005579
5580 /* XXX perhaps the linenos for these opt-breaking statements
5581 should be stored so the exception can point to them. */
5582
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005583 if (ste->ste_child_free) {
5584 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005585 PyOS_snprintf(buf, sizeof(buf),
5586 ILLEGAL_IMPORT_STAR,
5587 PyString_AS_STRING(ste->ste_name),
5588 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005589 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005590 PyOS_snprintf(buf, sizeof(buf),
5591 ILLEGAL_BARE_EXEC,
5592 PyString_AS_STRING(ste->ste_name),
5593 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005594 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005595 PyOS_snprintf(buf, sizeof(buf),
5596 ILLEGAL_EXEC_AND_IMPORT_STAR,
5597 PyString_AS_STRING(ste->ste_name),
5598 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005599 }
5600 } else {
5601 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005602 PyOS_snprintf(buf, sizeof(buf),
5603 ILLEGAL_IMPORT_STAR,
5604 PyString_AS_STRING(ste->ste_name),
5605 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005606 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005607 PyOS_snprintf(buf, sizeof(buf),
5608 ILLEGAL_BARE_EXEC,
5609 PyString_AS_STRING(ste->ste_name),
5610 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005611 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005612 PyOS_snprintf(buf, sizeof(buf),
5613 ILLEGAL_EXEC_AND_IMPORT_STAR,
5614 PyString_AS_STRING(ste->ste_name),
5615 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005616 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005617 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005618
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005619 PyErr_SetString(PyExc_SyntaxError, buf);
5620 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5621 ste->ste_opt_lineno);
5622 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005623}
5624
5625static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005626symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5627 struct symbol_info *si)
5628{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005629 if (c->c_future)
5630 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005631 if (ste->ste_generator)
5632 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005633 if (ste->ste_type != TYPE_MODULE)
5634 c->c_flags |= CO_NEWLOCALS;
5635 if (ste->ste_type == TYPE_FUNCTION) {
5636 c->c_nlocals = si->si_nlocals;
5637 if (ste->ste_optimized == 0)
5638 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005639 else if (ste->ste_optimized != OPT_EXEC)
5640 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005641 }
5642 return 0;
5643}
5644
5645static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005646symtable_error(struct symtable *st, int lineno)
5647{
5648 if (lineno == 0)
5649 lineno = st->st_cur->ste_lineno;
5650 PyErr_SyntaxLocation(st->st_filename, lineno);
5651 st->st_errors++;
5652 return -1;
5653}
5654
5655static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005656symtable_load_symbols(struct compiling *c)
5657{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005658 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005659 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005660 PyObject *name, *varnames, *v;
5661 int i, flags, pos;
5662 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005663
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005664 v = NULL;
5665
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005666 if (symtable_init_compiling_symbols(c) < 0)
5667 goto fail;
5668 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005669 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005670 si.si_nlocals = PyList_GET_SIZE(varnames);
5671 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005673 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005674 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005675 if (v == NULL)
5676 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005677 if (PyDict_SetItem(c->c_locals,
5678 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 goto fail;
5680 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681 }
5682
5683 /* XXX The cases below define the rules for whether a name is
5684 local or global. The logic could probably be clearer. */
5685 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005686 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5687 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005688
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005690 /* undo the original DEF_FREE */
5691 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005693 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005694 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005695 2. Free variables in methods that are also class
5696 variables or declared global.
5697 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005698 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005699 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005700
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005701 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702 c->c_argcount--;
5703 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005704 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005705 c->c_argcount--;
5706 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005707 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005709 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005710 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005711 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005712 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005713 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005714 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005715 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5717 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005718 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005719 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005720 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005722 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005723 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 if (v == NULL)
5725 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005727 goto fail;
5728 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005729 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005730 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005732 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005733 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005734 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735 if (v == NULL)
5736 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005737 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738 goto fail;
5739 Py_DECREF(v);
5740 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005741 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005742 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005743 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005744 goto fail;
5745 if (st->st_nscopes != 1) {
5746 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005747 if (v == NULL)
5748 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005749 if (PyDict_SetItem(st->st_global,
5750 name, v))
5751 goto fail;
5752 Py_DECREF(v);
5753 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 }
5756 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005757 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5758
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005759 if (si.si_ncells > 1) { /* one cell is always in order */
5760 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5761 c->c_varnames, c->c_flags) < 0)
5762 return -1;
5763 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005764 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5765 return -1;
5766 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 fail:
5768 /* is this always the right thing to do? */
5769 Py_XDECREF(v);
5770 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005771}
5772
5773static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005774symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005775{
5776 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005777
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005778 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005779 if (st == NULL)
5780 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005781 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005782
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005783 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005784 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005785 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786 goto fail;
5787 if ((st->st_symbols = PyDict_New()) == NULL)
5788 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005789 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005790 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005791 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005792 st->st_private = NULL;
5793 return st;
5794 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005795 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796 return NULL;
5797}
5798
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005799void
5800PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801{
5802 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005803 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005804 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005805 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005806}
5807
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005808/* When the compiler exits a scope, it must should update the scope's
5809 free variable information with the list of free variables in its
5810 children.
5811
5812 Variables that are free in children and defined in the current
5813 scope are cellvars.
5814
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005815 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005816 false), free variables in children that are not defined here are
5817 implicit globals.
5818
5819*/
5820
5821static int
5822symtable_update_free_vars(struct symtable *st)
5823{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005824 int i, j, def;
5825 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005826 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005828 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005829 def = DEF_FREE_CLASS;
5830 else
5831 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005832 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005833 int pos = 0;
5834
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005835 if (list && PyList_SetSlice(list, 0,
5836 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005837 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005838 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005839 PyList_GET_ITEM(ste->ste_children, i);
5840 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005841 int flags = PyInt_AS_LONG(o);
5842 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005844 if (list == NULL) {
5845 list = PyList_New(0);
5846 if (list == NULL)
5847 return -1;
5848 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005849 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005850 if (PyList_Append(list, name) < 0) {
5851 Py_DECREF(list);
5852 return -1;
5853 }
5854 }
5855 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005856 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005857 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005858 v = PyDict_GetItem(ste->ste_symbols, name);
5859 /* If a name N is declared global in scope A and
5860 referenced in scope B contained (perhaps
5861 indirectly) in A and there are no scopes
5862 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005863 is global in B. Unless A is a class scope,
5864 because class scopes are not considered for
5865 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005866 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005867 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005868 int flags = PyInt_AS_LONG(v);
5869 if (flags & DEF_GLOBAL) {
5870 symtable_undo_free(st, child->ste_id,
5871 name);
5872 continue;
5873 }
5874 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005875 if (ste->ste_nested) {
5876 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005877 name, def) < 0) {
5878 Py_DECREF(list);
5879 return -1;
5880 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005881 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005882 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005883 name) < 0) {
5884 Py_DECREF(list);
5885 return -1;
5886 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005887 }
5888 }
5889 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005890
5891 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005892 return 0;
5893}
5894
5895/* If the current scope is a non-nested class or if name is not
5896 defined in the current, non-nested scope, then it is an implicit
5897 global in all nested scopes.
5898*/
5899
5900static int
5901symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5902{
5903 PyObject *o;
5904 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005905 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005906
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005907 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005908 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005909 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005910 if (o == NULL)
5911 return symtable_undo_free(st, child, name);
5912 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005913
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005914 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005915 return symtable_undo_free(st, child, name);
5916 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005917 return symtable_add_def_o(st, ste->ste_symbols,
5918 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005919}
5920
5921static int
5922symtable_undo_free(struct symtable *st, PyObject *id,
5923 PyObject *name)
5924{
5925 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005926 PyObject *info;
5927 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005928
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005929 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5930 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005931 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005932
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005933 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005934 if (info == NULL)
5935 return 0;
5936 v = PyInt_AS_LONG(info);
5937 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005938 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005939 DEF_FREE_GLOBAL) < 0)
5940 return -1;
5941 } else
5942 /* If the name is defined here or declared global,
5943 then the recursion stops. */
5944 return 0;
5945
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005946 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5947 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005948 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005949 PyList_GET_ITEM(ste->ste_children, i);
5950 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005951 if (x < 0)
5952 return x;
5953 }
5954 return 0;
5955}
5956
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005957/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5958 This reference is released when the scope is exited, via the DECREF
5959 in symtable_exit_scope().
5960*/
5961
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005962static int
5963symtable_exit_scope(struct symtable *st)
5964{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005965 int end;
5966
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005967 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005968 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005969 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005970 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005971 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5972 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005973 if (PySequence_DelItem(st->st_stack, end) < 0)
5974 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005975 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005976}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005977
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005978static void
5979symtable_enter_scope(struct symtable *st, char *name, int type,
5980 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005981{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005982 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005983
5984 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005985 prev = st->st_cur;
5986 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005987 st->st_errors++;
5988 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005989 }
5990 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005991 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005992 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005993 if (st->st_cur == NULL) {
5994 st->st_errors++;
5995 return;
5996 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005997 if (strcmp(name, TOP) == 0)
5998 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005999 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006000 if (PyList_Append(prev->ste_children,
6001 (PyObject *)st->st_cur) < 0)
6002 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006003 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006004}
6005
6006static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006007symtable_lookup(struct symtable *st, char *name)
6008{
6009 char buffer[MANGLE_LEN];
6010 PyObject *v;
6011 int flags;
6012
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006013 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006014 name = buffer;
6015 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6016 if (v == NULL) {
6017 if (PyErr_Occurred())
6018 return -1;
6019 else
6020 return 0;
6021 }
6022
6023 flags = PyInt_AS_LONG(v);
6024 return flags;
6025}
6026
6027static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006028symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006030 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006031 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006032 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006033
Guido van Rossumb7164622002-08-16 02:48:11 +00006034 /* Warn about None, except inside a tuple (where the assignment
6035 code already issues a warning). */
6036 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6037 *name == 'N' && strcmp(name, "None") == 0)
6038 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006039 PyErr_SetString(PyExc_SyntaxError,
6040 "Invalid syntax. Assignment to None.");
6041 symtable_error(st, 0);
6042 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006043 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006044 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045 name = buffer;
6046 if ((s = PyString_InternFromString(name)) == NULL)
6047 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006048 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6049 Py_DECREF(s);
6050 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006051}
6052
6053/* Must only be called with mangled names */
6054
6055static int
6056symtable_add_def_o(struct symtable *st, PyObject *dict,
6057 PyObject *name, int flag)
6058{
6059 PyObject *o;
6060 int val;
6061
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006062 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006063 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006064 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006065 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006066 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006067 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006068 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006069 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006070 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006071 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006072 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006073 if (o == NULL)
6074 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006075 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006076 Py_DECREF(o);
6077 return -1;
6078 }
6079 Py_DECREF(o);
6080
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006081 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006082 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006083 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006084 } else if (flag & DEF_GLOBAL) {
6085 /* XXX need to update DEF_GLOBAL for other flags too;
6086 perhaps only DEF_FREE_GLOBAL */
6087 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006088 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006089 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006090 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006091 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006092 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006093 if (o == NULL)
6094 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006095 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006096 Py_DECREF(o);
6097 return -1;
6098 }
6099 Py_DECREF(o);
6100 }
6101 return 0;
6102}
6103
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006104#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006105
Tim Peters08a898f2001-06-28 01:52:22 +00006106/* Look for a yield stmt under n. Return 1 if found, else 0.
6107 This hack is used to look inside "if 0:" blocks (which are normally
6108 ignored) in case those are the only places a yield occurs (so that this
6109 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006110static int
6111look_for_yield(node *n)
6112{
6113 int i;
6114
6115 for (i = 0; i < NCH(n); ++i) {
6116 node *kid = CHILD(n, i);
6117
6118 switch (TYPE(kid)) {
6119
6120 case classdef:
6121 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006122 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006123 /* Stuff in nested functions and classes can't make
6124 the parent a generator. */
6125 return 0;
6126
6127 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006128 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006129
6130 default:
6131 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006132 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006133 }
6134 }
6135 return 0;
6136}
6137
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006138static void
6139symtable_node(struct symtable *st, node *n)
6140{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006141 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006142
6143 loop:
6144 switch (TYPE(n)) {
6145 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006146 char *func_name;
6147 if (NCH(n) == 6)
6148 symtable_node(st, CHILD(n, 0));
6149 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006150 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006151 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006152 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153 symtable_funcdef(st, n);
6154 symtable_exit_scope(st);
6155 break;
6156 }
6157 case lambdef:
6158 if (NCH(n) == 4)
6159 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006160 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161 symtable_funcdef(st, n);
6162 symtable_exit_scope(st);
6163 break;
6164 case classdef: {
6165 char *tmp, *class_name = STR(CHILD(n, 1));
6166 symtable_add_def(st, class_name, DEF_LOCAL);
6167 if (TYPE(CHILD(n, 2)) == LPAR) {
6168 node *bases = CHILD(n, 3);
6169 int i;
6170 for (i = 0; i < NCH(bases); i += 2) {
6171 symtable_node(st, CHILD(bases, i));
6172 }
6173 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006174 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006175 tmp = st->st_private;
6176 st->st_private = class_name;
6177 symtable_node(st, CHILD(n, NCH(n) - 1));
6178 st->st_private = tmp;
6179 symtable_exit_scope(st);
6180 break;
6181 }
6182 case if_stmt:
6183 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006184 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6185 if (st->st_cur->ste_generator == 0)
6186 st->st_cur->ste_generator =
6187 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006188 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006189 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006190 symtable_node(st, CHILD(n, i + 1));
6191 symtable_node(st, CHILD(n, i + 3));
6192 }
6193 if (i + 2 < NCH(n))
6194 symtable_node(st, CHILD(n, i + 2));
6195 break;
6196 case global_stmt:
6197 symtable_global(st, n);
6198 break;
6199 case import_stmt:
6200 symtable_import(st, n);
6201 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006202 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006203 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006204 symtable_node(st, CHILD(n, 1));
6205 if (NCH(n) > 2)
6206 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006207 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006208 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006209 st->st_cur->ste_opt_lineno = n->n_lineno;
6210 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006211 if (NCH(n) > 4)
6212 symtable_node(st, CHILD(n, 5));
6213 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006214
6215 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006216 case assert_stmt:
6217 if (Py_OptimizeFlag)
6218 return;
6219 if (NCH(n) == 2) {
6220 n = CHILD(n, 1);
6221 goto loop;
6222 } else {
6223 symtable_node(st, CHILD(n, 1));
6224 n = CHILD(n, 3);
6225 goto loop;
6226 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006227 case except_clause:
6228 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006229 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006230 if (NCH(n) > 1) {
6231 n = CHILD(n, 1);
6232 goto loop;
6233 }
6234 break;
6235 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006236 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006237 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006238 case yield_stmt:
6239 st->st_cur->ste_generator = 1;
6240 n = CHILD(n, 1);
6241 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006242 case expr_stmt:
6243 if (NCH(n) == 1)
6244 n = CHILD(n, 0);
6245 else {
6246 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006247 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006248 symtable_node(st, CHILD(n, 2));
6249 break;
6250 } else {
6251 int i;
6252 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006253 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006254 n = CHILD(n, NCH(n) - 1);
6255 }
6256 }
6257 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006258 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006259 /* only occurs when there are multiple for loops
6260 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006261 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006262 if (TYPE(n) == list_for)
6263 symtable_list_for(st, n);
6264 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006265 REQ(n, list_if);
6266 symtable_node(st, CHILD(n, 1));
6267 if (NCH(n) == 3) {
6268 n = CHILD(n, 2);
6269 goto loop;
6270 }
6271 }
6272 break;
6273 case for_stmt:
6274 symtable_assign(st, CHILD(n, 1), 0);
6275 for (i = 3; i < NCH(n); ++i)
6276 if (TYPE(CHILD(n, i)) >= single_input)
6277 symtable_node(st, CHILD(n, i));
6278 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006279 case arglist:
6280 if (NCH(n) > 1)
6281 for (i = 0; i < NCH(n); ++i) {
6282 node *ch = CHILD(n, i);
6283 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6284 TYPE(CHILD(ch, 1)) == gen_for) {
6285 PyErr_SetString(PyExc_SyntaxError,
6286 "invalid syntax");
6287 symtable_error(st, n->n_lineno);
6288 return;
6289 }
6290 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006291 /* The remaining cases fall through to default except in
6292 special circumstances. This requires the individual cases
6293 to be coded with great care, even though they look like
6294 rather innocuous. Each case must double-check TYPE(n).
6295 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006296 case decorator:
6297 if (TYPE(n) == decorator) {
6298 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6299 node *name, *varname;
6300 name = CHILD(n, 1);
6301 REQ(name, dotted_name);
6302 varname = CHILD(name, 0);
6303 REQ(varname, NAME);
6304 symtable_add_use(st, STR(varname));
6305 }
6306 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006307 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006308 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006309 n = CHILD(n, 2);
6310 goto loop;
6311 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006312 else if (TYPE(n) == argument && NCH(n) == 2 &&
6313 TYPE(CHILD(n, 1)) == gen_for) {
6314 symtable_generator_expression(st, n);
6315 break;
6316 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006317 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006318 case listmaker:
6319 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006320 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006321 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006322 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006323 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006324 case testlist_gexp:
6325 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6326 symtable_generator_expression(st, n);
6327 break;
6328 }
6329 /* fall through */
6330
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006331 case atom:
6332 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6333 symtable_add_use(st, STR(CHILD(n, 0)));
6334 break;
6335 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006336 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006337 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006338 /* Walk over every non-token child with a special case
6339 for one child.
6340 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006341 if (NCH(n) == 1) {
6342 n = CHILD(n, 0);
6343 goto loop;
6344 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006345 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006346 if (TYPE(CHILD(n, i)) >= single_input)
6347 symtable_node(st, CHILD(n, i));
6348 }
6349}
6350
6351static void
6352symtable_funcdef(struct symtable *st, node *n)
6353{
6354 node *body;
6355
6356 if (TYPE(n) == lambdef) {
6357 if (NCH(n) == 4)
6358 symtable_params(st, CHILD(n, 1));
6359 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006360 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006361 body = CHILD(n, NCH(n) - 1);
6362 symtable_node(st, body);
6363}
6364
6365/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006366 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006367 which are references in the defining scope. symtable_params()
6368 parses the parameter names, which are defined in the function's
6369 body.
6370
6371 varargslist:
6372 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6373 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6374*/
6375
6376static void
6377symtable_default_args(struct symtable *st, node *n)
6378{
6379 node *c;
6380 int i;
6381
6382 if (TYPE(n) == parameters) {
6383 n = CHILD(n, 1);
6384 if (TYPE(n) == RPAR)
6385 return;
6386 }
6387 REQ(n, varargslist);
6388 for (i = 0; i < NCH(n); i += 2) {
6389 c = CHILD(n, i);
6390 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6391 break;
6392 }
6393 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6394 symtable_node(st, CHILD(n, i));
6395 }
6396}
6397
6398static void
6399symtable_params(struct symtable *st, node *n)
6400{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006401 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006402 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006403
6404 if (TYPE(n) == parameters) {
6405 n = CHILD(n, 1);
6406 if (TYPE(n) == RPAR)
6407 return;
6408 }
6409 REQ(n, varargslist);
6410 for (i = 0; i < NCH(n); i += 2) {
6411 c = CHILD(n, i);
6412 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6413 ext = 1;
6414 break;
6415 }
6416 if (TYPE(c) == test) {
6417 continue;
6418 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006419 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006420 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006421 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006422 char nbuf[30];
6423 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006424 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006425 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006426 }
6427 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006428 if (ext) {
6429 c = CHILD(n, i);
6430 if (TYPE(c) == STAR) {
6431 i++;
6432 symtable_add_def(st, STR(CHILD(n, i)),
6433 DEF_PARAM | DEF_STAR);
6434 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006435 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006436 c = NULL;
6437 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006438 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006439 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006440 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006441 i++;
6442 symtable_add_def(st, STR(CHILD(n, i)),
6443 DEF_PARAM | DEF_DOUBLESTAR);
6444 }
6445 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006446 if (complex >= 0) {
6447 int j;
6448 for (j = 0; j <= complex; j++) {
6449 c = CHILD(n, j);
6450 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006451 c = CHILD(n, ++j);
6452 else if (TYPE(c) == EQUAL)
6453 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006454 if (TYPE(CHILD(c, 0)) == LPAR)
6455 symtable_params_fplist(st, CHILD(c, 1));
6456 }
6457 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006458}
6459
6460static void
6461symtable_params_fplist(struct symtable *st, node *n)
6462{
6463 int i;
6464 node *c;
6465
6466 REQ(n, fplist);
6467 for (i = 0; i < NCH(n); i += 2) {
6468 c = CHILD(n, i);
6469 REQ(c, fpdef);
6470 if (NCH(c) == 1)
6471 symtable_add_def(st, STR(CHILD(c, 0)),
6472 DEF_PARAM | DEF_INTUPLE);
6473 else
6474 symtable_params_fplist(st, CHILD(c, 1));
6475 }
6476
6477}
6478
6479static void
6480symtable_global(struct symtable *st, node *n)
6481{
6482 int i;
6483
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006484 /* XXX It might be helpful to warn about module-level global
6485 statements, but it's hard to tell the difference between
6486 module-level and a string passed to exec.
6487 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006488
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006489 for (i = 1; i < NCH(n); i += 2) {
6490 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006491 int flags;
6492
6493 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006494 if (flags < 0)
6495 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006496 if (flags && flags != DEF_GLOBAL) {
6497 char buf[500];
6498 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006499 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006500 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006501 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006502 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006503 }
6504 else {
6505 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006506 PyOS_snprintf(buf, sizeof(buf),
6507 GLOBAL_AFTER_ASSIGN,
6508 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006509 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006510 PyOS_snprintf(buf, sizeof(buf),
6511 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006512 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006513 }
6514 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006515 symtable_add_def(st, name, DEF_GLOBAL);
6516 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006517}
6518
6519static void
6520symtable_list_comprehension(struct symtable *st, node *n)
6521{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006522 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006523 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006524
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006525 REQ(n, listmaker);
6526 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6527 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006528 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006529 symtable_list_for(st, CHILD(n, 1));
6530 symtable_node(st, CHILD(n, 0));
6531 --st->st_cur->ste_tmpname;
6532}
6533
6534static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006535symtable_generator_expression(struct symtable *st, node *n)
6536{
6537 /* testlist_gexp: test gen_for */
6538 REQ(CHILD(n, 0), test);
6539 REQ(CHILD(n, 1), gen_for);
6540
6541 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6542 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6543
6544 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6545
6546 symtable_gen_for(st, CHILD(n, 1), 1);
6547 symtable_node(st, CHILD(n, 0));
6548 symtable_exit_scope(st);
6549
6550 /* for outmost iterable precomputation */
6551 symtable_node(st, CHILD(CHILD(n, 1), 3));
6552}
6553
6554static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006555symtable_list_for(struct symtable *st, node *n)
6556{
6557 REQ(n, list_for);
6558 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006559 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006560 symtable_node(st, CHILD(n, 3));
6561 if (NCH(n) == 5)
6562 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006563}
6564
6565static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006566symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6567{
6568 REQ(n, gen_for);
6569
6570 /* gen_for: for v in test [gen_iter] */
6571 symtable_assign(st, CHILD(n, 1), 0);
6572 if (is_outmost)
6573 symtable_add_use(st, "[outmost-iterable]");
6574 else
6575 symtable_node(st, CHILD(n, 3));
6576
6577 if (NCH(n) == 5)
6578 symtable_gen_iter(st, CHILD(n, 4));
6579}
6580
6581static void
6582symtable_gen_iter(struct symtable *st, node *n)
6583{
6584 REQ(n, gen_iter);
6585
6586 n = CHILD(n, 0);
6587 if (TYPE(n) == gen_for)
6588 symtable_gen_for(st, n, 0);
6589 else {
6590 REQ(n, gen_if);
6591 symtable_node(st, CHILD(n, 1));
6592
6593 if (NCH(n) == 3)
6594 symtable_gen_iter(st, CHILD(n, 2));
6595 }
6596}
6597
6598static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006599symtable_import(struct symtable *st, node *n)
6600{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006601 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006602 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006603 /* import_stmt: import_name | import_from */
6604 n = CHILD(n, 0);
6605 if (TYPE(n) == import_from) {
6606 /* import_from: 'from' dotted_name 'import' ('*' |
6607 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006608 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006609 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006610 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6611 /* check for bogus imports */
6612 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6613 PyErr_SetString(PyExc_SyntaxError,
6614 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006615 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006616 return;
6617 }
6618 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006619 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6620 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006621 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006622 if (symtable_warn(st,
6623 "import * only allowed at module level") < 0)
6624 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006625 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006626 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006627 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006628 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006629 REQ(nn, import_as_names);
6630 for (i = 0; i < NCH(nn); i += 2) {
6631 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006632 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006633 symtable_assign(st, CHILD(c, 2),
6634 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006635 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006636 symtable_assign(st, CHILD(c, 0),
6637 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006638 }
6639 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006640 } else {
6641 /* 'import' dotted_as_names */
6642 nn = CHILD(n, 1);
6643 REQ(nn, dotted_as_names);
6644 for (i = 0; i < NCH(nn); i += 2)
6645 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006646 }
6647}
6648
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006649/* The third argument to symatble_assign() is a flag to be passed to
6650 symtable_add_def() if it is eventually called. The flag is useful
6651 to specify the particular type of assignment that should be
6652 recorded, e.g. an assignment caused by import.
6653 */
6654
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006655static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006656symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006657{
6658 node *tmp;
6659 int i;
6660
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006661 loop:
6662 switch (TYPE(n)) {
6663 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006664 /* invalid assignment, e.g. lambda x:x=2. The next
6665 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006666 return;
6667 case power:
6668 if (NCH(n) > 2) {
6669 for (i = 2; i < NCH(n); ++i)
6670 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6671 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006672 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006673 if (NCH(n) > 1) {
6674 symtable_node(st, CHILD(n, 0));
6675 symtable_node(st, CHILD(n, 1));
6676 } else {
6677 n = CHILD(n, 0);
6678 goto loop;
6679 }
6680 return;
6681 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006682 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6683 /* XXX This is an error, but the next pass
6684 will catch it. */
6685 return;
6686 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006687 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006688 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006689 }
6690 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006691 case testlist_gexp:
6692 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6693 /* XXX This is an error, but the next pass
6694 will catch it. */
6695 return;
6696 } else {
6697 for (i = 0; i < NCH(n); i += 2)
6698 symtable_assign(st, CHILD(n, i), def_flag);
6699 }
6700 return;
6701
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006702 case exprlist:
6703 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006704 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006705 if (NCH(n) == 1) {
6706 n = CHILD(n, 0);
6707 goto loop;
6708 }
6709 else {
6710 int i;
6711 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006712 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006713 return;
6714 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006715 case atom:
6716 tmp = CHILD(n, 0);
6717 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6718 n = CHILD(n, 1);
6719 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006720 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006721 if (strcmp(STR(tmp), "__debug__") == 0) {
6722 PyErr_SetString(PyExc_SyntaxError,
6723 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006724 symtable_error(st, n->n_lineno);
6725 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006726 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006727 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006728 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006729 return;
6730 case dotted_as_name:
6731 if (NCH(n) == 3)
6732 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006733 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006734 else
6735 symtable_add_def(st,
6736 STR(CHILD(CHILD(n,
6737 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006738 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006739 return;
6740 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006741 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006742 return;
6743 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006744 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006745 return;
6746 default:
6747 if (NCH(n) == 0)
6748 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006749 if (NCH(n) == 1) {
6750 n = CHILD(n, 0);
6751 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006752 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006753 /* Should only occur for errors like x + 1 = 1,
6754 which will be caught in the next pass. */
6755 for (i = 0; i < NCH(n); ++i)
6756 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006757 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006758 }
6759}