blob: 37793caaacd674d2b2a36ad72b7c17a270eeecb2 [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.
400 Bails out with no change if one or more of the LOAD_CONSTs is missing. */
401static int
402tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
403{
404 PyObject *newconst, *constant;
405 int i, arg, len_consts;
406
407 /* Pre-conditions */
408 assert(PyList_CheckExact(consts));
409 assert(codestr[0] == LOAD_CONST);
410 assert(codestr[n*3] == BUILD_TUPLE);
411 assert(GETARG(codestr, (n*3)) == n);
412
413 /* Verify chain of n load_constants */
414 for (i=0 ; i<n ; i++)
415 if (codestr[i*3] != LOAD_CONST)
416 return 0;
417
418 /* Buildup new tuple of constants */
419 newconst = PyTuple_New(n);
420 if (newconst == NULL)
421 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000422 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000423 for (i=0 ; i<n ; i++) {
424 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000425 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000426 constant = PyList_GET_ITEM(consts, arg);
427 Py_INCREF(constant);
428 PyTuple_SET_ITEM(newconst, i, constant);
429 }
430
431 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000432 if (PyList_Append(consts, newconst)) {
433 Py_DECREF(newconst);
434 return 0;
435 }
436 Py_DECREF(newconst);
437
438 /* Write NOPs over old LOAD_CONSTS and
439 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
440 memset(codestr, NOP, n*3);
441 codestr[n*3] = LOAD_CONST;
442 SETARG(codestr, (n*3), len_consts);
443 return 1;
444}
445
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000446static unsigned int *
447markblocks(unsigned char *code, int len)
448{
449 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
450 int i,j, opcode, oldblock, newblock, blockcnt = 0;
451
452 if (blocks == NULL)
453 return NULL;
454 memset(blocks, 0, len*sizeof(int));
455 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
456 opcode = code[i];
457 switch (opcode) {
458 case FOR_ITER:
459 case JUMP_FORWARD:
460 case JUMP_IF_FALSE:
461 case JUMP_IF_TRUE:
462 case JUMP_ABSOLUTE:
463 case CONTINUE_LOOP:
464 case SETUP_LOOP:
465 case SETUP_EXCEPT:
466 case SETUP_FINALLY:
467 j = GETJUMPTGT(code, i);
468 oldblock = blocks[j];
469 newblock = ++blockcnt;
470 for (; j<len ; j++) {
471 if (blocks[j] != (unsigned)oldblock)
472 break;
473 blocks[j] = newblock;
474 }
475 break;
476 }
477 }
478 return blocks;
479}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000480
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000481/* Perform basic peephole optimizations to components of a code object.
482 The consts object should still be in list form to allow new constants
483 to be appended.
484
485 To keep the optimizer simple, it bails out (does nothing) for code
486 containing extended arguments or that has a length over 32,700. That
487 allows us to avoid overflow and sign issues. Likewise, it bails when
488 the lineno table has complex encoding for gaps >= 255.
489
490 Optimizations are restricted to simple transformations occuring within a
491 single basic block. All transformations keep the code size the same or
492 smaller. For those that reduce size, the gaps are initially filled with
493 NOPs. Later those NOPs are removed and the jump addresses retargeted in
494 a single pass. Line numbering is adjusted accordingly. */
495
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000496static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000497optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000498{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000499 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000500 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000501 unsigned char *codestr = NULL;
502 unsigned char *lineno;
503 int *addrmap = NULL;
504 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000505 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000506 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000507 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000508
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000509 /* Bypass optimization when the lineno table is too complex */
510 assert(PyString_Check(lineno_obj));
511 lineno = PyString_AS_STRING(lineno_obj);
512 tabsiz = PyString_GET_SIZE(lineno_obj);
513 if (memchr(lineno, 255, tabsiz) != NULL)
514 goto exitUnchanged;
515
Raymond Hettingera12fa142004-08-24 04:34:16 +0000516 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000517 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000518 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000519 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000520 goto exitUnchanged;
521
522 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000523 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000524 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000525 goto exitUnchanged;
526 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000527
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 /* Mapping to new jump targets after NOPs are removed */
529 addrmap = PyMem_Malloc(codelen * sizeof(int));
530 if (addrmap == NULL)
531 goto exitUnchanged;
532
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000533 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000534 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000535 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000536 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000537
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000538 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
539 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000540 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000541
542 lastlc = cumlc;
543 cumlc = 0;
544
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000545 switch (opcode) {
546
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000547 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000548 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000549 case UNARY_NOT:
550 if (codestr[i+1] != JUMP_IF_FALSE ||
551 codestr[i+4] != POP_TOP ||
552 !ISBASICBLOCK(blocks,i,5))
553 continue;
554 tgt = GETJUMPTGT(codestr, (i+1));
555 if (codestr[tgt] != POP_TOP)
556 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000557 j = GETARG(codestr, i+1) + 1;
558 codestr[i] = JUMP_IF_TRUE;
559 SETARG(codestr, i, j);
560 codestr[i+3] = POP_TOP;
561 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000562 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000563 break;
564
565 /* not a is b --> a is not b
566 not a in b --> a not in b
567 not a is not b --> a is b
568 not a not in b --> a in b */
569 case COMPARE_OP:
570 j = GETARG(codestr, i);
571 if (j < 6 || j > 9 ||
572 codestr[i+3] != UNARY_NOT ||
573 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000574 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000575 SETARG(codestr, i, (j^1));
576 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000577 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000578 break;
579
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000580 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
581 case LOAD_NAME:
582 case LOAD_GLOBAL:
583 j = GETARG(codestr, i);
584 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
585 if (name == NULL || strcmp(name, "None") != 0)
586 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000587 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
588 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000589 codestr[i] = LOAD_CONST;
590 SETARG(codestr, i, j);
591 break;
592 }
593 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000594 break;
595
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000596 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000597 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000598 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000599 j = GETARG(codestr, i);
600 if (codestr[i+3] != JUMP_IF_FALSE ||
601 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000602 !ISBASICBLOCK(blocks,i,7) ||
603 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000604 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000605 memset(codestr+i, NOP, 7);
606 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000607 break;
608
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000609 /* Try to fold tuples of constants.
610 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000611 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
612 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000613 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000614 j = GETARG(codestr, i);
615 h = i - 3 * j;
616 if (h >= 0 &&
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000617 j == lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000618 codestr[h] == LOAD_CONST &&
619 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
620 tuple_of_constants(&codestr[h], j, consts)) {
621 nops += 3 * j;
622 break;
623 }
624 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000626 j = GETARG(codestr, i);
627 if (codestr[i+3] != UNPACK_SEQUENCE ||
628 !ISBASICBLOCK(blocks,i,6) ||
629 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000630 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000631 if (j == 1) {
632 memset(codestr+i, NOP, 6);
633 nops += 6;
634 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000635 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000636 memset(codestr+i+1, NOP, 5);
637 nops += 5;
638 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000639 codestr[i] = ROT_THREE;
640 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000641 memset(codestr+i+2, NOP, 4);
642 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000643 }
644 break;
645
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000646 /* Simplify conditional jump to conditional jump where the
647 result of the first test implies the success of a similar
648 test or the failure of the opposite test.
649 Arises in code like:
650 "a and b or c"
651 "a and b and c"
652 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000653 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
654 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000655 */
656 case JUMP_IF_FALSE:
657 case JUMP_IF_TRUE:
658 tgt = GETJUMPTGT(codestr, i);
659 j = codestr[tgt];
660 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
661 if (j == opcode) {
662 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
663 SETARG(codestr, i, tgttgt);
664 } else {
665 tgt -= i;
666 SETARG(codestr, i, tgt);
667 }
668 break;
669 }
670 /* Intentional fallthrough */
671
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000673 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000674 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000675 case JUMP_ABSOLUTE:
676 case CONTINUE_LOOP:
677 case SETUP_LOOP:
678 case SETUP_EXCEPT:
679 case SETUP_FINALLY:
680 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000681 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000682 continue;
683 tgttgt = GETJUMPTGT(codestr, tgt);
684 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
685 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000686 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000687 tgttgt -= i + 3; /* Calc relative jump addr */
688 if (tgttgt < 0) /* No backward relative jumps */
689 continue;
690 codestr[i] = opcode;
691 SETARG(codestr, i, tgttgt);
692 break;
693
694 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000695 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000696
697 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
698 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000699 if (i+4 >= codelen ||
700 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000701 !ISBASICBLOCK(blocks,i,5))
702 continue;
703 memset(codestr+i+1, NOP, 4);
704 nops += 4;
705 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000706 }
707 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000708
709 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000710 cum_orig_line = 0;
711 last_line = 0;
712 for (i=0 ; i < tabsiz ; i+=2) {
713 cum_orig_line += lineno[i];
714 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000715 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000716 lineno[i] =((unsigned char)(new_line - last_line));
717 last_line = new_line;
718 }
719
720 /* Remove NOPs and fixup jump targets */
721 for (i=0, h=0 ; i<codelen ; ) {
722 opcode = codestr[i];
723 switch (opcode) {
724 case NOP:
725 i++;
726 continue;
727
728 case JUMP_ABSOLUTE:
729 case CONTINUE_LOOP:
730 j = addrmap[GETARG(codestr, i)];
731 SETARG(codestr, i, j);
732 break;
733
734 case FOR_ITER:
735 case JUMP_FORWARD:
736 case JUMP_IF_FALSE:
737 case JUMP_IF_TRUE:
738 case SETUP_LOOP:
739 case SETUP_EXCEPT:
740 case SETUP_FINALLY:
741 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
742 SETARG(codestr, i, j);
743 break;
744 }
745 adj = CODESIZE(opcode);
746 while (adj--)
747 codestr[h++] = codestr[i++];
748 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000749 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000750
751 code = PyString_FromStringAndSize((char *)codestr, h);
752 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000753 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000754 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000755 return code;
756
757exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000758 if (addrmap != NULL)
759 PyMem_Free(addrmap);
760 if (codestr != NULL)
761 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000762 Py_INCREF(code);
763 return code;
764}
765
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000766/* End: Peephole optimizations ----------------------------------------- */
767
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000769PyCode_New(int argcount, int nlocals, int stacksize, int flags,
770 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000771 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
772 PyObject *filename, PyObject *name, int firstlineno,
773 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000774{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000776 int i;
777 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000778 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000779 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 consts == NULL || !PyTuple_Check(consts) ||
781 names == NULL || !PyTuple_Check(names) ||
782 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000783 freevars == NULL || !PyTuple_Check(freevars) ||
784 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 name == NULL || !PyString_Check(name) ||
786 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000787 lnotab == NULL || !PyString_Check(lnotab) ||
788 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000789 PyErr_BadInternalCall();
790 return NULL;
791 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000792 intern_strings(names);
793 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000794 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000795 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000796 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 for (i = PyTuple_Size(consts); --i >= 0; ) {
798 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000800 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000801 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000802 continue;
803 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000804 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000807 co->co_argcount = argcount;
808 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000809 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000810 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000811 Py_INCREF(code);
812 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000814 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000816 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000818 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000819 Py_INCREF(freevars);
820 co->co_freevars = freevars;
821 Py_INCREF(cellvars);
822 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000824 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000826 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000827 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000829 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000830 if (PyTuple_GET_SIZE(freevars) == 0 &&
831 PyTuple_GET_SIZE(cellvars) == 0)
832 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000833 }
834 return co;
835}
836
837
838/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000839
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840/* The compiler uses two passes to generate bytecodes. The first pass
841 builds the symbol table. The second pass generates the bytecode.
842
843 The first pass uses a single symtable struct. The second pass uses
844 a compiling struct for each code block. The compiling structs
845 share a reference to the symtable.
846
847 The two passes communicate via symtable_load_symbols() and via
848 is_local() and is_global(). The former initializes several slots
849 in the compiling struct: c_varnames, c_locals, c_nlocals,
850 c_argcount, c_globals, and c_flags.
851*/
852
Tim Peters2a7f3842001-06-09 09:26:21 +0000853/* All about c_lnotab.
854
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000855c_lnotab is an array of unsigned bytes disguised as a Python string. Since
856version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
857mapped to source code line #s via c_lnotab instead.
858
Tim Peters2a7f3842001-06-09 09:26:21 +0000859The array is conceptually a list of
860 (bytecode offset increment, line number increment)
861pairs. The details are important and delicate, best illustrated by example:
862
863 byte code offset source code line number
864 0 1
865 6 2
866 50 7
867 350 307
868 361 308
869
870The first trick is that these numbers aren't stored, only the increments
871from one row to the next (this doesn't really work, but it's a start):
872
873 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
874
875The second trick is that an unsigned byte can't hold negative values, or
876values larger than 255, so (a) there's a deep assumption that byte code
877offsets and their corresponding line #s both increase monotonically, and (b)
878if at least one column jumps by more than 255 from one row to the next, more
879than one pair is written to the table. In case #b, there's no way to know
880from looking at the table later how many were written. That's the delicate
881part. A user of c_lnotab desiring to find the source line number
882corresponding to a bytecode address A should do something like this
883
884 lineno = addr = 0
885 for addr_incr, line_incr in c_lnotab:
886 addr += addr_incr
887 if addr > A:
888 return lineno
889 lineno += line_incr
890
891In order for this to work, when the addr field increments by more than 255,
892the line # increment in each pair generated must be 0 until the remaining addr
893increment is < 256. So, in the example above, com_set_lineno should not (as
894was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
895255, 0, 45, 255, 0, 45.
896*/
897
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000898struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000899 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000901 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000903 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000904 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *c_locals; /* dictionary (value=localID) */
906 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000907 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000908 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000909 int c_nlocals; /* index of next local */
910 int c_argcount; /* number of top-level arguments */
911 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 int c_nexti; /* index into c_code */
913 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000914 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000915 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000916 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000917 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000918 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000919 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000920 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000921 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000922 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000923 int c_stacklevel; /* Current stack level */
924 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000925 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000927 int c_last_addr; /* last op addr seen and recorded in lnotab */
928 int c_last_line; /* last line seen and recorded in lnotab */
929 int c_lnotab_next; /* current length of lnotab */
930 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000931 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000932 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000933 int c_nested; /* Is block nested funcdef or lamdef? */
934 int c_closure; /* Is nested w/freevars? */
935 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000936 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000937 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000938};
939
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000940static int
941is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942{
943 if ((v & (USE | DEF_FREE))
944 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
945 return 1;
946 if (v & DEF_FREE_CLASS)
947 return 1;
948 return 0;
949}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000950
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000951static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000952com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000953{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000954 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
955
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000956 if (c == NULL) {
957 /* Error occurred via symtable call to
958 is_constant_false */
959 PyErr_SetString(exc, msg);
960 return;
961 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000962 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000963 if (c->c_lineno < 1 || c->c_interactive) {
964 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000966 return;
967 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000968 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000969 if (v == NULL)
970 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000971
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000972 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000973 if (line == NULL) {
974 Py_INCREF(Py_None);
975 line = Py_None;
976 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000977 if (exc == PyExc_SyntaxError) {
978 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
979 Py_None, line);
980 if (t == NULL)
981 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000982 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000983 if (w == NULL)
984 goto exit;
985 PyErr_SetObject(exc, w);
986 } else {
987 /* Make sure additional exceptions are printed with
988 file and line, also. */
989 PyErr_SetObject(exc, v);
990 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
991 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000992 exit:
993 Py_XDECREF(t);
994 Py_XDECREF(v);
995 Py_XDECREF(w);
996 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000997}
998
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000999/* Interface to the block stack */
1000
1001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001002block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001003{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001004 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 com_error(c, PyExc_SystemError,
1006 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001007 }
1008 else {
1009 c->c_block[c->c_nblocks++] = type;
1010 }
1011}
1012
1013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001014block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001015{
1016 if (c->c_nblocks > 0)
1017 c->c_nblocks--;
1018 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001020 }
1021}
1022
Guido van Rossum681d79a1995-07-18 14:51:37 +00001023/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001024
Martin v. Löwis95292d62002-12-11 14:04:59 +00001025static int issue_warning(const char *, const char *, int);
1026static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001027static void com_free(struct compiling *);
1028static void com_push(struct compiling *, int);
1029static void com_pop(struct compiling *, int);
1030static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001031static void com_node(struct compiling *, node *);
1032static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001033static void com_addbyte(struct compiling *, int);
1034static void com_addint(struct compiling *, int);
1035static void com_addoparg(struct compiling *, int, int);
1036static void com_addfwref(struct compiling *, int, int *);
1037static void com_backpatch(struct compiling *, int);
1038static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1039static int com_addconst(struct compiling *, PyObject *);
1040static int com_addname(struct compiling *, PyObject *);
1041static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001042static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001043static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001044static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001045static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001046static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001047static void com_assign(struct compiling *, node *, int, node *);
1048static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001049static int com_make_closure(struct compiling *c, PyCodeObject *co);
1050
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001051static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001052static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001053 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001054static PyObject *parsestrplus(struct compiling*, node *);
1055static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001056static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001057
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001058static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001059
1060/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001061static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001062static struct symtable *symtable_build(node *, PyFutureFeatures *,
1063 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001064static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001065static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001066static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001067static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001068static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001069static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001070
1071static void symtable_node(struct symtable *, node *);
1072static void symtable_funcdef(struct symtable *, node *);
1073static void symtable_default_args(struct symtable *, node *);
1074static void symtable_params(struct symtable *, node *);
1075static void symtable_params_fplist(struct symtable *, node *n);
1076static void symtable_global(struct symtable *, node *);
1077static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001078static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001079static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001080static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001081static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001082static void symtable_gen_for(struct symtable *, node *, int);
1083static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001084
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001085static int symtable_update_free_vars(struct symtable *);
1086static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1087static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1088
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001089/* helper */
1090static void
1091do_pad(int pad)
1092{
1093 int i;
1094 for (i = 0; i < pad; ++i)
1095 fprintf(stderr, " ");
1096}
1097
1098static void
1099dump(node *n, int pad, int depth)
1100{
1101 int i;
1102 if (depth == 0)
1103 return;
1104 do_pad(pad);
1105 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1106 if (depth > 0)
1107 depth--;
1108 for (i = 0; i < NCH(n); ++i)
1109 dump(CHILD(n, i), pad + 1, depth);
1110}
1111
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001113com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001115 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1117 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001118 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001120 goto fail;
1121 if ((c->c_const_dict = PyDict_New()) == NULL)
1122 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001124 goto fail;
1125 if ((c->c_name_dict = PyDict_New()) == NULL)
1126 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001128 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1130 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001131 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001132 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001133 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001134 c->c_freevars = NULL;
1135 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001136 c->c_nlocals = 0;
1137 c->c_argcount = 0;
1138 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001139 c->c_nexti = 0;
1140 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001141 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001142 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001143 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001144 c->c_begin = 0;
1145 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001146 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001147 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001148 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001149 c->c_stacklevel = 0;
1150 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001151 c->c_firstlineno = 0;
1152 c->c_last_addr = 0;
1153 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001154 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001155 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001156 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001157 c->c_nested = 0;
1158 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001159 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001160 return 1;
1161
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001162 fail:
1163 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001164 return 0;
1165}
1166
1167static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001168com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001169{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 Py_XDECREF(c->c_code);
1171 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001172 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001174 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 Py_XDECREF(c->c_globals);
1176 Py_XDECREF(c->c_locals);
1177 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001178 Py_XDECREF(c->c_freevars);
1179 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001181 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001182 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001183}
1184
1185static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001186com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001187{
1188 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001189 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001190 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001191 /*
1192 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1193 c->c_filename, c->c_name, c->c_lineno,
1194 c->c_nexti, c->c_stacklevel, n);
1195 */
1196 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001197}
1198
1199static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001200com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001201{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001202 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001203 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001204 else
1205 c->c_stacklevel -= n;
1206}
1207
1208static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001209com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001210{
1211 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001213 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001215}
1216
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001217static int
1218com_check_size(PyObject **s, int offset)
1219{
1220 int len = PyString_GET_SIZE(*s);
1221 if (offset >= len)
1222 return _PyString_Resize(s, len * 2);
1223 return 0;
1224}
1225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001227com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001229 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001230 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001231 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001232 if (com_check_size(&c->c_code, c->c_nexti)) {
1233 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001234 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001235 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001236 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237}
1238
1239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001240com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001242 com_addbyte(c, x & 0xff);
1243 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001244}
1245
1246static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001247com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001248{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001249 char *p;
1250 if (c->c_lnotab == NULL)
1251 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001252 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1253 c->c_errors++;
1254 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001255 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001256 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001257 *p++ = addr;
1258 *p++ = line;
1259 c->c_lnotab_next += 2;
1260}
1261
1262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001263com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001264{
1265 c->c_lineno = lineno;
1266 if (c->c_firstlineno == 0) {
1267 c->c_firstlineno = c->c_last_line = lineno;
1268 }
1269 else {
1270 int incr_addr = c->c_nexti - c->c_last_addr;
1271 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001272 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001273 while (incr_addr > 255) {
1274 com_add_lnotab(c, 255, 0);
1275 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001276 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001277 while (incr_line > 255) {
1278 com_add_lnotab(c, incr_addr, 255);
1279 incr_line -=255;
1280 incr_addr = 0;
1281 }
1282 if (incr_addr > 0 || incr_line > 0)
1283 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001284 c->c_last_addr = c->c_nexti;
1285 c->c_last_line = lineno;
1286 }
1287}
1288
1289static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001290com_strip_lnotab(struct compiling *c)
1291{
1292 /* strip the last lnotab entry if no opcode were emitted.
1293 * This prevents a line number to be generated on a final
1294 * pass, like in the following example:
1295 *
1296 * if a:
1297 * print 5
1298 * else:
1299 * pass
1300 *
1301 * Without the fix, a line trace event would be generated
1302 * on the pass even if a is true (because of the implicit
1303 * return).
1304 */
1305 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1306 c->c_lnotab_next = c->c_lnotab_last;
1307 }
1308}
1309
1310static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001311com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312{
Fred Drakeef8ace32000-08-24 00:32:09 +00001313 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001314 if (extended_arg){
1315 com_addbyte(c, EXTENDED_ARG);
1316 com_addint(c, extended_arg);
1317 arg &= 0xffff;
1318 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001319 com_addbyte(c, op);
1320 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321}
1322
1323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001324com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001325{
1326 /* Compile a forward reference for backpatching */
1327 int here;
1328 int anchor;
1329 com_addbyte(c, op);
1330 here = c->c_nexti;
1331 anchor = *p_anchor;
1332 *p_anchor = here;
1333 com_addint(c, anchor == 0 ? 0 : here - anchor);
1334}
1335
1336static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001337com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001338{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001339 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001341 int dist;
1342 int prev;
1343 for (;;) {
1344 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001345 prev = code[anchor] + (code[anchor+1] << 8);
1346 dist = target - (anchor+2);
1347 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001348 dist >>= 8;
1349 code[anchor+1] = dist;
1350 dist >>= 8;
1351 if (dist) {
1352 com_error(c, PyExc_SystemError,
1353 "com_backpatch: offset too large");
1354 break;
1355 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001356 if (!prev)
1357 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 anchor -= prev;
1359 }
1360}
1361
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001362/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363
1364static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001365com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001367 PyObject *w, *t, *np=NULL;
1368 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001369
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001370 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001371 if (t == NULL)
1372 goto fail;
1373 w = PyDict_GetItem(dict, t);
1374 if (w != NULL) {
1375 n = PyInt_AsLong(w);
1376 } else {
1377 n = PyList_Size(list);
1378 np = PyInt_FromLong(n);
1379 if (np == NULL)
1380 goto fail;
1381 if (PyList_Append(list, v) != 0)
1382 goto fail;
1383 if (PyDict_SetItem(dict, t, np) != 0)
1384 goto fail;
1385 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001386 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001387 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001388 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001389 fail:
1390 Py_XDECREF(np);
1391 Py_XDECREF(t);
1392 c->c_errors++;
1393 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001394}
1395
1396static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001397com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001399 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001400}
1401
1402static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001405 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001406}
1407
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001408int
1409_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001410{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001411 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001412 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001413 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001414 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1415 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001416 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001417 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001418 return 0; /* Don't mangle __extremely_long_names */
1419 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1420 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001421 /* Strip leading underscores from class name */
1422 while (*p == '_')
1423 p++;
1424 if (*p == '\0')
1425 return 0; /* Don't mangle if class is just underscores */
1426 plen = strlen(p);
1427 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001428 plen = maxlen-nlen-2; /* Truncate class name if too long */
1429 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001430 buffer[0] = '_';
1431 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001432 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001433 return 1;
1434}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001435
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001437com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001440 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001441 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001442
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001443 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001444 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001445 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001446 c->c_errors++;
1447 i = 255;
1448 }
1449 else {
1450 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001453 com_addoparg(c, op, i);
1454}
1455
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001456#define NAME_LOCAL 0
1457#define NAME_GLOBAL 1
1458#define NAME_DEFAULT 2
1459#define NAME_CLOSURE 3
1460
1461static int
1462com_lookup_arg(PyObject *dict, PyObject *name)
1463{
1464 PyObject *v = PyDict_GetItem(dict, name);
1465 if (v == NULL)
1466 return -1;
1467 else
1468 return PyInt_AS_LONG(v);
1469}
1470
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001471static int
1472none_assignment_check(struct compiling *c, char *name, int assigning)
1473{
1474 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1475 char *msg;
1476 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001477 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001478 else
1479 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001480 com_error(c, PyExc_SyntaxError, msg);
1481 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001482 }
1483 return 0;
1484}
1485
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001486static void
1487com_addop_varname(struct compiling *c, int kind, char *name)
1488{
1489 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001490 int i, reftype;
1491 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001492 int op = STOP_CODE;
1493 char buffer[MANGLE_LEN];
1494
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001495 if (kind != VAR_LOAD &&
1496 none_assignment_check(c, name, kind == VAR_STORE))
1497 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001498 i = 255;
1499 goto done;
1500 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001501 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001502 name = buffer;
1503 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1504 c->c_errors++;
1505 i = 255;
1506 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001507 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001508
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001509 reftype = get_ref_type(c, name);
1510 switch (reftype) {
1511 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001512 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001513 scope = NAME_LOCAL;
1514 break;
1515 case GLOBAL_EXPLICIT:
1516 scope = NAME_GLOBAL;
1517 break;
1518 case GLOBAL_IMPLICIT:
1519 if (c->c_flags & CO_OPTIMIZED)
1520 scope = NAME_GLOBAL;
1521 break;
1522 case FREE:
1523 case CELL:
1524 scope = NAME_CLOSURE;
1525 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001526 }
1527
1528 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001529 if (scope == NAME_LOCAL)
1530 i = com_lookup_arg(c->c_locals, v);
1531 else if (reftype == FREE)
1532 i = com_lookup_arg(c->c_freevars, v);
1533 else if (reftype == CELL)
1534 i = com_lookup_arg(c->c_cellvars, v);
1535 if (i == -1) {
1536 c->c_errors++; /* XXX no exception set */
1537 i = 255;
1538 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001539 }
1540 Py_DECREF(v);
1541
1542 switch (kind) {
1543 case VAR_LOAD:
1544 switch (scope) {
1545 case NAME_LOCAL:
1546 op = LOAD_FAST;
1547 break;
1548 case NAME_GLOBAL:
1549 op = LOAD_GLOBAL;
1550 break;
1551 case NAME_DEFAULT:
1552 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001553 break;
1554 case NAME_CLOSURE:
1555 op = LOAD_DEREF;
1556 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001557 }
1558 break;
1559 case VAR_STORE:
1560 switch (scope) {
1561 case NAME_LOCAL:
1562 op = STORE_FAST;
1563 break;
1564 case NAME_GLOBAL:
1565 op = STORE_GLOBAL;
1566 break;
1567 case NAME_DEFAULT:
1568 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001569 break;
1570 case NAME_CLOSURE:
1571 op = STORE_DEREF;
1572 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001573 }
1574 break;
1575 case VAR_DELETE:
1576 switch (scope) {
1577 case NAME_LOCAL:
1578 op = DELETE_FAST;
1579 break;
1580 case NAME_GLOBAL:
1581 op = DELETE_GLOBAL;
1582 break;
1583 case NAME_DEFAULT:
1584 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001585 break;
1586 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001587 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001588 PyOS_snprintf(buf, sizeof(buf),
1589 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001590 com_error(c, PyExc_SyntaxError, buf);
1591 i = 255;
1592 break;
1593 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001594 }
1595 break;
1596 }
1597done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001598 com_addoparg(c, op, i);
1599}
1600
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001601static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001602com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001603{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001604 char *name;
1605 char buffer[1000];
1606 /* XXX it is possible to write this code without the 1000
1607 chars on the total length of dotted names, I just can't be
1608 bothered right now */
1609 if (TYPE(n) == STAR)
1610 name = "*";
1611 else if (TYPE(n) == dotted_name) {
1612 char *p = buffer;
1613 int i;
1614 name = buffer;
1615 for (i = 0; i < NCH(n); i += 2) {
1616 char *s = STR(CHILD(n, i));
1617 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001618 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001619 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001620 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001621 break;
1622 }
1623 if (p != buffer)
1624 *p++ = '.';
1625 strcpy(p, s);
1626 p = strchr(p, '\0');
1627 }
1628 }
1629 else {
1630 REQ(n, NAME);
1631 name = STR(n);
1632 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001633 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001634}
1635
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001637parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001638{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001639 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001641 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001642#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001643 int imflag;
1644#endif
1645
Guido van Rossum282914b1991-04-04 10:42:56 +00001646 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001647 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001648#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001649 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001650#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001651 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001653 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001655 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001656 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001657 }
1658 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001659 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001661 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001662 if (errno != 0)
1663 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001665 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001666 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001667#ifndef WITHOUT_COMPLEX
1668 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001669 Py_complex z;
1670 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001671 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001672 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001673 PyFPE_END_PROTECT(z)
1674 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001675 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001676 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001677#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001678 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001679 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001680 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001681 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001683 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001684}
1685
Guido van Rossum79f25d91997-04-29 20:08:16 +00001686static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001687decode_utf8(char **sPtr, char *end, char* encoding)
1688{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001689#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001690 Py_FatalError("decode_utf8 should not be called in this build.");
1691 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001692#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001693 PyObject *u, *v;
1694 char *s, *t;
1695 t = s = *sPtr;
1696 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1697 while (s < end && (*s & 0x80)) s++;
1698 *sPtr = s;
1699 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1700 if (u == NULL)
1701 return NULL;
1702 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1703 Py_DECREF(u);
1704 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001705#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001706}
1707
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001708/* compiler.transformer.Transformer.decode_literal depends on what
1709 might seem like minor details of this function -- changes here
1710 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001711static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001712parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001713{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001715 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001716 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001717 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001718 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001719 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001720 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001721
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001722 if (isalpha(quote) || quote == '_') {
1723 if (quote == 'u' || quote == 'U') {
1724 quote = *++s;
1725 unicode = 1;
1726 }
1727 if (quote == 'r' || quote == 'R') {
1728 quote = *++s;
1729 rawmode = 1;
1730 }
1731 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001732 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 return NULL;
1735 }
1736 s++;
1737 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001738 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001739 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001740 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001741 return NULL;
1742 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001743 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001744 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001745 return NULL;
1746 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001747 if (len >= 4 && s[0] == quote && s[1] == quote) {
1748 s += 2;
1749 len -= 2;
1750 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001752 return NULL;
1753 }
1754 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001755#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001756 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001757 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001758 char *buf;
1759 char *p;
1760 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001761 if (encoding == NULL) {
1762 buf = s;
1763 u = NULL;
1764 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1765 buf = s;
1766 u = NULL;
1767 } else {
1768 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1769 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1770 if (u == NULL)
1771 return NULL;
1772 p = buf = PyString_AsString(u);
1773 end = s + len;
1774 while (s < end) {
1775 if (*s == '\\') {
1776 *p++ = *s++;
1777 if (*s & 0x80) {
1778 strcpy(p, "u005c");
1779 p += 5;
1780 }
1781 }
1782 if (*s & 0x80) { /* XXX inefficient */
1783 char *r;
1784 int rn, i;
1785 w = decode_utf8(&s, end, "utf-16-be");
1786 if (w == NULL) {
1787 Py_DECREF(u);
1788 return NULL;
1789 }
1790 r = PyString_AsString(w);
1791 rn = PyString_Size(w);
1792 assert(rn % 2 == 0);
1793 for (i = 0; i < rn; i += 2) {
1794 sprintf(p, "\\u%02x%02x",
1795 r[i + 0] & 0xFF,
1796 r[i + 1] & 0xFF);
1797 p += 6;
1798 }
1799 Py_DECREF(w);
1800 } else {
1801 *p++ = *s++;
1802 }
1803 }
1804 len = p - buf;
1805 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001806 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001807 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001808 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001809 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1810 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001811 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001812 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001813 return v;
1814
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001815 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001816#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001817 need_encoding = (encoding != NULL &&
1818 strcmp(encoding, "utf-8") != 0 &&
1819 strcmp(encoding, "iso-8859-1") != 0);
1820 if (rawmode || strchr(s, '\\') == NULL) {
1821 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001822#ifndef Py_USING_UNICODE
1823 /* This should not happen - we never see any other
1824 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001825 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001826#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001827 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1828 if (u == NULL)
1829 return NULL;
1830 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1831 Py_DECREF(u);
1832 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001833#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001834 } else {
1835 return PyString_FromStringAndSize(s, len);
1836 }
1837 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001838
1839 v = PyString_DecodeEscape(s, len, NULL, unicode,
1840 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001841 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001842 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001843 return v;
1844}
1845
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001847parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001848{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001850 int i;
1851 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001852 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001853 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001854 for (i = 1; i < NCH(n); i++) {
1855 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001856 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001857 if (s == NULL)
1858 goto onError;
1859 if (PyString_Check(v) && PyString_Check(s)) {
1860 PyString_ConcatAndDel(&v, s);
1861 if (v == NULL)
1862 goto onError;
1863 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001864#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001865 else {
1866 PyObject *temp;
1867 temp = PyUnicode_Concat(v, s);
1868 Py_DECREF(s);
1869 if (temp == NULL)
1870 goto onError;
1871 Py_DECREF(v);
1872 v = temp;
1873 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001874#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001875 }
1876 }
1877 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001878
1879 onError:
1880 Py_XDECREF(v);
1881 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001882}
1883
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001884static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001885com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001886{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001887 int anchor = 0;
1888 int save_begin = c->c_begin;
1889
Raymond Hettinger354433a2004-05-19 08:20:33 +00001890 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001891 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001892 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001893 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001894 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001895 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001896 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001897 c->c_loops++;
1898 com_list_iter(c, n, e, t);
1899 c->c_loops--;
1900 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1901 c->c_begin = save_begin;
1902 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001903 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001904}
1905
1906static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001907com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1908{
1909 int break_anchor = 0;
1910 int anchor = 0;
1911 int save_begin = c->c_begin;
1912
1913 REQ(n, gen_for);
1914 /* gen_for: for v in test [gen_iter] */
1915
1916 com_addfwref(c, SETUP_LOOP, &break_anchor);
1917 block_push(c, SETUP_LOOP);
1918
1919 if (is_outmost) {
1920 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1921 com_push(c, 1);
1922 }
1923 else {
1924 com_node(c, CHILD(n, 3));
1925 com_addbyte(c, GET_ITER);
1926 }
1927
1928 c->c_begin = c->c_nexti;
1929 com_set_lineno(c, c->c_last_line);
1930 com_addfwref(c, FOR_ITER, &anchor);
1931 com_push(c, 1);
1932 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1933
1934 if (NCH(n) == 5)
1935 com_gen_iter(c, CHILD(n, 4), t);
1936 else {
1937 com_test(c, t);
1938 com_addbyte(c, YIELD_VALUE);
1939 com_pop(c, 1);
1940 }
1941
1942 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1943 c->c_begin = save_begin;
1944
1945 com_backpatch(c, anchor);
1946 com_pop(c, 1); /* FOR_ITER has popped this */
1947 com_addbyte(c, POP_BLOCK);
1948 block_pop(c, SETUP_LOOP);
1949 com_backpatch(c, break_anchor);
1950}
1951
1952static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001953com_list_if(struct compiling *c, node *n, node *e, char *t)
1954{
1955 int anchor = 0;
1956 int a = 0;
1957 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001958 com_node(c, CHILD(n, 1));
1959 com_addfwref(c, JUMP_IF_FALSE, &a);
1960 com_addbyte(c, POP_TOP);
1961 com_pop(c, 1);
1962 com_list_iter(c, n, e, t);
1963 com_addfwref(c, JUMP_FORWARD, &anchor);
1964 com_backpatch(c, a);
1965 /* We jump here with an extra entry which we now pop */
1966 com_addbyte(c, POP_TOP);
1967 com_backpatch(c, anchor);
1968}
1969
1970static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001971com_gen_if(struct compiling *c, node *n, node *t)
1972{
1973 /* gen_if: 'if' test [gen_iter] */
1974 int anchor = 0;
1975 int a=0;
1976
1977 com_node(c, CHILD(n, 1));
1978 com_addfwref(c, JUMP_IF_FALSE, &a);
1979 com_addbyte(c, POP_TOP);
1980 com_pop(c, 1);
1981
1982 if (NCH(n) == 3)
1983 com_gen_iter(c, CHILD(n, 2), t);
1984 else {
1985 com_test(c, t);
1986 com_addbyte(c, YIELD_VALUE);
1987 com_pop(c, 1);
1988 }
1989 com_addfwref(c, JUMP_FORWARD, &anchor);
1990 com_backpatch(c, a);
1991 /* We jump here with an extra entry which we now pop */
1992 com_addbyte(c, POP_TOP);
1993 com_backpatch(c, anchor);
1994}
1995
1996static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001997com_list_iter(struct compiling *c,
1998 node *p, /* parent of list_iter node */
1999 node *e, /* element expression node */
2000 char *t /* name of result list temp local */)
2001{
2002 /* list_iter is the last child in a listmaker, list_for, or list_if */
2003 node *n = CHILD(p, NCH(p)-1);
2004 if (TYPE(n) == list_iter) {
2005 n = CHILD(n, 0);
2006 switch (TYPE(n)) {
2007 case list_for:
2008 com_list_for(c, n, e, t);
2009 break;
2010 case list_if:
2011 com_list_if(c, n, e, t);
2012 break;
2013 default:
2014 com_error(c, PyExc_SystemError,
2015 "invalid list_iter node type");
2016 }
2017 }
2018 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002019 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002020 com_push(c, 1);
2021 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002022 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002023 com_pop(c, 2);
2024 }
2025}
2026
2027static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002028com_gen_iter(struct compiling *c, node *n, node *t)
2029{
2030 /* gen_iter: gen_for | gen_if */
2031 node *ch;
2032 REQ(n, gen_iter);
2033
2034 ch = CHILD(n, 0);
2035
2036 switch (TYPE(ch)) {
2037 case gen_for:
2038 com_gen_for(c, ch, t, 0);
2039 break;
2040 case gen_if:
2041 com_gen_if(c, ch, t);
2042 break;
2043 default:
2044 com_error(c, PyExc_SystemError,
2045 "invalid gen_iter node type");
2046 }
2047}
2048
2049static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002050com_list_comprehension(struct compiling *c, node *n)
2051{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002052 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002053 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002054
2055 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002056 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002057 com_addoparg(c, BUILD_LIST, 0);
2058 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2059 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002060 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002061 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002062 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002063 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002064 --c->c_tmpname;
2065}
2066
2067static void
2068com_listmaker(struct compiling *c, node *n)
2069{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002070 /* listmaker: test ( list_for | (',' test)* [','] ) */
2071 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002072 com_list_comprehension(c, n);
2073 else {
2074 int len = 0;
2075 int i;
2076 for (i = 0; i < NCH(n); i += 2, len++)
2077 com_node(c, CHILD(n, i));
2078 com_addoparg(c, BUILD_LIST, len);
2079 com_pop(c, len-1);
2080 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081}
2082
2083static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002084com_generator_expression(struct compiling *c, node *n)
2085{
2086 /* testlist_gexp: test gen_for */
2087 /* argument: test gen_for */
2088 PyCodeObject *co;
2089
2090 REQ(CHILD(n, 0), test);
2091 REQ(CHILD(n, 1), gen_for);
2092
2093 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2094 n->n_lineno);
2095 co = icompile(n, c);
2096 symtable_exit_scope(c->c_symtable);
2097
2098 if (co == NULL)
2099 c->c_errors++;
2100 else {
2101 int closure = com_make_closure(c, co);
2102 int i = com_addconst(c, (PyObject *)co);
2103
2104 com_addoparg(c, LOAD_CONST, i);
2105 com_push(c, 1);
2106 if (closure)
2107 com_addoparg(c, MAKE_CLOSURE, 0);
2108 else
2109 com_addoparg(c, MAKE_FUNCTION, 0);
2110
2111 com_test(c, CHILD(CHILD(n, 1), 3));
2112 com_addbyte(c, GET_ITER);
2113 com_addoparg(c, CALL_FUNCTION, 1);
2114 com_pop(c, 1);
2115
2116 Py_DECREF(co);
2117 }
2118}
2119
2120static void
2121com_testlist_gexp(struct compiling *c, node *n)
2122{
2123 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2124 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2125 com_generator_expression(c, n);
2126 else com_list(c, n, 0);
2127}
2128
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002129
Raymond Hettinger354433a2004-05-19 08:20:33 +00002130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002131com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002132{
2133 int i;
2134 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2135 for (i = 0; i+2 < NCH(n); i += 4) {
2136 /* We must arrange things just right for STORE_SUBSCR.
2137 It wants the stack to look like (value) (dict) (key) */
2138 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002139 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002140 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002141 com_node(c, CHILD(n, i+2)); /* value */
2142 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002143 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002145 }
2146}
2147
2148static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002149com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002150{
2151 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002152 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002153 int i;
2154 REQ(n, atom);
2155 ch = CHILD(n, 0);
2156 switch (TYPE(ch)) {
2157 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002160 com_push(c, 1);
2161 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002162 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002163 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002165 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002166 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002167 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002168 com_push(c, 1);
2169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002171 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002172 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002173 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002174 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002175 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002176 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002177 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002178 break;
2179 case BACKQUOTE:
2180 com_node(c, CHILD(n, 1));
2181 com_addbyte(c, UNARY_CONVERT);
2182 break;
2183 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002184 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 i = 255;
2186 }
2187 else {
2188 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002190 }
2191 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002192 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002193 break;
2194 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002195 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002196 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002197 c->c_errors++;
2198 i = 255;
2199 }
2200 else {
2201 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002202 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002203 }
2204 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002205 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 break;
2207 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002208 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002209 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210 break;
2211 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002212 com_error(c, PyExc_SystemError,
2213 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002214 }
2215}
2216
2217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002218com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002219{
2220 if (NCH(n) == 1) {
2221 com_addbyte(c, op);
2222 }
2223 else if (NCH(n) == 2) {
2224 if (TYPE(CHILD(n, 0)) != COLON) {
2225 com_node(c, CHILD(n, 0));
2226 com_addbyte(c, op+1);
2227 }
2228 else {
2229 com_node(c, CHILD(n, 1));
2230 com_addbyte(c, op+2);
2231 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002233 }
2234 else {
2235 com_node(c, CHILD(n, 0));
2236 com_node(c, CHILD(n, 2));
2237 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002238 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239 }
2240}
2241
Guido van Rossum635abd21997-01-06 22:56:52 +00002242static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002243com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2244{
2245 if (NCH(n) == 1) {
2246 com_addbyte(c, DUP_TOP);
2247 com_push(c, 1);
2248 com_addbyte(c, SLICE);
2249 com_node(c, augn);
2250 com_addbyte(c, opcode);
2251 com_pop(c, 1);
2252 com_addbyte(c, ROT_TWO);
2253 com_addbyte(c, STORE_SLICE);
2254 com_pop(c, 2);
2255 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2256 com_node(c, CHILD(n, 0));
2257 com_addoparg(c, DUP_TOPX, 2);
2258 com_push(c, 2);
2259 com_addbyte(c, SLICE+1);
2260 com_pop(c, 1);
2261 com_node(c, augn);
2262 com_addbyte(c, opcode);
2263 com_pop(c, 1);
2264 com_addbyte(c, ROT_THREE);
2265 com_addbyte(c, STORE_SLICE+1);
2266 com_pop(c, 3);
2267 } else if (NCH(n) == 2) {
2268 com_node(c, CHILD(n, 1));
2269 com_addoparg(c, DUP_TOPX, 2);
2270 com_push(c, 2);
2271 com_addbyte(c, SLICE+2);
2272 com_pop(c, 1);
2273 com_node(c, augn);
2274 com_addbyte(c, opcode);
2275 com_pop(c, 1);
2276 com_addbyte(c, ROT_THREE);
2277 com_addbyte(c, STORE_SLICE+2);
2278 com_pop(c, 3);
2279 } else {
2280 com_node(c, CHILD(n, 0));
2281 com_node(c, CHILD(n, 2));
2282 com_addoparg(c, DUP_TOPX, 3);
2283 com_push(c, 3);
2284 com_addbyte(c, SLICE+3);
2285 com_pop(c, 2);
2286 com_node(c, augn);
2287 com_addbyte(c, opcode);
2288 com_pop(c, 1);
2289 com_addbyte(c, ROT_FOUR);
2290 com_addbyte(c, STORE_SLICE+3);
2291 com_pop(c, 4);
2292 }
2293}
2294
2295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002297{
2298 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002299 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002300 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002301 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002303 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002304 }
2305 else {
2306 com_node(c, CHILD(n, 0));
2307 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002308 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002310 if (NCH(n) == 2) {
2311 com_generator_expression(c, n);
2312 return;
2313 }
2314
Guido van Rossumf10570b1995-07-07 22:53:21 +00002315 m = n;
2316 do {
2317 m = CHILD(m, 0);
2318 } while (NCH(m) == 1);
2319 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002320 /* f(lambda x: x[0] = 3) ends up getting parsed with
2321 * LHS test = lambda x: x[0], and RHS test = 3.
2322 * SF bug 132313 points out that complaining about a keyword
2323 * then is very confusing.
2324 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002326 TYPE(m) == lambdef ?
2327 "lambda cannot contain assignment" :
2328 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002329 }
2330 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002332 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002333 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002335 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002336 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002337 else if (*pkeywords == NULL) {
2338 c->c_errors++;
2339 Py_DECREF(v);
2340 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 if (PyDict_GetItem(*pkeywords, v) != NULL)
2342 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002343 "duplicate keyword argument");
2344 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002346 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002347 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002350 }
2351 }
2352 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002353}
2354
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002356com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002357{
2358 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002359 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 }
2361 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002363 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002364 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002365 int star_flag = 0;
2366 int starstar_flag = 0;
2367 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002368 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002369 na = 0;
2370 nk = 0;
2371 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002372 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002373 if (TYPE(ch) == STAR ||
2374 TYPE(ch) == DOUBLESTAR)
2375 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002376 if (ch->n_lineno != lineno) {
2377 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002378 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002379 }
2380 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002381 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002382 na++;
2383 else
2384 nk++;
2385 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002387 while (i < NCH(n)) {
2388 node *tok = CHILD(n, i);
2389 node *ch = CHILD(n, i+1);
2390 i += 3;
2391 switch (TYPE(tok)) {
2392 case STAR: star_flag = 1; break;
2393 case DOUBLESTAR: starstar_flag = 1; break;
2394 }
2395 com_node(c, ch);
2396 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002397 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002398 com_error(c, PyExc_SyntaxError,
2399 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002400 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002401 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002402 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002403 star_flag + (starstar_flag << 1);
2404 else
2405 opcode = CALL_FUNCTION;
2406 com_addoparg(c, opcode, na | (nk << 8));
2407 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002408 }
2409}
2410
2411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002412com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002413{
2414 com_addopname(c, LOAD_ATTR, n);
2415}
2416
2417static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002418com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002419{
2420 int i=0;
2421 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002422 node *ch;
2423
2424 /* first argument */
2425 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002426 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002427 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002428 i++;
2429 }
2430 else {
2431 com_node(c, CHILD(n,i));
2432 i++;
2433 REQ(CHILD(n,i),COLON);
2434 i++;
2435 }
2436 /* second argument */
2437 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2438 com_node(c, CHILD(n,i));
2439 i++;
2440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002441 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002442 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002443 com_push(c, 1);
2444 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002445 /* remaining arguments */
2446 for (; i < NCH(n); i++) {
2447 ns++;
2448 ch=CHILD(n,i);
2449 REQ(ch, sliceop);
2450 if (NCH(ch) == 1) {
2451 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002452 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002453 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002454 }
2455 else
2456 com_node(c, CHILD(ch,1));
2457 }
2458 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002460}
2461
2462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002463com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002464{
2465 node *ch;
2466 REQ(n, subscript);
2467 ch = CHILD(n,0);
2468 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002469 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002470 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_push(c, 1);
2472 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002473 else {
2474 /* check for slice */
2475 if ((TYPE(ch) == COLON || NCH(n) > 1))
2476 com_sliceobj(c, n);
2477 else {
2478 REQ(ch, test);
2479 com_node(c, ch);
2480 }
2481 }
2482}
2483
2484static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002485com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002486{
2487 int i, op;
2488 REQ(n, subscriptlist);
2489 /* Check to make backward compatible slice behavior for '[i:j]' */
2490 if (NCH(n) == 1) {
2491 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002492 /* 'Basic' slice, should have exactly one colon. */
2493 if ((TYPE(CHILD(sub, 0)) == COLON
2494 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2495 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2496 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002497 switch (assigning) {
2498 case OP_DELETE:
2499 op = DELETE_SLICE;
2500 break;
2501 case OP_ASSIGN:
2502 op = STORE_SLICE;
2503 break;
2504 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002505 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002506 break;
2507 default:
2508 com_augassign_slice(c, sub, assigning, augn);
2509 return;
2510 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002511 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002512 if (op == STORE_SLICE)
2513 com_pop(c, 2);
2514 else if (op == DELETE_SLICE)
2515 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002516 return;
2517 }
2518 }
2519 /* Else normal subscriptlist. Compile each subscript. */
2520 for (i = 0; i < NCH(n); i += 2)
2521 com_subscript(c, CHILD(n, i));
2522 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002523 if (NCH(n) > 1) {
2524 i = (NCH(n)+1) / 2;
2525 com_addoparg(c, BUILD_TUPLE, i);
2526 com_pop(c, i-1);
2527 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002528 switch (assigning) {
2529 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 op = DELETE_SUBSCR;
2531 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002532 break;
2533 default:
2534 case OP_ASSIGN:
2535 op = STORE_SUBSCR;
2536 i = 3;
2537 break;
2538 case OP_APPLY:
2539 op = BINARY_SUBSCR;
2540 i = 1;
2541 break;
2542 }
2543 if (assigning > OP_APPLY) {
2544 com_addoparg(c, DUP_TOPX, 2);
2545 com_push(c, 2);
2546 com_addbyte(c, BINARY_SUBSCR);
2547 com_pop(c, 1);
2548 com_node(c, augn);
2549 com_addbyte(c, assigning);
2550 com_pop(c, 1);
2551 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002552 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002553 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002554 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002555}
2556
2557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002558com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002559{
2560 REQ(n, trailer);
2561 switch (TYPE(CHILD(n, 0))) {
2562 case LPAR:
2563 com_call_function(c, CHILD(n, 1));
2564 break;
2565 case DOT:
2566 com_select_member(c, CHILD(n, 1));
2567 break;
2568 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002569 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 break;
2571 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002572 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002573 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 }
2575}
2576
2577static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002578com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002579{
2580 int i;
2581 REQ(n, power);
2582 com_atom(c, CHILD(n, 0));
2583 for (i = 1; i < NCH(n); i++) {
2584 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2585 com_factor(c, CHILD(n, i+1));
2586 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002587 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002588 break;
2589 }
2590 else
2591 com_apply_trailer(c, CHILD(n, i));
2592 }
2593}
2594
2595static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002596com_invert_constant(struct compiling *c, node *n)
2597{
2598 /* Compute the inverse of int and longs and use them directly,
2599 but be prepared to generate code for all other
2600 possibilities (invalid numbers, floats, complex).
2601 */
2602 PyObject *num, *inv = NULL;
2603 int i;
2604
2605 REQ(n, NUMBER);
2606 num = parsenumber(c, STR(n));
2607 if (num == NULL)
2608 i = 255;
2609 else {
2610 inv = PyNumber_Invert(num);
2611 if (inv == NULL) {
2612 PyErr_Clear();
2613 i = com_addconst(c, num);
2614 } else {
2615 i = com_addconst(c, inv);
2616 Py_DECREF(inv);
2617 }
2618 Py_DECREF(num);
2619 }
2620 com_addoparg(c, LOAD_CONST, i);
2621 com_push(c, 1);
2622 if (num != NULL && inv == NULL)
2623 com_addbyte(c, UNARY_INVERT);
2624}
2625
Tim Peters51e26512001-09-07 08:45:55 +00002626static int
2627is_float_zero(const char *p)
2628{
2629 int found_radix_point = 0;
2630 int ch;
2631 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2632 switch (ch) {
2633 case '0':
2634 /* no reason to believe it's not 0 -- continue */
2635 break;
2636
2637 case 'e': case 'E': case 'j': case 'J':
2638 /* If this was a hex constant, we already would have
2639 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2640 must be an exponent marker, and we haven't yet
2641 seen a non-zero digit, and it doesn't matter what
2642 the exponent is then. For 'j' or 'J' similarly,
2643 except that this is an imaginary 0 then. */
2644 return 1;
2645
2646 case '.':
2647 found_radix_point = 1;
2648 break;
2649
2650 default:
2651 return 0;
2652 }
2653 }
2654 return found_radix_point;
2655}
2656
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002657static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002658com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002659{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002660 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002661 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002662 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002663 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002664 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002665 approriate value as a constant. If the value is negative,
2666 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002667 negative in the 0th position -- unless we're doing unary minus
2668 of a floating zero! In that case the sign is significant, but
2669 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002670 */
2671 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002672 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002673 && TYPE((pfactor = CHILD(n, 1))) == factor
2674 && NCH(pfactor) == 1
2675 && TYPE((ppower = CHILD(pfactor, 0))) == power
2676 && NCH(ppower) == 1
2677 && TYPE((patom = CHILD(ppower, 0))) == atom
2678 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002679 && !(childtype == MINUS &&
2680 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002681 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002682 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002683 return;
2684 }
2685 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002686 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002687 if (s == NULL) {
2688 com_error(c, PyExc_MemoryError, "");
2689 com_addbyte(c, 255);
2690 return;
2691 }
2692 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002693 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002694 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002695 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002696 }
Tim Peters51e26512001-09-07 08:45:55 +00002697 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002698 }
2699 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002700 com_factor(c, CHILD(n, 1));
2701 com_addbyte(c, UNARY_POSITIVE);
2702 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002703 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002704 com_factor(c, CHILD(n, 1));
2705 com_addbyte(c, UNARY_NEGATIVE);
2706 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002707 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002708 com_factor(c, CHILD(n, 1));
2709 com_addbyte(c, UNARY_INVERT);
2710 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002711 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002712 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002713 }
2714}
2715
2716static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002717com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002718{
2719 int i;
2720 int op;
2721 REQ(n, term);
2722 com_factor(c, CHILD(n, 0));
2723 for (i = 2; i < NCH(n); i += 2) {
2724 com_factor(c, CHILD(n, i));
2725 switch (TYPE(CHILD(n, i-1))) {
2726 case STAR:
2727 op = BINARY_MULTIPLY;
2728 break;
2729 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002730 if (c->c_flags & CO_FUTURE_DIVISION)
2731 op = BINARY_TRUE_DIVIDE;
2732 else
2733 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002734 break;
2735 case PERCENT:
2736 op = BINARY_MODULO;
2737 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002738 case DOUBLESLASH:
2739 op = BINARY_FLOOR_DIVIDE;
2740 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002742 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002743 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002744 op = 255;
2745 }
2746 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002747 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002748 }
2749}
2750
2751static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002752com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002753{
2754 int i;
2755 int op;
2756 REQ(n, arith_expr);
2757 com_term(c, CHILD(n, 0));
2758 for (i = 2; i < NCH(n); i += 2) {
2759 com_term(c, CHILD(n, i));
2760 switch (TYPE(CHILD(n, i-1))) {
2761 case PLUS:
2762 op = BINARY_ADD;
2763 break;
2764 case MINUS:
2765 op = BINARY_SUBTRACT;
2766 break;
2767 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002768 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002769 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002770 op = 255;
2771 }
2772 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002774 }
2775}
2776
2777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002778com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002779{
2780 int i;
2781 int op;
2782 REQ(n, shift_expr);
2783 com_arith_expr(c, CHILD(n, 0));
2784 for (i = 2; i < NCH(n); i += 2) {
2785 com_arith_expr(c, CHILD(n, i));
2786 switch (TYPE(CHILD(n, i-1))) {
2787 case LEFTSHIFT:
2788 op = BINARY_LSHIFT;
2789 break;
2790 case RIGHTSHIFT:
2791 op = BINARY_RSHIFT;
2792 break;
2793 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002794 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002795 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002796 op = 255;
2797 }
2798 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002799 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002800 }
2801}
2802
2803static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002804com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002805{
2806 int i;
2807 int op;
2808 REQ(n, and_expr);
2809 com_shift_expr(c, CHILD(n, 0));
2810 for (i = 2; i < NCH(n); i += 2) {
2811 com_shift_expr(c, CHILD(n, i));
2812 if (TYPE(CHILD(n, i-1)) == AMPER) {
2813 op = BINARY_AND;
2814 }
2815 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002816 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002817 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002818 op = 255;
2819 }
2820 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002821 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002822 }
2823}
2824
2825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002826com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002827{
2828 int i;
2829 int op;
2830 REQ(n, xor_expr);
2831 com_and_expr(c, CHILD(n, 0));
2832 for (i = 2; i < NCH(n); i += 2) {
2833 com_and_expr(c, CHILD(n, i));
2834 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2835 op = BINARY_XOR;
2836 }
2837 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002838 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002839 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 op = 255;
2841 }
2842 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002843 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 }
2845}
2846
2847static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002848com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849{
2850 int i;
2851 int op;
2852 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002853 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002855 com_xor_expr(c, CHILD(n, i));
2856 if (TYPE(CHILD(n, i-1)) == VBAR) {
2857 op = BINARY_OR;
2858 }
2859 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002860 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002861 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 op = 255;
2863 }
2864 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 }
2867}
2868
2869static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002870cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871{
2872 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002873 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002874 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2875 if (NCH(n) == 1) {
2876 n = CHILD(n, 0);
2877 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002878 case LESS: return PyCmp_LT;
2879 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002880 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002881 case LESSEQUAL: return PyCmp_LE;
2882 case GREATEREQUAL: return PyCmp_GE;
2883 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2884 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2885 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 }
2887 }
2888 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002891 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002893 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894 }
2895 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002896 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002897}
2898
2899static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002900com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901{
2902 int i;
2903 enum cmp_op op;
2904 int anchor;
2905 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2906 com_expr(c, CHILD(n, 0));
2907 if (NCH(n) == 1)
2908 return;
2909
2910 /****************************************************************
2911 The following code is generated for all but the last
2912 comparison in a chain:
2913
2914 label: on stack: opcode: jump to:
2915
2916 a <code to load b>
2917 a, b DUP_TOP
2918 a, b, b ROT_THREE
2919 b, a, b COMPARE_OP
2920 b, 0-or-1 JUMP_IF_FALSE L1
2921 b, 1 POP_TOP
2922 b
2923
2924 We are now ready to repeat this sequence for the next
2925 comparison in the chain.
2926
2927 For the last we generate:
2928
2929 b <code to load c>
2930 b, c COMPARE_OP
2931 0-or-1
2932
2933 If there were any jumps to L1 (i.e., there was more than one
2934 comparison), we generate:
2935
2936 0-or-1 JUMP_FORWARD L2
2937 L1: b, 0 ROT_TWO
2938 0, b POP_TOP
2939 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002940 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002941 ****************************************************************/
2942
2943 anchor = 0;
2944
2945 for (i = 2; i < NCH(n); i += 2) {
2946 com_expr(c, CHILD(n, i));
2947 if (i+2 < NCH(n)) {
2948 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002950 com_addbyte(c, ROT_THREE);
2951 }
2952 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002953 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002954 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002955 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002956 }
2957 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002958 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959 if (i+2 < NCH(n)) {
2960 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2961 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002962 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002963 }
2964 }
2965
2966 if (anchor) {
2967 int anchor2 = 0;
2968 com_addfwref(c, JUMP_FORWARD, &anchor2);
2969 com_backpatch(c, anchor);
2970 com_addbyte(c, ROT_TWO);
2971 com_addbyte(c, POP_TOP);
2972 com_backpatch(c, anchor2);
2973 }
2974}
2975
2976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978{
2979 REQ(n, not_test); /* 'not' not_test | comparison */
2980 if (NCH(n) == 1) {
2981 com_comparison(c, CHILD(n, 0));
2982 }
2983 else {
2984 com_not_test(c, CHILD(n, 1));
2985 com_addbyte(c, UNARY_NOT);
2986 }
2987}
2988
2989static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002990com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991{
2992 int i;
2993 int anchor;
2994 REQ(n, and_test); /* not_test ('and' not_test)* */
2995 anchor = 0;
2996 i = 0;
2997 for (;;) {
2998 com_not_test(c, CHILD(n, i));
2999 if ((i += 2) >= NCH(n))
3000 break;
3001 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004 }
3005 if (anchor)
3006 com_backpatch(c, anchor);
3007}
3008
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003009static int
3010com_make_closure(struct compiling *c, PyCodeObject *co)
3011{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003012 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003013 if (free == 0)
3014 return 0;
3015 for (i = 0; i < free; ++i) {
3016 /* Bypass com_addop_varname because it will generate
3017 LOAD_DEREF but LOAD_CLOSURE is needed.
3018 */
3019 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3020 int arg, reftype;
3021
3022 /* Special case: If a class contains a method with a
3023 free variable that has the same name as a method,
3024 the name will be considered free *and* local in the
3025 class. It should be handled by the closure, as
3026 well as by the normal name loookup logic.
3027 */
3028 reftype = get_ref_type(c, PyString_AS_STRING(name));
3029 if (reftype == CELL)
3030 arg = com_lookup_arg(c->c_cellvars, name);
3031 else /* (reftype == FREE) */
3032 arg = com_lookup_arg(c->c_freevars, name);
3033 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003034 fprintf(stderr, "lookup %s in %s %d %d\n"
3035 "freevars of %s: %s\n",
3036 PyObject_REPR(name),
3037 c->c_name,
3038 reftype, arg,
3039 PyString_AS_STRING(co->co_name),
3040 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003041 Py_FatalError("com_make_closure()");
3042 }
3043 com_addoparg(c, LOAD_CLOSURE, arg);
3044
3045 }
3046 com_push(c, free);
3047 return 1;
3048}
3049
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003051com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003054 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003055 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003056 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003057 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003058 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3059 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003060 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003061 if (co == NULL) {
3062 c->c_errors++;
3063 return;
3064 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003065 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003066 i = com_addconst(c, (PyObject *)co);
3067 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003068 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003070 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003071 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003072 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003073 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003074 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003075 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003078 else {
3079 int anchor = 0;
3080 int i = 0;
3081 for (;;) {
3082 com_and_test(c, CHILD(n, i));
3083 if ((i += 2) >= NCH(n))
3084 break;
3085 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3086 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003088 }
3089 if (anchor)
3090 com_backpatch(c, anchor);
3091 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092}
3093
3094static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003095com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003096{
3097 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003098 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 com_node(c, CHILD(n, 0));
3100 }
3101 else {
3102 int i;
3103 int len;
3104 len = (NCH(n) + 1) / 2;
3105 for (i = 0; i < NCH(n); i += 2)
3106 com_node(c, CHILD(n, i));
3107 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003108 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109 }
3110}
3111
3112
3113/* Begin of assignment compilation */
3114
Thomas Wouters434d0822000-08-24 20:11:32 +00003115
3116static void
3117com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3118{
3119 com_addbyte(c, DUP_TOP);
3120 com_push(c, 1);
3121 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003122 com_node(c, augn);
3123 com_addbyte(c, opcode);
3124 com_pop(c, 1);
3125 com_addbyte(c, ROT_TWO);
3126 com_addopname(c, STORE_ATTR, n);
3127 com_pop(c, 2);
3128}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129
3130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003131com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003133 if (none_assignment_check(c, STR(n), assigning))
3134 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003136 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003137}
3138
3139static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003140com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 REQ(n, trailer);
3143 switch (TYPE(CHILD(n, 0))) {
3144 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003145 if (assigning == OP_DELETE)
3146 com_error(c, PyExc_SyntaxError,
3147 "can't delete function call");
3148 else
3149 com_error(c, PyExc_SyntaxError,
3150 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 break;
3152 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003153 if (assigning > OP_APPLY)
3154 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3155 else
3156 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003158 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003159 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160 break;
3161 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003162 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 }
3164}
3165
3166static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003167com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003168{
3169 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003170 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3171 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003172 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003173 if (assigning) {
3174 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003175 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003176 com_push(c, i-1);
3177 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003179 com_assign(c, CHILD(n, i), assigning, NULL);
3180}
3181
3182static void
3183com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3184{
3185 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003186 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003187 com_push(c, 1);
3188 com_node(c, augn);
3189 com_addbyte(c, opcode);
3190 com_pop(c, 1);
3191 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192}
3193
3194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003195com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003196{
3197 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003198 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003199 if (assigning)
3200 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003201}
3202
3203static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003204com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003205{
3206 /* Loop to avoid trivial recursion */
3207 for (;;) {
3208 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003209
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003210 case exprlist:
3211 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003212 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003213 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003214 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003215 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003216 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003217 "assign to generator expression not possible");
3218 return;
3219 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003220 if (assigning > OP_APPLY) {
3221 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003222 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003223 return;
3224 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003225 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 return;
3227 }
3228 n = CHILD(n, 0);
3229 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003230
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003231 case test:
3232 case and_test:
3233 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003236 case xor_expr:
3237 case and_expr:
3238 case shift_expr:
3239 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003241 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003243 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003244 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 return;
3246 }
3247 n = CHILD(n, 0);
3248 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003249
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003250 case power: /* atom trailer* ('**' power)*
3251 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003252 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003253 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003254 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003255 return;
3256 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003257 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 int i;
3259 com_node(c, CHILD(n, 0));
3260 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003261 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003262 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003263 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003264 return;
3265 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266 com_apply_trailer(c, CHILD(n, i));
3267 } /* NB i is still alive */
3268 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003269 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270 return;
3271 }
3272 n = CHILD(n, 0);
3273 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003274
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 case atom:
3276 switch (TYPE(CHILD(n, 0))) {
3277 case LPAR:
3278 n = CHILD(n, 1);
3279 if (TYPE(n) == RPAR) {
3280 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003281 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003282 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003283 return;
3284 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003285 if (assigning > OP_APPLY) {
3286 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003287 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003288 return;
3289 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003290 break;
3291 case LSQB:
3292 n = CHILD(n, 1);
3293 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003294 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003295 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 return;
3297 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003298 if (assigning > OP_APPLY) {
3299 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003300 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003301 return;
3302 }
3303 if (NCH(n) > 1
3304 && TYPE(CHILD(n, 1)) == list_for) {
3305 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003306 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003307 return;
3308 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003309 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 return;
3311 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003312 if (assigning > OP_APPLY)
3313 com_augassign_name(c, CHILD(n, 0),
3314 assigning, augn);
3315 else
3316 com_assign_name(c, CHILD(n, 0),
3317 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 return;
3319 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003320 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003321 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003322 return;
3323 }
3324 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003325
3326 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003327 com_error(c, PyExc_SyntaxError,
3328 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003329 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003330
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003331 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003332 com_error(c, PyExc_SystemError,
3333 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003335
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 }
3337 }
3338}
Guido van Rossum7c531111997-03-11 18:42:21 +00003339
Thomas Wouters434d0822000-08-24 20:11:32 +00003340static void
3341com_augassign(struct compiling *c, node *n)
3342{
3343 int opcode;
3344
3345 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3346 case '+': opcode = INPLACE_ADD; break;
3347 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003348 case '/':
3349 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3350 opcode = INPLACE_FLOOR_DIVIDE;
3351 else if (c->c_flags & CO_FUTURE_DIVISION)
3352 opcode = INPLACE_TRUE_DIVIDE;
3353 else
3354 opcode = INPLACE_DIVIDE;
3355 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003356 case '%': opcode = INPLACE_MODULO; break;
3357 case '<': opcode = INPLACE_LSHIFT; break;
3358 case '>': opcode = INPLACE_RSHIFT; break;
3359 case '&': opcode = INPLACE_AND; break;
3360 case '^': opcode = INPLACE_XOR; break;
3361 case '|': opcode = INPLACE_OR; break;
3362 case '*':
3363 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3364 opcode = INPLACE_POWER;
3365 else
3366 opcode = INPLACE_MULTIPLY;
3367 break;
3368 default:
3369 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3370 return;
3371 }
3372 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3373}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374
3375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003376com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377{
Thomas Wouters434d0822000-08-24 20:11:32 +00003378 REQ(n, expr_stmt);
3379 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003380 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003381 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003382 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003383 if (NCH(n) == 1) {
3384 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003385 if (c->c_interactive)
3386 com_addbyte(c, PRINT_EXPR);
3387 else
3388 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003391 else if (TYPE(CHILD(n,1)) == augassign)
3392 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393 else {
3394 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003395 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003396 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003397 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003399 com_push(c, 1);
3400 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003401 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 }
3403 }
3404}
3405
3406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003407com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003408{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003409 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003410 int i;
3411 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003412 if (Py_OptimizeFlag)
3413 return;
3414 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003415
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003416 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003417 raise AssertionError [, <message>]
3418
3419 where <message> is the second test, if present.
3420 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003421 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003422 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003423 com_addbyte(c, POP_TOP);
3424 com_pop(c, 1);
3425 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003426 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003427 com_push(c, 1);
3428 i = NCH(n)/2; /* Either 2 or 4 */
3429 if (i > 1)
3430 com_node(c, CHILD(n, 3));
3431 com_addoparg(c, RAISE_VARARGS, i);
3432 com_pop(c, i);
3433 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003434 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003435 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003436 com_addbyte(c, POP_TOP);
3437}
3438
3439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003440com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003441{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003442 int i = 1;
3443 node* stream = NULL;
3444
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003445 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003446
3447 /* are we using the extended print form? */
3448 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3449 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003450 com_node(c, stream);
3451 /* stack: [...] => [... stream] */
3452 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003453 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3454 i = 4;
3455 else
3456 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003458 for (; i < NCH(n); i += 2) {
3459 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003460 com_addbyte(c, DUP_TOP);
3461 /* stack: [stream] => [stream stream] */
3462 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003463 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003464 /* stack: [stream stream] => [stream stream obj] */
3465 com_addbyte(c, ROT_TWO);
3466 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003467 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003468 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003469 com_pop(c, 2);
3470 }
3471 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003472 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003473 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003474 com_addbyte(c, PRINT_ITEM);
3475 com_pop(c, 1);
3476 }
3477 }
3478 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003479 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003480 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003481 /* must pop the extra stream object off the stack */
3482 com_addbyte(c, POP_TOP);
3483 /* stack: [... stream] => [...] */
3484 com_pop(c, 1);
3485 }
3486 }
3487 else {
3488 if (stream != NULL) {
3489 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003490 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003491 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003492 com_pop(c, 1);
3493 }
3494 else
3495 com_addbyte(c, PRINT_NEWLINE);
3496 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497}
3498
3499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003500com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003501{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003502 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003503 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003504 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003505 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003506 if (c->c_flags & CO_GENERATOR) {
3507 if (NCH(n) > 1) {
3508 com_error(c, PyExc_SyntaxError,
3509 "'return' with argument inside generator");
3510 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003511 }
3512 if (NCH(n) < 2) {
3513 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 com_push(c, 1);
3515 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003516 else
3517 com_node(c, CHILD(n, 1));
3518 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003519 com_pop(c, 1);
3520}
3521
3522static void
3523com_yield_stmt(struct compiling *c, node *n)
3524{
Tim Peters95c80f82001-06-23 02:07:08 +00003525 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003526 REQ(n, yield_stmt); /* 'yield' testlist */
3527 if (!c->c_infunction) {
3528 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3529 }
Tim Peters95c80f82001-06-23 02:07:08 +00003530
3531 for (i = 0; i < c->c_nblocks; ++i) {
3532 if (c->c_block[i] == SETUP_FINALLY) {
3533 com_error(c, PyExc_SyntaxError,
3534 "'yield' not allowed in a 'try' block "
3535 "with a 'finally' clause");
3536 return;
3537 }
3538 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003539 com_node(c, CHILD(n, 1));
3540 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003541 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542}
3543
3544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003545com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003547 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003548 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3549 if (NCH(n) > 1) {
3550 com_node(c, CHILD(n, 1));
3551 if (NCH(n) > 3) {
3552 com_node(c, CHILD(n, 3));
3553 if (NCH(n) > 5)
3554 com_node(c, CHILD(n, 5));
3555 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003556 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003557 i = NCH(n)/2;
3558 com_addoparg(c, RAISE_VARARGS, i);
3559 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003560}
3561
3562static void
Thomas Wouters52152252000-08-17 22:55:00 +00003563com_from_import(struct compiling *c, node *n)
3564{
3565 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3566 com_push(c, 1);
3567 if (NCH(n) > 1) {
3568 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3569 com_error(c, PyExc_SyntaxError, "invalid syntax");
3570 return;
3571 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003572 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003573 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003574 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003575 com_pop(c, 1);
3576}
3577
3578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003579com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003581 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582 int i;
3583 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003584 n = CHILD(n, 0);
3585 /* import_stmt: import_name | import_from */
3586 if (TYPE(n) == import_from) {
3587 /* 'from' dotted_name 'import' ('*' |
3588 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003589 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003590 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003591 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3592 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003593 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003594 else {
3595 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3596 TYPE(CHILD(n, 3)) != LPAR) {
3597 com_error(c, PyExc_SyntaxError,
3598 "trailing comma not allowed "
3599 "without surrounding parentheses");
3600 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003601 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003602 REQ(nn, import_as_names);
3603 tup = PyTuple_New((NCH(nn) + 1) / 2);
3604 for (i = 0; i < NCH(nn); i += 2)
3605 PyTuple_SET_ITEM(tup, i / 2,
3606 PyString_FromString(STR(
3607 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003608 }
3609 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003610 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003611 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003612 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003613 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003614 com_addbyte(c, IMPORT_STAR);
3615 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003616 for (i = 0; i < NCH(nn); i += 2)
3617 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003618 com_addbyte(c, POP_TOP);
3619 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003620 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003621 }
3622 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003623 /* 'import' dotted_as_names */
3624 nn = CHILD(n, 1);
3625 REQ(nn, dotted_as_names);
3626 for (i = 0; i < NCH(nn); i += 2) {
3627 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003628 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003629 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003630 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003631 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003632 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003633 int j;
3634 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003635 com_error(c, PyExc_SyntaxError,
3636 "invalid syntax");
3637 return;
3638 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003639 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3640 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003641 CHILD(CHILD(subn, 0),
3642 j));
3643 com_addop_varname(c, VAR_STORE,
3644 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003645 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003646 com_addop_varname(c, VAR_STORE,
3647 STR(CHILD(CHILD(subn, 0),
3648 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003649 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003650 }
3651 }
3652}
3653
3654static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003655com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003656{
3657 REQ(n, exec_stmt);
3658 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3659 com_node(c, CHILD(n, 1));
3660 if (NCH(n) >= 4)
3661 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003662 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003663 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003664 com_push(c, 1);
3665 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003666 if (NCH(n) >= 6)
3667 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003668 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003669 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_push(c, 1);
3671 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003672 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003673 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003674}
3675
Guido van Rossum7c531111997-03-11 18:42:21 +00003676static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003677is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003678{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003679 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003680 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003681 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003682
3683 /* Label to avoid tail recursion */
3684 next:
3685 switch (TYPE(n)) {
3686
3687 case suite:
3688 if (NCH(n) == 1) {
3689 n = CHILD(n, 0);
3690 goto next;
3691 }
3692 /* Fall through */
3693 case file_input:
3694 for (i = 0; i < NCH(n); i++) {
3695 node *ch = CHILD(n, i);
3696 if (TYPE(ch) == stmt) {
3697 n = ch;
3698 goto next;
3699 }
3700 }
3701 break;
3702
3703 case stmt:
3704 case simple_stmt:
3705 case small_stmt:
3706 n = CHILD(n, 0);
3707 goto next;
3708
3709 case expr_stmt:
3710 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003711 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003712 case test:
3713 case and_test:
3714 case not_test:
3715 case comparison:
3716 case expr:
3717 case xor_expr:
3718 case and_expr:
3719 case shift_expr:
3720 case arith_expr:
3721 case term:
3722 case factor:
3723 case power:
3724 case atom:
3725 if (NCH(n) == 1) {
3726 n = CHILD(n, 0);
3727 goto next;
3728 }
3729 break;
3730
3731 case NAME:
3732 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3733 return 1;
3734 break;
3735
3736 case NUMBER:
3737 v = parsenumber(c, STR(n));
3738 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003739 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003740 break;
3741 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003742 i = PyObject_IsTrue(v);
3743 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003744 return i == 0;
3745
3746 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003747 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003748 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003749 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003750 break;
3751 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003752 i = PyObject_IsTrue(v);
3753 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003754 return i == 0;
3755
3756 }
3757 return 0;
3758}
3759
Tim Peters08a898f2001-06-28 01:52:22 +00003760
3761/* Look under n for a return stmt with an expression.
3762 * This hack is used to find illegal returns under "if 0:" blocks in
3763 * functions already known to be generators (as determined by the symtable
3764 * pass).
3765 * Return the offending return node if found, else NULL.
3766 */
3767static node *
3768look_for_offending_return(node *n)
3769{
3770 int i;
3771
3772 for (i = 0; i < NCH(n); ++i) {
3773 node *kid = CHILD(n, i);
3774
3775 switch (TYPE(kid)) {
3776 case classdef:
3777 case funcdef:
3778 case lambdef:
3779 /* Stuff in nested functions & classes doesn't
3780 affect the code block we started in. */
3781 return NULL;
3782
3783 case return_stmt:
3784 if (NCH(kid) > 1)
3785 return kid;
3786 break;
3787
3788 default: {
3789 node *bad = look_for_offending_return(kid);
3790 if (bad != NULL)
3791 return bad;
3792 }
3793 }
3794 }
3795
3796 return NULL;
3797}
3798
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003800com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003801{
3802 int i;
3803 int anchor = 0;
3804 REQ(n, if_stmt);
3805 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3806 for (i = 0; i+3 < NCH(n); i+=4) {
3807 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003808 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003809 if (is_constant_false(c, ch)) {
3810 /* We're going to skip this block. However, if this
3811 is a generator, we have to check the dead code
3812 anyway to make sure there aren't any return stmts
3813 with expressions, in the same scope. */
3814 if (c->c_flags & CO_GENERATOR) {
3815 node *p = look_for_offending_return(n);
3816 if (p != NULL) {
3817 int savelineno = c->c_lineno;
3818 c->c_lineno = p->n_lineno;
3819 com_error(c, PyExc_SyntaxError,
3820 "'return' with argument "
3821 "inside generator");
3822 c->c_lineno = savelineno;
3823 }
3824 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003825 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003826 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003827 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003828 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003829 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003830 com_addfwref(c, JUMP_IF_FALSE, &a);
3831 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003832 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003833 com_node(c, CHILD(n, i+3));
3834 com_addfwref(c, JUMP_FORWARD, &anchor);
3835 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003836 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003837 com_addbyte(c, POP_TOP);
3838 }
3839 if (i+2 < NCH(n))
3840 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003841 if (anchor)
3842 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843}
3844
3845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003846com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003847{
3848 int break_anchor = 0;
3849 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003850 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003851 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3852 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003853 block_push(c, SETUP_LOOP);
3854 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003855 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003856 com_node(c, CHILD(n, 1));
3857 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3858 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003860 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003861 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003862 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003863 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3864 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003865 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003867 com_addbyte(c, POP_TOP);
3868 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003869 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 if (NCH(n) > 4)
3871 com_node(c, CHILD(n, 6));
3872 com_backpatch(c, break_anchor);
3873}
3874
3875static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003876com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003878 int break_anchor = 0;
3879 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003880 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003881 REQ(n, for_stmt);
3882 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3883 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003884 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003886 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003887 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003888 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003889 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003890 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003891 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003892 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003894 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003895 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3896 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003897 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003898 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003899 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003900 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003901 if (NCH(n) > 8)
3902 com_node(c, CHILD(n, 8));
3903 com_backpatch(c, break_anchor);
3904}
3905
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003906/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003907
3908 SETUP_FINALLY L
3909 <code for S>
3910 POP_BLOCK
3911 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003912 L: <code for Sf>
3913 END_FINALLY
3914
3915 The special instructions use the block stack. Each block
3916 stack entry contains the instruction that created it (here
3917 SETUP_FINALLY), the level of the value stack at the time the
3918 block stack entry was created, and a label (here L).
3919
3920 SETUP_FINALLY:
3921 Pushes the current value stack level and the label
3922 onto the block stack.
3923 POP_BLOCK:
3924 Pops en entry from the block stack, and pops the value
3925 stack until its level is the same as indicated on the
3926 block stack. (The label is ignored.)
3927 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003928 Pops a variable number of entries from the *value* stack
3929 and re-raises the exception they specify. The number of
3930 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003931
3932 The block stack is unwound when an exception is raised:
3933 when a SETUP_FINALLY entry is found, the exception is pushed
3934 onto the value stack (and the exception condition is cleared),
3935 and the interpreter jumps to the label gotten from the block
3936 stack.
3937
3938 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003939 (The contents of the value stack is shown in [], with the top
3940 at the right; 'tb' is trace-back info, 'val' the exception's
3941 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003942
3943 Value stack Label Instruction Argument
3944 [] SETUP_EXCEPT L1
3945 [] <code for S>
3946 [] POP_BLOCK
3947 [] JUMP_FORWARD L0
3948
Guido van Rossum3f5da241990-12-20 15:06:42 +00003949 [tb, val, exc] L1: DUP )
3950 [tb, val, exc, exc] <evaluate E1> )
3951 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3952 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3953 [tb, val, exc, 1] POP )
3954 [tb, val, exc] POP
3955 [tb, val] <assign to V1> (or POP if no V1)
3956 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003957 [] <code for S1>
3958 JUMP_FORWARD L0
3959
Guido van Rossum3f5da241990-12-20 15:06:42 +00003960 [tb, val, exc, 0] L2: POP
3961 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003962 .............................etc.......................
3963
Guido van Rossum3f5da241990-12-20 15:06:42 +00003964 [tb, val, exc, 0] Ln+1: POP
3965 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003966
3967 [] L0: <next statement>
3968
3969 Of course, parts are not generated if Vi or Ei is not present.
3970*/
3971
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003973com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003974{
3975 int except_anchor = 0;
3976 int end_anchor = 0;
3977 int else_anchor = 0;
3978 int i;
3979 node *ch;
3980
3981 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3982 block_push(c, SETUP_EXCEPT);
3983 com_node(c, CHILD(n, 2));
3984 com_addbyte(c, POP_BLOCK);
3985 block_pop(c, SETUP_EXCEPT);
3986 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3987 com_backpatch(c, except_anchor);
3988 for (i = 3;
3989 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3990 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003992 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003993 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003994 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003995 break;
3996 }
3997 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003998 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003999 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004000 if (NCH(ch) > 1) {
4001 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004002 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004003 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004004 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004006 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004008 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004009 }
4010 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004011 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004012 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004013 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004014 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004015 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016 com_pop(c, 1);
4017 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004018 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004019 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004020 com_node(c, CHILD(n, i+2));
4021 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4022 if (except_anchor) {
4023 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004024 /* We come in with [tb, val, exc, 0] on the
4025 stack; one pop and it's the same as
4026 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004027 com_addbyte(c, POP_TOP);
4028 }
4029 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004030 /* We actually come in here with [tb, val, exc] but the
4031 END_FINALLY will zap those and jump around.
4032 The c_stacklevel does not reflect them so we need not pop
4033 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004034 com_addbyte(c, END_FINALLY);
4035 com_backpatch(c, else_anchor);
4036 if (i < NCH(n))
4037 com_node(c, CHILD(n, i+2));
4038 com_backpatch(c, end_anchor);
4039}
4040
4041static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004042com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043{
4044 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004045 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004046
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004047 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4048 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004049 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004050 com_addbyte(c, POP_BLOCK);
4051 block_pop(c, SETUP_FINALLY);
4052 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004053 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004054 /* While the generated code pushes only one item,
4055 the try-finally handling can enter here with
4056 up to three items. OK, here are the details:
4057 3 for an exception, 2 for RETURN, 1 for BREAK. */
4058 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004059 com_backpatch(c, finally_anchor);
4060 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004061 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004062 com_node(c, ch);
4063 com_addbyte(c, END_FINALLY);
4064 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004065 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004066}
4067
4068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004069com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004070{
4071 REQ(n, try_stmt);
4072 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4073 | 'try' ':' suite 'finally' ':' suite */
4074 if (TYPE(CHILD(n, 3)) != except_clause)
4075 com_try_finally(c, n);
4076 else
4077 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004078}
4079
Guido van Rossum8b993a91997-01-17 21:04:03 +00004080static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004081get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004082{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004083 int i;
4084
Guido van Rossum8b993a91997-01-17 21:04:03 +00004085 /* Label to avoid tail recursion */
4086 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004087 switch (TYPE(n)) {
4088
4089 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004090 if (NCH(n) == 1) {
4091 n = CHILD(n, 0);
4092 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004093 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004094 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004095 case file_input:
4096 for (i = 0; i < NCH(n); i++) {
4097 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004098 if (TYPE(ch) == stmt) {
4099 n = ch;
4100 goto next;
4101 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004102 }
4103 break;
4104
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004105 case stmt:
4106 case simple_stmt:
4107 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004108 n = CHILD(n, 0);
4109 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004110
4111 case expr_stmt:
4112 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004113 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004114 case test:
4115 case and_test:
4116 case not_test:
4117 case comparison:
4118 case expr:
4119 case xor_expr:
4120 case and_expr:
4121 case shift_expr:
4122 case arith_expr:
4123 case term:
4124 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004125 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004126 if (NCH(n) == 1) {
4127 n = CHILD(n, 0);
4128 goto next;
4129 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004130 break;
4131
4132 case atom:
4133 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004134 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004135 break;
4136
4137 }
4138 return NULL;
4139}
4140
Guido van Rossum79f25d91997-04-29 20:08:16 +00004141static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004142get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143{
Guido van Rossum541563e1999-01-28 15:08:09 +00004144 /* Don't generate doc-strings if run with -OO */
4145 if (Py_OptimizeFlag > 1)
4146 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004147 n = get_rawdocstring(n);
4148 if (n == NULL)
4149 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004150 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151}
4152
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004154com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004155{
4156 REQ(n, suite);
4157 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4158 if (NCH(n) == 1) {
4159 com_node(c, CHILD(n, 0));
4160 }
4161 else {
4162 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004163 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164 node *ch = CHILD(n, i);
4165 if (TYPE(ch) == stmt)
4166 com_node(c, ch);
4167 }
4168 }
4169}
4170
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004171/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004172static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004173com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004174{
4175 int i = c->c_nblocks;
4176 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4177 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4178 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004179 else if (i <= 0) {
4180 /* at the outer level */
4181 com_error(c, PyExc_SyntaxError,
4182 "'continue' not properly in loop");
4183 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004184 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004185 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004186 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004187 if (c->c_block[j] == SETUP_LOOP)
4188 break;
4189 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004190 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004191 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004192 for (; i > j; --i) {
4193 if (c->c_block[i] == SETUP_EXCEPT ||
4194 c->c_block[i] == SETUP_FINALLY) {
4195 com_addoparg(c, CONTINUE_LOOP,
4196 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004197 return;
4198 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004199 if (c->c_block[i] == END_FINALLY) {
4200 com_error(c, PyExc_SyntaxError,
4201 "'continue' not supported inside 'finally' clause");
4202 return;
4203 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004204 }
4205 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004206 com_error(c, PyExc_SyntaxError,
4207 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004208 }
4209 /* XXX Could allow it inside a 'finally' clause
4210 XXX if we could pop the exception still on the stack */
4211}
4212
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004213/* Return the number of default values in the argument list.
4214
4215 If a non-default argument follows a default argument, set an
4216 exception and return -1.
4217*/
4218
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004219static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004220com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004221{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004222 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004223 if (TYPE(n) == lambdef) {
4224 /* lambdef: 'lambda' [varargslist] ':' test */
4225 n = CHILD(n, 1);
4226 }
4227 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004228 REQ(n, funcdef);
4229 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4230 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004231 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4232 n = CHILD(n, 1);
4233 }
4234 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004235 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004237 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004238 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4239 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004240 ndefs = 0;
4241 for (i = 0; i < nch; i++) {
4242 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004243 if (TYPE(CHILD(n, i)) == STAR ||
4244 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004245 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004246 i++;
4247 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004248 t = RPAR; /* Anything except EQUAL or COMMA */
4249 else
4250 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004251 if (t == EQUAL) {
4252 i++;
4253 ndefs++;
4254 com_node(c, CHILD(n, i));
4255 i++;
4256 if (i >= nch)
4257 break;
4258 t = TYPE(CHILD(n, i));
4259 }
4260 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004261 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004262 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004263 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004264 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004265 return -1;
4266 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004267 }
4268 if (t != COMMA)
4269 break;
4270 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004271 return ndefs;
4272}
4273
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004274static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004275com_decorator_name(struct compiling *c, node *n)
4276{
4277 /* dotted_name: NAME ('.' NAME)* */
4278
4279 int i, nch;
4280 node *varname;
4281
4282 REQ(n, dotted_name);
4283 nch = NCH(n);
4284 assert(nch >= 1 && nch % 2 == 1);
4285
4286 varname = CHILD(n, 0);
4287 REQ(varname, NAME);
4288 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004289 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004290
4291 for (i = 1; i < nch; i += 2) {
4292 node *attrname;
4293
4294 REQ(CHILD(n, i), DOT);
4295
4296 attrname = CHILD(n, i + 1);
4297 REQ(attrname, NAME);
4298 com_addop_name(c, LOAD_ATTR, STR(attrname));
4299 }
4300}
4301
4302static void
4303com_decorator(struct compiling *c, node *n)
4304{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004305 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004306 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004307 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004308 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004309 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004310 com_decorator_name(c, CHILD(n, 1));
4311
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004312 if (nch > 3) {
4313 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004314 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004315 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004316 com_call_function(c, CHILD(n, 3));
4317 }
4318}
4319
4320static int
4321com_decorators(struct compiling *c, node *n)
4322{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004323 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004324
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004325 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004326 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004327 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004328
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004329 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004330 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004331 REQ(ch, decorator);
4332
4333 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004334 }
4335
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004336 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004337}
4338
4339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004340com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004341{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004343 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004344
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004345 REQ(n, funcdef);
4346 /* -6 -5 -4 -3 -2 -1
4347 funcdef: [decorators] 'def' NAME parameters ':' suite */
4348
4349 if (NCH(n) == 6)
4350 ndecorators = com_decorators(c, CHILD(n, 0));
4351 else
4352 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004353
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004355 if (ndefs < 0)
4356 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004357 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004358 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004359 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004360 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004361 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004362 c->c_errors++;
4363 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004364 int closure = com_make_closure(c, (PyCodeObject *)co);
4365 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004366 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004367 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004368 if (closure)
4369 com_addoparg(c, MAKE_CLOSURE, ndefs);
4370 else
4371 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004372 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004373
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004374 while (ndecorators > 0) {
4375 com_addoparg(c, CALL_FUNCTION, 1);
4376 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004377 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004378 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004379
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004380 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004381 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004382 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004383 }
4384}
4385
4386static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004387com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004388{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004389 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004390 REQ(n, testlist);
4391 /* testlist: test (',' test)* [','] */
4392 for (i = 0; i < NCH(n); i += 2)
4393 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004394 i = (NCH(n)+1) / 2;
4395 com_addoparg(c, BUILD_TUPLE, i);
4396 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004397}
4398
4399static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004400com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401{
Guido van Rossum25831651993-05-19 14:50:45 +00004402 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004403 PyObject *v;
4404 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004405 char *name;
4406
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004407 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004408 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004409 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004410 c->c_errors++;
4411 return;
4412 }
4413 /* Push the class name on the stack */
4414 i = com_addconst(c, v);
4415 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004416 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004417 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004418 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004419 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004420 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004421 com_push(c, 1);
4422 }
Guido van Rossum25831651993-05-19 14:50:45 +00004423 else
4424 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004425 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004426 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004427 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004428 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004429 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004430 c->c_errors++;
4431 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004432 int closure = com_make_closure(c, co);
4433 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004434 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004435 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004436 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004437 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004438 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004439 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004440 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004441 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004442 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004443 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004444 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004445 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004446 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004447 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004448}
4449
4450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004451com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004452{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004453 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004454 if (c->c_errors)
4455 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004456 switch (TYPE(n)) {
4457
4458 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004459
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004460 case funcdef:
4461 com_funcdef(c, n);
4462 break;
4463 case classdef:
4464 com_classdef(c, n);
4465 break;
4466
4467 /* Trivial parse tree nodes */
4468
4469 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004470 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004471 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004472 n = CHILD(n, 0);
4473 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004474
4475 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004476 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004477 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004478 {
4479 int i;
4480 for (i = 0; i < NCH(n)-1; i += 2)
4481 com_node(c, CHILD(n, i));
4482 }
4483 break;
4484
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004485 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004486 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004487 n = CHILD(n, 0);
4488 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004489
4490 /* Statement nodes */
4491
4492 case expr_stmt:
4493 com_expr_stmt(c, n);
4494 break;
4495 case print_stmt:
4496 com_print_stmt(c, n);
4497 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004498 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004499 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004500 break;
4501 case pass_stmt:
4502 break;
4503 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004504 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004505 com_error(c, PyExc_SyntaxError,
4506 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004507 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004508 com_addbyte(c, BREAK_LOOP);
4509 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004510 case continue_stmt:
4511 com_continue_stmt(c, n);
4512 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004513 case return_stmt:
4514 com_return_stmt(c, n);
4515 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004516 case yield_stmt:
4517 com_yield_stmt(c, n);
4518 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004519 case raise_stmt:
4520 com_raise_stmt(c, n);
4521 break;
4522 case import_stmt:
4523 com_import_stmt(c, n);
4524 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004525 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004526 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004527 case exec_stmt:
4528 com_exec_stmt(c, n);
4529 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004530 case assert_stmt:
4531 com_assert_stmt(c, n);
4532 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004533 case if_stmt:
4534 com_if_stmt(c, n);
4535 break;
4536 case while_stmt:
4537 com_while_stmt(c, n);
4538 break;
4539 case for_stmt:
4540 com_for_stmt(c, n);
4541 break;
4542 case try_stmt:
4543 com_try_stmt(c, n);
4544 break;
4545 case suite:
4546 com_suite(c, n);
4547 break;
4548
4549 /* Expression nodes */
4550
4551 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004552 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004553 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004554 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004555 break;
4556 case test:
4557 com_test(c, n);
4558 break;
4559 case and_test:
4560 com_and_test(c, n);
4561 break;
4562 case not_test:
4563 com_not_test(c, n);
4564 break;
4565 case comparison:
4566 com_comparison(c, n);
4567 break;
4568 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004569 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004570 break;
4571 case expr:
4572 com_expr(c, n);
4573 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004574 case xor_expr:
4575 com_xor_expr(c, n);
4576 break;
4577 case and_expr:
4578 com_and_expr(c, n);
4579 break;
4580 case shift_expr:
4581 com_shift_expr(c, n);
4582 break;
4583 case arith_expr:
4584 com_arith_expr(c, n);
4585 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004586 case term:
4587 com_term(c, n);
4588 break;
4589 case factor:
4590 com_factor(c, n);
4591 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004592 case power:
4593 com_power(c, n);
4594 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004595 case atom:
4596 com_atom(c, n);
4597 break;
4598
4599 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004600 com_error(c, PyExc_SystemError,
4601 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004602 }
4603}
4604
Tim Petersdbd9ba62000-07-09 03:09:57 +00004605static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004606
4607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004608com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609{
4610 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4611 if (TYPE(CHILD(n, 0)) == LPAR)
4612 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004613 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004615 com_pop(c, 1);
4616 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617}
4618
4619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004620com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004621{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004622 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004623 if (NCH(n) == 1) {
4624 com_fpdef(c, CHILD(n, 0));
4625 }
4626 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004627 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004628 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004629 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004630 for (i = 0; i < NCH(n); i += 2)
4631 com_fpdef(c, CHILD(n, i));
4632 }
4633}
4634
4635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004636com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004637{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004638 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004639 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004640 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004641 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004642 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004643 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004644 nch = NCH(n);
4645 /* Enter all arguments in table of locals */
4646 for (i = 0, narg = 0; i < nch; i++) {
4647 node *ch = CHILD(n, i);
4648 node *fp;
4649 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004650 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004651 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4652 fp = CHILD(ch, 0);
4653 if (TYPE(fp) != NAME) {
4654 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4655 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004656 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004657 narg++;
4658 /* all name updates handled by symtable */
4659 if (++i >= nch)
4660 break;
4661 ch = CHILD(n, i);
4662 if (TYPE(ch) == EQUAL)
4663 i += 2;
4664 else
4665 REQ(ch, COMMA);
4666 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004667 if (complex) {
4668 /* Generate code for complex arguments only after
4669 having counted the simple arguments */
4670 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004671 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004672 node *ch = CHILD(n, i);
4673 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004674 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004675 break;
4676 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4677 fp = CHILD(ch, 0);
4678 if (TYPE(fp) != NAME) {
4679 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004680 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004681 com_fpdef(c, ch);
4682 }
4683 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004684 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004685 break;
4686 ch = CHILD(n, i);
4687 if (TYPE(ch) == EQUAL)
4688 i += 2;
4689 else
4690 REQ(ch, COMMA);
4691 }
4692 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004693}
4694
4695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004696com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004697{
4698 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004699 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004700 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004701 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004702 if (doc != NULL) {
4703 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004704 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004705 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004706 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004707 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004708 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004709 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004710 for (i = 0; i < NCH(n); i++) {
4711 node *ch = CHILD(n, i);
4712 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4713 com_node(c, ch);
4714 }
4715}
4716
4717/* Top-level compile-node interface */
4718
4719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004720compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004721{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004722 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004723 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004724 REQ(n, funcdef);
4725 /* -6 -5 -4 -3 -2 -1
4726 funcdef: [decorators] 'def' NAME parameters ':' suite */
4727 c->c_name = STR(RCHILD(n, -4));
4728 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004729 if (doc != NULL) {
4730 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004731 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004732 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004733 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004734 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004735 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004736 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004737 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004738 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004739 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004740 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004741 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004742 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004743 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4744 com_push(c, 1);
4745 com_addbyte(c, RETURN_VALUE);
4746 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004747}
4748
4749static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004750compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004751{
Guido van Rossum590baa41993-11-30 13:40:46 +00004752 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004753 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004754 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004755
4756 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004757 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004758 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004759 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004760 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004761 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004762 else
4763 ch = CHILD(n, 2);
4764 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004765 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004766 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004767}
4768
4769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004770compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004771{
4772 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004773 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004774 REQ(n, classdef);
4775 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4776 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004777 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004778 /* Initialize local __module__ from global __name__ */
4779 com_addop_name(c, LOAD_GLOBAL, "__name__");
4780 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004781 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004782 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004783 if (doc != NULL) {
4784 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004785 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004786 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004787 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004788 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004789 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004790 }
4791 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004792 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004793 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004794 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004795 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004796 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004797 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004798 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004799}
4800
4801static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004802compile_generator_expression(struct compiling *c, node *n)
4803{
4804 /* testlist_gexp: test gen_for */
4805 /* argument: test gen_for */
4806 REQ(CHILD(n, 0), test);
4807 REQ(CHILD(n, 1), gen_for);
4808
4809 c->c_name = "<generator expression>";
4810 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4811
4812 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4813 com_push(c, 1);
4814 com_addbyte(c, RETURN_VALUE);
4815 com_pop(c, 1);
4816}
4817
4818static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004819compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004820{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004821 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004822
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004823 switch (TYPE(n)) {
4824
Guido van Rossum4c417781991-01-21 16:09:22 +00004825 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004826 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004827 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004828 n = CHILD(n, 0);
4829 if (TYPE(n) != NEWLINE)
4830 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004831 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004832 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4833 com_push(c, 1);
4834 com_addbyte(c, RETURN_VALUE);
4835 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004836 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004837 break;
4838
Guido van Rossum4c417781991-01-21 16:09:22 +00004839 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004840 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004841 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004842 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4843 com_push(c, 1);
4844 com_addbyte(c, RETURN_VALUE);
4845 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004846 break;
4847
Guido van Rossum590baa41993-11-30 13:40:46 +00004848 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004849 com_node(c, CHILD(n, 0));
4850 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004851 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004852 break;
4853
Guido van Rossum590baa41993-11-30 13:40:46 +00004854 case lambdef: /* anonymous function definition */
4855 compile_lambdef(c, n);
4856 break;
4857
Guido van Rossum4c417781991-01-21 16:09:22 +00004858 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004859 compile_funcdef(c, n);
4860 break;
4861
Guido van Rossum4c417781991-01-21 16:09:22 +00004862 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004863 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004864 break;
4865
Raymond Hettinger354433a2004-05-19 08:20:33 +00004866 case testlist_gexp: /* A generator expression */
4867 case argument: /* A generator expression */
4868 compile_generator_expression(c, n);
4869 break;
4870
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004871 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004872 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004873 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004874 }
4875}
4876
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004877static PyObject *
4878dict_keys_inorder(PyObject *dict, int offset)
4879{
4880 PyObject *tuple, *k, *v;
4881 int i, pos = 0, size = PyDict_Size(dict);
4882
4883 tuple = PyTuple_New(size);
4884 if (tuple == NULL)
4885 return NULL;
4886 while (PyDict_Next(dict, &pos, &k, &v)) {
4887 i = PyInt_AS_LONG(v);
4888 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004889 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004890 PyTuple_SET_ITEM(tuple, i - offset, k);
4891 }
4892 return tuple;
4893}
4894
Guido van Rossum79f25d91997-04-29 20:08:16 +00004895PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004896PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004897{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004898 return PyNode_CompileFlags(n, filename, NULL);
4899}
4900
4901PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004902PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004903{
4904 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004905}
4906
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004907struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004908PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004909{
4910 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004911 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004912
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004913 ff = PyNode_Future(n, filename);
4914 if (ff == NULL)
4915 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004916 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004917 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004918 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004919 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004920 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004921 return st;
4922}
4923
Guido van Rossum79f25d91997-04-29 20:08:16 +00004924static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004925icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004926{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004927 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004928}
4929
Guido van Rossum79f25d91997-04-29 20:08:16 +00004930static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004931jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004932 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004933{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004934 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004935 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004936 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004937 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004938 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4939 sc.c_encoding = "utf-8";
4940 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004941 sc.c_encoding = STR(n);
4942 n = CHILD(n, 0);
4943 } else {
4944 sc.c_encoding = NULL;
4945 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004946 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004947 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004948 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004949 /* c_symtable still points to parent's symbols */
4950 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004951 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004953 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004954 if (base->c_encoding != NULL) {
4955 assert(sc.c_encoding == NULL);
4956 sc.c_encoding = base->c_encoding;
4957 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004958 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004959 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004960 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004961 if (sc.c_future == NULL) {
4962 com_free(&sc);
4963 return NULL;
4964 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004965 if (flags) {
4966 int merged = sc.c_future->ff_features |
4967 flags->cf_flags;
4968 sc.c_future->ff_features = merged;
4969 flags->cf_flags = merged;
4970 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004971 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4972 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004973 com_free(&sc);
4974 return NULL;
4975 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004976 /* reset symbol table for second pass */
4977 sc.c_symtable->st_nscopes = 1;
4978 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004979 }
4980 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004981 if (symtable_load_symbols(&sc) < 0) {
4982 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004983 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004984 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004985 compile_node(&sc, n);
4986 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004987 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004988 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004989 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004990 names = PyList_AsTuple(sc.c_names);
4991 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004992 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4993 freevars = dict_keys_inorder(sc.c_freevars,
4994 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004995 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004996 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00004997 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
4998 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004999 if (!PyErr_Occurred())
5000 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005001 sc.c_nlocals,
5002 sc.c_maxstacklevel,
5003 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005004 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005005 consts,
5006 names,
5007 varnames,
5008 freevars,
5009 cellvars,
5010 filename,
5011 name,
5012 sc.c_firstlineno,
5013 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005014 Py_XDECREF(consts);
5015 Py_XDECREF(names);
5016 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005017 Py_XDECREF(freevars);
5018 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005019 Py_XDECREF(filename);
5020 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005021 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005022 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005023 else if (!PyErr_Occurred()) {
5024 /* This could happen if someone called PyErr_Clear() after an
5025 error was reported above. That's not supposed to happen,
5026 but I just plugged one case and I'm not sure there can't be
5027 others. In that case, raise SystemError so that at least
5028 it gets reported instead dumping core. */
5029 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5030 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005032 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005033 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005034 sc.c_symtable = NULL;
5035 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005036 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005037 return co;
5038}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005039
5040int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005041PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005042{
5043 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005044 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005045 int line = co->co_firstlineno;
5046 int addr = 0;
5047 while (--size >= 0) {
5048 addr += *p++;
5049 if (addr > addrq)
5050 break;
5051 line += *p++;
5052 }
5053 return line;
5054}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005056/* The test for LOCAL must come before the test for FREE in order to
5057 handle classes where name is both local and free. The local var is
5058 a method and the free var is a free var referenced within a method.
5059*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005060
5061static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005062get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005063{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005064 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005066
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005067 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5068 return CELL;
5069 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5070 return LOCAL;
5071 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5072 return FREE;
5073 v = PyDict_GetItemString(c->c_globals, name);
5074 if (v) {
5075 if (v == Py_None)
5076 return GLOBAL_EXPLICIT;
5077 else {
5078 return GLOBAL_IMPLICIT;
5079 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005080 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005081 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005082 "unknown scope for %.100s in %.100s(%s) "
5083 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5084 name, c->c_name,
5085 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5086 c->c_filename,
5087 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5088 PyObject_REPR(c->c_locals),
5089 PyObject_REPR(c->c_globals)
5090 );
5091
5092 Py_FatalError(buf);
5093 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094}
5095
Guido van Rossum207fda62001-03-02 03:30:41 +00005096/* Helper functions to issue warnings */
5097
5098static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005099issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005100{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005101 if (PyErr_Occurred()) {
5102 /* This can happen because symtable_node continues
5103 processing even after raising a SyntaxError.
5104 Calling PyErr_WarnExplicit now would clobber the
5105 pending exception; instead we fail and let that
5106 exception propagate.
5107 */
5108 return -1;
5109 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005110 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5111 lineno, NULL, NULL) < 0) {
5112 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5113 PyErr_SetString(PyExc_SyntaxError, msg);
5114 PyErr_SyntaxLocation(filename, lineno);
5115 }
5116 return -1;
5117 }
5118 return 0;
5119}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005120
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005121static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005122symtable_warn(struct symtable *st, char *msg)
5123{
Guido van Rossum207fda62001-03-02 03:30:41 +00005124 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005125 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005126 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005127 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005128 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005129}
5130
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005131/* Helper function for setting lineno and filename */
5132
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005133static struct symtable *
5134symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005135{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005136 struct symtable *st;
5137
5138 st = symtable_init();
5139 if (st == NULL)
5140 return NULL;
5141 st->st_future = ff;
5142 st->st_filename = filename;
5143 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5144 if (st->st_errors > 0)
5145 goto fail;
5146 symtable_node(st, n);
5147 if (st->st_errors > 0)
5148 goto fail;
5149 return st;
5150 fail:
5151 if (!PyErr_Occurred()) {
5152 /* This could happen because after a syntax error is
5153 detected, the symbol-table-building continues for
5154 a while, and PyErr_Clear() might erroneously be
5155 called during that process. One such case has been
5156 fixed, but there might be more (now or later).
5157 */
5158 PyErr_SetString(PyExc_SystemError, "lost exception");
5159 }
5160 st->st_future = NULL;
5161 st->st_filename = NULL;
5162 PySymtable_Free(st);
5163 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005164}
5165
5166static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005167symtable_init_compiling_symbols(struct compiling *c)
5168{
5169 PyObject *varnames;
5170
5171 varnames = c->c_symtable->st_cur->ste_varnames;
5172 if (varnames == NULL) {
5173 varnames = PyList_New(0);
5174 if (varnames == NULL)
5175 return -1;
5176 c->c_symtable->st_cur->ste_varnames = varnames;
5177 Py_INCREF(varnames);
5178 } else
5179 Py_INCREF(varnames);
5180 c->c_varnames = varnames;
5181
5182 c->c_globals = PyDict_New();
5183 if (c->c_globals == NULL)
5184 return -1;
5185 c->c_freevars = PyDict_New();
5186 if (c->c_freevars == NULL)
5187 return -1;
5188 c->c_cellvars = PyDict_New();
5189 if (c->c_cellvars == NULL)
5190 return -1;
5191 return 0;
5192}
5193
5194struct symbol_info {
5195 int si_nlocals;
5196 int si_ncells;
5197 int si_nfrees;
5198 int si_nimplicit;
5199};
5200
5201static void
5202symtable_init_info(struct symbol_info *si)
5203{
5204 si->si_nlocals = 0;
5205 si->si_ncells = 0;
5206 si->si_nfrees = 0;
5207 si->si_nimplicit = 0;
5208}
5209
5210static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005211symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005212 struct symbol_info *si)
5213{
5214 PyObject *dict, *v;
5215
5216 /* Seperate logic for DEF_FREE. If it occurs in a function,
5217 it indicates a local that we must allocate storage for (a
5218 cell var). If it occurs in a class, then the class has a
5219 method and a free variable with the same name.
5220 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005221 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005222 /* If it isn't declared locally, it can't be a cell. */
5223 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5224 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005225 v = PyInt_FromLong(si->si_ncells++);
5226 dict = c->c_cellvars;
5227 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005228 /* If it is free anyway, then there is no need to do
5229 anything here.
5230 */
5231 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005232 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005233 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005234 v = PyInt_FromLong(si->si_nfrees++);
5235 dict = c->c_freevars;
5236 }
5237 if (v == NULL)
5238 return -1;
5239 if (PyDict_SetItem(dict, name, v) < 0) {
5240 Py_DECREF(v);
5241 return -1;
5242 }
5243 Py_DECREF(v);
5244 return 0;
5245}
5246
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005247/* If a variable is a cell and an argument, make sure that appears in
5248 co_cellvars before any variable to its right in varnames.
5249*/
5250
5251
5252static int
5253symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5254 PyObject *varnames, int flags)
5255{
Tim Petersb39903b2003-03-24 17:22:24 +00005256 PyObject *v = NULL;
5257 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005258 int i, pos;
5259
5260 if (flags & CO_VARARGS)
5261 argcount++;
5262 if (flags & CO_VARKEYWORDS)
5263 argcount++;
5264 for (i = argcount; --i >= 0; ) {
5265 v = PyList_GET_ITEM(varnames, i);
5266 if (PyDict_GetItem(*cellvars, v)) {
5267 if (list == NULL) {
5268 list = PyList_New(1);
5269 if (list == NULL)
5270 return -1;
5271 PyList_SET_ITEM(list, 0, v);
5272 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005273 } else {
5274 if (PyList_Insert(list, 0, v) < 0) {
5275 Py_DECREF(list);
5276 return -1;
5277 }
5278 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005279 }
5280 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005281 if (list == NULL)
5282 return 0;
5283
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005284 /* There are cellvars that are also arguments. Create a dict
5285 to replace cellvars and put the args at the front.
5286 */
5287 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005288 if (d == NULL)
5289 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005290 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5291 v = PyInt_FromLong(i);
5292 if (v == NULL)
5293 goto fail;
5294 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5295 goto fail;
5296 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5297 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005298 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005299 }
5300 pos = 0;
5301 i = PyList_GET_SIZE(list);
5302 Py_DECREF(list);
5303 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5304 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005305 if (w == NULL)
5306 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005307 if (PyDict_SetItem(d, v, w) < 0) {
5308 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005309 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005310 goto fail;
5311 }
5312 Py_DECREF(w);
5313 }
5314 Py_DECREF(*cellvars);
5315 *cellvars = d;
5316 return 1;
5317 fail:
5318 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005319 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005320 return -1;
5321}
5322
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005323static int
5324symtable_freevar_offsets(PyObject *freevars, int offset)
5325{
5326 PyObject *name, *v;
5327 int pos;
5328
5329 /* The cell vars are the first elements of the closure,
5330 followed by the free vars. Update the offsets in
5331 c_freevars to account for number of cellvars. */
5332 pos = 0;
5333 while (PyDict_Next(freevars, &pos, &name, &v)) {
5334 int i = PyInt_AS_LONG(v) + offset;
5335 PyObject *o = PyInt_FromLong(i);
5336 if (o == NULL)
5337 return -1;
5338 if (PyDict_SetItem(freevars, name, o) < 0) {
5339 Py_DECREF(o);
5340 return -1;
5341 }
5342 Py_DECREF(o);
5343 }
5344 return 0;
5345}
5346
5347static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005348symtable_check_unoptimized(struct compiling *c,
5349 PySymtableEntryObject *ste,
5350 struct symbol_info *si)
5351{
5352 char buf[300];
5353
5354 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5355 || (ste->ste_nested && si->si_nimplicit)))
5356 return 0;
5357
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005358#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5359
5360#define ILLEGAL_IS "is a nested function"
5361
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005362#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005363"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005364
5365#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005366"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005367
5368#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005369"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005370"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005371
5372 /* XXX perhaps the linenos for these opt-breaking statements
5373 should be stored so the exception can point to them. */
5374
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005375 if (ste->ste_child_free) {
5376 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005377 PyOS_snprintf(buf, sizeof(buf),
5378 ILLEGAL_IMPORT_STAR,
5379 PyString_AS_STRING(ste->ste_name),
5380 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005381 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005382 PyOS_snprintf(buf, sizeof(buf),
5383 ILLEGAL_BARE_EXEC,
5384 PyString_AS_STRING(ste->ste_name),
5385 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005386 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005387 PyOS_snprintf(buf, sizeof(buf),
5388 ILLEGAL_EXEC_AND_IMPORT_STAR,
5389 PyString_AS_STRING(ste->ste_name),
5390 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005391 }
5392 } else {
5393 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005394 PyOS_snprintf(buf, sizeof(buf),
5395 ILLEGAL_IMPORT_STAR,
5396 PyString_AS_STRING(ste->ste_name),
5397 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005398 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005399 PyOS_snprintf(buf, sizeof(buf),
5400 ILLEGAL_BARE_EXEC,
5401 PyString_AS_STRING(ste->ste_name),
5402 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005403 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005404 PyOS_snprintf(buf, sizeof(buf),
5405 ILLEGAL_EXEC_AND_IMPORT_STAR,
5406 PyString_AS_STRING(ste->ste_name),
5407 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005408 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005409 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005410
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005411 PyErr_SetString(PyExc_SyntaxError, buf);
5412 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5413 ste->ste_opt_lineno);
5414 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005415}
5416
5417static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005418symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5419 struct symbol_info *si)
5420{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005421 if (c->c_future)
5422 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005423 if (ste->ste_generator)
5424 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005425 if (ste->ste_type != TYPE_MODULE)
5426 c->c_flags |= CO_NEWLOCALS;
5427 if (ste->ste_type == TYPE_FUNCTION) {
5428 c->c_nlocals = si->si_nlocals;
5429 if (ste->ste_optimized == 0)
5430 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005431 else if (ste->ste_optimized != OPT_EXEC)
5432 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005433 }
5434 return 0;
5435}
5436
5437static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005438symtable_error(struct symtable *st, int lineno)
5439{
5440 if (lineno == 0)
5441 lineno = st->st_cur->ste_lineno;
5442 PyErr_SyntaxLocation(st->st_filename, lineno);
5443 st->st_errors++;
5444 return -1;
5445}
5446
5447static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448symtable_load_symbols(struct compiling *c)
5449{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005450 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005451 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452 PyObject *name, *varnames, *v;
5453 int i, flags, pos;
5454 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005455
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005456 v = NULL;
5457
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005458 if (symtable_init_compiling_symbols(c) < 0)
5459 goto fail;
5460 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005461 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005462 si.si_nlocals = PyList_GET_SIZE(varnames);
5463 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005464
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005465 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005467 if (v == NULL)
5468 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005469 if (PyDict_SetItem(c->c_locals,
5470 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005471 goto fail;
5472 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005473 }
5474
5475 /* XXX The cases below define the rules for whether a name is
5476 local or global. The logic could probably be clearer. */
5477 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005478 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5479 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005480
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005481 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005482 /* undo the original DEF_FREE */
5483 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005484
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005485 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005486 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005487 2. Free variables in methods that are also class
5488 variables or declared global.
5489 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005490 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005491 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005493 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494 c->c_argcount--;
5495 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005496 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005497 c->c_argcount--;
5498 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005499 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005500 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005501 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005502 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005503 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005504 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005505 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005506 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005507 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5509 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005510 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005511 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005512 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005513 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005515 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516 if (v == NULL)
5517 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005518 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005519 goto fail;
5520 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005521 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005522 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005523 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005524 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005525 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005526 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005527 if (v == NULL)
5528 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005529 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005530 goto fail;
5531 Py_DECREF(v);
5532 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005533 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005534 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005535 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005536 goto fail;
5537 if (st->st_nscopes != 1) {
5538 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005539 if (v == NULL)
5540 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005541 if (PyDict_SetItem(st->st_global,
5542 name, v))
5543 goto fail;
5544 Py_DECREF(v);
5545 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005546 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005547 }
5548 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005549 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5550
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005551 if (si.si_ncells > 1) { /* one cell is always in order */
5552 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5553 c->c_varnames, c->c_flags) < 0)
5554 return -1;
5555 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005556 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5557 return -1;
5558 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005559 fail:
5560 /* is this always the right thing to do? */
5561 Py_XDECREF(v);
5562 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005563}
5564
5565static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005566symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005567{
5568 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005569
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005570 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005571 if (st == NULL)
5572 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005574
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005575 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005576 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005577 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005578 goto fail;
5579 if ((st->st_symbols = PyDict_New()) == NULL)
5580 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005581 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005582 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005583 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005584 st->st_private = NULL;
5585 return st;
5586 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005587 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005588 return NULL;
5589}
5590
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005591void
5592PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005593{
5594 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005596 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005597 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005598}
5599
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600/* When the compiler exits a scope, it must should update the scope's
5601 free variable information with the list of free variables in its
5602 children.
5603
5604 Variables that are free in children and defined in the current
5605 scope are cellvars.
5606
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005607 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 false), free variables in children that are not defined here are
5609 implicit globals.
5610
5611*/
5612
5613static int
5614symtable_update_free_vars(struct symtable *st)
5615{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005616 int i, j, def;
5617 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005618 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005620 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621 def = DEF_FREE_CLASS;
5622 else
5623 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005624 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005625 int pos = 0;
5626
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005627 if (list && PyList_SetSlice(list, 0,
5628 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005629 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005630 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005631 PyList_GET_ITEM(ste->ste_children, i);
5632 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005633 int flags = PyInt_AS_LONG(o);
5634 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005636 if (list == NULL) {
5637 list = PyList_New(0);
5638 if (list == NULL)
5639 return -1;
5640 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005641 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005642 if (PyList_Append(list, name) < 0) {
5643 Py_DECREF(list);
5644 return -1;
5645 }
5646 }
5647 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005648 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005649 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005650 v = PyDict_GetItem(ste->ste_symbols, name);
5651 /* If a name N is declared global in scope A and
5652 referenced in scope B contained (perhaps
5653 indirectly) in A and there are no scopes
5654 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005655 is global in B. Unless A is a class scope,
5656 because class scopes are not considered for
5657 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005658 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005659 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005660 int flags = PyInt_AS_LONG(v);
5661 if (flags & DEF_GLOBAL) {
5662 symtable_undo_free(st, child->ste_id,
5663 name);
5664 continue;
5665 }
5666 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005667 if (ste->ste_nested) {
5668 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005669 name, def) < 0) {
5670 Py_DECREF(list);
5671 return -1;
5672 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005674 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005675 name) < 0) {
5676 Py_DECREF(list);
5677 return -1;
5678 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005679 }
5680 }
5681 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005682
5683 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684 return 0;
5685}
5686
5687/* If the current scope is a non-nested class or if name is not
5688 defined in the current, non-nested scope, then it is an implicit
5689 global in all nested scopes.
5690*/
5691
5692static int
5693symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5694{
5695 PyObject *o;
5696 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005697 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005698
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005699 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005700 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005701 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 if (o == NULL)
5703 return symtable_undo_free(st, child, name);
5704 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005705
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005706 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005707 return symtable_undo_free(st, child, name);
5708 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005709 return symtable_add_def_o(st, ste->ste_symbols,
5710 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711}
5712
5713static int
5714symtable_undo_free(struct symtable *st, PyObject *id,
5715 PyObject *name)
5716{
5717 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005718 PyObject *info;
5719 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005720
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005721 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5722 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005724
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005725 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726 if (info == NULL)
5727 return 0;
5728 v = PyInt_AS_LONG(info);
5729 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005730 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 DEF_FREE_GLOBAL) < 0)
5732 return -1;
5733 } else
5734 /* If the name is defined here or declared global,
5735 then the recursion stops. */
5736 return 0;
5737
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005738 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5739 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005740 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005741 PyList_GET_ITEM(ste->ste_children, i);
5742 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005743 if (x < 0)
5744 return x;
5745 }
5746 return 0;
5747}
5748
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005749/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5750 This reference is released when the scope is exited, via the DECREF
5751 in symtable_exit_scope().
5752*/
5753
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754static int
5755symtable_exit_scope(struct symtable *st)
5756{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 int end;
5758
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005759 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005761 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005762 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005763 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5764 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 if (PySequence_DelItem(st->st_stack, end) < 0)
5766 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005767 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005768}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005770static void
5771symtable_enter_scope(struct symtable *st, char *name, int type,
5772 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005773{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005774 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005775
5776 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005777 prev = st->st_cur;
5778 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005779 st->st_errors++;
5780 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005781 }
5782 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005783 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005784 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005785 if (st->st_cur == NULL) {
5786 st->st_errors++;
5787 return;
5788 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005789 if (strcmp(name, TOP) == 0)
5790 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005791 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005792 if (PyList_Append(prev->ste_children,
5793 (PyObject *)st->st_cur) < 0)
5794 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005795 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796}
5797
5798static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005799symtable_lookup(struct symtable *st, char *name)
5800{
5801 char buffer[MANGLE_LEN];
5802 PyObject *v;
5803 int flags;
5804
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005805 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005806 name = buffer;
5807 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5808 if (v == NULL) {
5809 if (PyErr_Occurred())
5810 return -1;
5811 else
5812 return 0;
5813 }
5814
5815 flags = PyInt_AS_LONG(v);
5816 return flags;
5817}
5818
5819static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005820symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005821{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005822 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005823 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005824 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005825
Guido van Rossumb7164622002-08-16 02:48:11 +00005826 /* Warn about None, except inside a tuple (where the assignment
5827 code already issues a warning). */
5828 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5829 *name == 'N' && strcmp(name, "None") == 0)
5830 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005831 PyErr_SetString(PyExc_SyntaxError,
5832 "Invalid syntax. Assignment to None.");
5833 symtable_error(st, 0);
5834 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005835 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005836 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005837 name = buffer;
5838 if ((s = PyString_InternFromString(name)) == NULL)
5839 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005840 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5841 Py_DECREF(s);
5842 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843}
5844
5845/* Must only be called with mangled names */
5846
5847static int
5848symtable_add_def_o(struct symtable *st, PyObject *dict,
5849 PyObject *name, int flag)
5850{
5851 PyObject *o;
5852 int val;
5853
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005854 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005855 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005856 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005857 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005858 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005859 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005860 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005861 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005862 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005863 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005864 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005865 if (o == NULL)
5866 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005867 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005868 Py_DECREF(o);
5869 return -1;
5870 }
5871 Py_DECREF(o);
5872
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005873 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005874 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005875 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005876 } else if (flag & DEF_GLOBAL) {
5877 /* XXX need to update DEF_GLOBAL for other flags too;
5878 perhaps only DEF_FREE_GLOBAL */
5879 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005880 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005881 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005882 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005883 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005884 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005885 if (o == NULL)
5886 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005887 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005888 Py_DECREF(o);
5889 return -1;
5890 }
5891 Py_DECREF(o);
5892 }
5893 return 0;
5894}
5895
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005896#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005897
Tim Peters08a898f2001-06-28 01:52:22 +00005898/* Look for a yield stmt under n. Return 1 if found, else 0.
5899 This hack is used to look inside "if 0:" blocks (which are normally
5900 ignored) in case those are the only places a yield occurs (so that this
5901 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005902static int
5903look_for_yield(node *n)
5904{
5905 int i;
5906
5907 for (i = 0; i < NCH(n); ++i) {
5908 node *kid = CHILD(n, i);
5909
5910 switch (TYPE(kid)) {
5911
5912 case classdef:
5913 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005914 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005915 /* Stuff in nested functions and classes can't make
5916 the parent a generator. */
5917 return 0;
5918
5919 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005920 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005921
5922 default:
5923 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005924 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005925 }
5926 }
5927 return 0;
5928}
5929
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005930static void
5931symtable_node(struct symtable *st, node *n)
5932{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005933 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005934
5935 loop:
5936 switch (TYPE(n)) {
5937 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005938 char *func_name;
5939 if (NCH(n) == 6)
5940 symtable_node(st, CHILD(n, 0));
5941 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005942 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005943 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005944 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005945 symtable_funcdef(st, n);
5946 symtable_exit_scope(st);
5947 break;
5948 }
5949 case lambdef:
5950 if (NCH(n) == 4)
5951 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005952 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005953 symtable_funcdef(st, n);
5954 symtable_exit_scope(st);
5955 break;
5956 case classdef: {
5957 char *tmp, *class_name = STR(CHILD(n, 1));
5958 symtable_add_def(st, class_name, DEF_LOCAL);
5959 if (TYPE(CHILD(n, 2)) == LPAR) {
5960 node *bases = CHILD(n, 3);
5961 int i;
5962 for (i = 0; i < NCH(bases); i += 2) {
5963 symtable_node(st, CHILD(bases, i));
5964 }
5965 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005966 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005967 tmp = st->st_private;
5968 st->st_private = class_name;
5969 symtable_node(st, CHILD(n, NCH(n) - 1));
5970 st->st_private = tmp;
5971 symtable_exit_scope(st);
5972 break;
5973 }
5974 case if_stmt:
5975 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005976 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5977 if (st->st_cur->ste_generator == 0)
5978 st->st_cur->ste_generator =
5979 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005980 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005981 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005982 symtable_node(st, CHILD(n, i + 1));
5983 symtable_node(st, CHILD(n, i + 3));
5984 }
5985 if (i + 2 < NCH(n))
5986 symtable_node(st, CHILD(n, i + 2));
5987 break;
5988 case global_stmt:
5989 symtable_global(st, n);
5990 break;
5991 case import_stmt:
5992 symtable_import(st, n);
5993 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005994 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005995 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005996 symtable_node(st, CHILD(n, 1));
5997 if (NCH(n) > 2)
5998 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005999 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006000 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006001 st->st_cur->ste_opt_lineno = n->n_lineno;
6002 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006003 if (NCH(n) > 4)
6004 symtable_node(st, CHILD(n, 5));
6005 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006006
6007 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006008 case assert_stmt:
6009 if (Py_OptimizeFlag)
6010 return;
6011 if (NCH(n) == 2) {
6012 n = CHILD(n, 1);
6013 goto loop;
6014 } else {
6015 symtable_node(st, CHILD(n, 1));
6016 n = CHILD(n, 3);
6017 goto loop;
6018 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019 case except_clause:
6020 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006021 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 if (NCH(n) > 1) {
6023 n = CHILD(n, 1);
6024 goto loop;
6025 }
6026 break;
6027 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006028 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006030 case yield_stmt:
6031 st->st_cur->ste_generator = 1;
6032 n = CHILD(n, 1);
6033 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 case expr_stmt:
6035 if (NCH(n) == 1)
6036 n = CHILD(n, 0);
6037 else {
6038 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006039 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006040 symtable_node(st, CHILD(n, 2));
6041 break;
6042 } else {
6043 int i;
6044 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006045 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006046 n = CHILD(n, NCH(n) - 1);
6047 }
6048 }
6049 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006050 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006051 /* only occurs when there are multiple for loops
6052 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006053 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006054 if (TYPE(n) == list_for)
6055 symtable_list_for(st, n);
6056 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006057 REQ(n, list_if);
6058 symtable_node(st, CHILD(n, 1));
6059 if (NCH(n) == 3) {
6060 n = CHILD(n, 2);
6061 goto loop;
6062 }
6063 }
6064 break;
6065 case for_stmt:
6066 symtable_assign(st, CHILD(n, 1), 0);
6067 for (i = 3; i < NCH(n); ++i)
6068 if (TYPE(CHILD(n, i)) >= single_input)
6069 symtable_node(st, CHILD(n, i));
6070 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006071 case arglist:
6072 if (NCH(n) > 1)
6073 for (i = 0; i < NCH(n); ++i) {
6074 node *ch = CHILD(n, i);
6075 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6076 TYPE(CHILD(ch, 1)) == gen_for) {
6077 PyErr_SetString(PyExc_SyntaxError,
6078 "invalid syntax");
6079 symtable_error(st, n->n_lineno);
6080 return;
6081 }
6082 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006083 /* The remaining cases fall through to default except in
6084 special circumstances. This requires the individual cases
6085 to be coded with great care, even though they look like
6086 rather innocuous. Each case must double-check TYPE(n).
6087 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006088 case decorator:
6089 if (TYPE(n) == decorator) {
6090 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6091 node *name, *varname;
6092 name = CHILD(n, 1);
6093 REQ(name, dotted_name);
6094 varname = CHILD(name, 0);
6095 REQ(varname, NAME);
6096 symtable_add_use(st, STR(varname));
6097 }
6098 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006099 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006100 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006101 n = CHILD(n, 2);
6102 goto loop;
6103 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006104 else if (TYPE(n) == argument && NCH(n) == 2 &&
6105 TYPE(CHILD(n, 1)) == gen_for) {
6106 symtable_generator_expression(st, n);
6107 break;
6108 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006109 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006110 case listmaker:
6111 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006112 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006113 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006114 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006115 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006116 case testlist_gexp:
6117 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6118 symtable_generator_expression(st, n);
6119 break;
6120 }
6121 /* fall through */
6122
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006123 case atom:
6124 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6125 symtable_add_use(st, STR(CHILD(n, 0)));
6126 break;
6127 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006128 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006129 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006130 /* Walk over every non-token child with a special case
6131 for one child.
6132 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006133 if (NCH(n) == 1) {
6134 n = CHILD(n, 0);
6135 goto loop;
6136 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006137 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006138 if (TYPE(CHILD(n, i)) >= single_input)
6139 symtable_node(st, CHILD(n, i));
6140 }
6141}
6142
6143static void
6144symtable_funcdef(struct symtable *st, node *n)
6145{
6146 node *body;
6147
6148 if (TYPE(n) == lambdef) {
6149 if (NCH(n) == 4)
6150 symtable_params(st, CHILD(n, 1));
6151 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006152 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153 body = CHILD(n, NCH(n) - 1);
6154 symtable_node(st, body);
6155}
6156
6157/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006158 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006159 which are references in the defining scope. symtable_params()
6160 parses the parameter names, which are defined in the function's
6161 body.
6162
6163 varargslist:
6164 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6165 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6166*/
6167
6168static void
6169symtable_default_args(struct symtable *st, node *n)
6170{
6171 node *c;
6172 int i;
6173
6174 if (TYPE(n) == parameters) {
6175 n = CHILD(n, 1);
6176 if (TYPE(n) == RPAR)
6177 return;
6178 }
6179 REQ(n, varargslist);
6180 for (i = 0; i < NCH(n); i += 2) {
6181 c = CHILD(n, i);
6182 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6183 break;
6184 }
6185 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6186 symtable_node(st, CHILD(n, i));
6187 }
6188}
6189
6190static void
6191symtable_params(struct symtable *st, node *n)
6192{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006193 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006194 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006195
6196 if (TYPE(n) == parameters) {
6197 n = CHILD(n, 1);
6198 if (TYPE(n) == RPAR)
6199 return;
6200 }
6201 REQ(n, varargslist);
6202 for (i = 0; i < NCH(n); i += 2) {
6203 c = CHILD(n, i);
6204 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6205 ext = 1;
6206 break;
6207 }
6208 if (TYPE(c) == test) {
6209 continue;
6210 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006211 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006212 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006213 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006214 char nbuf[30];
6215 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006216 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006217 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006218 }
6219 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006220 if (ext) {
6221 c = CHILD(n, i);
6222 if (TYPE(c) == STAR) {
6223 i++;
6224 symtable_add_def(st, STR(CHILD(n, i)),
6225 DEF_PARAM | DEF_STAR);
6226 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006227 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006228 c = NULL;
6229 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006230 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006231 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006232 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006233 i++;
6234 symtable_add_def(st, STR(CHILD(n, i)),
6235 DEF_PARAM | DEF_DOUBLESTAR);
6236 }
6237 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006238 if (complex >= 0) {
6239 int j;
6240 for (j = 0; j <= complex; j++) {
6241 c = CHILD(n, j);
6242 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006243 c = CHILD(n, ++j);
6244 else if (TYPE(c) == EQUAL)
6245 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006246 if (TYPE(CHILD(c, 0)) == LPAR)
6247 symtable_params_fplist(st, CHILD(c, 1));
6248 }
6249 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006250}
6251
6252static void
6253symtable_params_fplist(struct symtable *st, node *n)
6254{
6255 int i;
6256 node *c;
6257
6258 REQ(n, fplist);
6259 for (i = 0; i < NCH(n); i += 2) {
6260 c = CHILD(n, i);
6261 REQ(c, fpdef);
6262 if (NCH(c) == 1)
6263 symtable_add_def(st, STR(CHILD(c, 0)),
6264 DEF_PARAM | DEF_INTUPLE);
6265 else
6266 symtable_params_fplist(st, CHILD(c, 1));
6267 }
6268
6269}
6270
6271static void
6272symtable_global(struct symtable *st, node *n)
6273{
6274 int i;
6275
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006276 /* XXX It might be helpful to warn about module-level global
6277 statements, but it's hard to tell the difference between
6278 module-level and a string passed to exec.
6279 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006280
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006281 for (i = 1; i < NCH(n); i += 2) {
6282 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006283 int flags;
6284
6285 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006286 if (flags < 0)
6287 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006288 if (flags && flags != DEF_GLOBAL) {
6289 char buf[500];
6290 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006291 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006292 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006293 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006294 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006295 }
6296 else {
6297 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006298 PyOS_snprintf(buf, sizeof(buf),
6299 GLOBAL_AFTER_ASSIGN,
6300 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006301 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006302 PyOS_snprintf(buf, sizeof(buf),
6303 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006304 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006305 }
6306 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006307 symtable_add_def(st, name, DEF_GLOBAL);
6308 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006309}
6310
6311static void
6312symtable_list_comprehension(struct symtable *st, node *n)
6313{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006314 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006315 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006316
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006317 REQ(n, listmaker);
6318 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6319 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006320 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006321 symtable_list_for(st, CHILD(n, 1));
6322 symtable_node(st, CHILD(n, 0));
6323 --st->st_cur->ste_tmpname;
6324}
6325
6326static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006327symtable_generator_expression(struct symtable *st, node *n)
6328{
6329 /* testlist_gexp: test gen_for */
6330 REQ(CHILD(n, 0), test);
6331 REQ(CHILD(n, 1), gen_for);
6332
6333 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6334 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6335
6336 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6337
6338 symtable_gen_for(st, CHILD(n, 1), 1);
6339 symtable_node(st, CHILD(n, 0));
6340 symtable_exit_scope(st);
6341
6342 /* for outmost iterable precomputation */
6343 symtable_node(st, CHILD(CHILD(n, 1), 3));
6344}
6345
6346static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006347symtable_list_for(struct symtable *st, node *n)
6348{
6349 REQ(n, list_for);
6350 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006351 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006352 symtable_node(st, CHILD(n, 3));
6353 if (NCH(n) == 5)
6354 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006355}
6356
6357static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006358symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6359{
6360 REQ(n, gen_for);
6361
6362 /* gen_for: for v in test [gen_iter] */
6363 symtable_assign(st, CHILD(n, 1), 0);
6364 if (is_outmost)
6365 symtable_add_use(st, "[outmost-iterable]");
6366 else
6367 symtable_node(st, CHILD(n, 3));
6368
6369 if (NCH(n) == 5)
6370 symtable_gen_iter(st, CHILD(n, 4));
6371}
6372
6373static void
6374symtable_gen_iter(struct symtable *st, node *n)
6375{
6376 REQ(n, gen_iter);
6377
6378 n = CHILD(n, 0);
6379 if (TYPE(n) == gen_for)
6380 symtable_gen_for(st, n, 0);
6381 else {
6382 REQ(n, gen_if);
6383 symtable_node(st, CHILD(n, 1));
6384
6385 if (NCH(n) == 3)
6386 symtable_gen_iter(st, CHILD(n, 2));
6387 }
6388}
6389
6390static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006391symtable_import(struct symtable *st, node *n)
6392{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006393 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006394 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006395 /* import_stmt: import_name | import_from */
6396 n = CHILD(n, 0);
6397 if (TYPE(n) == import_from) {
6398 /* import_from: 'from' dotted_name 'import' ('*' |
6399 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006400 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006401 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006402 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6403 /* check for bogus imports */
6404 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6405 PyErr_SetString(PyExc_SyntaxError,
6406 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006407 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006408 return;
6409 }
6410 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006411 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6412 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006413 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006414 if (symtable_warn(st,
6415 "import * only allowed at module level") < 0)
6416 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006417 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006418 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006419 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006420 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006421 REQ(nn, import_as_names);
6422 for (i = 0; i < NCH(nn); i += 2) {
6423 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006424 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006425 symtable_assign(st, CHILD(c, 2),
6426 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006427 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006428 symtable_assign(st, CHILD(c, 0),
6429 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006430 }
6431 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006432 } else {
6433 /* 'import' dotted_as_names */
6434 nn = CHILD(n, 1);
6435 REQ(nn, dotted_as_names);
6436 for (i = 0; i < NCH(nn); i += 2)
6437 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006438 }
6439}
6440
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006441/* The third argument to symatble_assign() is a flag to be passed to
6442 symtable_add_def() if it is eventually called. The flag is useful
6443 to specify the particular type of assignment that should be
6444 recorded, e.g. an assignment caused by import.
6445 */
6446
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006447static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006448symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006449{
6450 node *tmp;
6451 int i;
6452
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006453 loop:
6454 switch (TYPE(n)) {
6455 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006456 /* invalid assignment, e.g. lambda x:x=2. The next
6457 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006458 return;
6459 case power:
6460 if (NCH(n) > 2) {
6461 for (i = 2; i < NCH(n); ++i)
6462 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6463 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006464 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006465 if (NCH(n) > 1) {
6466 symtable_node(st, CHILD(n, 0));
6467 symtable_node(st, CHILD(n, 1));
6468 } else {
6469 n = CHILD(n, 0);
6470 goto loop;
6471 }
6472 return;
6473 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006474 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6475 /* XXX This is an error, but the next pass
6476 will catch it. */
6477 return;
6478 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006479 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006480 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006481 }
6482 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006483 case testlist_gexp:
6484 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6485 /* XXX This is an error, but the next pass
6486 will catch it. */
6487 return;
6488 } else {
6489 for (i = 0; i < NCH(n); i += 2)
6490 symtable_assign(st, CHILD(n, i), def_flag);
6491 }
6492 return;
6493
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006494 case exprlist:
6495 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006496 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006497 if (NCH(n) == 1) {
6498 n = CHILD(n, 0);
6499 goto loop;
6500 }
6501 else {
6502 int i;
6503 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006504 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006505 return;
6506 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006507 case atom:
6508 tmp = CHILD(n, 0);
6509 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6510 n = CHILD(n, 1);
6511 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006512 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006513 if (strcmp(STR(tmp), "__debug__") == 0) {
6514 PyErr_SetString(PyExc_SyntaxError,
6515 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006516 symtable_error(st, n->n_lineno);
6517 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006518 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006519 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006520 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006521 return;
6522 case dotted_as_name:
6523 if (NCH(n) == 3)
6524 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006525 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006526 else
6527 symtable_add_def(st,
6528 STR(CHILD(CHILD(n,
6529 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006530 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006531 return;
6532 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006533 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006534 return;
6535 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006536 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006537 return;
6538 default:
6539 if (NCH(n) == 0)
6540 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006541 if (NCH(n) == 1) {
6542 n = CHILD(n, 0);
6543 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006544 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006545 /* Should only occur for errors like x + 1 = 1,
6546 which will be caught in the next pass. */
6547 for (i = 0; i < NCH(n); ++i)
6548 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006549 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006550 }
6551}