blob: dfb94d38e31d8607cf6f03acddf8d99a49c480ae [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;
422 for (i=0 ; i<n ; i++) {
423 arg = GETARG(codestr, (i*3));
424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
430 len_consts = PyList_GET_SIZE(consts);
431 if (PyList_Append(consts, newconst)) {
432 Py_DECREF(newconst);
433 return 0;
434 }
435 Py_DECREF(newconst);
436
437 /* Write NOPs over old LOAD_CONSTS and
438 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
439 memset(codestr, NOP, n*3);
440 codestr[n*3] = LOAD_CONST;
441 SETARG(codestr, (n*3), len_consts);
442 return 1;
443}
444
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000445static unsigned int *
446markblocks(unsigned char *code, int len)
447{
448 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
449 int i,j, opcode, oldblock, newblock, blockcnt = 0;
450
451 if (blocks == NULL)
452 return NULL;
453 memset(blocks, 0, len*sizeof(int));
454 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
455 opcode = code[i];
456 switch (opcode) {
457 case FOR_ITER:
458 case JUMP_FORWARD:
459 case JUMP_IF_FALSE:
460 case JUMP_IF_TRUE:
461 case JUMP_ABSOLUTE:
462 case CONTINUE_LOOP:
463 case SETUP_LOOP:
464 case SETUP_EXCEPT:
465 case SETUP_FINALLY:
466 j = GETJUMPTGT(code, i);
467 oldblock = blocks[j];
468 newblock = ++blockcnt;
469 for (; j<len ; j++) {
470 if (blocks[j] != (unsigned)oldblock)
471 break;
472 blocks[j] = newblock;
473 }
474 break;
475 }
476 }
477 return blocks;
478}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000479
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000480/* Perform basic peephole optimizations to components of a code object.
481 The consts object should still be in list form to allow new constants
482 to be appended.
483
484 To keep the optimizer simple, it bails out (does nothing) for code
485 containing extended arguments or that has a length over 32,700. That
486 allows us to avoid overflow and sign issues. Likewise, it bails when
487 the lineno table has complex encoding for gaps >= 255.
488
489 Optimizations are restricted to simple transformations occuring within a
490 single basic block. All transformations keep the code size the same or
491 smaller. For those that reduce size, the gaps are initially filled with
492 NOPs. Later those NOPs are removed and the jump addresses retargeted in
493 a single pass. Line numbering is adjusted accordingly. */
494
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000495static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000496optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000497{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000498 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000499 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000500 unsigned char *codestr = NULL;
501 unsigned char *lineno;
502 int *addrmap = NULL;
503 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000504 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000505 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000506
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000507 /* Bypass optimization when the lineno table is too complex */
508 assert(PyString_Check(lineno_obj));
509 lineno = PyString_AS_STRING(lineno_obj);
510 tabsiz = PyString_GET_SIZE(lineno_obj);
511 if (memchr(lineno, 255, tabsiz) != NULL)
512 goto exitUnchanged;
513
Raymond Hettingera12fa142004-08-24 04:34:16 +0000514 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000515 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000516 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000517 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000518 goto exitUnchanged;
519
520 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000521 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000522 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000523 goto exitUnchanged;
524 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000525
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000526 /* Mapping to new jump targets after NOPs are removed */
527 addrmap = PyMem_Malloc(codelen * sizeof(int));
528 if (addrmap == NULL)
529 goto exitUnchanged;
530
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000531 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000532 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000533 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000534 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000535
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000536 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
537 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000538 opcode = codestr[i];
539 switch (opcode) {
540
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000541 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000542 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000543 case UNARY_NOT:
544 if (codestr[i+1] != JUMP_IF_FALSE ||
545 codestr[i+4] != POP_TOP ||
546 !ISBASICBLOCK(blocks,i,5))
547 continue;
548 tgt = GETJUMPTGT(codestr, (i+1));
549 if (codestr[tgt] != POP_TOP)
550 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000551 j = GETARG(codestr, i+1) + 1;
552 codestr[i] = JUMP_IF_TRUE;
553 SETARG(codestr, i, j);
554 codestr[i+3] = POP_TOP;
555 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000556 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000557 break;
558
559 /* not a is b --> a is not b
560 not a in b --> a not in b
561 not a is not b --> a is b
562 not a not in b --> a in b */
563 case COMPARE_OP:
564 j = GETARG(codestr, i);
565 if (j < 6 || j > 9 ||
566 codestr[i+3] != UNARY_NOT ||
567 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000568 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000569 SETARG(codestr, i, (j^1));
570 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000571 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000572 break;
573
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000574 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
575 case LOAD_NAME:
576 case LOAD_GLOBAL:
577 j = GETARG(codestr, i);
578 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
579 if (name == NULL || strcmp(name, "None") != 0)
580 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000581 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
582 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000583 codestr[i] = LOAD_CONST;
584 SETARG(codestr, i, j);
585 break;
586 }
587 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000588 break;
589
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000590 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000591 case LOAD_CONST:
592 j = GETARG(codestr, i);
593 if (codestr[i+3] != JUMP_IF_FALSE ||
594 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000595 !ISBASICBLOCK(blocks,i,7) ||
596 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000597 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000598 memset(codestr+i, NOP, 7);
599 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000600 break;
601
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000602 /* Try to fold tuples of constants.
603 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000604 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
605 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000606 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000607 j = GETARG(codestr, i);
608 h = i - 3 * j;
609 if (h >= 0 &&
610 codestr[h] == LOAD_CONST &&
611 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
612 tuple_of_constants(&codestr[h], j, consts)) {
613 nops += 3 * j;
614 break;
615 }
616 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000617 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000618 j = GETARG(codestr, i);
619 if (codestr[i+3] != UNPACK_SEQUENCE ||
620 !ISBASICBLOCK(blocks,i,6) ||
621 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000622 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000623 if (j == 1) {
624 memset(codestr+i, NOP, 6);
625 nops += 6;
626 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000627 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000628 memset(codestr+i+1, NOP, 5);
629 nops += 5;
630 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000631 codestr[i] = ROT_THREE;
632 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000633 memset(codestr+i+2, NOP, 4);
634 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000635 }
636 break;
637
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000638 /* Simplify conditional jump to conditional jump where the
639 result of the first test implies the success of a similar
640 test or the failure of the opposite test.
641 Arises in code like:
642 "a and b or c"
643 "a and b and c"
644 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000645 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
646 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000647 */
648 case JUMP_IF_FALSE:
649 case JUMP_IF_TRUE:
650 tgt = GETJUMPTGT(codestr, i);
651 j = codestr[tgt];
652 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
653 if (j == opcode) {
654 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
655 SETARG(codestr, i, tgttgt);
656 } else {
657 tgt -= i;
658 SETARG(codestr, i, tgt);
659 }
660 break;
661 }
662 /* Intentional fallthrough */
663
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000664 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000665 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000666 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000667 case JUMP_ABSOLUTE:
668 case CONTINUE_LOOP:
669 case SETUP_LOOP:
670 case SETUP_EXCEPT:
671 case SETUP_FINALLY:
672 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000673 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000674 continue;
675 tgttgt = GETJUMPTGT(codestr, tgt);
676 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
677 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000678 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000679 tgttgt -= i + 3; /* Calc relative jump addr */
680 if (tgttgt < 0) /* No backward relative jumps */
681 continue;
682 codestr[i] = opcode;
683 SETARG(codestr, i, tgttgt);
684 break;
685
686 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000687 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000688
689 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
690 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000691 if (i+4 >= codelen ||
692 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000693 !ISBASICBLOCK(blocks,i,5))
694 continue;
695 memset(codestr+i+1, NOP, 4);
696 nops += 4;
697 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000698 }
699 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000700
701 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000702 cum_orig_line = 0;
703 last_line = 0;
704 for (i=0 ; i < tabsiz ; i+=2) {
705 cum_orig_line += lineno[i];
706 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000707 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000708 lineno[i] =((unsigned char)(new_line - last_line));
709 last_line = new_line;
710 }
711
712 /* Remove NOPs and fixup jump targets */
713 for (i=0, h=0 ; i<codelen ; ) {
714 opcode = codestr[i];
715 switch (opcode) {
716 case NOP:
717 i++;
718 continue;
719
720 case JUMP_ABSOLUTE:
721 case CONTINUE_LOOP:
722 j = addrmap[GETARG(codestr, i)];
723 SETARG(codestr, i, j);
724 break;
725
726 case FOR_ITER:
727 case JUMP_FORWARD:
728 case JUMP_IF_FALSE:
729 case JUMP_IF_TRUE:
730 case SETUP_LOOP:
731 case SETUP_EXCEPT:
732 case SETUP_FINALLY:
733 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
734 SETARG(codestr, i, j);
735 break;
736 }
737 adj = CODESIZE(opcode);
738 while (adj--)
739 codestr[h++] = codestr[i++];
740 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000741 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000742
743 code = PyString_FromStringAndSize((char *)codestr, h);
744 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000745 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000746 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000747 return code;
748
749exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000750 if (addrmap != NULL)
751 PyMem_Free(addrmap);
752 if (codestr != NULL)
753 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000754 Py_INCREF(code);
755 return code;
756}
757
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000758/* End: Peephole optimizations ----------------------------------------- */
759
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000761PyCode_New(int argcount, int nlocals, int stacksize, int flags,
762 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000763 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
764 PyObject *filename, PyObject *name, int firstlineno,
765 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000766{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000768 int i;
769 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000770 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000771 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000772 consts == NULL || !PyTuple_Check(consts) ||
773 names == NULL || !PyTuple_Check(names) ||
774 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000775 freevars == NULL || !PyTuple_Check(freevars) ||
776 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 name == NULL || !PyString_Check(name) ||
778 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000779 lnotab == NULL || !PyString_Check(lnotab) ||
780 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000781 PyErr_BadInternalCall();
782 return NULL;
783 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000784 intern_strings(names);
785 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000786 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000787 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000788 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 for (i = PyTuple_Size(consts); --i >= 0; ) {
790 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000792 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000793 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000794 continue;
795 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000798 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000799 co->co_argcount = argcount;
800 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000801 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000802 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000803 Py_INCREF(code);
804 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000808 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000810 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000811 Py_INCREF(freevars);
812 co->co_freevars = freevars;
813 Py_INCREF(cellvars);
814 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000816 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000818 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000819 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000821 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000822 if (PyTuple_GET_SIZE(freevars) == 0 &&
823 PyTuple_GET_SIZE(cellvars) == 0)
824 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000825 }
826 return co;
827}
828
829
830/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000831
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000832/* The compiler uses two passes to generate bytecodes. The first pass
833 builds the symbol table. The second pass generates the bytecode.
834
835 The first pass uses a single symtable struct. The second pass uses
836 a compiling struct for each code block. The compiling structs
837 share a reference to the symtable.
838
839 The two passes communicate via symtable_load_symbols() and via
840 is_local() and is_global(). The former initializes several slots
841 in the compiling struct: c_varnames, c_locals, c_nlocals,
842 c_argcount, c_globals, and c_flags.
843*/
844
Tim Peters2a7f3842001-06-09 09:26:21 +0000845/* All about c_lnotab.
846
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000847c_lnotab is an array of unsigned bytes disguised as a Python string. Since
848version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
849mapped to source code line #s via c_lnotab instead.
850
Tim Peters2a7f3842001-06-09 09:26:21 +0000851The array is conceptually a list of
852 (bytecode offset increment, line number increment)
853pairs. The details are important and delicate, best illustrated by example:
854
855 byte code offset source code line number
856 0 1
857 6 2
858 50 7
859 350 307
860 361 308
861
862The first trick is that these numbers aren't stored, only the increments
863from one row to the next (this doesn't really work, but it's a start):
864
865 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
866
867The second trick is that an unsigned byte can't hold negative values, or
868values larger than 255, so (a) there's a deep assumption that byte code
869offsets and their corresponding line #s both increase monotonically, and (b)
870if at least one column jumps by more than 255 from one row to the next, more
871than one pair is written to the table. In case #b, there's no way to know
872from looking at the table later how many were written. That's the delicate
873part. A user of c_lnotab desiring to find the source line number
874corresponding to a bytecode address A should do something like this
875
876 lineno = addr = 0
877 for addr_incr, line_incr in c_lnotab:
878 addr += addr_incr
879 if addr > A:
880 return lineno
881 lineno += line_incr
882
883In order for this to work, when the addr field increments by more than 255,
884the line # increment in each pair generated must be 0 until the remaining addr
885increment is < 256. So, in the example above, com_set_lineno should not (as
886was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
887255, 0, 45, 255, 0, 45.
888*/
889
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000890struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000891 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000893 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000895 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000896 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyObject *c_locals; /* dictionary (value=localID) */
898 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000899 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000900 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000901 int c_nlocals; /* index of next local */
902 int c_argcount; /* number of top-level arguments */
903 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000904 int c_nexti; /* index into c_code */
905 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000907 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000909 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000910 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000911 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000912 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000913 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000914 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000915 int c_stacklevel; /* Current stack level */
916 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000917 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000919 int c_last_addr; /* last op addr seen and recorded in lnotab */
920 int c_last_line; /* last line seen and recorded in lnotab */
921 int c_lnotab_next; /* current length of lnotab */
922 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000923 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000924 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000925 int c_nested; /* Is block nested funcdef or lamdef? */
926 int c_closure; /* Is nested w/freevars? */
927 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000928 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000929 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000930};
931
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000932static int
933is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000934{
935 if ((v & (USE | DEF_FREE))
936 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
937 return 1;
938 if (v & DEF_FREE_CLASS)
939 return 1;
940 return 0;
941}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000942
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000943static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000944com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000945{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000946 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
947
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000948 if (c == NULL) {
949 /* Error occurred via symtable call to
950 is_constant_false */
951 PyErr_SetString(exc, msg);
952 return;
953 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000954 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000955 if (c->c_lineno < 1 || c->c_interactive) {
956 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000958 return;
959 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000960 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000961 if (v == NULL)
962 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000963
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000964 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000965 if (line == NULL) {
966 Py_INCREF(Py_None);
967 line = Py_None;
968 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000969 if (exc == PyExc_SyntaxError) {
970 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
971 Py_None, line);
972 if (t == NULL)
973 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000974 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000975 if (w == NULL)
976 goto exit;
977 PyErr_SetObject(exc, w);
978 } else {
979 /* Make sure additional exceptions are printed with
980 file and line, also. */
981 PyErr_SetObject(exc, v);
982 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
983 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000984 exit:
985 Py_XDECREF(t);
986 Py_XDECREF(v);
987 Py_XDECREF(w);
988 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000989}
990
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000991/* Interface to the block stack */
992
993static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000994block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000995{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000996 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 com_error(c, PyExc_SystemError,
998 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000999 }
1000 else {
1001 c->c_block[c->c_nblocks++] = type;
1002 }
1003}
1004
1005static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001006block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001007{
1008 if (c->c_nblocks > 0)
1009 c->c_nblocks--;
1010 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001012 }
1013}
1014
Guido van Rossum681d79a1995-07-18 14:51:37 +00001015/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001016
Martin v. Löwis95292d62002-12-11 14:04:59 +00001017static int issue_warning(const char *, const char *, int);
1018static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001019static void com_free(struct compiling *);
1020static void com_push(struct compiling *, int);
1021static void com_pop(struct compiling *, int);
1022static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001023static void com_node(struct compiling *, node *);
1024static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001025static void com_addbyte(struct compiling *, int);
1026static void com_addint(struct compiling *, int);
1027static void com_addoparg(struct compiling *, int, int);
1028static void com_addfwref(struct compiling *, int, int *);
1029static void com_backpatch(struct compiling *, int);
1030static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1031static int com_addconst(struct compiling *, PyObject *);
1032static int com_addname(struct compiling *, PyObject *);
1033static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001034static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001035static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001036static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001037static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001038static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001039static void com_assign(struct compiling *, node *, int, node *);
1040static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001041static int com_make_closure(struct compiling *c, PyCodeObject *co);
1042
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001043static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001044static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001045 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001046static PyObject *parsestrplus(struct compiling*, node *);
1047static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001048static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001049
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001050static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001051
1052/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001053static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001054static struct symtable *symtable_build(node *, PyFutureFeatures *,
1055 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001056static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001057static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001058static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001059static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001060static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001061static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001062
1063static void symtable_node(struct symtable *, node *);
1064static void symtable_funcdef(struct symtable *, node *);
1065static void symtable_default_args(struct symtable *, node *);
1066static void symtable_params(struct symtable *, node *);
1067static void symtable_params_fplist(struct symtable *, node *n);
1068static void symtable_global(struct symtable *, node *);
1069static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001070static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001071static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001072static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001073static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001074static void symtable_gen_for(struct symtable *, node *, int);
1075static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001076
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001077static int symtable_update_free_vars(struct symtable *);
1078static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1079static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1080
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001081/* helper */
1082static void
1083do_pad(int pad)
1084{
1085 int i;
1086 for (i = 0; i < pad; ++i)
1087 fprintf(stderr, " ");
1088}
1089
1090static void
1091dump(node *n, int pad, int depth)
1092{
1093 int i;
1094 if (depth == 0)
1095 return;
1096 do_pad(pad);
1097 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1098 if (depth > 0)
1099 depth--;
1100 for (i = 0; i < NCH(n); ++i)
1101 dump(CHILD(n, i), pad + 1, depth);
1102}
1103
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001104static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001105com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001107 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1109 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001110 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001112 goto fail;
1113 if ((c->c_const_dict = PyDict_New()) == NULL)
1114 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001116 goto fail;
1117 if ((c->c_name_dict = PyDict_New()) == NULL)
1118 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001120 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1122 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001123 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001124 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001125 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001126 c->c_freevars = NULL;
1127 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001128 c->c_nlocals = 0;
1129 c->c_argcount = 0;
1130 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001131 c->c_nexti = 0;
1132 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001133 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001134 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001135 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001136 c->c_begin = 0;
1137 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001138 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001139 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001140 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001141 c->c_stacklevel = 0;
1142 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001143 c->c_firstlineno = 0;
1144 c->c_last_addr = 0;
1145 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001146 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001147 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001148 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001149 c->c_nested = 0;
1150 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001151 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152 return 1;
1153
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001154 fail:
1155 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156 return 0;
1157}
1158
1159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001160com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001161{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 Py_XDECREF(c->c_code);
1163 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001164 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001166 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 Py_XDECREF(c->c_globals);
1168 Py_XDECREF(c->c_locals);
1169 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001170 Py_XDECREF(c->c_freevars);
1171 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001173 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001174 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001175}
1176
1177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001178com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001179{
1180 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001181 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001182 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001183 /*
1184 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1185 c->c_filename, c->c_name, c->c_lineno,
1186 c->c_nexti, c->c_stacklevel, n);
1187 */
1188 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001189}
1190
1191static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001192com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001193{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001194 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001195 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001196 else
1197 c->c_stacklevel -= n;
1198}
1199
1200static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001201com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001202{
1203 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001205 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001207}
1208
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001209static int
1210com_check_size(PyObject **s, int offset)
1211{
1212 int len = PyString_GET_SIZE(*s);
1213 if (offset >= len)
1214 return _PyString_Resize(s, len * 2);
1215 return 0;
1216}
1217
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001219com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001221 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001222 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001223 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001224 if (com_check_size(&c->c_code, c->c_nexti)) {
1225 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001226 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001227 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001228 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229}
1230
1231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001232com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001234 com_addbyte(c, x & 0xff);
1235 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001236}
1237
1238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001239com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001240{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001241 char *p;
1242 if (c->c_lnotab == NULL)
1243 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001244 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1245 c->c_errors++;
1246 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001247 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001248 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001249 *p++ = addr;
1250 *p++ = line;
1251 c->c_lnotab_next += 2;
1252}
1253
1254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001255com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001256{
1257 c->c_lineno = lineno;
1258 if (c->c_firstlineno == 0) {
1259 c->c_firstlineno = c->c_last_line = lineno;
1260 }
1261 else {
1262 int incr_addr = c->c_nexti - c->c_last_addr;
1263 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001264 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001265 while (incr_addr > 255) {
1266 com_add_lnotab(c, 255, 0);
1267 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001268 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001269 while (incr_line > 255) {
1270 com_add_lnotab(c, incr_addr, 255);
1271 incr_line -=255;
1272 incr_addr = 0;
1273 }
1274 if (incr_addr > 0 || incr_line > 0)
1275 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001276 c->c_last_addr = c->c_nexti;
1277 c->c_last_line = lineno;
1278 }
1279}
1280
1281static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001282com_strip_lnotab(struct compiling *c)
1283{
1284 /* strip the last lnotab entry if no opcode were emitted.
1285 * This prevents a line number to be generated on a final
1286 * pass, like in the following example:
1287 *
1288 * if a:
1289 * print 5
1290 * else:
1291 * pass
1292 *
1293 * Without the fix, a line trace event would be generated
1294 * on the pass even if a is true (because of the implicit
1295 * return).
1296 */
1297 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1298 c->c_lnotab_next = c->c_lnotab_last;
1299 }
1300}
1301
1302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001303com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001304{
Fred Drakeef8ace32000-08-24 00:32:09 +00001305 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001306 if (extended_arg){
1307 com_addbyte(c, EXTENDED_ARG);
1308 com_addint(c, extended_arg);
1309 arg &= 0xffff;
1310 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001311 com_addbyte(c, op);
1312 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313}
1314
1315static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001316com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001317{
1318 /* Compile a forward reference for backpatching */
1319 int here;
1320 int anchor;
1321 com_addbyte(c, op);
1322 here = c->c_nexti;
1323 anchor = *p_anchor;
1324 *p_anchor = here;
1325 com_addint(c, anchor == 0 ? 0 : here - anchor);
1326}
1327
1328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001329com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001331 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001332 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001333 int dist;
1334 int prev;
1335 for (;;) {
1336 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001337 prev = code[anchor] + (code[anchor+1] << 8);
1338 dist = target - (anchor+2);
1339 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001340 dist >>= 8;
1341 code[anchor+1] = dist;
1342 dist >>= 8;
1343 if (dist) {
1344 com_error(c, PyExc_SystemError,
1345 "com_backpatch: offset too large");
1346 break;
1347 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 if (!prev)
1349 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350 anchor -= prev;
1351 }
1352}
1353
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001354/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355
1356static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001357com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001359 PyObject *w, *t, *np=NULL;
1360 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001361
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001362 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001363 if (t == NULL)
1364 goto fail;
1365 w = PyDict_GetItem(dict, t);
1366 if (w != NULL) {
1367 n = PyInt_AsLong(w);
1368 } else {
1369 n = PyList_Size(list);
1370 np = PyInt_FromLong(n);
1371 if (np == NULL)
1372 goto fail;
1373 if (PyList_Append(list, v) != 0)
1374 goto fail;
1375 if (PyDict_SetItem(dict, t, np) != 0)
1376 goto fail;
1377 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001378 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001379 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001380 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001381 fail:
1382 Py_XDECREF(np);
1383 Py_XDECREF(t);
1384 c->c_errors++;
1385 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386}
1387
1388static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001389com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001390{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001391 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392}
1393
1394static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001395com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001396{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001397 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398}
1399
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001400int
1401_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001402{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001403 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001404 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001405 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001406 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1407 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001408 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001409 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001410 return 0; /* Don't mangle __extremely_long_names */
1411 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1412 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001413 /* Strip leading underscores from class name */
1414 while (*p == '_')
1415 p++;
1416 if (*p == '\0')
1417 return 0; /* Don't mangle if class is just underscores */
1418 plen = strlen(p);
1419 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001420 plen = maxlen-nlen-2; /* Truncate class name if too long */
1421 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001422 buffer[0] = '_';
1423 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001424 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001425 return 1;
1426}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001427
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001428static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001429com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001430{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001431 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001433 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001434
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001435 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001436 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001437 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001438 c->c_errors++;
1439 i = 255;
1440 }
1441 else {
1442 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001444 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001445 com_addoparg(c, op, i);
1446}
1447
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001448#define NAME_LOCAL 0
1449#define NAME_GLOBAL 1
1450#define NAME_DEFAULT 2
1451#define NAME_CLOSURE 3
1452
1453static int
1454com_lookup_arg(PyObject *dict, PyObject *name)
1455{
1456 PyObject *v = PyDict_GetItem(dict, name);
1457 if (v == NULL)
1458 return -1;
1459 else
1460 return PyInt_AS_LONG(v);
1461}
1462
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001463static int
1464none_assignment_check(struct compiling *c, char *name, int assigning)
1465{
1466 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1467 char *msg;
1468 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001469 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001470 else
1471 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001472 com_error(c, PyExc_SyntaxError, msg);
1473 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001474 }
1475 return 0;
1476}
1477
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001478static void
1479com_addop_varname(struct compiling *c, int kind, char *name)
1480{
1481 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001482 int i, reftype;
1483 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001484 int op = STOP_CODE;
1485 char buffer[MANGLE_LEN];
1486
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001487 if (kind != VAR_LOAD &&
1488 none_assignment_check(c, name, kind == VAR_STORE))
1489 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001490 i = 255;
1491 goto done;
1492 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001493 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001494 name = buffer;
1495 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1496 c->c_errors++;
1497 i = 255;
1498 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001499 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001500
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001501 reftype = get_ref_type(c, name);
1502 switch (reftype) {
1503 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001504 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001505 scope = NAME_LOCAL;
1506 break;
1507 case GLOBAL_EXPLICIT:
1508 scope = NAME_GLOBAL;
1509 break;
1510 case GLOBAL_IMPLICIT:
1511 if (c->c_flags & CO_OPTIMIZED)
1512 scope = NAME_GLOBAL;
1513 break;
1514 case FREE:
1515 case CELL:
1516 scope = NAME_CLOSURE;
1517 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001518 }
1519
1520 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001521 if (scope == NAME_LOCAL)
1522 i = com_lookup_arg(c->c_locals, v);
1523 else if (reftype == FREE)
1524 i = com_lookup_arg(c->c_freevars, v);
1525 else if (reftype == CELL)
1526 i = com_lookup_arg(c->c_cellvars, v);
1527 if (i == -1) {
1528 c->c_errors++; /* XXX no exception set */
1529 i = 255;
1530 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001531 }
1532 Py_DECREF(v);
1533
1534 switch (kind) {
1535 case VAR_LOAD:
1536 switch (scope) {
1537 case NAME_LOCAL:
1538 op = LOAD_FAST;
1539 break;
1540 case NAME_GLOBAL:
1541 op = LOAD_GLOBAL;
1542 break;
1543 case NAME_DEFAULT:
1544 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001545 break;
1546 case NAME_CLOSURE:
1547 op = LOAD_DEREF;
1548 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001549 }
1550 break;
1551 case VAR_STORE:
1552 switch (scope) {
1553 case NAME_LOCAL:
1554 op = STORE_FAST;
1555 break;
1556 case NAME_GLOBAL:
1557 op = STORE_GLOBAL;
1558 break;
1559 case NAME_DEFAULT:
1560 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001561 break;
1562 case NAME_CLOSURE:
1563 op = STORE_DEREF;
1564 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001565 }
1566 break;
1567 case VAR_DELETE:
1568 switch (scope) {
1569 case NAME_LOCAL:
1570 op = DELETE_FAST;
1571 break;
1572 case NAME_GLOBAL:
1573 op = DELETE_GLOBAL;
1574 break;
1575 case NAME_DEFAULT:
1576 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001577 break;
1578 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001579 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001580 PyOS_snprintf(buf, sizeof(buf),
1581 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001582 com_error(c, PyExc_SyntaxError, buf);
1583 i = 255;
1584 break;
1585 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001586 }
1587 break;
1588 }
1589done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001590 com_addoparg(c, op, i);
1591}
1592
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001594com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001595{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001596 char *name;
1597 char buffer[1000];
1598 /* XXX it is possible to write this code without the 1000
1599 chars on the total length of dotted names, I just can't be
1600 bothered right now */
1601 if (TYPE(n) == STAR)
1602 name = "*";
1603 else if (TYPE(n) == dotted_name) {
1604 char *p = buffer;
1605 int i;
1606 name = buffer;
1607 for (i = 0; i < NCH(n); i += 2) {
1608 char *s = STR(CHILD(n, i));
1609 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001611 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001612 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001613 break;
1614 }
1615 if (p != buffer)
1616 *p++ = '.';
1617 strcpy(p, s);
1618 p = strchr(p, '\0');
1619 }
1620 }
1621 else {
1622 REQ(n, NAME);
1623 name = STR(n);
1624 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001625 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001626}
1627
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001629parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001630{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001631 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001632 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001633 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001634#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001635 int imflag;
1636#endif
1637
Guido van Rossum282914b1991-04-04 10:42:56 +00001638 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001639 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001640#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001641 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001642#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001643 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001645 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001647 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001648 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001649 }
1650 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001651 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001653 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001654 if (errno != 0)
1655 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001656 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001657 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001658 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001659#ifndef WITHOUT_COMPLEX
1660 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001661 Py_complex z;
1662 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001663 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001664 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001665 PyFPE_END_PROTECT(z)
1666 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001667 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001668 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001669#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001670 {
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 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001673 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001675 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001676}
1677
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001679decode_utf8(char **sPtr, char *end, char* encoding)
1680{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001681#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001682 Py_FatalError("decode_utf8 should not be called in this build.");
1683 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001684#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001685 PyObject *u, *v;
1686 char *s, *t;
1687 t = s = *sPtr;
1688 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1689 while (s < end && (*s & 0x80)) s++;
1690 *sPtr = s;
1691 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1692 if (u == NULL)
1693 return NULL;
1694 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1695 Py_DECREF(u);
1696 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001697#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001698}
1699
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001700/* compiler.transformer.Transformer.decode_literal depends on what
1701 might seem like minor details of this function -- changes here
1702 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001703static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001704parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001705{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001707 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001708 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001709 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001710 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001711 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001712 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001713
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001714 if (isalpha(quote) || quote == '_') {
1715 if (quote == 'u' || quote == 'U') {
1716 quote = *++s;
1717 unicode = 1;
1718 }
1719 if (quote == 'r' || quote == 'R') {
1720 quote = *++s;
1721 rawmode = 1;
1722 }
1723 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001724 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001725 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001726 return NULL;
1727 }
1728 s++;
1729 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001730 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001731 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001732 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001733 return NULL;
1734 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001735 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001737 return NULL;
1738 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001739 if (len >= 4 && s[0] == quote && s[1] == quote) {
1740 s += 2;
1741 len -= 2;
1742 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001743 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001744 return NULL;
1745 }
1746 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001747#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001748 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001749 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001750 char *buf;
1751 char *p;
1752 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001753 if (encoding == NULL) {
1754 buf = s;
1755 u = NULL;
1756 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1757 buf = s;
1758 u = NULL;
1759 } else {
1760 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1761 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1762 if (u == NULL)
1763 return NULL;
1764 p = buf = PyString_AsString(u);
1765 end = s + len;
1766 while (s < end) {
1767 if (*s == '\\') {
1768 *p++ = *s++;
1769 if (*s & 0x80) {
1770 strcpy(p, "u005c");
1771 p += 5;
1772 }
1773 }
1774 if (*s & 0x80) { /* XXX inefficient */
1775 char *r;
1776 int rn, i;
1777 w = decode_utf8(&s, end, "utf-16-be");
1778 if (w == NULL) {
1779 Py_DECREF(u);
1780 return NULL;
1781 }
1782 r = PyString_AsString(w);
1783 rn = PyString_Size(w);
1784 assert(rn % 2 == 0);
1785 for (i = 0; i < rn; i += 2) {
1786 sprintf(p, "\\u%02x%02x",
1787 r[i + 0] & 0xFF,
1788 r[i + 1] & 0xFF);
1789 p += 6;
1790 }
1791 Py_DECREF(w);
1792 } else {
1793 *p++ = *s++;
1794 }
1795 }
1796 len = p - buf;
1797 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001798 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001799 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001800 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001801 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1802 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001803 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001804 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001805 return v;
1806
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001807 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001808#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001809 need_encoding = (encoding != NULL &&
1810 strcmp(encoding, "utf-8") != 0 &&
1811 strcmp(encoding, "iso-8859-1") != 0);
1812 if (rawmode || strchr(s, '\\') == NULL) {
1813 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001814#ifndef Py_USING_UNICODE
1815 /* This should not happen - we never see any other
1816 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001817 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001818#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001819 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1820 if (u == NULL)
1821 return NULL;
1822 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1823 Py_DECREF(u);
1824 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001825#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001826 } else {
1827 return PyString_FromStringAndSize(s, len);
1828 }
1829 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001830
1831 v = PyString_DecodeEscape(s, len, NULL, unicode,
1832 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001833 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001834 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001835 return v;
1836}
1837
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001839parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001840{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001842 int i;
1843 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001844 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001845 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001846 for (i = 1; i < NCH(n); i++) {
1847 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001848 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001849 if (s == NULL)
1850 goto onError;
1851 if (PyString_Check(v) && PyString_Check(s)) {
1852 PyString_ConcatAndDel(&v, s);
1853 if (v == NULL)
1854 goto onError;
1855 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001856#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001857 else {
1858 PyObject *temp;
1859 temp = PyUnicode_Concat(v, s);
1860 Py_DECREF(s);
1861 if (temp == NULL)
1862 goto onError;
1863 Py_DECREF(v);
1864 v = temp;
1865 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001866#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001867 }
1868 }
1869 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001870
1871 onError:
1872 Py_XDECREF(v);
1873 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001874}
1875
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001876static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001877com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001878{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001879 int anchor = 0;
1880 int save_begin = c->c_begin;
1881
Raymond Hettinger354433a2004-05-19 08:20:33 +00001882 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001883 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001884 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001885 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001886 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001887 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001888 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001889 c->c_loops++;
1890 com_list_iter(c, n, e, t);
1891 c->c_loops--;
1892 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1893 c->c_begin = save_begin;
1894 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001895 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001896}
1897
1898static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001899com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1900{
1901 int break_anchor = 0;
1902 int anchor = 0;
1903 int save_begin = c->c_begin;
1904
1905 REQ(n, gen_for);
1906 /* gen_for: for v in test [gen_iter] */
1907
1908 com_addfwref(c, SETUP_LOOP, &break_anchor);
1909 block_push(c, SETUP_LOOP);
1910
1911 if (is_outmost) {
1912 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1913 com_push(c, 1);
1914 }
1915 else {
1916 com_node(c, CHILD(n, 3));
1917 com_addbyte(c, GET_ITER);
1918 }
1919
1920 c->c_begin = c->c_nexti;
1921 com_set_lineno(c, c->c_last_line);
1922 com_addfwref(c, FOR_ITER, &anchor);
1923 com_push(c, 1);
1924 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1925
1926 if (NCH(n) == 5)
1927 com_gen_iter(c, CHILD(n, 4), t);
1928 else {
1929 com_test(c, t);
1930 com_addbyte(c, YIELD_VALUE);
1931 com_pop(c, 1);
1932 }
1933
1934 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1935 c->c_begin = save_begin;
1936
1937 com_backpatch(c, anchor);
1938 com_pop(c, 1); /* FOR_ITER has popped this */
1939 com_addbyte(c, POP_BLOCK);
1940 block_pop(c, SETUP_LOOP);
1941 com_backpatch(c, break_anchor);
1942}
1943
1944static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001945com_list_if(struct compiling *c, node *n, node *e, char *t)
1946{
1947 int anchor = 0;
1948 int a = 0;
1949 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001950 com_node(c, CHILD(n, 1));
1951 com_addfwref(c, JUMP_IF_FALSE, &a);
1952 com_addbyte(c, POP_TOP);
1953 com_pop(c, 1);
1954 com_list_iter(c, n, e, t);
1955 com_addfwref(c, JUMP_FORWARD, &anchor);
1956 com_backpatch(c, a);
1957 /* We jump here with an extra entry which we now pop */
1958 com_addbyte(c, POP_TOP);
1959 com_backpatch(c, anchor);
1960}
1961
1962static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001963com_gen_if(struct compiling *c, node *n, node *t)
1964{
1965 /* gen_if: 'if' test [gen_iter] */
1966 int anchor = 0;
1967 int a=0;
1968
1969 com_node(c, CHILD(n, 1));
1970 com_addfwref(c, JUMP_IF_FALSE, &a);
1971 com_addbyte(c, POP_TOP);
1972 com_pop(c, 1);
1973
1974 if (NCH(n) == 3)
1975 com_gen_iter(c, CHILD(n, 2), t);
1976 else {
1977 com_test(c, t);
1978 com_addbyte(c, YIELD_VALUE);
1979 com_pop(c, 1);
1980 }
1981 com_addfwref(c, JUMP_FORWARD, &anchor);
1982 com_backpatch(c, a);
1983 /* We jump here with an extra entry which we now pop */
1984 com_addbyte(c, POP_TOP);
1985 com_backpatch(c, anchor);
1986}
1987
1988static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001989com_list_iter(struct compiling *c,
1990 node *p, /* parent of list_iter node */
1991 node *e, /* element expression node */
1992 char *t /* name of result list temp local */)
1993{
1994 /* list_iter is the last child in a listmaker, list_for, or list_if */
1995 node *n = CHILD(p, NCH(p)-1);
1996 if (TYPE(n) == list_iter) {
1997 n = CHILD(n, 0);
1998 switch (TYPE(n)) {
1999 case list_for:
2000 com_list_for(c, n, e, t);
2001 break;
2002 case list_if:
2003 com_list_if(c, n, e, t);
2004 break;
2005 default:
2006 com_error(c, PyExc_SystemError,
2007 "invalid list_iter node type");
2008 }
2009 }
2010 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002011 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002012 com_push(c, 1);
2013 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002014 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002015 com_pop(c, 2);
2016 }
2017}
2018
2019static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002020com_gen_iter(struct compiling *c, node *n, node *t)
2021{
2022 /* gen_iter: gen_for | gen_if */
2023 node *ch;
2024 REQ(n, gen_iter);
2025
2026 ch = CHILD(n, 0);
2027
2028 switch (TYPE(ch)) {
2029 case gen_for:
2030 com_gen_for(c, ch, t, 0);
2031 break;
2032 case gen_if:
2033 com_gen_if(c, ch, t);
2034 break;
2035 default:
2036 com_error(c, PyExc_SystemError,
2037 "invalid gen_iter node type");
2038 }
2039}
2040
2041static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002042com_list_comprehension(struct compiling *c, node *n)
2043{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002044 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002045 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002046
2047 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002048 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002049 com_addoparg(c, BUILD_LIST, 0);
2050 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2051 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002052 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002053 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002054 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002055 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002056 --c->c_tmpname;
2057}
2058
2059static void
2060com_listmaker(struct compiling *c, node *n)
2061{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002062 /* listmaker: test ( list_for | (',' test)* [','] ) */
2063 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002064 com_list_comprehension(c, n);
2065 else {
2066 int len = 0;
2067 int i;
2068 for (i = 0; i < NCH(n); i += 2, len++)
2069 com_node(c, CHILD(n, i));
2070 com_addoparg(c, BUILD_LIST, len);
2071 com_pop(c, len-1);
2072 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002073}
2074
2075static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002076com_generator_expression(struct compiling *c, node *n)
2077{
2078 /* testlist_gexp: test gen_for */
2079 /* argument: test gen_for */
2080 PyCodeObject *co;
2081
2082 REQ(CHILD(n, 0), test);
2083 REQ(CHILD(n, 1), gen_for);
2084
2085 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2086 n->n_lineno);
2087 co = icompile(n, c);
2088 symtable_exit_scope(c->c_symtable);
2089
2090 if (co == NULL)
2091 c->c_errors++;
2092 else {
2093 int closure = com_make_closure(c, co);
2094 int i = com_addconst(c, (PyObject *)co);
2095
2096 com_addoparg(c, LOAD_CONST, i);
2097 com_push(c, 1);
2098 if (closure)
2099 com_addoparg(c, MAKE_CLOSURE, 0);
2100 else
2101 com_addoparg(c, MAKE_FUNCTION, 0);
2102
2103 com_test(c, CHILD(CHILD(n, 1), 3));
2104 com_addbyte(c, GET_ITER);
2105 com_addoparg(c, CALL_FUNCTION, 1);
2106 com_pop(c, 1);
2107
2108 Py_DECREF(co);
2109 }
2110}
2111
2112static void
2113com_testlist_gexp(struct compiling *c, node *n)
2114{
2115 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2116 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2117 com_generator_expression(c, n);
2118 else com_list(c, n, 0);
2119}
2120
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002121
Raymond Hettinger354433a2004-05-19 08:20:33 +00002122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002123com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002124{
2125 int i;
2126 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2127 for (i = 0; i+2 < NCH(n); i += 4) {
2128 /* We must arrange things just right for STORE_SUBSCR.
2129 It wants the stack to look like (value) (dict) (key) */
2130 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002131 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002132 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002133 com_node(c, CHILD(n, i+2)); /* value */
2134 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002135 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002136 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002137 }
2138}
2139
2140static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002141com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002142{
2143 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002144 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 int i;
2146 REQ(n, atom);
2147 ch = CHILD(n, 0);
2148 switch (TYPE(ch)) {
2149 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002150 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002152 com_push(c, 1);
2153 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002154 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002155 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002156 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002157 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002158 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002159 com_addoparg(c, BUILD_LIST, 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
Skip Montanaro803d6e52000-08-12 18:09:51 +00002163 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002164 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002165 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002166 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002167 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002168 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002169 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002170 break;
2171 case BACKQUOTE:
2172 com_node(c, CHILD(n, 1));
2173 com_addbyte(c, UNARY_CONVERT);
2174 break;
2175 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002176 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002177 i = 255;
2178 }
2179 else {
2180 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002181 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002182 }
2183 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002184 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002185 break;
2186 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002187 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002188 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002189 c->c_errors++;
2190 i = 255;
2191 }
2192 else {
2193 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002194 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002195 }
2196 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002197 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002198 break;
2199 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002200 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002201 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002202 break;
2203 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204 com_error(c, PyExc_SystemError,
2205 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002206 }
2207}
2208
2209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002210com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002211{
2212 if (NCH(n) == 1) {
2213 com_addbyte(c, op);
2214 }
2215 else if (NCH(n) == 2) {
2216 if (TYPE(CHILD(n, 0)) != COLON) {
2217 com_node(c, CHILD(n, 0));
2218 com_addbyte(c, op+1);
2219 }
2220 else {
2221 com_node(c, CHILD(n, 1));
2222 com_addbyte(c, op+2);
2223 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002224 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002225 }
2226 else {
2227 com_node(c, CHILD(n, 0));
2228 com_node(c, CHILD(n, 2));
2229 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002230 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002231 }
2232}
2233
Guido van Rossum635abd21997-01-06 22:56:52 +00002234static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002235com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2236{
2237 if (NCH(n) == 1) {
2238 com_addbyte(c, DUP_TOP);
2239 com_push(c, 1);
2240 com_addbyte(c, SLICE);
2241 com_node(c, augn);
2242 com_addbyte(c, opcode);
2243 com_pop(c, 1);
2244 com_addbyte(c, ROT_TWO);
2245 com_addbyte(c, STORE_SLICE);
2246 com_pop(c, 2);
2247 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2248 com_node(c, CHILD(n, 0));
2249 com_addoparg(c, DUP_TOPX, 2);
2250 com_push(c, 2);
2251 com_addbyte(c, SLICE+1);
2252 com_pop(c, 1);
2253 com_node(c, augn);
2254 com_addbyte(c, opcode);
2255 com_pop(c, 1);
2256 com_addbyte(c, ROT_THREE);
2257 com_addbyte(c, STORE_SLICE+1);
2258 com_pop(c, 3);
2259 } else if (NCH(n) == 2) {
2260 com_node(c, CHILD(n, 1));
2261 com_addoparg(c, DUP_TOPX, 2);
2262 com_push(c, 2);
2263 com_addbyte(c, SLICE+2);
2264 com_pop(c, 1);
2265 com_node(c, augn);
2266 com_addbyte(c, opcode);
2267 com_pop(c, 1);
2268 com_addbyte(c, ROT_THREE);
2269 com_addbyte(c, STORE_SLICE+2);
2270 com_pop(c, 3);
2271 } else {
2272 com_node(c, CHILD(n, 0));
2273 com_node(c, CHILD(n, 2));
2274 com_addoparg(c, DUP_TOPX, 3);
2275 com_push(c, 3);
2276 com_addbyte(c, SLICE+3);
2277 com_pop(c, 2);
2278 com_node(c, augn);
2279 com_addbyte(c, opcode);
2280 com_pop(c, 1);
2281 com_addbyte(c, ROT_FOUR);
2282 com_addbyte(c, STORE_SLICE+3);
2283 com_pop(c, 4);
2284 }
2285}
2286
2287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002289{
2290 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002291 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002292 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002293 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002295 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002296 }
2297 else {
2298 com_node(c, CHILD(n, 0));
2299 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002300 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002301 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002302 if (NCH(n) == 2) {
2303 com_generator_expression(c, n);
2304 return;
2305 }
2306
Guido van Rossumf10570b1995-07-07 22:53:21 +00002307 m = n;
2308 do {
2309 m = CHILD(m, 0);
2310 } while (NCH(m) == 1);
2311 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002312 /* f(lambda x: x[0] = 3) ends up getting parsed with
2313 * LHS test = lambda x: x[0], and RHS test = 3.
2314 * SF bug 132313 points out that complaining about a keyword
2315 * then is very confusing.
2316 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002318 TYPE(m) == lambdef ?
2319 "lambda cannot contain assignment" :
2320 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002321 }
2322 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002324 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002325 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002326 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002327 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002328 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002329 else if (*pkeywords == NULL) {
2330 c->c_errors++;
2331 Py_DECREF(v);
2332 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 if (PyDict_GetItem(*pkeywords, v) != NULL)
2334 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002335 "duplicate keyword argument");
2336 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002337 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002338 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002339 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002340 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002342 }
2343 }
2344 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002345}
2346
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002348com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349{
2350 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002351 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 }
2353 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002355 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002356 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002357 int star_flag = 0;
2358 int starstar_flag = 0;
2359 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002360 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002361 na = 0;
2362 nk = 0;
2363 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002364 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002365 if (TYPE(ch) == STAR ||
2366 TYPE(ch) == DOUBLESTAR)
2367 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002368 if (ch->n_lineno != lineno) {
2369 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002370 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002371 }
2372 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002373 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002374 na++;
2375 else
2376 nk++;
2377 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002379 while (i < NCH(n)) {
2380 node *tok = CHILD(n, i);
2381 node *ch = CHILD(n, i+1);
2382 i += 3;
2383 switch (TYPE(tok)) {
2384 case STAR: star_flag = 1; break;
2385 case DOUBLESTAR: starstar_flag = 1; break;
2386 }
2387 com_node(c, ch);
2388 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002389 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002390 com_error(c, PyExc_SyntaxError,
2391 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002392 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002393 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002394 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002395 star_flag + (starstar_flag << 1);
2396 else
2397 opcode = CALL_FUNCTION;
2398 com_addoparg(c, opcode, na | (nk << 8));
2399 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002400 }
2401}
2402
2403static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002404com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405{
2406 com_addopname(c, LOAD_ATTR, n);
2407}
2408
2409static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002410com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002411{
2412 int i=0;
2413 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002414 node *ch;
2415
2416 /* first argument */
2417 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002418 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002419 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002420 i++;
2421 }
2422 else {
2423 com_node(c, CHILD(n,i));
2424 i++;
2425 REQ(CHILD(n,i),COLON);
2426 i++;
2427 }
2428 /* second argument */
2429 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2430 com_node(c, CHILD(n,i));
2431 i++;
2432 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002433 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002434 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 com_push(c, 1);
2436 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002437 /* remaining arguments */
2438 for (; i < NCH(n); i++) {
2439 ns++;
2440 ch=CHILD(n,i);
2441 REQ(ch, sliceop);
2442 if (NCH(ch) == 1) {
2443 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002444 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002445 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002446 }
2447 else
2448 com_node(c, CHILD(ch,1));
2449 }
2450 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002451 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002452}
2453
2454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002455com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002456{
2457 node *ch;
2458 REQ(n, subscript);
2459 ch = CHILD(n,0);
2460 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002462 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002463 com_push(c, 1);
2464 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002465 else {
2466 /* check for slice */
2467 if ((TYPE(ch) == COLON || NCH(n) > 1))
2468 com_sliceobj(c, n);
2469 else {
2470 REQ(ch, test);
2471 com_node(c, ch);
2472 }
2473 }
2474}
2475
2476static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002477com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002478{
2479 int i, op;
2480 REQ(n, subscriptlist);
2481 /* Check to make backward compatible slice behavior for '[i:j]' */
2482 if (NCH(n) == 1) {
2483 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002484 /* 'Basic' slice, should have exactly one colon. */
2485 if ((TYPE(CHILD(sub, 0)) == COLON
2486 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2487 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2488 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002489 switch (assigning) {
2490 case OP_DELETE:
2491 op = DELETE_SLICE;
2492 break;
2493 case OP_ASSIGN:
2494 op = STORE_SLICE;
2495 break;
2496 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002497 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002498 break;
2499 default:
2500 com_augassign_slice(c, sub, assigning, augn);
2501 return;
2502 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002503 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002504 if (op == STORE_SLICE)
2505 com_pop(c, 2);
2506 else if (op == DELETE_SLICE)
2507 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002508 return;
2509 }
2510 }
2511 /* Else normal subscriptlist. Compile each subscript. */
2512 for (i = 0; i < NCH(n); i += 2)
2513 com_subscript(c, CHILD(n, i));
2514 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002515 if (NCH(n) > 1) {
2516 i = (NCH(n)+1) / 2;
2517 com_addoparg(c, BUILD_TUPLE, i);
2518 com_pop(c, i-1);
2519 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002520 switch (assigning) {
2521 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002522 op = DELETE_SUBSCR;
2523 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002524 break;
2525 default:
2526 case OP_ASSIGN:
2527 op = STORE_SUBSCR;
2528 i = 3;
2529 break;
2530 case OP_APPLY:
2531 op = BINARY_SUBSCR;
2532 i = 1;
2533 break;
2534 }
2535 if (assigning > OP_APPLY) {
2536 com_addoparg(c, DUP_TOPX, 2);
2537 com_push(c, 2);
2538 com_addbyte(c, BINARY_SUBSCR);
2539 com_pop(c, 1);
2540 com_node(c, augn);
2541 com_addbyte(c, assigning);
2542 com_pop(c, 1);
2543 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002544 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002545 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002546 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002547}
2548
2549static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002550com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002551{
2552 REQ(n, trailer);
2553 switch (TYPE(CHILD(n, 0))) {
2554 case LPAR:
2555 com_call_function(c, CHILD(n, 1));
2556 break;
2557 case DOT:
2558 com_select_member(c, CHILD(n, 1));
2559 break;
2560 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002561 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002562 break;
2563 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002564 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002565 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566 }
2567}
2568
2569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002571{
2572 int i;
2573 REQ(n, power);
2574 com_atom(c, CHILD(n, 0));
2575 for (i = 1; i < NCH(n); i++) {
2576 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2577 com_factor(c, CHILD(n, i+1));
2578 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002580 break;
2581 }
2582 else
2583 com_apply_trailer(c, CHILD(n, i));
2584 }
2585}
2586
2587static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002588com_invert_constant(struct compiling *c, node *n)
2589{
2590 /* Compute the inverse of int and longs and use them directly,
2591 but be prepared to generate code for all other
2592 possibilities (invalid numbers, floats, complex).
2593 */
2594 PyObject *num, *inv = NULL;
2595 int i;
2596
2597 REQ(n, NUMBER);
2598 num = parsenumber(c, STR(n));
2599 if (num == NULL)
2600 i = 255;
2601 else {
2602 inv = PyNumber_Invert(num);
2603 if (inv == NULL) {
2604 PyErr_Clear();
2605 i = com_addconst(c, num);
2606 } else {
2607 i = com_addconst(c, inv);
2608 Py_DECREF(inv);
2609 }
2610 Py_DECREF(num);
2611 }
2612 com_addoparg(c, LOAD_CONST, i);
2613 com_push(c, 1);
2614 if (num != NULL && inv == NULL)
2615 com_addbyte(c, UNARY_INVERT);
2616}
2617
Tim Peters51e26512001-09-07 08:45:55 +00002618static int
2619is_float_zero(const char *p)
2620{
2621 int found_radix_point = 0;
2622 int ch;
2623 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2624 switch (ch) {
2625 case '0':
2626 /* no reason to believe it's not 0 -- continue */
2627 break;
2628
2629 case 'e': case 'E': case 'j': case 'J':
2630 /* If this was a hex constant, we already would have
2631 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2632 must be an exponent marker, and we haven't yet
2633 seen a non-zero digit, and it doesn't matter what
2634 the exponent is then. For 'j' or 'J' similarly,
2635 except that this is an imaginary 0 then. */
2636 return 1;
2637
2638 case '.':
2639 found_radix_point = 1;
2640 break;
2641
2642 default:
2643 return 0;
2644 }
2645 }
2646 return found_radix_point;
2647}
2648
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002649static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002650com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002651{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002652 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002653 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002654 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002655 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002656 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002657 approriate value as a constant. If the value is negative,
2658 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002659 negative in the 0th position -- unless we're doing unary minus
2660 of a floating zero! In that case the sign is significant, but
2661 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002662 */
2663 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002664 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002665 && TYPE((pfactor = CHILD(n, 1))) == factor
2666 && NCH(pfactor) == 1
2667 && TYPE((ppower = CHILD(pfactor, 0))) == power
2668 && NCH(ppower) == 1
2669 && TYPE((patom = CHILD(ppower, 0))) == atom
2670 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002671 && !(childtype == MINUS &&
2672 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002673 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002674 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002675 return;
2676 }
2677 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002678 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002679 if (s == NULL) {
2680 com_error(c, PyExc_MemoryError, "");
2681 com_addbyte(c, 255);
2682 return;
2683 }
2684 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002685 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002686 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002687 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002688 }
Tim Peters51e26512001-09-07 08:45:55 +00002689 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002690 }
2691 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002692 com_factor(c, CHILD(n, 1));
2693 com_addbyte(c, UNARY_POSITIVE);
2694 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002695 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002696 com_factor(c, CHILD(n, 1));
2697 com_addbyte(c, UNARY_NEGATIVE);
2698 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002699 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002700 com_factor(c, CHILD(n, 1));
2701 com_addbyte(c, UNARY_INVERT);
2702 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002704 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002705 }
2706}
2707
2708static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002709com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710{
2711 int i;
2712 int op;
2713 REQ(n, term);
2714 com_factor(c, CHILD(n, 0));
2715 for (i = 2; i < NCH(n); i += 2) {
2716 com_factor(c, CHILD(n, i));
2717 switch (TYPE(CHILD(n, i-1))) {
2718 case STAR:
2719 op = BINARY_MULTIPLY;
2720 break;
2721 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002722 if (c->c_flags & CO_FUTURE_DIVISION)
2723 op = BINARY_TRUE_DIVIDE;
2724 else
2725 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002726 break;
2727 case PERCENT:
2728 op = BINARY_MODULO;
2729 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002730 case DOUBLESLASH:
2731 op = BINARY_FLOOR_DIVIDE;
2732 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002734 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002735 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002736 op = 255;
2737 }
2738 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002739 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002740 }
2741}
2742
2743static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002744com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002745{
2746 int i;
2747 int op;
2748 REQ(n, arith_expr);
2749 com_term(c, CHILD(n, 0));
2750 for (i = 2; i < NCH(n); i += 2) {
2751 com_term(c, CHILD(n, i));
2752 switch (TYPE(CHILD(n, i-1))) {
2753 case PLUS:
2754 op = BINARY_ADD;
2755 break;
2756 case MINUS:
2757 op = BINARY_SUBTRACT;
2758 break;
2759 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002761 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002762 op = 255;
2763 }
2764 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002765 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002766 }
2767}
2768
2769static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002770com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002771{
2772 int i;
2773 int op;
2774 REQ(n, shift_expr);
2775 com_arith_expr(c, CHILD(n, 0));
2776 for (i = 2; i < NCH(n); i += 2) {
2777 com_arith_expr(c, CHILD(n, i));
2778 switch (TYPE(CHILD(n, i-1))) {
2779 case LEFTSHIFT:
2780 op = BINARY_LSHIFT;
2781 break;
2782 case RIGHTSHIFT:
2783 op = BINARY_RSHIFT;
2784 break;
2785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002786 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002787 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002788 op = 255;
2789 }
2790 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002791 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002792 }
2793}
2794
2795static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002796com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002797{
2798 int i;
2799 int op;
2800 REQ(n, and_expr);
2801 com_shift_expr(c, CHILD(n, 0));
2802 for (i = 2; i < NCH(n); i += 2) {
2803 com_shift_expr(c, CHILD(n, i));
2804 if (TYPE(CHILD(n, i-1)) == AMPER) {
2805 op = BINARY_AND;
2806 }
2807 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002808 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002809 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002810 op = 255;
2811 }
2812 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002813 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002814 }
2815}
2816
2817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002818com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002819{
2820 int i;
2821 int op;
2822 REQ(n, xor_expr);
2823 com_and_expr(c, CHILD(n, 0));
2824 for (i = 2; i < NCH(n); i += 2) {
2825 com_and_expr(c, CHILD(n, i));
2826 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2827 op = BINARY_XOR;
2828 }
2829 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002830 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002831 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002832 op = 255;
2833 }
2834 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002835 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 }
2837}
2838
2839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
2842 int i;
2843 int op;
2844 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002845 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002846 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002847 com_xor_expr(c, CHILD(n, i));
2848 if (TYPE(CHILD(n, i-1)) == VBAR) {
2849 op = BINARY_OR;
2850 }
2851 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002852 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002853 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854 op = 255;
2855 }
2856 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002857 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858 }
2859}
2860
2861static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002862cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863{
2864 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002865 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2867 if (NCH(n) == 1) {
2868 n = CHILD(n, 0);
2869 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002870 case LESS: return PyCmp_LT;
2871 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002872 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002873 case LESSEQUAL: return PyCmp_LE;
2874 case GREATEREQUAL: return PyCmp_GE;
2875 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2876 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2877 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002878 }
2879 }
2880 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002881 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002883 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002884 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002885 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 }
2887 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002888 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889}
2890
2891static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002892com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893{
2894 int i;
2895 enum cmp_op op;
2896 int anchor;
2897 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2898 com_expr(c, CHILD(n, 0));
2899 if (NCH(n) == 1)
2900 return;
2901
2902 /****************************************************************
2903 The following code is generated for all but the last
2904 comparison in a chain:
2905
2906 label: on stack: opcode: jump to:
2907
2908 a <code to load b>
2909 a, b DUP_TOP
2910 a, b, b ROT_THREE
2911 b, a, b COMPARE_OP
2912 b, 0-or-1 JUMP_IF_FALSE L1
2913 b, 1 POP_TOP
2914 b
2915
2916 We are now ready to repeat this sequence for the next
2917 comparison in the chain.
2918
2919 For the last we generate:
2920
2921 b <code to load c>
2922 b, c COMPARE_OP
2923 0-or-1
2924
2925 If there were any jumps to L1 (i.e., there was more than one
2926 comparison), we generate:
2927
2928 0-or-1 JUMP_FORWARD L2
2929 L1: b, 0 ROT_TWO
2930 0, b POP_TOP
2931 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002932 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002933 ****************************************************************/
2934
2935 anchor = 0;
2936
2937 for (i = 2; i < NCH(n); i += 2) {
2938 com_expr(c, CHILD(n, i));
2939 if (i+2 < NCH(n)) {
2940 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002941 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 com_addbyte(c, ROT_THREE);
2943 }
2944 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002945 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002946 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002947 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002948 }
2949 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002951 if (i+2 < NCH(n)) {
2952 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2953 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002954 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002955 }
2956 }
2957
2958 if (anchor) {
2959 int anchor2 = 0;
2960 com_addfwref(c, JUMP_FORWARD, &anchor2);
2961 com_backpatch(c, anchor);
2962 com_addbyte(c, ROT_TWO);
2963 com_addbyte(c, POP_TOP);
2964 com_backpatch(c, anchor2);
2965 }
2966}
2967
2968static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002969com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002970{
2971 REQ(n, not_test); /* 'not' not_test | comparison */
2972 if (NCH(n) == 1) {
2973 com_comparison(c, CHILD(n, 0));
2974 }
2975 else {
2976 com_not_test(c, CHILD(n, 1));
2977 com_addbyte(c, UNARY_NOT);
2978 }
2979}
2980
2981static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002982com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983{
2984 int i;
2985 int anchor;
2986 REQ(n, and_test); /* not_test ('and' not_test)* */
2987 anchor = 0;
2988 i = 0;
2989 for (;;) {
2990 com_not_test(c, CHILD(n, i));
2991 if ((i += 2) >= NCH(n))
2992 break;
2993 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2994 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002996 }
2997 if (anchor)
2998 com_backpatch(c, anchor);
2999}
3000
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003001static int
3002com_make_closure(struct compiling *c, PyCodeObject *co)
3003{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003004 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003005 if (free == 0)
3006 return 0;
3007 for (i = 0; i < free; ++i) {
3008 /* Bypass com_addop_varname because it will generate
3009 LOAD_DEREF but LOAD_CLOSURE is needed.
3010 */
3011 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3012 int arg, reftype;
3013
3014 /* Special case: If a class contains a method with a
3015 free variable that has the same name as a method,
3016 the name will be considered free *and* local in the
3017 class. It should be handled by the closure, as
3018 well as by the normal name loookup logic.
3019 */
3020 reftype = get_ref_type(c, PyString_AS_STRING(name));
3021 if (reftype == CELL)
3022 arg = com_lookup_arg(c->c_cellvars, name);
3023 else /* (reftype == FREE) */
3024 arg = com_lookup_arg(c->c_freevars, name);
3025 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003026 fprintf(stderr, "lookup %s in %s %d %d\n"
3027 "freevars of %s: %s\n",
3028 PyObject_REPR(name),
3029 c->c_name,
3030 reftype, arg,
3031 PyString_AS_STRING(co->co_name),
3032 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003033 Py_FatalError("com_make_closure()");
3034 }
3035 com_addoparg(c, LOAD_CLOSURE, arg);
3036
3037 }
3038 com_push(c, free);
3039 return 1;
3040}
3041
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003045 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003046 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003047 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003048 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003049 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003050 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3051 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003052 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003053 if (co == NULL) {
3054 c->c_errors++;
3055 return;
3056 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003057 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003058 i = com_addconst(c, (PyObject *)co);
3059 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003060 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003061 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003062 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003063 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003064 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003065 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003066 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003067 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003068 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003070 else {
3071 int anchor = 0;
3072 int i = 0;
3073 for (;;) {
3074 com_and_test(c, CHILD(n, i));
3075 if ((i += 2) >= NCH(n))
3076 break;
3077 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3078 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003079 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003080 }
3081 if (anchor)
3082 com_backpatch(c, anchor);
3083 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084}
3085
3086static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003087com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088{
3089 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003090 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003091 com_node(c, CHILD(n, 0));
3092 }
3093 else {
3094 int i;
3095 int len;
3096 len = (NCH(n) + 1) / 2;
3097 for (i = 0; i < NCH(n); i += 2)
3098 com_node(c, CHILD(n, i));
3099 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003100 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003101 }
3102}
3103
3104
3105/* Begin of assignment compilation */
3106
Thomas Wouters434d0822000-08-24 20:11:32 +00003107
3108static void
3109com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3110{
3111 com_addbyte(c, DUP_TOP);
3112 com_push(c, 1);
3113 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003114 com_node(c, augn);
3115 com_addbyte(c, opcode);
3116 com_pop(c, 1);
3117 com_addbyte(c, ROT_TWO);
3118 com_addopname(c, STORE_ATTR, n);
3119 com_pop(c, 2);
3120}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121
3122static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003123com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003125 if (none_assignment_check(c, STR(n), assigning))
3126 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003128 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129}
3130
3131static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003132com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 REQ(n, trailer);
3135 switch (TYPE(CHILD(n, 0))) {
3136 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003137 if (assigning == OP_DELETE)
3138 com_error(c, PyExc_SyntaxError,
3139 "can't delete function call");
3140 else
3141 com_error(c, PyExc_SyntaxError,
3142 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 break;
3144 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003145 if (assigning > OP_APPLY)
3146 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3147 else
3148 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003150 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003151 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 break;
3153 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003154 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003155 }
3156}
3157
3158static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003159com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160{
3161 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003162 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3163 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003165 if (assigning) {
3166 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003167 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003168 com_push(c, i-1);
3169 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003171 com_assign(c, CHILD(n, i), assigning, NULL);
3172}
3173
3174static void
3175com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3176{
3177 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003178 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003179 com_push(c, 1);
3180 com_node(c, augn);
3181 com_addbyte(c, opcode);
3182 com_pop(c, 1);
3183 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003184}
3185
3186static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003187com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188{
3189 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003190 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003191 if (assigning)
3192 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003193}
3194
3195static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003196com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197{
3198 /* Loop to avoid trivial recursion */
3199 for (;;) {
3200 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003201
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 case exprlist:
3203 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003204 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003205 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003207 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003208 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003209 "assign to generator expression not possible");
3210 return;
3211 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003212 if (assigning > OP_APPLY) {
3213 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003214 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003215 return;
3216 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003217 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 return;
3219 }
3220 n = CHILD(n, 0);
3221 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003222
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003223 case test:
3224 case and_test:
3225 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003227 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003228 case xor_expr:
3229 case and_expr:
3230 case shift_expr:
3231 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003233 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003235 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003236 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003237 return;
3238 }
3239 n = CHILD(n, 0);
3240 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003241
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003242 case power: /* atom trailer* ('**' power)*
3243 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003244 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003245 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003246 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003247 return;
3248 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003249 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003250 int i;
3251 com_node(c, CHILD(n, 0));
3252 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003253 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003254 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003255 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003256 return;
3257 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258 com_apply_trailer(c, CHILD(n, i));
3259 } /* NB i is still alive */
3260 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003261 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003262 return;
3263 }
3264 n = CHILD(n, 0);
3265 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003267 case atom:
3268 switch (TYPE(CHILD(n, 0))) {
3269 case LPAR:
3270 n = CHILD(n, 1);
3271 if (TYPE(n) == RPAR) {
3272 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003273 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003274 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 return;
3276 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003277 if (assigning > OP_APPLY) {
3278 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003279 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003280 return;
3281 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 break;
3283 case LSQB:
3284 n = CHILD(n, 1);
3285 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003286 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003287 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003288 return;
3289 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003290 if (assigning > OP_APPLY) {
3291 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003292 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003293 return;
3294 }
3295 if (NCH(n) > 1
3296 && TYPE(CHILD(n, 1)) == list_for) {
3297 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003298 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003299 return;
3300 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003301 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 return;
3303 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003304 if (assigning > OP_APPLY)
3305 com_augassign_name(c, CHILD(n, 0),
3306 assigning, augn);
3307 else
3308 com_assign_name(c, CHILD(n, 0),
3309 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 return;
3311 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003312 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003313 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 return;
3315 }
3316 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003317
3318 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003319 com_error(c, PyExc_SyntaxError,
3320 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003321 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003322
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003324 com_error(c, PyExc_SystemError,
3325 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003326 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003327
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328 }
3329 }
3330}
Guido van Rossum7c531111997-03-11 18:42:21 +00003331
Thomas Wouters434d0822000-08-24 20:11:32 +00003332static void
3333com_augassign(struct compiling *c, node *n)
3334{
3335 int opcode;
3336
3337 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3338 case '+': opcode = INPLACE_ADD; break;
3339 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003340 case '/':
3341 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3342 opcode = INPLACE_FLOOR_DIVIDE;
3343 else if (c->c_flags & CO_FUTURE_DIVISION)
3344 opcode = INPLACE_TRUE_DIVIDE;
3345 else
3346 opcode = INPLACE_DIVIDE;
3347 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003348 case '%': opcode = INPLACE_MODULO; break;
3349 case '<': opcode = INPLACE_LSHIFT; break;
3350 case '>': opcode = INPLACE_RSHIFT; break;
3351 case '&': opcode = INPLACE_AND; break;
3352 case '^': opcode = INPLACE_XOR; break;
3353 case '|': opcode = INPLACE_OR; break;
3354 case '*':
3355 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3356 opcode = INPLACE_POWER;
3357 else
3358 opcode = INPLACE_MULTIPLY;
3359 break;
3360 default:
3361 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3362 return;
3363 }
3364 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3365}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366
3367static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003368com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369{
Thomas Wouters434d0822000-08-24 20:11:32 +00003370 REQ(n, expr_stmt);
3371 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003372 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003373 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003374 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003375 if (NCH(n) == 1) {
3376 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003377 if (c->c_interactive)
3378 com_addbyte(c, PRINT_EXPR);
3379 else
3380 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003382 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003383 else if (TYPE(CHILD(n,1)) == augassign)
3384 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385 else {
3386 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003387 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003388 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003389 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003391 com_push(c, 1);
3392 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003393 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 }
3395 }
3396}
3397
3398static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003399com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003400{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003401 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003402 int i;
3403 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003404 if (Py_OptimizeFlag)
3405 return;
3406 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003407
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003408 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003409 raise AssertionError [, <message>]
3410
3411 where <message> is the second test, if present.
3412 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003413 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003414 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003415 com_addbyte(c, POP_TOP);
3416 com_pop(c, 1);
3417 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003418 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003419 com_push(c, 1);
3420 i = NCH(n)/2; /* Either 2 or 4 */
3421 if (i > 1)
3422 com_node(c, CHILD(n, 3));
3423 com_addoparg(c, RAISE_VARARGS, i);
3424 com_pop(c, i);
3425 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003426 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003427 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003428 com_addbyte(c, POP_TOP);
3429}
3430
3431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003432com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003434 int i = 1;
3435 node* stream = NULL;
3436
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003437 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003438
3439 /* are we using the extended print form? */
3440 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3441 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003442 com_node(c, stream);
3443 /* stack: [...] => [... stream] */
3444 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003445 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3446 i = 4;
3447 else
3448 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003450 for (; i < NCH(n); i += 2) {
3451 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003452 com_addbyte(c, DUP_TOP);
3453 /* stack: [stream] => [stream stream] */
3454 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003455 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003456 /* stack: [stream stream] => [stream stream obj] */
3457 com_addbyte(c, ROT_TWO);
3458 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003459 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003460 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003461 com_pop(c, 2);
3462 }
3463 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003464 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003465 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003466 com_addbyte(c, PRINT_ITEM);
3467 com_pop(c, 1);
3468 }
3469 }
3470 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003471 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003472 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003473 /* must pop the extra stream object off the stack */
3474 com_addbyte(c, POP_TOP);
3475 /* stack: [... stream] => [...] */
3476 com_pop(c, 1);
3477 }
3478 }
3479 else {
3480 if (stream != NULL) {
3481 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003482 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003483 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003484 com_pop(c, 1);
3485 }
3486 else
3487 com_addbyte(c, PRINT_NEWLINE);
3488 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003489}
3490
3491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003492com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003494 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003495 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003496 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003497 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003498 if (c->c_flags & CO_GENERATOR) {
3499 if (NCH(n) > 1) {
3500 com_error(c, PyExc_SyntaxError,
3501 "'return' with argument inside generator");
3502 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003503 }
3504 if (NCH(n) < 2) {
3505 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003506 com_push(c, 1);
3507 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003508 else
3509 com_node(c, CHILD(n, 1));
3510 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003511 com_pop(c, 1);
3512}
3513
3514static void
3515com_yield_stmt(struct compiling *c, node *n)
3516{
Tim Peters95c80f82001-06-23 02:07:08 +00003517 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003518 REQ(n, yield_stmt); /* 'yield' testlist */
3519 if (!c->c_infunction) {
3520 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3521 }
Tim Peters95c80f82001-06-23 02:07:08 +00003522
3523 for (i = 0; i < c->c_nblocks; ++i) {
3524 if (c->c_block[i] == SETUP_FINALLY) {
3525 com_error(c, PyExc_SyntaxError,
3526 "'yield' not allowed in a 'try' block "
3527 "with a 'finally' clause");
3528 return;
3529 }
3530 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003531 com_node(c, CHILD(n, 1));
3532 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534}
3535
3536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003537com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003539 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003540 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3541 if (NCH(n) > 1) {
3542 com_node(c, CHILD(n, 1));
3543 if (NCH(n) > 3) {
3544 com_node(c, CHILD(n, 3));
3545 if (NCH(n) > 5)
3546 com_node(c, CHILD(n, 5));
3547 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003548 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003549 i = NCH(n)/2;
3550 com_addoparg(c, RAISE_VARARGS, i);
3551 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003552}
3553
3554static void
Thomas Wouters52152252000-08-17 22:55:00 +00003555com_from_import(struct compiling *c, node *n)
3556{
3557 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3558 com_push(c, 1);
3559 if (NCH(n) > 1) {
3560 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3561 com_error(c, PyExc_SyntaxError, "invalid syntax");
3562 return;
3563 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003564 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003565 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003566 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003567 com_pop(c, 1);
3568}
3569
3570static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003571com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003573 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 int i;
3575 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003576 n = CHILD(n, 0);
3577 /* import_stmt: import_name | import_from */
3578 if (TYPE(n) == import_from) {
3579 /* 'from' dotted_name 'import' ('*' |
3580 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003581 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003582 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003583 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3584 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003585 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003586 else {
3587 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3588 TYPE(CHILD(n, 3)) != LPAR) {
3589 com_error(c, PyExc_SyntaxError,
3590 "trailing comma not allowed "
3591 "without surrounding parentheses");
3592 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003593 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003594 REQ(nn, import_as_names);
3595 tup = PyTuple_New((NCH(nn) + 1) / 2);
3596 for (i = 0; i < NCH(nn); i += 2)
3597 PyTuple_SET_ITEM(tup, i / 2,
3598 PyString_FromString(STR(
3599 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003600 }
3601 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003602 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003603 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003604 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003605 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003606 com_addbyte(c, IMPORT_STAR);
3607 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003608 for (i = 0; i < NCH(nn); i += 2)
3609 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003610 com_addbyte(c, POP_TOP);
3611 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003612 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003613 }
3614 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003615 /* 'import' dotted_as_names */
3616 nn = CHILD(n, 1);
3617 REQ(nn, dotted_as_names);
3618 for (i = 0; i < NCH(nn); i += 2) {
3619 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003620 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003621 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003622 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003623 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003624 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003625 int j;
3626 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003627 com_error(c, PyExc_SyntaxError,
3628 "invalid syntax");
3629 return;
3630 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003631 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3632 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003633 CHILD(CHILD(subn, 0),
3634 j));
3635 com_addop_varname(c, VAR_STORE,
3636 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003637 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003638 com_addop_varname(c, VAR_STORE,
3639 STR(CHILD(CHILD(subn, 0),
3640 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003641 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003642 }
3643 }
3644}
3645
3646static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003647com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003648{
3649 REQ(n, exec_stmt);
3650 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3651 com_node(c, CHILD(n, 1));
3652 if (NCH(n) >= 4)
3653 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003654 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003656 com_push(c, 1);
3657 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003658 if (NCH(n) >= 6)
3659 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003660 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003661 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003662 com_push(c, 1);
3663 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003664 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003665 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003666}
3667
Guido van Rossum7c531111997-03-11 18:42:21 +00003668static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003669is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003670{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003671 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003672 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003673 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003674
3675 /* Label to avoid tail recursion */
3676 next:
3677 switch (TYPE(n)) {
3678
3679 case suite:
3680 if (NCH(n) == 1) {
3681 n = CHILD(n, 0);
3682 goto next;
3683 }
3684 /* Fall through */
3685 case file_input:
3686 for (i = 0; i < NCH(n); i++) {
3687 node *ch = CHILD(n, i);
3688 if (TYPE(ch) == stmt) {
3689 n = ch;
3690 goto next;
3691 }
3692 }
3693 break;
3694
3695 case stmt:
3696 case simple_stmt:
3697 case small_stmt:
3698 n = CHILD(n, 0);
3699 goto next;
3700
3701 case expr_stmt:
3702 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003703 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003704 case test:
3705 case and_test:
3706 case not_test:
3707 case comparison:
3708 case expr:
3709 case xor_expr:
3710 case and_expr:
3711 case shift_expr:
3712 case arith_expr:
3713 case term:
3714 case factor:
3715 case power:
3716 case atom:
3717 if (NCH(n) == 1) {
3718 n = CHILD(n, 0);
3719 goto next;
3720 }
3721 break;
3722
3723 case NAME:
3724 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3725 return 1;
3726 break;
3727
3728 case NUMBER:
3729 v = parsenumber(c, STR(n));
3730 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003731 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003732 break;
3733 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003734 i = PyObject_IsTrue(v);
3735 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003736 return i == 0;
3737
3738 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003739 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003740 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003741 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003742 break;
3743 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003744 i = PyObject_IsTrue(v);
3745 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003746 return i == 0;
3747
3748 }
3749 return 0;
3750}
3751
Tim Peters08a898f2001-06-28 01:52:22 +00003752
3753/* Look under n for a return stmt with an expression.
3754 * This hack is used to find illegal returns under "if 0:" blocks in
3755 * functions already known to be generators (as determined by the symtable
3756 * pass).
3757 * Return the offending return node if found, else NULL.
3758 */
3759static node *
3760look_for_offending_return(node *n)
3761{
3762 int i;
3763
3764 for (i = 0; i < NCH(n); ++i) {
3765 node *kid = CHILD(n, i);
3766
3767 switch (TYPE(kid)) {
3768 case classdef:
3769 case funcdef:
3770 case lambdef:
3771 /* Stuff in nested functions & classes doesn't
3772 affect the code block we started in. */
3773 return NULL;
3774
3775 case return_stmt:
3776 if (NCH(kid) > 1)
3777 return kid;
3778 break;
3779
3780 default: {
3781 node *bad = look_for_offending_return(kid);
3782 if (bad != NULL)
3783 return bad;
3784 }
3785 }
3786 }
3787
3788 return NULL;
3789}
3790
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003791static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003792com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793{
3794 int i;
3795 int anchor = 0;
3796 REQ(n, if_stmt);
3797 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3798 for (i = 0; i+3 < NCH(n); i+=4) {
3799 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003800 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003801 if (is_constant_false(c, ch)) {
3802 /* We're going to skip this block. However, if this
3803 is a generator, we have to check the dead code
3804 anyway to make sure there aren't any return stmts
3805 with expressions, in the same scope. */
3806 if (c->c_flags & CO_GENERATOR) {
3807 node *p = look_for_offending_return(n);
3808 if (p != NULL) {
3809 int savelineno = c->c_lineno;
3810 c->c_lineno = p->n_lineno;
3811 com_error(c, PyExc_SyntaxError,
3812 "'return' with argument "
3813 "inside generator");
3814 c->c_lineno = savelineno;
3815 }
3816 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003817 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003818 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003819 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003820 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003821 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003822 com_addfwref(c, JUMP_IF_FALSE, &a);
3823 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003824 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003825 com_node(c, CHILD(n, i+3));
3826 com_addfwref(c, JUMP_FORWARD, &anchor);
3827 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003829 com_addbyte(c, POP_TOP);
3830 }
3831 if (i+2 < NCH(n))
3832 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003833 if (anchor)
3834 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003835}
3836
3837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003838com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839{
3840 int break_anchor = 0;
3841 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003842 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003843 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3844 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003845 block_push(c, SETUP_LOOP);
3846 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003847 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 com_node(c, CHILD(n, 1));
3849 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3850 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003851 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003852 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003853 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003854 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003855 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3856 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003857 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003858 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003859 com_addbyte(c, POP_TOP);
3860 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003861 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003862 if (NCH(n) > 4)
3863 com_node(c, CHILD(n, 6));
3864 com_backpatch(c, break_anchor);
3865}
3866
3867static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003868com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003870 int break_anchor = 0;
3871 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003872 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003873 REQ(n, for_stmt);
3874 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3875 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003876 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003877 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003878 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003879 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003880 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003881 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003882 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003883 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003884 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003885 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003886 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003887 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3888 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003889 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003890 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003891 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003892 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003893 if (NCH(n) > 8)
3894 com_node(c, CHILD(n, 8));
3895 com_backpatch(c, break_anchor);
3896}
3897
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003898/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003899
3900 SETUP_FINALLY L
3901 <code for S>
3902 POP_BLOCK
3903 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003904 L: <code for Sf>
3905 END_FINALLY
3906
3907 The special instructions use the block stack. Each block
3908 stack entry contains the instruction that created it (here
3909 SETUP_FINALLY), the level of the value stack at the time the
3910 block stack entry was created, and a label (here L).
3911
3912 SETUP_FINALLY:
3913 Pushes the current value stack level and the label
3914 onto the block stack.
3915 POP_BLOCK:
3916 Pops en entry from the block stack, and pops the value
3917 stack until its level is the same as indicated on the
3918 block stack. (The label is ignored.)
3919 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003920 Pops a variable number of entries from the *value* stack
3921 and re-raises the exception they specify. The number of
3922 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003923
3924 The block stack is unwound when an exception is raised:
3925 when a SETUP_FINALLY entry is found, the exception is pushed
3926 onto the value stack (and the exception condition is cleared),
3927 and the interpreter jumps to the label gotten from the block
3928 stack.
3929
3930 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003931 (The contents of the value stack is shown in [], with the top
3932 at the right; 'tb' is trace-back info, 'val' the exception's
3933 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003934
3935 Value stack Label Instruction Argument
3936 [] SETUP_EXCEPT L1
3937 [] <code for S>
3938 [] POP_BLOCK
3939 [] JUMP_FORWARD L0
3940
Guido van Rossum3f5da241990-12-20 15:06:42 +00003941 [tb, val, exc] L1: DUP )
3942 [tb, val, exc, exc] <evaluate E1> )
3943 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3944 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3945 [tb, val, exc, 1] POP )
3946 [tb, val, exc] POP
3947 [tb, val] <assign to V1> (or POP if no V1)
3948 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003949 [] <code for S1>
3950 JUMP_FORWARD L0
3951
Guido van Rossum3f5da241990-12-20 15:06:42 +00003952 [tb, val, exc, 0] L2: POP
3953 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003954 .............................etc.......................
3955
Guido van Rossum3f5da241990-12-20 15:06:42 +00003956 [tb, val, exc, 0] Ln+1: POP
3957 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003958
3959 [] L0: <next statement>
3960
3961 Of course, parts are not generated if Vi or Ei is not present.
3962*/
3963
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003965com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003966{
3967 int except_anchor = 0;
3968 int end_anchor = 0;
3969 int else_anchor = 0;
3970 int i;
3971 node *ch;
3972
3973 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3974 block_push(c, SETUP_EXCEPT);
3975 com_node(c, CHILD(n, 2));
3976 com_addbyte(c, POP_BLOCK);
3977 block_pop(c, SETUP_EXCEPT);
3978 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3979 com_backpatch(c, except_anchor);
3980 for (i = 3;
3981 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3982 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003983 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003984 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003985 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003986 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003987 break;
3988 }
3989 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003990 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003991 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003992 if (NCH(ch) > 1) {
3993 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003994 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003995 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003996 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003997 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003998 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3999 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004000 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004001 }
4002 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004003 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004004 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004005 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004007 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004008 com_pop(c, 1);
4009 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004010 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 com_node(c, CHILD(n, i+2));
4013 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4014 if (except_anchor) {
4015 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016 /* We come in with [tb, val, exc, 0] on the
4017 stack; one pop and it's the same as
4018 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004019 com_addbyte(c, POP_TOP);
4020 }
4021 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 /* We actually come in here with [tb, val, exc] but the
4023 END_FINALLY will zap those and jump around.
4024 The c_stacklevel does not reflect them so we need not pop
4025 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004026 com_addbyte(c, END_FINALLY);
4027 com_backpatch(c, else_anchor);
4028 if (i < NCH(n))
4029 com_node(c, CHILD(n, i+2));
4030 com_backpatch(c, end_anchor);
4031}
4032
4033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004034com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035{
4036 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004037 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004038
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004039 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4040 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004042 com_addbyte(c, POP_BLOCK);
4043 block_pop(c, SETUP_FINALLY);
4044 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004045 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004046 /* While the generated code pushes only one item,
4047 the try-finally handling can enter here with
4048 up to three items. OK, here are the details:
4049 3 for an exception, 2 for RETURN, 1 for BREAK. */
4050 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004051 com_backpatch(c, finally_anchor);
4052 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004053 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004054 com_node(c, ch);
4055 com_addbyte(c, END_FINALLY);
4056 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004057 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004058}
4059
4060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004061com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004062{
4063 REQ(n, try_stmt);
4064 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4065 | 'try' ':' suite 'finally' ':' suite */
4066 if (TYPE(CHILD(n, 3)) != except_clause)
4067 com_try_finally(c, n);
4068 else
4069 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004070}
4071
Guido van Rossum8b993a91997-01-17 21:04:03 +00004072static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004073get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004074{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004075 int i;
4076
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 /* Label to avoid tail recursion */
4078 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004079 switch (TYPE(n)) {
4080
4081 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004082 if (NCH(n) == 1) {
4083 n = CHILD(n, 0);
4084 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004085 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004086 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004087 case file_input:
4088 for (i = 0; i < NCH(n); i++) {
4089 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004090 if (TYPE(ch) == stmt) {
4091 n = ch;
4092 goto next;
4093 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004094 }
4095 break;
4096
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004097 case stmt:
4098 case simple_stmt:
4099 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004100 n = CHILD(n, 0);
4101 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004102
4103 case expr_stmt:
4104 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004105 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004106 case test:
4107 case and_test:
4108 case not_test:
4109 case comparison:
4110 case expr:
4111 case xor_expr:
4112 case and_expr:
4113 case shift_expr:
4114 case arith_expr:
4115 case term:
4116 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004117 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004118 if (NCH(n) == 1) {
4119 n = CHILD(n, 0);
4120 goto next;
4121 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004122 break;
4123
4124 case atom:
4125 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004126 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004127 break;
4128
4129 }
4130 return NULL;
4131}
4132
Guido van Rossum79f25d91997-04-29 20:08:16 +00004133static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004134get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004135{
Guido van Rossum541563e1999-01-28 15:08:09 +00004136 /* Don't generate doc-strings if run with -OO */
4137 if (Py_OptimizeFlag > 1)
4138 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004139 n = get_rawdocstring(n);
4140 if (n == NULL)
4141 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004142 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004143}
4144
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004145static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004146com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004147{
4148 REQ(n, suite);
4149 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4150 if (NCH(n) == 1) {
4151 com_node(c, CHILD(n, 0));
4152 }
4153 else {
4154 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004155 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004156 node *ch = CHILD(n, i);
4157 if (TYPE(ch) == stmt)
4158 com_node(c, ch);
4159 }
4160 }
4161}
4162
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004163/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004165com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004166{
4167 int i = c->c_nblocks;
4168 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4169 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4170 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004171 else if (i <= 0) {
4172 /* at the outer level */
4173 com_error(c, PyExc_SyntaxError,
4174 "'continue' not properly in loop");
4175 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004176 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004177 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004178 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004179 if (c->c_block[j] == SETUP_LOOP)
4180 break;
4181 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004182 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004183 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004184 for (; i > j; --i) {
4185 if (c->c_block[i] == SETUP_EXCEPT ||
4186 c->c_block[i] == SETUP_FINALLY) {
4187 com_addoparg(c, CONTINUE_LOOP,
4188 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004189 return;
4190 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004191 if (c->c_block[i] == END_FINALLY) {
4192 com_error(c, PyExc_SyntaxError,
4193 "'continue' not supported inside 'finally' clause");
4194 return;
4195 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004196 }
4197 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004198 com_error(c, PyExc_SyntaxError,
4199 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004200 }
4201 /* XXX Could allow it inside a 'finally' clause
4202 XXX if we could pop the exception still on the stack */
4203}
4204
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004205/* Return the number of default values in the argument list.
4206
4207 If a non-default argument follows a default argument, set an
4208 exception and return -1.
4209*/
4210
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004211static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004212com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004213{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004214 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004215 if (TYPE(n) == lambdef) {
4216 /* lambdef: 'lambda' [varargslist] ':' test */
4217 n = CHILD(n, 1);
4218 }
4219 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004220 REQ(n, funcdef);
4221 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4222 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004223 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4224 n = CHILD(n, 1);
4225 }
4226 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004227 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004228 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004229 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004230 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4231 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004232 ndefs = 0;
4233 for (i = 0; i < nch; i++) {
4234 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004235 if (TYPE(CHILD(n, i)) == STAR ||
4236 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004237 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004238 i++;
4239 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004240 t = RPAR; /* Anything except EQUAL or COMMA */
4241 else
4242 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004243 if (t == EQUAL) {
4244 i++;
4245 ndefs++;
4246 com_node(c, CHILD(n, i));
4247 i++;
4248 if (i >= nch)
4249 break;
4250 t = TYPE(CHILD(n, i));
4251 }
4252 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004253 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004254 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004255 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004256 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004257 return -1;
4258 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004259 }
4260 if (t != COMMA)
4261 break;
4262 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004263 return ndefs;
4264}
4265
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004266static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004267com_decorator_name(struct compiling *c, node *n)
4268{
4269 /* dotted_name: NAME ('.' NAME)* */
4270
4271 int i, nch;
4272 node *varname;
4273
4274 REQ(n, dotted_name);
4275 nch = NCH(n);
4276 assert(nch >= 1 && nch % 2 == 1);
4277
4278 varname = CHILD(n, 0);
4279 REQ(varname, NAME);
4280 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004281 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004282
4283 for (i = 1; i < nch; i += 2) {
4284 node *attrname;
4285
4286 REQ(CHILD(n, i), DOT);
4287
4288 attrname = CHILD(n, i + 1);
4289 REQ(attrname, NAME);
4290 com_addop_name(c, LOAD_ATTR, STR(attrname));
4291 }
4292}
4293
4294static void
4295com_decorator(struct compiling *c, node *n)
4296{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004297 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004298 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004299 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004300 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004301 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004302 com_decorator_name(c, CHILD(n, 1));
4303
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004304 if (nch > 3) {
4305 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004306 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004307 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004308 com_call_function(c, CHILD(n, 3));
4309 }
4310}
4311
4312static int
4313com_decorators(struct compiling *c, node *n)
4314{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004315 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004316
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004317 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004318 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004319 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004320
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004321 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004322 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004323 REQ(ch, decorator);
4324
4325 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004326 }
4327
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004328 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004329}
4330
4331static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004332com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004333{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004334 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004335 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004336
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004337 REQ(n, funcdef);
4338 /* -6 -5 -4 -3 -2 -1
4339 funcdef: [decorators] 'def' NAME parameters ':' suite */
4340
4341 if (NCH(n) == 6)
4342 ndecorators = com_decorators(c, CHILD(n, 0));
4343 else
4344 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004345
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004346 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004347 if (ndefs < 0)
4348 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004349 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004350 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004351 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004352 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004353 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004354 c->c_errors++;
4355 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004356 int closure = com_make_closure(c, (PyCodeObject *)co);
4357 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004359 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004360 if (closure)
4361 com_addoparg(c, MAKE_CLOSURE, ndefs);
4362 else
4363 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004364 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004365
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004366 while (ndecorators > 0) {
4367 com_addoparg(c, CALL_FUNCTION, 1);
4368 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004369 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004370 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004371
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004372 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004373 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004374 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004375 }
4376}
4377
4378static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004379com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004380{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004381 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004382 REQ(n, testlist);
4383 /* testlist: test (',' test)* [','] */
4384 for (i = 0; i < NCH(n); i += 2)
4385 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004386 i = (NCH(n)+1) / 2;
4387 com_addoparg(c, BUILD_TUPLE, i);
4388 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004389}
4390
4391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004392com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004393{
Guido van Rossum25831651993-05-19 14:50:45 +00004394 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004395 PyObject *v;
4396 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004397 char *name;
4398
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004399 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004400 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004401 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004402 c->c_errors++;
4403 return;
4404 }
4405 /* Push the class name on the stack */
4406 i = com_addconst(c, v);
4407 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004408 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004409 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004410 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004411 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004412 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004413 com_push(c, 1);
4414 }
Guido van Rossum25831651993-05-19 14:50:45 +00004415 else
4416 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004417 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004418 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004419 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004420 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004421 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004422 c->c_errors++;
4423 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004424 int closure = com_make_closure(c, co);
4425 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004426 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004427 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004428 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004429 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004430 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004431 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004432 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004433 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004434 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004435 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004436 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004437 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004438 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004439 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004440}
4441
4442static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004443com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004444{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004445 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004446 if (c->c_errors)
4447 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004448 switch (TYPE(n)) {
4449
4450 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004451
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004452 case funcdef:
4453 com_funcdef(c, n);
4454 break;
4455 case classdef:
4456 com_classdef(c, n);
4457 break;
4458
4459 /* Trivial parse tree nodes */
4460
4461 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004462 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004463 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004464 n = CHILD(n, 0);
4465 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004466
4467 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004468 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004469 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004470 {
4471 int i;
4472 for (i = 0; i < NCH(n)-1; i += 2)
4473 com_node(c, CHILD(n, i));
4474 }
4475 break;
4476
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004477 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004478 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004479 n = CHILD(n, 0);
4480 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004481
4482 /* Statement nodes */
4483
4484 case expr_stmt:
4485 com_expr_stmt(c, n);
4486 break;
4487 case print_stmt:
4488 com_print_stmt(c, n);
4489 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004490 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004491 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004492 break;
4493 case pass_stmt:
4494 break;
4495 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004496 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004497 com_error(c, PyExc_SyntaxError,
4498 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004499 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004500 com_addbyte(c, BREAK_LOOP);
4501 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004502 case continue_stmt:
4503 com_continue_stmt(c, n);
4504 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505 case return_stmt:
4506 com_return_stmt(c, n);
4507 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004508 case yield_stmt:
4509 com_yield_stmt(c, n);
4510 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004511 case raise_stmt:
4512 com_raise_stmt(c, n);
4513 break;
4514 case import_stmt:
4515 com_import_stmt(c, n);
4516 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004517 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004518 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004519 case exec_stmt:
4520 com_exec_stmt(c, n);
4521 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004522 case assert_stmt:
4523 com_assert_stmt(c, n);
4524 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004525 case if_stmt:
4526 com_if_stmt(c, n);
4527 break;
4528 case while_stmt:
4529 com_while_stmt(c, n);
4530 break;
4531 case for_stmt:
4532 com_for_stmt(c, n);
4533 break;
4534 case try_stmt:
4535 com_try_stmt(c, n);
4536 break;
4537 case suite:
4538 com_suite(c, n);
4539 break;
4540
4541 /* Expression nodes */
4542
4543 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004544 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004545 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004546 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004547 break;
4548 case test:
4549 com_test(c, n);
4550 break;
4551 case and_test:
4552 com_and_test(c, n);
4553 break;
4554 case not_test:
4555 com_not_test(c, n);
4556 break;
4557 case comparison:
4558 com_comparison(c, n);
4559 break;
4560 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004561 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004562 break;
4563 case expr:
4564 com_expr(c, n);
4565 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004566 case xor_expr:
4567 com_xor_expr(c, n);
4568 break;
4569 case and_expr:
4570 com_and_expr(c, n);
4571 break;
4572 case shift_expr:
4573 com_shift_expr(c, n);
4574 break;
4575 case arith_expr:
4576 com_arith_expr(c, n);
4577 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004578 case term:
4579 com_term(c, n);
4580 break;
4581 case factor:
4582 com_factor(c, n);
4583 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004584 case power:
4585 com_power(c, n);
4586 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004587 case atom:
4588 com_atom(c, n);
4589 break;
4590
4591 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004592 com_error(c, PyExc_SystemError,
4593 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594 }
4595}
4596
Tim Petersdbd9ba62000-07-09 03:09:57 +00004597static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004598
4599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004600com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004601{
4602 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4603 if (TYPE(CHILD(n, 0)) == LPAR)
4604 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004605 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004606 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004607 com_pop(c, 1);
4608 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609}
4610
4611static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004612com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004613{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004614 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004615 if (NCH(n) == 1) {
4616 com_fpdef(c, CHILD(n, 0));
4617 }
4618 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004619 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004620 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004621 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004622 for (i = 0; i < NCH(n); i += 2)
4623 com_fpdef(c, CHILD(n, i));
4624 }
4625}
4626
4627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004628com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004629{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004630 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004631 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004632 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004633 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004634 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004635 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004636 nch = NCH(n);
4637 /* Enter all arguments in table of locals */
4638 for (i = 0, narg = 0; i < nch; i++) {
4639 node *ch = CHILD(n, i);
4640 node *fp;
4641 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004642 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004643 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4644 fp = CHILD(ch, 0);
4645 if (TYPE(fp) != NAME) {
4646 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4647 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004648 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004649 narg++;
4650 /* all name updates handled by symtable */
4651 if (++i >= nch)
4652 break;
4653 ch = CHILD(n, i);
4654 if (TYPE(ch) == EQUAL)
4655 i += 2;
4656 else
4657 REQ(ch, COMMA);
4658 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004659 if (complex) {
4660 /* Generate code for complex arguments only after
4661 having counted the simple arguments */
4662 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004663 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004664 node *ch = CHILD(n, i);
4665 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004666 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004667 break;
4668 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4669 fp = CHILD(ch, 0);
4670 if (TYPE(fp) != NAME) {
4671 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004672 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004673 com_fpdef(c, ch);
4674 }
4675 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004676 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004677 break;
4678 ch = CHILD(n, i);
4679 if (TYPE(ch) == EQUAL)
4680 i += 2;
4681 else
4682 REQ(ch, COMMA);
4683 }
4684 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004685}
4686
4687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004688com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004689{
4690 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004691 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004692 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004693 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004694 if (doc != NULL) {
4695 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004696 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004697 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004698 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004699 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004700 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004701 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004702 for (i = 0; i < NCH(n); i++) {
4703 node *ch = CHILD(n, i);
4704 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4705 com_node(c, ch);
4706 }
4707}
4708
4709/* Top-level compile-node interface */
4710
4711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004712compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004713{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004714 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004715 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004716 REQ(n, funcdef);
4717 /* -6 -5 -4 -3 -2 -1
4718 funcdef: [decorators] 'def' NAME parameters ':' suite */
4719 c->c_name = STR(RCHILD(n, -4));
4720 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004721 if (doc != NULL) {
4722 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004723 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004724 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004725 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004726 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004727 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004728 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004729 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004730 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004731 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004732 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004733 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004734 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004735 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4736 com_push(c, 1);
4737 com_addbyte(c, RETURN_VALUE);
4738 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004739}
4740
4741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004742compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004743{
Guido van Rossum590baa41993-11-30 13:40:46 +00004744 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004745 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004746 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004747
4748 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004749 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004750 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004751 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004752 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004753 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004754 else
4755 ch = CHILD(n, 2);
4756 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004757 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004758 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004759}
4760
4761static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004762compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004763{
4764 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004765 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004766 REQ(n, classdef);
4767 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4768 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004769 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004770 /* Initialize local __module__ from global __name__ */
4771 com_addop_name(c, LOAD_GLOBAL, "__name__");
4772 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004773 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004774 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004775 if (doc != NULL) {
4776 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004777 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004778 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004779 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004780 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004781 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004782 }
4783 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004784 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004785 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004786 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004787 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004788 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004789 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004790 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004791}
4792
4793static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004794compile_generator_expression(struct compiling *c, node *n)
4795{
4796 /* testlist_gexp: test gen_for */
4797 /* argument: test gen_for */
4798 REQ(CHILD(n, 0), test);
4799 REQ(CHILD(n, 1), gen_for);
4800
4801 c->c_name = "<generator expression>";
4802 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4803
4804 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4805 com_push(c, 1);
4806 com_addbyte(c, RETURN_VALUE);
4807 com_pop(c, 1);
4808}
4809
4810static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004811compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004812{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004813 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004814
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004815 switch (TYPE(n)) {
4816
Guido van Rossum4c417781991-01-21 16:09:22 +00004817 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004818 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004819 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004820 n = CHILD(n, 0);
4821 if (TYPE(n) != NEWLINE)
4822 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004823 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004824 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4825 com_push(c, 1);
4826 com_addbyte(c, RETURN_VALUE);
4827 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004828 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004829 break;
4830
Guido van Rossum4c417781991-01-21 16:09:22 +00004831 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004832 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004833 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004834 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4835 com_push(c, 1);
4836 com_addbyte(c, RETURN_VALUE);
4837 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 break;
4839
Guido van Rossum590baa41993-11-30 13:40:46 +00004840 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004841 com_node(c, CHILD(n, 0));
4842 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004843 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004844 break;
4845
Guido van Rossum590baa41993-11-30 13:40:46 +00004846 case lambdef: /* anonymous function definition */
4847 compile_lambdef(c, n);
4848 break;
4849
Guido van Rossum4c417781991-01-21 16:09:22 +00004850 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004851 compile_funcdef(c, n);
4852 break;
4853
Guido van Rossum4c417781991-01-21 16:09:22 +00004854 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004855 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004856 break;
4857
Raymond Hettinger354433a2004-05-19 08:20:33 +00004858 case testlist_gexp: /* A generator expression */
4859 case argument: /* A generator expression */
4860 compile_generator_expression(c, n);
4861 break;
4862
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004863 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004864 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004865 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004866 }
4867}
4868
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004869static PyObject *
4870dict_keys_inorder(PyObject *dict, int offset)
4871{
4872 PyObject *tuple, *k, *v;
4873 int i, pos = 0, size = PyDict_Size(dict);
4874
4875 tuple = PyTuple_New(size);
4876 if (tuple == NULL)
4877 return NULL;
4878 while (PyDict_Next(dict, &pos, &k, &v)) {
4879 i = PyInt_AS_LONG(v);
4880 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004881 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004882 PyTuple_SET_ITEM(tuple, i - offset, k);
4883 }
4884 return tuple;
4885}
4886
Guido van Rossum79f25d91997-04-29 20:08:16 +00004887PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004888PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004889{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004890 return PyNode_CompileFlags(n, filename, NULL);
4891}
4892
4893PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004894PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004895{
4896 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004897}
4898
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004899struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004900PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004901{
4902 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004903 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004904
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004905 ff = PyNode_Future(n, filename);
4906 if (ff == NULL)
4907 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004908 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004909 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004910 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004911 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004912 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004913 return st;
4914}
4915
Guido van Rossum79f25d91997-04-29 20:08:16 +00004916static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004917icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004918{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004919 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004920}
4921
Guido van Rossum79f25d91997-04-29 20:08:16 +00004922static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004923jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004924 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004925{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004926 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004927 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004928 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004929 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004930 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4931 sc.c_encoding = "utf-8";
4932 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004933 sc.c_encoding = STR(n);
4934 n = CHILD(n, 0);
4935 } else {
4936 sc.c_encoding = NULL;
4937 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004939 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004940 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004941 /* c_symtable still points to parent's symbols */
4942 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004943 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004944 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004945 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004946 if (base->c_encoding != NULL) {
4947 assert(sc.c_encoding == NULL);
4948 sc.c_encoding = base->c_encoding;
4949 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004950 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004951 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004952 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004953 if (sc.c_future == NULL) {
4954 com_free(&sc);
4955 return NULL;
4956 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004957 if (flags) {
4958 int merged = sc.c_future->ff_features |
4959 flags->cf_flags;
4960 sc.c_future->ff_features = merged;
4961 flags->cf_flags = merged;
4962 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004963 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4964 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004965 com_free(&sc);
4966 return NULL;
4967 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004968 /* reset symbol table for second pass */
4969 sc.c_symtable->st_nscopes = 1;
4970 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004971 }
4972 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004973 if (symtable_load_symbols(&sc) < 0) {
4974 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004976 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004977 compile_node(&sc, n);
4978 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004979 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004980 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004981 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004982 names = PyList_AsTuple(sc.c_names);
4983 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004984 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4985 freevars = dict_keys_inorder(sc.c_freevars,
4986 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004987 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004988 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00004989 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
4990 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004991 if (!PyErr_Occurred())
4992 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004993 sc.c_nlocals,
4994 sc.c_maxstacklevel,
4995 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004996 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004997 consts,
4998 names,
4999 varnames,
5000 freevars,
5001 cellvars,
5002 filename,
5003 name,
5004 sc.c_firstlineno,
5005 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005006 Py_XDECREF(consts);
5007 Py_XDECREF(names);
5008 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005009 Py_XDECREF(freevars);
5010 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005011 Py_XDECREF(filename);
5012 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005013 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005014 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005015 else if (!PyErr_Occurred()) {
5016 /* This could happen if someone called PyErr_Clear() after an
5017 error was reported above. That's not supposed to happen,
5018 but I just plugged one case and I'm not sure there can't be
5019 others. In that case, raise SystemError so that at least
5020 it gets reported instead dumping core. */
5021 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5022 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005023 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005024 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005025 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005026 sc.c_symtable = NULL;
5027 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005028 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005029 return co;
5030}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005031
5032int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005033PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005034{
5035 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005036 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005037 int line = co->co_firstlineno;
5038 int addr = 0;
5039 while (--size >= 0) {
5040 addr += *p++;
5041 if (addr > addrq)
5042 break;
5043 line += *p++;
5044 }
5045 return line;
5046}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005048/* The test for LOCAL must come before the test for FREE in order to
5049 handle classes where name is both local and free. The local var is
5050 a method and the free var is a free var referenced within a method.
5051*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005052
5053static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005054get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005055{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005056 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005057 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005058
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005059 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5060 return CELL;
5061 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5062 return LOCAL;
5063 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5064 return FREE;
5065 v = PyDict_GetItemString(c->c_globals, name);
5066 if (v) {
5067 if (v == Py_None)
5068 return GLOBAL_EXPLICIT;
5069 else {
5070 return GLOBAL_IMPLICIT;
5071 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005072 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005073 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005074 "unknown scope for %.100s in %.100s(%s) "
5075 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5076 name, c->c_name,
5077 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5078 c->c_filename,
5079 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5080 PyObject_REPR(c->c_locals),
5081 PyObject_REPR(c->c_globals)
5082 );
5083
5084 Py_FatalError(buf);
5085 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005086}
5087
Guido van Rossum207fda62001-03-02 03:30:41 +00005088/* Helper functions to issue warnings */
5089
5090static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005091issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005092{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005093 if (PyErr_Occurred()) {
5094 /* This can happen because symtable_node continues
5095 processing even after raising a SyntaxError.
5096 Calling PyErr_WarnExplicit now would clobber the
5097 pending exception; instead we fail and let that
5098 exception propagate.
5099 */
5100 return -1;
5101 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005102 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5103 lineno, NULL, NULL) < 0) {
5104 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5105 PyErr_SetString(PyExc_SyntaxError, msg);
5106 PyErr_SyntaxLocation(filename, lineno);
5107 }
5108 return -1;
5109 }
5110 return 0;
5111}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005112
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005113static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005114symtable_warn(struct symtable *st, char *msg)
5115{
Guido van Rossum207fda62001-03-02 03:30:41 +00005116 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005117 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005118 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005119 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005120 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005121}
5122
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005123/* Helper function for setting lineno and filename */
5124
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005125static struct symtable *
5126symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005127{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005128 struct symtable *st;
5129
5130 st = symtable_init();
5131 if (st == NULL)
5132 return NULL;
5133 st->st_future = ff;
5134 st->st_filename = filename;
5135 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5136 if (st->st_errors > 0)
5137 goto fail;
5138 symtable_node(st, n);
5139 if (st->st_errors > 0)
5140 goto fail;
5141 return st;
5142 fail:
5143 if (!PyErr_Occurred()) {
5144 /* This could happen because after a syntax error is
5145 detected, the symbol-table-building continues for
5146 a while, and PyErr_Clear() might erroneously be
5147 called during that process. One such case has been
5148 fixed, but there might be more (now or later).
5149 */
5150 PyErr_SetString(PyExc_SystemError, "lost exception");
5151 }
5152 st->st_future = NULL;
5153 st->st_filename = NULL;
5154 PySymtable_Free(st);
5155 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156}
5157
5158static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005159symtable_init_compiling_symbols(struct compiling *c)
5160{
5161 PyObject *varnames;
5162
5163 varnames = c->c_symtable->st_cur->ste_varnames;
5164 if (varnames == NULL) {
5165 varnames = PyList_New(0);
5166 if (varnames == NULL)
5167 return -1;
5168 c->c_symtable->st_cur->ste_varnames = varnames;
5169 Py_INCREF(varnames);
5170 } else
5171 Py_INCREF(varnames);
5172 c->c_varnames = varnames;
5173
5174 c->c_globals = PyDict_New();
5175 if (c->c_globals == NULL)
5176 return -1;
5177 c->c_freevars = PyDict_New();
5178 if (c->c_freevars == NULL)
5179 return -1;
5180 c->c_cellvars = PyDict_New();
5181 if (c->c_cellvars == NULL)
5182 return -1;
5183 return 0;
5184}
5185
5186struct symbol_info {
5187 int si_nlocals;
5188 int si_ncells;
5189 int si_nfrees;
5190 int si_nimplicit;
5191};
5192
5193static void
5194symtable_init_info(struct symbol_info *si)
5195{
5196 si->si_nlocals = 0;
5197 si->si_ncells = 0;
5198 si->si_nfrees = 0;
5199 si->si_nimplicit = 0;
5200}
5201
5202static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005203symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005204 struct symbol_info *si)
5205{
5206 PyObject *dict, *v;
5207
5208 /* Seperate logic for DEF_FREE. If it occurs in a function,
5209 it indicates a local that we must allocate storage for (a
5210 cell var). If it occurs in a class, then the class has a
5211 method and a free variable with the same name.
5212 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005213 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005214 /* If it isn't declared locally, it can't be a cell. */
5215 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5216 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005217 v = PyInt_FromLong(si->si_ncells++);
5218 dict = c->c_cellvars;
5219 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005220 /* If it is free anyway, then there is no need to do
5221 anything here.
5222 */
5223 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005224 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005225 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005226 v = PyInt_FromLong(si->si_nfrees++);
5227 dict = c->c_freevars;
5228 }
5229 if (v == NULL)
5230 return -1;
5231 if (PyDict_SetItem(dict, name, v) < 0) {
5232 Py_DECREF(v);
5233 return -1;
5234 }
5235 Py_DECREF(v);
5236 return 0;
5237}
5238
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005239/* If a variable is a cell and an argument, make sure that appears in
5240 co_cellvars before any variable to its right in varnames.
5241*/
5242
5243
5244static int
5245symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5246 PyObject *varnames, int flags)
5247{
Tim Petersb39903b2003-03-24 17:22:24 +00005248 PyObject *v = NULL;
5249 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005250 int i, pos;
5251
5252 if (flags & CO_VARARGS)
5253 argcount++;
5254 if (flags & CO_VARKEYWORDS)
5255 argcount++;
5256 for (i = argcount; --i >= 0; ) {
5257 v = PyList_GET_ITEM(varnames, i);
5258 if (PyDict_GetItem(*cellvars, v)) {
5259 if (list == NULL) {
5260 list = PyList_New(1);
5261 if (list == NULL)
5262 return -1;
5263 PyList_SET_ITEM(list, 0, v);
5264 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005265 } else {
5266 if (PyList_Insert(list, 0, v) < 0) {
5267 Py_DECREF(list);
5268 return -1;
5269 }
5270 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005271 }
5272 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005273 if (list == NULL)
5274 return 0;
5275
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005276 /* There are cellvars that are also arguments. Create a dict
5277 to replace cellvars and put the args at the front.
5278 */
5279 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005280 if (d == NULL)
5281 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005282 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5283 v = PyInt_FromLong(i);
5284 if (v == NULL)
5285 goto fail;
5286 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5287 goto fail;
5288 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5289 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005290 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005291 }
5292 pos = 0;
5293 i = PyList_GET_SIZE(list);
5294 Py_DECREF(list);
5295 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5296 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005297 if (w == NULL)
5298 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005299 if (PyDict_SetItem(d, v, w) < 0) {
5300 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005301 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005302 goto fail;
5303 }
5304 Py_DECREF(w);
5305 }
5306 Py_DECREF(*cellvars);
5307 *cellvars = d;
5308 return 1;
5309 fail:
5310 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005311 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005312 return -1;
5313}
5314
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005315static int
5316symtable_freevar_offsets(PyObject *freevars, int offset)
5317{
5318 PyObject *name, *v;
5319 int pos;
5320
5321 /* The cell vars are the first elements of the closure,
5322 followed by the free vars. Update the offsets in
5323 c_freevars to account for number of cellvars. */
5324 pos = 0;
5325 while (PyDict_Next(freevars, &pos, &name, &v)) {
5326 int i = PyInt_AS_LONG(v) + offset;
5327 PyObject *o = PyInt_FromLong(i);
5328 if (o == NULL)
5329 return -1;
5330 if (PyDict_SetItem(freevars, name, o) < 0) {
5331 Py_DECREF(o);
5332 return -1;
5333 }
5334 Py_DECREF(o);
5335 }
5336 return 0;
5337}
5338
5339static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005340symtable_check_unoptimized(struct compiling *c,
5341 PySymtableEntryObject *ste,
5342 struct symbol_info *si)
5343{
5344 char buf[300];
5345
5346 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5347 || (ste->ste_nested && si->si_nimplicit)))
5348 return 0;
5349
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005350#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5351
5352#define ILLEGAL_IS "is a nested function"
5353
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005354#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005355"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005356
5357#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005358"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005359
5360#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005361"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005362"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005363
5364 /* XXX perhaps the linenos for these opt-breaking statements
5365 should be stored so the exception can point to them. */
5366
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005367 if (ste->ste_child_free) {
5368 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005369 PyOS_snprintf(buf, sizeof(buf),
5370 ILLEGAL_IMPORT_STAR,
5371 PyString_AS_STRING(ste->ste_name),
5372 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005373 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005374 PyOS_snprintf(buf, sizeof(buf),
5375 ILLEGAL_BARE_EXEC,
5376 PyString_AS_STRING(ste->ste_name),
5377 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005378 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005379 PyOS_snprintf(buf, sizeof(buf),
5380 ILLEGAL_EXEC_AND_IMPORT_STAR,
5381 PyString_AS_STRING(ste->ste_name),
5382 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005383 }
5384 } else {
5385 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005386 PyOS_snprintf(buf, sizeof(buf),
5387 ILLEGAL_IMPORT_STAR,
5388 PyString_AS_STRING(ste->ste_name),
5389 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005390 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005391 PyOS_snprintf(buf, sizeof(buf),
5392 ILLEGAL_BARE_EXEC,
5393 PyString_AS_STRING(ste->ste_name),
5394 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005395 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005396 PyOS_snprintf(buf, sizeof(buf),
5397 ILLEGAL_EXEC_AND_IMPORT_STAR,
5398 PyString_AS_STRING(ste->ste_name),
5399 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005400 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005401 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005402
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005403 PyErr_SetString(PyExc_SyntaxError, buf);
5404 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5405 ste->ste_opt_lineno);
5406 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005407}
5408
5409static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005410symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5411 struct symbol_info *si)
5412{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005413 if (c->c_future)
5414 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005415 if (ste->ste_generator)
5416 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005417 if (ste->ste_type != TYPE_MODULE)
5418 c->c_flags |= CO_NEWLOCALS;
5419 if (ste->ste_type == TYPE_FUNCTION) {
5420 c->c_nlocals = si->si_nlocals;
5421 if (ste->ste_optimized == 0)
5422 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005423 else if (ste->ste_optimized != OPT_EXEC)
5424 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005425 }
5426 return 0;
5427}
5428
5429static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005430symtable_error(struct symtable *st, int lineno)
5431{
5432 if (lineno == 0)
5433 lineno = st->st_cur->ste_lineno;
5434 PyErr_SyntaxLocation(st->st_filename, lineno);
5435 st->st_errors++;
5436 return -1;
5437}
5438
5439static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005440symtable_load_symbols(struct compiling *c)
5441{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005442 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005443 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005444 PyObject *name, *varnames, *v;
5445 int i, flags, pos;
5446 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005447
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005448 v = NULL;
5449
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005450 if (symtable_init_compiling_symbols(c) < 0)
5451 goto fail;
5452 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005453 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005454 si.si_nlocals = PyList_GET_SIZE(varnames);
5455 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005456
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005457 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005458 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005459 if (v == NULL)
5460 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005461 if (PyDict_SetItem(c->c_locals,
5462 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005463 goto fail;
5464 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465 }
5466
5467 /* XXX The cases below define the rules for whether a name is
5468 local or global. The logic could probably be clearer. */
5469 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005470 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5471 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005472
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005473 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005474 /* undo the original DEF_FREE */
5475 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005476
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005477 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005478 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005479 2. Free variables in methods that are also class
5480 variables or declared global.
5481 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005482 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005483 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005484
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005485 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005486 c->c_argcount--;
5487 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005488 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 c->c_argcount--;
5490 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005491 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005492 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005493 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005494 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005495 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005496 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005497 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005500 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5501 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005502 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005503 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005504 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005505 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005506 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005507 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 if (v == NULL)
5509 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005511 goto fail;
5512 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005513 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005514 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005515 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005516 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005517 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005518 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005519 if (v == NULL)
5520 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005521 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 goto fail;
5523 Py_DECREF(v);
5524 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005525 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005526 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005527 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005528 goto fail;
5529 if (st->st_nscopes != 1) {
5530 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005531 if (v == NULL)
5532 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005533 if (PyDict_SetItem(st->st_global,
5534 name, v))
5535 goto fail;
5536 Py_DECREF(v);
5537 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005538 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005539 }
5540 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005541 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5542
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005543 if (si.si_ncells > 1) { /* one cell is always in order */
5544 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5545 c->c_varnames, c->c_flags) < 0)
5546 return -1;
5547 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005548 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5549 return -1;
5550 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005551 fail:
5552 /* is this always the right thing to do? */
5553 Py_XDECREF(v);
5554 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005555}
5556
5557static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005558symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005559{
5560 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005561
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005562 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005563 if (st == NULL)
5564 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005565 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005566
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005567 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005568 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005569 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005570 goto fail;
5571 if ((st->st_symbols = PyDict_New()) == NULL)
5572 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005573 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005574 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005575 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005576 st->st_private = NULL;
5577 return st;
5578 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005579 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005580 return NULL;
5581}
5582
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005583void
5584PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005585{
5586 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005587 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005588 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005589 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005590}
5591
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005592/* When the compiler exits a scope, it must should update the scope's
5593 free variable information with the list of free variables in its
5594 children.
5595
5596 Variables that are free in children and defined in the current
5597 scope are cellvars.
5598
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005599 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005600 false), free variables in children that are not defined here are
5601 implicit globals.
5602
5603*/
5604
5605static int
5606symtable_update_free_vars(struct symtable *st)
5607{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005608 int i, j, def;
5609 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005611
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005612 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005613 def = DEF_FREE_CLASS;
5614 else
5615 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005616 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617 int pos = 0;
5618
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005619 if (list && PyList_SetSlice(list, 0,
5620 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005621 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005622 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005623 PyList_GET_ITEM(ste->ste_children, i);
5624 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005625 int flags = PyInt_AS_LONG(o);
5626 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005628 if (list == NULL) {
5629 list = PyList_New(0);
5630 if (list == NULL)
5631 return -1;
5632 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005633 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005634 if (PyList_Append(list, name) < 0) {
5635 Py_DECREF(list);
5636 return -1;
5637 }
5638 }
5639 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005640 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005641 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005642 v = PyDict_GetItem(ste->ste_symbols, name);
5643 /* If a name N is declared global in scope A and
5644 referenced in scope B contained (perhaps
5645 indirectly) in A and there are no scopes
5646 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005647 is global in B. Unless A is a class scope,
5648 because class scopes are not considered for
5649 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005650 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005651 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005652 int flags = PyInt_AS_LONG(v);
5653 if (flags & DEF_GLOBAL) {
5654 symtable_undo_free(st, child->ste_id,
5655 name);
5656 continue;
5657 }
5658 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005659 if (ste->ste_nested) {
5660 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005661 name, def) < 0) {
5662 Py_DECREF(list);
5663 return -1;
5664 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005665 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005666 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005667 name) < 0) {
5668 Py_DECREF(list);
5669 return -1;
5670 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005671 }
5672 }
5673 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005674
5675 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 return 0;
5677}
5678
5679/* If the current scope is a non-nested class or if name is not
5680 defined in the current, non-nested scope, then it is an implicit
5681 global in all nested scopes.
5682*/
5683
5684static int
5685symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5686{
5687 PyObject *o;
5688 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005690
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005691 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005693 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005694 if (o == NULL)
5695 return symtable_undo_free(st, child, name);
5696 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005697
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005698 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 return symtable_undo_free(st, child, name);
5700 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005701 return symtable_add_def_o(st, ste->ste_symbols,
5702 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005703}
5704
5705static int
5706symtable_undo_free(struct symtable *st, PyObject *id,
5707 PyObject *name)
5708{
5709 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005710 PyObject *info;
5711 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005712
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005713 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5714 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005715 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005716
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005717 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718 if (info == NULL)
5719 return 0;
5720 v = PyInt_AS_LONG(info);
5721 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005722 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 DEF_FREE_GLOBAL) < 0)
5724 return -1;
5725 } else
5726 /* If the name is defined here or declared global,
5727 then the recursion stops. */
5728 return 0;
5729
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005730 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5731 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005732 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005733 PyList_GET_ITEM(ste->ste_children, i);
5734 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005735 if (x < 0)
5736 return x;
5737 }
5738 return 0;
5739}
5740
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005741/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5742 This reference is released when the scope is exited, via the DECREF
5743 in symtable_exit_scope().
5744*/
5745
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746static int
5747symtable_exit_scope(struct symtable *st)
5748{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005749 int end;
5750
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005751 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005755 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5756 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 if (PySequence_DelItem(st->st_stack, end) < 0)
5758 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005759 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005762static void
5763symtable_enter_scope(struct symtable *st, char *name, int type,
5764 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005766 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767
5768 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005769 prev = st->st_cur;
5770 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005771 st->st_errors++;
5772 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 }
5774 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005775 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005776 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005777 if (st->st_cur == NULL) {
5778 st->st_errors++;
5779 return;
5780 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005781 if (strcmp(name, TOP) == 0)
5782 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005783 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005784 if (PyList_Append(prev->ste_children,
5785 (PyObject *)st->st_cur) < 0)
5786 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005787 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005788}
5789
5790static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005791symtable_lookup(struct symtable *st, char *name)
5792{
5793 char buffer[MANGLE_LEN];
5794 PyObject *v;
5795 int flags;
5796
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005797 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005798 name = buffer;
5799 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5800 if (v == NULL) {
5801 if (PyErr_Occurred())
5802 return -1;
5803 else
5804 return 0;
5805 }
5806
5807 flags = PyInt_AS_LONG(v);
5808 return flags;
5809}
5810
5811static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005812symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005813{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005814 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005815 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005816 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005817
Guido van Rossumb7164622002-08-16 02:48:11 +00005818 /* Warn about None, except inside a tuple (where the assignment
5819 code already issues a warning). */
5820 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5821 *name == 'N' && strcmp(name, "None") == 0)
5822 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005823 PyErr_SetString(PyExc_SyntaxError,
5824 "Invalid syntax. Assignment to None.");
5825 symtable_error(st, 0);
5826 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005827 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005828 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005829 name = buffer;
5830 if ((s = PyString_InternFromString(name)) == NULL)
5831 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005832 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5833 Py_DECREF(s);
5834 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005835}
5836
5837/* Must only be called with mangled names */
5838
5839static int
5840symtable_add_def_o(struct symtable *st, PyObject *dict,
5841 PyObject *name, int flag)
5842{
5843 PyObject *o;
5844 int val;
5845
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005846 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005847 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005848 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005849 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005850 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005851 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005852 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005855 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005856 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005857 if (o == NULL)
5858 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005859 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005860 Py_DECREF(o);
5861 return -1;
5862 }
5863 Py_DECREF(o);
5864
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005865 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005866 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005867 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005868 } else if (flag & DEF_GLOBAL) {
5869 /* XXX need to update DEF_GLOBAL for other flags too;
5870 perhaps only DEF_FREE_GLOBAL */
5871 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005872 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005873 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005874 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005875 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005876 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005877 if (o == NULL)
5878 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005879 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005880 Py_DECREF(o);
5881 return -1;
5882 }
5883 Py_DECREF(o);
5884 }
5885 return 0;
5886}
5887
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005888#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005889
Tim Peters08a898f2001-06-28 01:52:22 +00005890/* Look for a yield stmt under n. Return 1 if found, else 0.
5891 This hack is used to look inside "if 0:" blocks (which are normally
5892 ignored) in case those are the only places a yield occurs (so that this
5893 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005894static int
5895look_for_yield(node *n)
5896{
5897 int i;
5898
5899 for (i = 0; i < NCH(n); ++i) {
5900 node *kid = CHILD(n, i);
5901
5902 switch (TYPE(kid)) {
5903
5904 case classdef:
5905 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005906 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005907 /* Stuff in nested functions and classes can't make
5908 the parent a generator. */
5909 return 0;
5910
5911 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005912 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005913
5914 default:
5915 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005916 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005917 }
5918 }
5919 return 0;
5920}
5921
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005922static void
5923symtable_node(struct symtable *st, node *n)
5924{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005925 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005926
5927 loop:
5928 switch (TYPE(n)) {
5929 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005930 char *func_name;
5931 if (NCH(n) == 6)
5932 symtable_node(st, CHILD(n, 0));
5933 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005934 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005935 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005936 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005937 symtable_funcdef(st, n);
5938 symtable_exit_scope(st);
5939 break;
5940 }
5941 case lambdef:
5942 if (NCH(n) == 4)
5943 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005944 symtable_enter_scope(st, "lambda", 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 case classdef: {
5949 char *tmp, *class_name = STR(CHILD(n, 1));
5950 symtable_add_def(st, class_name, DEF_LOCAL);
5951 if (TYPE(CHILD(n, 2)) == LPAR) {
5952 node *bases = CHILD(n, 3);
5953 int i;
5954 for (i = 0; i < NCH(bases); i += 2) {
5955 symtable_node(st, CHILD(bases, i));
5956 }
5957 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005958 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005959 tmp = st->st_private;
5960 st->st_private = class_name;
5961 symtable_node(st, CHILD(n, NCH(n) - 1));
5962 st->st_private = tmp;
5963 symtable_exit_scope(st);
5964 break;
5965 }
5966 case if_stmt:
5967 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005968 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5969 if (st->st_cur->ste_generator == 0)
5970 st->st_cur->ste_generator =
5971 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005972 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005973 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005974 symtable_node(st, CHILD(n, i + 1));
5975 symtable_node(st, CHILD(n, i + 3));
5976 }
5977 if (i + 2 < NCH(n))
5978 symtable_node(st, CHILD(n, i + 2));
5979 break;
5980 case global_stmt:
5981 symtable_global(st, n);
5982 break;
5983 case import_stmt:
5984 symtable_import(st, n);
5985 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005986 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005987 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005988 symtable_node(st, CHILD(n, 1));
5989 if (NCH(n) > 2)
5990 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005991 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005992 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005993 st->st_cur->ste_opt_lineno = n->n_lineno;
5994 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005995 if (NCH(n) > 4)
5996 symtable_node(st, CHILD(n, 5));
5997 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005998
5999 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006000 case assert_stmt:
6001 if (Py_OptimizeFlag)
6002 return;
6003 if (NCH(n) == 2) {
6004 n = CHILD(n, 1);
6005 goto loop;
6006 } else {
6007 symtable_node(st, CHILD(n, 1));
6008 n = CHILD(n, 3);
6009 goto loop;
6010 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 case except_clause:
6012 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006013 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 if (NCH(n) > 1) {
6015 n = CHILD(n, 1);
6016 goto loop;
6017 }
6018 break;
6019 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006020 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006022 case yield_stmt:
6023 st->st_cur->ste_generator = 1;
6024 n = CHILD(n, 1);
6025 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 case expr_stmt:
6027 if (NCH(n) == 1)
6028 n = CHILD(n, 0);
6029 else {
6030 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006031 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006032 symtable_node(st, CHILD(n, 2));
6033 break;
6034 } else {
6035 int i;
6036 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006037 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006038 n = CHILD(n, NCH(n) - 1);
6039 }
6040 }
6041 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006042 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006043 /* only occurs when there are multiple for loops
6044 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006045 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006046 if (TYPE(n) == list_for)
6047 symtable_list_for(st, n);
6048 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006049 REQ(n, list_if);
6050 symtable_node(st, CHILD(n, 1));
6051 if (NCH(n) == 3) {
6052 n = CHILD(n, 2);
6053 goto loop;
6054 }
6055 }
6056 break;
6057 case for_stmt:
6058 symtable_assign(st, CHILD(n, 1), 0);
6059 for (i = 3; i < NCH(n); ++i)
6060 if (TYPE(CHILD(n, i)) >= single_input)
6061 symtable_node(st, CHILD(n, i));
6062 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006063 case arglist:
6064 if (NCH(n) > 1)
6065 for (i = 0; i < NCH(n); ++i) {
6066 node *ch = CHILD(n, i);
6067 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6068 TYPE(CHILD(ch, 1)) == gen_for) {
6069 PyErr_SetString(PyExc_SyntaxError,
6070 "invalid syntax");
6071 symtable_error(st, n->n_lineno);
6072 return;
6073 }
6074 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006075 /* The remaining cases fall through to default except in
6076 special circumstances. This requires the individual cases
6077 to be coded with great care, even though they look like
6078 rather innocuous. Each case must double-check TYPE(n).
6079 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006080 case decorator:
6081 if (TYPE(n) == decorator) {
6082 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6083 node *name, *varname;
6084 name = CHILD(n, 1);
6085 REQ(name, dotted_name);
6086 varname = CHILD(name, 0);
6087 REQ(varname, NAME);
6088 symtable_add_use(st, STR(varname));
6089 }
6090 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006091 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006092 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006093 n = CHILD(n, 2);
6094 goto loop;
6095 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006096 else if (TYPE(n) == argument && NCH(n) == 2 &&
6097 TYPE(CHILD(n, 1)) == gen_for) {
6098 symtable_generator_expression(st, n);
6099 break;
6100 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006101 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006102 case listmaker:
6103 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006104 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006105 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006106 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006107 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006108 case testlist_gexp:
6109 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6110 symtable_generator_expression(st, n);
6111 break;
6112 }
6113 /* fall through */
6114
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006115 case atom:
6116 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6117 symtable_add_use(st, STR(CHILD(n, 0)));
6118 break;
6119 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006120 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006121 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006122 /* Walk over every non-token child with a special case
6123 for one child.
6124 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006125 if (NCH(n) == 1) {
6126 n = CHILD(n, 0);
6127 goto loop;
6128 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006129 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006130 if (TYPE(CHILD(n, i)) >= single_input)
6131 symtable_node(st, CHILD(n, i));
6132 }
6133}
6134
6135static void
6136symtable_funcdef(struct symtable *st, node *n)
6137{
6138 node *body;
6139
6140 if (TYPE(n) == lambdef) {
6141 if (NCH(n) == 4)
6142 symtable_params(st, CHILD(n, 1));
6143 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006144 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006145 body = CHILD(n, NCH(n) - 1);
6146 symtable_node(st, body);
6147}
6148
6149/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006150 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151 which are references in the defining scope. symtable_params()
6152 parses the parameter names, which are defined in the function's
6153 body.
6154
6155 varargslist:
6156 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6157 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6158*/
6159
6160static void
6161symtable_default_args(struct symtable *st, node *n)
6162{
6163 node *c;
6164 int i;
6165
6166 if (TYPE(n) == parameters) {
6167 n = CHILD(n, 1);
6168 if (TYPE(n) == RPAR)
6169 return;
6170 }
6171 REQ(n, varargslist);
6172 for (i = 0; i < NCH(n); i += 2) {
6173 c = CHILD(n, i);
6174 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6175 break;
6176 }
6177 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6178 symtable_node(st, CHILD(n, i));
6179 }
6180}
6181
6182static void
6183symtable_params(struct symtable *st, node *n)
6184{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006185 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006186 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006187
6188 if (TYPE(n) == parameters) {
6189 n = CHILD(n, 1);
6190 if (TYPE(n) == RPAR)
6191 return;
6192 }
6193 REQ(n, varargslist);
6194 for (i = 0; i < NCH(n); i += 2) {
6195 c = CHILD(n, i);
6196 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6197 ext = 1;
6198 break;
6199 }
6200 if (TYPE(c) == test) {
6201 continue;
6202 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006203 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006204 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006205 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006206 char nbuf[30];
6207 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006208 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006209 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006210 }
6211 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006212 if (ext) {
6213 c = CHILD(n, i);
6214 if (TYPE(c) == STAR) {
6215 i++;
6216 symtable_add_def(st, STR(CHILD(n, i)),
6217 DEF_PARAM | DEF_STAR);
6218 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006219 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006220 c = NULL;
6221 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006222 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006223 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006224 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006225 i++;
6226 symtable_add_def(st, STR(CHILD(n, i)),
6227 DEF_PARAM | DEF_DOUBLESTAR);
6228 }
6229 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006230 if (complex >= 0) {
6231 int j;
6232 for (j = 0; j <= complex; j++) {
6233 c = CHILD(n, j);
6234 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006235 c = CHILD(n, ++j);
6236 else if (TYPE(c) == EQUAL)
6237 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006238 if (TYPE(CHILD(c, 0)) == LPAR)
6239 symtable_params_fplist(st, CHILD(c, 1));
6240 }
6241 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006242}
6243
6244static void
6245symtable_params_fplist(struct symtable *st, node *n)
6246{
6247 int i;
6248 node *c;
6249
6250 REQ(n, fplist);
6251 for (i = 0; i < NCH(n); i += 2) {
6252 c = CHILD(n, i);
6253 REQ(c, fpdef);
6254 if (NCH(c) == 1)
6255 symtable_add_def(st, STR(CHILD(c, 0)),
6256 DEF_PARAM | DEF_INTUPLE);
6257 else
6258 symtable_params_fplist(st, CHILD(c, 1));
6259 }
6260
6261}
6262
6263static void
6264symtable_global(struct symtable *st, node *n)
6265{
6266 int i;
6267
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006268 /* XXX It might be helpful to warn about module-level global
6269 statements, but it's hard to tell the difference between
6270 module-level and a string passed to exec.
6271 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006272
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006273 for (i = 1; i < NCH(n); i += 2) {
6274 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006275 int flags;
6276
6277 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006278 if (flags < 0)
6279 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006280 if (flags && flags != DEF_GLOBAL) {
6281 char buf[500];
6282 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006283 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006284 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006285 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006286 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006287 }
6288 else {
6289 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006290 PyOS_snprintf(buf, sizeof(buf),
6291 GLOBAL_AFTER_ASSIGN,
6292 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006293 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006294 PyOS_snprintf(buf, sizeof(buf),
6295 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006296 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006297 }
6298 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006299 symtable_add_def(st, name, DEF_GLOBAL);
6300 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006301}
6302
6303static void
6304symtable_list_comprehension(struct symtable *st, node *n)
6305{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006306 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006307 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006308
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006309 REQ(n, listmaker);
6310 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6311 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006312 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006313 symtable_list_for(st, CHILD(n, 1));
6314 symtable_node(st, CHILD(n, 0));
6315 --st->st_cur->ste_tmpname;
6316}
6317
6318static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006319symtable_generator_expression(struct symtable *st, node *n)
6320{
6321 /* testlist_gexp: test gen_for */
6322 REQ(CHILD(n, 0), test);
6323 REQ(CHILD(n, 1), gen_for);
6324
6325 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6326 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6327
6328 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6329
6330 symtable_gen_for(st, CHILD(n, 1), 1);
6331 symtable_node(st, CHILD(n, 0));
6332 symtable_exit_scope(st);
6333
6334 /* for outmost iterable precomputation */
6335 symtable_node(st, CHILD(CHILD(n, 1), 3));
6336}
6337
6338static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006339symtable_list_for(struct symtable *st, node *n)
6340{
6341 REQ(n, list_for);
6342 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006343 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006344 symtable_node(st, CHILD(n, 3));
6345 if (NCH(n) == 5)
6346 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006347}
6348
6349static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006350symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6351{
6352 REQ(n, gen_for);
6353
6354 /* gen_for: for v in test [gen_iter] */
6355 symtable_assign(st, CHILD(n, 1), 0);
6356 if (is_outmost)
6357 symtable_add_use(st, "[outmost-iterable]");
6358 else
6359 symtable_node(st, CHILD(n, 3));
6360
6361 if (NCH(n) == 5)
6362 symtable_gen_iter(st, CHILD(n, 4));
6363}
6364
6365static void
6366symtable_gen_iter(struct symtable *st, node *n)
6367{
6368 REQ(n, gen_iter);
6369
6370 n = CHILD(n, 0);
6371 if (TYPE(n) == gen_for)
6372 symtable_gen_for(st, n, 0);
6373 else {
6374 REQ(n, gen_if);
6375 symtable_node(st, CHILD(n, 1));
6376
6377 if (NCH(n) == 3)
6378 symtable_gen_iter(st, CHILD(n, 2));
6379 }
6380}
6381
6382static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006383symtable_import(struct symtable *st, node *n)
6384{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006385 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006386 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006387 /* import_stmt: import_name | import_from */
6388 n = CHILD(n, 0);
6389 if (TYPE(n) == import_from) {
6390 /* import_from: 'from' dotted_name 'import' ('*' |
6391 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006392 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006393 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006394 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6395 /* check for bogus imports */
6396 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6397 PyErr_SetString(PyExc_SyntaxError,
6398 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006399 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006400 return;
6401 }
6402 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006403 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6404 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006405 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006406 if (symtable_warn(st,
6407 "import * only allowed at module level") < 0)
6408 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006409 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006410 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006411 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006412 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006413 REQ(nn, import_as_names);
6414 for (i = 0; i < NCH(nn); i += 2) {
6415 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006416 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006417 symtable_assign(st, CHILD(c, 2),
6418 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006419 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006420 symtable_assign(st, CHILD(c, 0),
6421 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006422 }
6423 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006424 } else {
6425 /* 'import' dotted_as_names */
6426 nn = CHILD(n, 1);
6427 REQ(nn, dotted_as_names);
6428 for (i = 0; i < NCH(nn); i += 2)
6429 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006430 }
6431}
6432
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006433/* The third argument to symatble_assign() is a flag to be passed to
6434 symtable_add_def() if it is eventually called. The flag is useful
6435 to specify the particular type of assignment that should be
6436 recorded, e.g. an assignment caused by import.
6437 */
6438
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006439static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006440symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006441{
6442 node *tmp;
6443 int i;
6444
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006445 loop:
6446 switch (TYPE(n)) {
6447 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006448 /* invalid assignment, e.g. lambda x:x=2. The next
6449 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006450 return;
6451 case power:
6452 if (NCH(n) > 2) {
6453 for (i = 2; i < NCH(n); ++i)
6454 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6455 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006456 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006457 if (NCH(n) > 1) {
6458 symtable_node(st, CHILD(n, 0));
6459 symtable_node(st, CHILD(n, 1));
6460 } else {
6461 n = CHILD(n, 0);
6462 goto loop;
6463 }
6464 return;
6465 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006466 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6467 /* XXX This is an error, but the next pass
6468 will catch it. */
6469 return;
6470 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006471 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006472 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006473 }
6474 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006475 case testlist_gexp:
6476 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6477 /* XXX This is an error, but the next pass
6478 will catch it. */
6479 return;
6480 } else {
6481 for (i = 0; i < NCH(n); i += 2)
6482 symtable_assign(st, CHILD(n, i), def_flag);
6483 }
6484 return;
6485
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006486 case exprlist:
6487 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006488 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006489 if (NCH(n) == 1) {
6490 n = CHILD(n, 0);
6491 goto loop;
6492 }
6493 else {
6494 int i;
6495 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006496 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006497 return;
6498 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006499 case atom:
6500 tmp = CHILD(n, 0);
6501 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6502 n = CHILD(n, 1);
6503 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006504 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006505 if (strcmp(STR(tmp), "__debug__") == 0) {
6506 PyErr_SetString(PyExc_SyntaxError,
6507 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006508 symtable_error(st, n->n_lineno);
6509 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006510 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006511 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006512 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006513 return;
6514 case dotted_as_name:
6515 if (NCH(n) == 3)
6516 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006517 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006518 else
6519 symtable_add_def(st,
6520 STR(CHILD(CHILD(n,
6521 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006522 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006523 return;
6524 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006525 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006526 return;
6527 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006528 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006529 return;
6530 default:
6531 if (NCH(n) == 0)
6532 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006533 if (NCH(n) == 1) {
6534 n = CHILD(n, 0);
6535 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006536 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006537 /* Should only occur for errors like x + 1 = 1,
6538 which will be caught in the next pass. */
6539 for (i = 0; i < NCH(n); ++i)
6540 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006541 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006542 }
6543}