blob: acfbfe112a10220f5b8974535e2b0d6619912ee2 [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));
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000409 assert(codestr[n*3] == BUILD_TUPLE);
410 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000411 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000412 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413
414 /* Buildup new tuple of constants */
415 newconst = PyTuple_New(n);
416 if (newconst == NULL)
417 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000418 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000419 for (i=0 ; i<n ; i++) {
420 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000421 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000422 constant = PyList_GET_ITEM(consts, arg);
423 Py_INCREF(constant);
424 PyTuple_SET_ITEM(newconst, i, constant);
425 }
426
427 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000428 if (PyList_Append(consts, newconst)) {
429 Py_DECREF(newconst);
430 return 0;
431 }
432 Py_DECREF(newconst);
433
434 /* Write NOPs over old LOAD_CONSTS and
435 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
436 memset(codestr, NOP, n*3);
437 codestr[n*3] = LOAD_CONST;
438 SETARG(codestr, (n*3), len_consts);
439 return 1;
440}
441
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000442/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
443 with LOAD_CONST binop(c1,c2)
444 The consts table must still be in list form so that the
445 new constant can be appended.
446 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000447 Abandons the transformation if the folding fails (i.e. 1+'a').
448 If the new constant is a sequence, only folds when the size
449 is below a threshold value. That keeps pyc files from
450 becoming large in the presence of code like: (None,)*1000.
451*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000452static int
453fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
454{
455 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000456 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000457
458 /* Pre-conditions */
459 assert(PyList_CheckExact(consts));
460 assert(codestr[0] == LOAD_CONST);
461 assert(codestr[3] == LOAD_CONST);
462
463 /* Create new constant */
464 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
465 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
466 opcode = codestr[6];
467 switch (opcode) {
468 case BINARY_POWER:
469 newconst = PyNumber_Power(v, w, Py_None);
470 break;
471 case BINARY_MULTIPLY:
472 newconst = PyNumber_Multiply(v, w);
473 break;
474 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000475 /* Cannot fold this operation statically since
476 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000477 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000478 case BINARY_TRUE_DIVIDE:
479 newconst = PyNumber_TrueDivide(v, w);
480 break;
481 case BINARY_FLOOR_DIVIDE:
482 newconst = PyNumber_FloorDivide(v, w);
483 break;
484 case BINARY_MODULO:
485 newconst = PyNumber_Remainder(v, w);
486 break;
487 case BINARY_ADD:
488 newconst = PyNumber_Add(v, w);
489 break;
490 case BINARY_SUBTRACT:
491 newconst = PyNumber_Subtract(v, w);
492 break;
493 case BINARY_SUBSCR:
494 newconst = PyObject_GetItem(v, w);
495 break;
496 case BINARY_LSHIFT:
497 newconst = PyNumber_Lshift(v, w);
498 break;
499 case BINARY_RSHIFT:
500 newconst = PyNumber_Rshift(v, w);
501 break;
502 case BINARY_AND:
503 newconst = PyNumber_And(v, w);
504 break;
505 case BINARY_XOR:
506 newconst = PyNumber_Xor(v, w);
507 break;
508 case BINARY_OR:
509 newconst = PyNumber_Or(v, w);
510 break;
511 default:
512 /* Called with an unknown opcode */
513 assert(0);
514 return 0;
515 }
516 if (newconst == NULL) {
517 PyErr_Clear();
518 return 0;
519 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000520 size = PyObject_Size(newconst);
521 if (size == -1)
522 PyErr_Clear();
523 else if (size > 20) {
524 Py_DECREF(newconst);
525 return 0;
526 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000527
528 /* Append folded constant into consts table */
529 len_consts = PyList_GET_SIZE(consts);
530 if (PyList_Append(consts, newconst)) {
531 Py_DECREF(newconst);
532 return 0;
533 }
534 Py_DECREF(newconst);
535
536 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
537 memset(codestr, NOP, 4);
538 codestr[4] = LOAD_CONST;
539 SETARG(codestr, 4, len_consts);
540 return 1;
541}
542
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000543static unsigned int *
544markblocks(unsigned char *code, int len)
545{
546 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000547 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000548
549 if (blocks == NULL)
550 return NULL;
551 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000552
553 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000554 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
555 opcode = code[i];
556 switch (opcode) {
557 case FOR_ITER:
558 case JUMP_FORWARD:
559 case JUMP_IF_FALSE:
560 case JUMP_IF_TRUE:
561 case JUMP_ABSOLUTE:
562 case CONTINUE_LOOP:
563 case SETUP_LOOP:
564 case SETUP_EXCEPT:
565 case SETUP_FINALLY:
566 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000567 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000568 break;
569 }
570 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000571 /* Build block numbers in the second pass */
572 for (i=0 ; i<len ; i++) {
573 blockcnt += blocks[i]; /* increment blockcnt over labels */
574 blocks[i] = blockcnt;
575 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000576 return blocks;
577}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000578
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000579/* Perform basic peephole optimizations to components of a code object.
580 The consts object should still be in list form to allow new constants
581 to be appended.
582
583 To keep the optimizer simple, it bails out (does nothing) for code
584 containing extended arguments or that has a length over 32,700. That
585 allows us to avoid overflow and sign issues. Likewise, it bails when
586 the lineno table has complex encoding for gaps >= 255.
587
588 Optimizations are restricted to simple transformations occuring within a
589 single basic block. All transformations keep the code size the same or
590 smaller. For those that reduce size, the gaps are initially filled with
591 NOPs. Later those NOPs are removed and the jump addresses retargeted in
592 a single pass. Line numbering is adjusted accordingly. */
593
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000594static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000595optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000596{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000597 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000599 unsigned char *codestr = NULL;
600 unsigned char *lineno;
601 int *addrmap = NULL;
602 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000603 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000604 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000605 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000606
Raymond Hettingereffb3932004-10-30 08:55:08 +0000607 /* Bail out if an exception is set */
608 if (PyErr_Occurred())
609 goto exitUnchanged;
610
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000611 /* Bypass optimization when the lineno table is too complex */
612 assert(PyString_Check(lineno_obj));
613 lineno = PyString_AS_STRING(lineno_obj);
614 tabsiz = PyString_GET_SIZE(lineno_obj);
615 if (memchr(lineno, 255, tabsiz) != NULL)
616 goto exitUnchanged;
617
Raymond Hettingera12fa142004-08-24 04:34:16 +0000618 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000619 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000620 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000621 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000622 goto exitUnchanged;
623
624 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000625 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000626 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000627 goto exitUnchanged;
628 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000629
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000630 /* Mapping to new jump targets after NOPs are removed */
631 addrmap = PyMem_Malloc(codelen * sizeof(int));
632 if (addrmap == NULL)
633 goto exitUnchanged;
634
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000635 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000636 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000637 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000638 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000639
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000640 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000641 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000642
643 lastlc = cumlc;
644 cumlc = 0;
645
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000646 switch (opcode) {
647
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000648 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000649 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000650 case UNARY_NOT:
651 if (codestr[i+1] != JUMP_IF_FALSE ||
652 codestr[i+4] != POP_TOP ||
653 !ISBASICBLOCK(blocks,i,5))
654 continue;
655 tgt = GETJUMPTGT(codestr, (i+1));
656 if (codestr[tgt] != POP_TOP)
657 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000658 j = GETARG(codestr, i+1) + 1;
659 codestr[i] = JUMP_IF_TRUE;
660 SETARG(codestr, i, j);
661 codestr[i+3] = POP_TOP;
662 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000663 break;
664
665 /* not a is b --> a is not b
666 not a in b --> a not in b
667 not a is not b --> a is b
668 not a not in b --> a in b */
669 case COMPARE_OP:
670 j = GETARG(codestr, i);
671 if (j < 6 || j > 9 ||
672 codestr[i+3] != UNARY_NOT ||
673 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000674 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000675 SETARG(codestr, i, (j^1));
676 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000677 break;
678
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000679 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
680 case LOAD_NAME:
681 case LOAD_GLOBAL:
682 j = GETARG(codestr, i);
683 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
684 if (name == NULL || strcmp(name, "None") != 0)
685 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000686 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
687 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000688 codestr[i] = LOAD_CONST;
689 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000690 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000691 break;
692 }
693 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000694 break;
695
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000696 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000697 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000698 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000699 j = GETARG(codestr, i);
700 if (codestr[i+3] != JUMP_IF_FALSE ||
701 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000702 !ISBASICBLOCK(blocks,i,7) ||
703 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000704 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000705 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000706 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000707 break;
708
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000709 /* Try to fold tuples of constants.
710 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000711 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
712 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000713 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000714 j = GETARG(codestr, i);
715 h = i - 3 * j;
716 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000717 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000718 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
719 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000720 assert(codestr[i] == LOAD_CONST);
721 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000722 break;
723 }
724 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000725 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000726 j = GETARG(codestr, i);
727 if (codestr[i+3] != UNPACK_SEQUENCE ||
728 !ISBASICBLOCK(blocks,i,6) ||
729 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000730 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000731 if (j == 1) {
732 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000733 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000734 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000735 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000736 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000737 codestr[i] = ROT_THREE;
738 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000739 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000740 }
741 break;
742
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000743 /* Fold binary ops on constants.
744 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
745 case BINARY_POWER:
746 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000747 case BINARY_TRUE_DIVIDE:
748 case BINARY_FLOOR_DIVIDE:
749 case BINARY_MODULO:
750 case BINARY_ADD:
751 case BINARY_SUBTRACT:
752 case BINARY_SUBSCR:
753 case BINARY_LSHIFT:
754 case BINARY_RSHIFT:
755 case BINARY_AND:
756 case BINARY_XOR:
757 case BINARY_OR:
758 if (lastlc >= 2 &&
759 ISBASICBLOCK(blocks, i-6, 7) &&
760 fold_binops_on_constants(&codestr[i-6], consts)) {
761 i -= 2;
762 assert(codestr[i] == LOAD_CONST);
763 cumlc = 1;
764 }
765 break;
766
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000767 /* Simplify conditional jump to conditional jump where the
768 result of the first test implies the success of a similar
769 test or the failure of the opposite test.
770 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000771 "if a and b:"
772 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000773 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000774 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000775 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000776 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
777 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000778 */
779 case JUMP_IF_FALSE:
780 case JUMP_IF_TRUE:
781 tgt = GETJUMPTGT(codestr, i);
782 j = codestr[tgt];
783 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
784 if (j == opcode) {
785 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
786 SETARG(codestr, i, tgttgt);
787 } else {
788 tgt -= i;
789 SETARG(codestr, i, tgt);
790 }
791 break;
792 }
793 /* Intentional fallthrough */
794
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000795 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000796 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000797 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000798 case JUMP_ABSOLUTE:
799 case CONTINUE_LOOP:
800 case SETUP_LOOP:
801 case SETUP_EXCEPT:
802 case SETUP_FINALLY:
803 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000804 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000805 continue;
806 tgttgt = GETJUMPTGT(codestr, tgt);
807 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
808 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000809 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000810 tgttgt -= i + 3; /* Calc relative jump addr */
811 if (tgttgt < 0) /* No backward relative jumps */
812 continue;
813 codestr[i] = opcode;
814 SETARG(codestr, i, tgttgt);
815 break;
816
817 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000818 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000819
820 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
821 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000822 if (i+4 >= codelen ||
823 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000824 !ISBASICBLOCK(blocks,i,5))
825 continue;
826 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000827 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000828 }
829 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000830
831 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000832 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
833 addrmap[i] = i - nops;
834 if (codestr[i] == NOP)
835 nops++;
836 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000837 cum_orig_line = 0;
838 last_line = 0;
839 for (i=0 ; i < tabsiz ; i+=2) {
840 cum_orig_line += lineno[i];
841 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000842 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000843 lineno[i] =((unsigned char)(new_line - last_line));
844 last_line = new_line;
845 }
846
847 /* Remove NOPs and fixup jump targets */
848 for (i=0, h=0 ; i<codelen ; ) {
849 opcode = codestr[i];
850 switch (opcode) {
851 case NOP:
852 i++;
853 continue;
854
855 case JUMP_ABSOLUTE:
856 case CONTINUE_LOOP:
857 j = addrmap[GETARG(codestr, i)];
858 SETARG(codestr, i, j);
859 break;
860
861 case FOR_ITER:
862 case JUMP_FORWARD:
863 case JUMP_IF_FALSE:
864 case JUMP_IF_TRUE:
865 case SETUP_LOOP:
866 case SETUP_EXCEPT:
867 case SETUP_FINALLY:
868 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
869 SETARG(codestr, i, j);
870 break;
871 }
872 adj = CODESIZE(opcode);
873 while (adj--)
874 codestr[h++] = codestr[i++];
875 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000876 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000877
878 code = PyString_FromStringAndSize((char *)codestr, h);
879 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000880 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000881 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000882 return code;
883
884exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000885 if (blocks != NULL)
886 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000887 if (addrmap != NULL)
888 PyMem_Free(addrmap);
889 if (codestr != NULL)
890 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000891 Py_INCREF(code);
892 return code;
893}
894
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000895/* End: Peephole optimizations ----------------------------------------- */
896
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898PyCode_New(int argcount, int nlocals, int stacksize, int flags,
899 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000900 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
901 PyObject *filename, PyObject *name, int firstlineno,
902 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000903{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000905 int i;
906 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000907 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000908 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 consts == NULL || !PyTuple_Check(consts) ||
910 names == NULL || !PyTuple_Check(names) ||
911 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000912 freevars == NULL || !PyTuple_Check(freevars) ||
913 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 name == NULL || !PyString_Check(name) ||
915 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000916 lnotab == NULL || !PyString_Check(lnotab) ||
917 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000918 PyErr_BadInternalCall();
919 return NULL;
920 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000921 intern_strings(names);
922 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000923 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000924 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000925 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 for (i = PyTuple_Size(consts); --i >= 0; ) {
927 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000929 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000930 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000931 continue;
932 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000933 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000935 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000936 co->co_argcount = argcount;
937 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000938 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000939 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000940 Py_INCREF(code);
941 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000943 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000945 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000947 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000948 Py_INCREF(freevars);
949 co->co_freevars = freevars;
950 Py_INCREF(cellvars);
951 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000953 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000955 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000956 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000958 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000959 if (PyTuple_GET_SIZE(freevars) == 0 &&
960 PyTuple_GET_SIZE(cellvars) == 0)
961 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962 }
963 return co;
964}
965
966
967/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000968
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000969/* The compiler uses two passes to generate bytecodes. The first pass
970 builds the symbol table. The second pass generates the bytecode.
971
972 The first pass uses a single symtable struct. The second pass uses
973 a compiling struct for each code block. The compiling structs
974 share a reference to the symtable.
975
976 The two passes communicate via symtable_load_symbols() and via
977 is_local() and is_global(). The former initializes several slots
978 in the compiling struct: c_varnames, c_locals, c_nlocals,
979 c_argcount, c_globals, and c_flags.
980*/
981
Tim Peters2a7f3842001-06-09 09:26:21 +0000982/* All about c_lnotab.
983
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000984c_lnotab is an array of unsigned bytes disguised as a Python string. Since
985version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
986mapped to source code line #s via c_lnotab instead.
987
Tim Peters2a7f3842001-06-09 09:26:21 +0000988The array is conceptually a list of
989 (bytecode offset increment, line number increment)
990pairs. The details are important and delicate, best illustrated by example:
991
992 byte code offset source code line number
993 0 1
994 6 2
995 50 7
996 350 307
997 361 308
998
999The first trick is that these numbers aren't stored, only the increments
1000from one row to the next (this doesn't really work, but it's a start):
1001
1002 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1003
1004The second trick is that an unsigned byte can't hold negative values, or
1005values larger than 255, so (a) there's a deep assumption that byte code
1006offsets and their corresponding line #s both increase monotonically, and (b)
1007if at least one column jumps by more than 255 from one row to the next, more
1008than one pair is written to the table. In case #b, there's no way to know
1009from looking at the table later how many were written. That's the delicate
1010part. A user of c_lnotab desiring to find the source line number
1011corresponding to a bytecode address A should do something like this
1012
1013 lineno = addr = 0
1014 for addr_incr, line_incr in c_lnotab:
1015 addr += addr_incr
1016 if addr > A:
1017 return lineno
1018 lineno += line_incr
1019
1020In order for this to work, when the addr field increments by more than 255,
1021the line # increment in each pair generated must be 0 until the remaining addr
1022increment is < 256. So, in the example above, com_set_lineno should not (as
1023was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1024255, 0, 45, 255, 0, 45.
1025*/
1026
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001027struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001028 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001030 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001032 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001033 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 PyObject *c_locals; /* dictionary (value=localID) */
1035 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001036 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001037 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001038 int c_nlocals; /* index of next local */
1039 int c_argcount; /* number of top-level arguments */
1040 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 int c_nexti; /* index into c_code */
1042 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001043 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001044 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001045 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001046 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001047 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001048 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001049 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001050 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001051 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001052 int c_stacklevel; /* Current stack level */
1053 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001054 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001056 int c_last_addr; /* last op addr seen and recorded in lnotab */
1057 int c_last_line; /* last line seen and recorded in lnotab */
1058 int c_lnotab_next; /* current length of lnotab */
1059 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001060 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001061 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001062 int c_nested; /* Is block nested funcdef or lamdef? */
1063 int c_closure; /* Is nested w/freevars? */
1064 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001065 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001066 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067};
1068
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001069static int
1070is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001071{
1072 if ((v & (USE | DEF_FREE))
1073 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1074 return 1;
1075 if (v & DEF_FREE_CLASS)
1076 return 1;
1077 return 0;
1078}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001079
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001080static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001081com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001082{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001083 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1084
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001085 if (c == NULL) {
1086 /* Error occurred via symtable call to
1087 is_constant_false */
1088 PyErr_SetString(exc, msg);
1089 return;
1090 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001091 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001092 if (c->c_lineno < 1 || c->c_interactive) {
1093 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001095 return;
1096 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001097 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001098 if (v == NULL)
1099 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001100
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001101 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001102 if (line == NULL) {
1103 Py_INCREF(Py_None);
1104 line = Py_None;
1105 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001106 if (exc == PyExc_SyntaxError) {
1107 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1108 Py_None, line);
1109 if (t == NULL)
1110 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001111 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001112 if (w == NULL)
1113 goto exit;
1114 PyErr_SetObject(exc, w);
1115 } else {
1116 /* Make sure additional exceptions are printed with
1117 file and line, also. */
1118 PyErr_SetObject(exc, v);
1119 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1120 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001121 exit:
1122 Py_XDECREF(t);
1123 Py_XDECREF(v);
1124 Py_XDECREF(w);
1125 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001126}
1127
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001128/* Interface to the block stack */
1129
1130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001131block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001132{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001133 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 com_error(c, PyExc_SystemError,
1135 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001136 }
1137 else {
1138 c->c_block[c->c_nblocks++] = type;
1139 }
1140}
1141
1142static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001143block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001144{
1145 if (c->c_nblocks > 0)
1146 c->c_nblocks--;
1147 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001149 }
1150}
1151
Guido van Rossum681d79a1995-07-18 14:51:37 +00001152/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001153
Martin v. Löwis95292d62002-12-11 14:04:59 +00001154static int issue_warning(const char *, const char *, int);
1155static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001156static void com_free(struct compiling *);
1157static void com_push(struct compiling *, int);
1158static void com_pop(struct compiling *, int);
1159static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001160static void com_node(struct compiling *, node *);
1161static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001162static void com_addbyte(struct compiling *, int);
1163static void com_addint(struct compiling *, int);
1164static void com_addoparg(struct compiling *, int, int);
1165static void com_addfwref(struct compiling *, int, int *);
1166static void com_backpatch(struct compiling *, int);
1167static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1168static int com_addconst(struct compiling *, PyObject *);
1169static int com_addname(struct compiling *, PyObject *);
1170static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001171static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001172static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001173static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001174static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001175static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001176static void com_assign(struct compiling *, node *, int, node *);
1177static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001178static int com_make_closure(struct compiling *c, PyCodeObject *co);
1179
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001180static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001181static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001182 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001183static PyObject *parsestrplus(struct compiling*, node *);
1184static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001185static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001186
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001187static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001188
1189/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001190static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001191static struct symtable *symtable_build(node *, PyFutureFeatures *,
1192 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001193static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001194static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001195static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001196static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001197static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001198static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001199
1200static void symtable_node(struct symtable *, node *);
1201static void symtable_funcdef(struct symtable *, node *);
1202static void symtable_default_args(struct symtable *, node *);
1203static void symtable_params(struct symtable *, node *);
1204static void symtable_params_fplist(struct symtable *, node *n);
1205static void symtable_global(struct symtable *, node *);
1206static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001207static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001208static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001209static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001210static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001211static void symtable_gen_for(struct symtable *, node *, int);
1212static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001213
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001214static int symtable_update_free_vars(struct symtable *);
1215static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1216static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1217
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001218/* helper */
1219static void
1220do_pad(int pad)
1221{
1222 int i;
1223 for (i = 0; i < pad; ++i)
1224 fprintf(stderr, " ");
1225}
1226
1227static void
1228dump(node *n, int pad, int depth)
1229{
1230 int i;
1231 if (depth == 0)
1232 return;
1233 do_pad(pad);
1234 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1235 if (depth > 0)
1236 depth--;
1237 for (i = 0; i < NCH(n); ++i)
1238 dump(CHILD(n, i), pad + 1, depth);
1239}
1240
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001241static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001242com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001243{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001244 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1246 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001247 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001249 goto fail;
1250 if ((c->c_const_dict = PyDict_New()) == NULL)
1251 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001253 goto fail;
1254 if ((c->c_name_dict = PyDict_New()) == NULL)
1255 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001257 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1259 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001260 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001261 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001262 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001263 c->c_freevars = NULL;
1264 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001265 c->c_nlocals = 0;
1266 c->c_argcount = 0;
1267 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 c->c_nexti = 0;
1269 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001271 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001272 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001273 c->c_begin = 0;
1274 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001276 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001277 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001278 c->c_stacklevel = 0;
1279 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001280 c->c_firstlineno = 0;
1281 c->c_last_addr = 0;
1282 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001283 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001284 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001285 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001286 c->c_nested = 0;
1287 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001288 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001289 return 1;
1290
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001291 fail:
1292 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001293 return 0;
1294}
1295
1296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001297com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001298{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 Py_XDECREF(c->c_code);
1300 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001301 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001303 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 Py_XDECREF(c->c_globals);
1305 Py_XDECREF(c->c_locals);
1306 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001307 Py_XDECREF(c->c_freevars);
1308 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001310 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001311 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312}
1313
1314static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001316{
1317 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001318 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001319 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001320 /*
1321 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1322 c->c_filename, c->c_name, c->c_lineno,
1323 c->c_nexti, c->c_stacklevel, n);
1324 */
1325 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326}
1327
1328static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001329com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001330{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001331 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001332 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333 else
1334 c->c_stacklevel -= n;
1335}
1336
1337static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001338com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001339{
1340 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001341 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001342 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001343 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344}
1345
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001346static int
1347com_check_size(PyObject **s, int offset)
1348{
1349 int len = PyString_GET_SIZE(*s);
1350 if (offset >= len)
1351 return _PyString_Resize(s, len * 2);
1352 return 0;
1353}
1354
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001356com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001358 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001359 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001360 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001361 if (com_check_size(&c->c_code, c->c_nexti)) {
1362 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001363 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001365 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001366}
1367
1368static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001369com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001371 com_addbyte(c, x & 0xff);
1372 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373}
1374
1375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001377{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001378 char *p;
1379 if (c->c_lnotab == NULL)
1380 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001381 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1382 c->c_errors++;
1383 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001384 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001385 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001386 *p++ = addr;
1387 *p++ = line;
1388 c->c_lnotab_next += 2;
1389}
1390
1391static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001392com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001393{
1394 c->c_lineno = lineno;
1395 if (c->c_firstlineno == 0) {
1396 c->c_firstlineno = c->c_last_line = lineno;
1397 }
1398 else {
1399 int incr_addr = c->c_nexti - c->c_last_addr;
1400 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001401 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001402 while (incr_addr > 255) {
1403 com_add_lnotab(c, 255, 0);
1404 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001405 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001406 while (incr_line > 255) {
1407 com_add_lnotab(c, incr_addr, 255);
1408 incr_line -=255;
1409 incr_addr = 0;
1410 }
1411 if (incr_addr > 0 || incr_line > 0)
1412 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001413 c->c_last_addr = c->c_nexti;
1414 c->c_last_line = lineno;
1415 }
1416}
1417
1418static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001419com_strip_lnotab(struct compiling *c)
1420{
1421 /* strip the last lnotab entry if no opcode were emitted.
1422 * This prevents a line number to be generated on a final
1423 * pass, like in the following example:
1424 *
1425 * if a:
1426 * print 5
1427 * else:
1428 * pass
1429 *
1430 * Without the fix, a line trace event would be generated
1431 * on the pass even if a is true (because of the implicit
1432 * return).
1433 */
1434 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1435 c->c_lnotab_next = c->c_lnotab_last;
1436 }
1437}
1438
1439static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001440com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001441{
Fred Drakeef8ace32000-08-24 00:32:09 +00001442 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001443 if (extended_arg){
1444 com_addbyte(c, EXTENDED_ARG);
1445 com_addint(c, extended_arg);
1446 arg &= 0xffff;
1447 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001448 com_addbyte(c, op);
1449 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001450}
1451
1452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001453com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001454{
1455 /* Compile a forward reference for backpatching */
1456 int here;
1457 int anchor;
1458 com_addbyte(c, op);
1459 here = c->c_nexti;
1460 anchor = *p_anchor;
1461 *p_anchor = here;
1462 com_addint(c, anchor == 0 ? 0 : here - anchor);
1463}
1464
1465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001466com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001467{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001468 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001469 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001470 int dist;
1471 int prev;
1472 for (;;) {
1473 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001474 prev = code[anchor] + (code[anchor+1] << 8);
1475 dist = target - (anchor+2);
1476 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001477 dist >>= 8;
1478 code[anchor+1] = dist;
1479 dist >>= 8;
1480 if (dist) {
1481 com_error(c, PyExc_SystemError,
1482 "com_backpatch: offset too large");
1483 break;
1484 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001485 if (!prev)
1486 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001487 anchor -= prev;
1488 }
1489}
1490
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001491/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492
1493static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001494com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001495{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001496 PyObject *w, *t, *np=NULL;
1497 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001498
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001499 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001500 if (t == NULL)
1501 goto fail;
1502 w = PyDict_GetItem(dict, t);
1503 if (w != NULL) {
1504 n = PyInt_AsLong(w);
1505 } else {
1506 n = PyList_Size(list);
1507 np = PyInt_FromLong(n);
1508 if (np == NULL)
1509 goto fail;
1510 if (PyList_Append(list, v) != 0)
1511 goto fail;
1512 if (PyDict_SetItem(dict, t, np) != 0)
1513 goto fail;
1514 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001515 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001516 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001517 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001518 fail:
1519 Py_XDECREF(np);
1520 Py_XDECREF(t);
1521 c->c_errors++;
1522 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523}
1524
1525static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001526com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001527{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001528 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529}
1530
1531static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001532com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001534 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001535}
1536
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001537int
1538_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001539{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001540 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001541 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001542 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001543 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1544 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001545 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001546 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001547 return 0; /* Don't mangle __extremely_long_names */
1548 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1549 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001550 /* Strip leading underscores from class name */
1551 while (*p == '_')
1552 p++;
1553 if (*p == '\0')
1554 return 0; /* Don't mangle if class is just underscores */
1555 plen = strlen(p);
1556 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001557 plen = maxlen-nlen-2; /* Truncate class name if too long */
1558 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001559 buffer[0] = '_';
1560 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001561 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001562 return 1;
1563}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001564
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001565static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001566com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001567{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001569 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001570 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001571
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001572 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001573 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001574 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001575 c->c_errors++;
1576 i = 255;
1577 }
1578 else {
1579 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001581 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001582 com_addoparg(c, op, i);
1583}
1584
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001585#define NAME_LOCAL 0
1586#define NAME_GLOBAL 1
1587#define NAME_DEFAULT 2
1588#define NAME_CLOSURE 3
1589
1590static int
1591com_lookup_arg(PyObject *dict, PyObject *name)
1592{
1593 PyObject *v = PyDict_GetItem(dict, name);
1594 if (v == NULL)
1595 return -1;
1596 else
1597 return PyInt_AS_LONG(v);
1598}
1599
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001600static int
1601none_assignment_check(struct compiling *c, char *name, int assigning)
1602{
1603 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1604 char *msg;
1605 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001606 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001607 else
1608 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001609 com_error(c, PyExc_SyntaxError, msg);
1610 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001611 }
1612 return 0;
1613}
1614
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001615static void
1616com_addop_varname(struct compiling *c, int kind, char *name)
1617{
1618 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001619 int i, reftype;
1620 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001621 int op = STOP_CODE;
1622 char buffer[MANGLE_LEN];
1623
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001624 if (kind != VAR_LOAD &&
1625 none_assignment_check(c, name, kind == VAR_STORE))
1626 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001627 i = 255;
1628 goto done;
1629 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001630 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001631 name = buffer;
1632 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1633 c->c_errors++;
1634 i = 255;
1635 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001636 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001637
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001638 reftype = get_ref_type(c, name);
1639 switch (reftype) {
1640 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001641 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001642 scope = NAME_LOCAL;
1643 break;
1644 case GLOBAL_EXPLICIT:
1645 scope = NAME_GLOBAL;
1646 break;
1647 case GLOBAL_IMPLICIT:
1648 if (c->c_flags & CO_OPTIMIZED)
1649 scope = NAME_GLOBAL;
1650 break;
1651 case FREE:
1652 case CELL:
1653 scope = NAME_CLOSURE;
1654 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001655 }
1656
1657 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001658 if (scope == NAME_LOCAL)
1659 i = com_lookup_arg(c->c_locals, v);
1660 else if (reftype == FREE)
1661 i = com_lookup_arg(c->c_freevars, v);
1662 else if (reftype == CELL)
1663 i = com_lookup_arg(c->c_cellvars, v);
1664 if (i == -1) {
1665 c->c_errors++; /* XXX no exception set */
1666 i = 255;
1667 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001668 }
1669 Py_DECREF(v);
1670
1671 switch (kind) {
1672 case VAR_LOAD:
1673 switch (scope) {
1674 case NAME_LOCAL:
1675 op = LOAD_FAST;
1676 break;
1677 case NAME_GLOBAL:
1678 op = LOAD_GLOBAL;
1679 break;
1680 case NAME_DEFAULT:
1681 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001682 break;
1683 case NAME_CLOSURE:
1684 op = LOAD_DEREF;
1685 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001686 }
1687 break;
1688 case VAR_STORE:
1689 switch (scope) {
1690 case NAME_LOCAL:
1691 op = STORE_FAST;
1692 break;
1693 case NAME_GLOBAL:
1694 op = STORE_GLOBAL;
1695 break;
1696 case NAME_DEFAULT:
1697 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001698 break;
1699 case NAME_CLOSURE:
1700 op = STORE_DEREF;
1701 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001702 }
1703 break;
1704 case VAR_DELETE:
1705 switch (scope) {
1706 case NAME_LOCAL:
1707 op = DELETE_FAST;
1708 break;
1709 case NAME_GLOBAL:
1710 op = DELETE_GLOBAL;
1711 break;
1712 case NAME_DEFAULT:
1713 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001714 break;
1715 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001716 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001717 PyOS_snprintf(buf, sizeof(buf),
1718 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001719 com_error(c, PyExc_SyntaxError, buf);
1720 i = 255;
1721 break;
1722 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001723 }
1724 break;
1725 }
1726done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 com_addoparg(c, op, i);
1728}
1729
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001731com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001732{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001733 char *name;
1734 char buffer[1000];
1735 /* XXX it is possible to write this code without the 1000
1736 chars on the total length of dotted names, I just can't be
1737 bothered right now */
1738 if (TYPE(n) == STAR)
1739 name = "*";
1740 else if (TYPE(n) == dotted_name) {
1741 char *p = buffer;
1742 int i;
1743 name = buffer;
1744 for (i = 0; i < NCH(n); i += 2) {
1745 char *s = STR(CHILD(n, i));
1746 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001748 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001749 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001750 break;
1751 }
1752 if (p != buffer)
1753 *p++ = '.';
1754 strcpy(p, s);
1755 p = strchr(p, '\0');
1756 }
1757 }
1758 else {
1759 REQ(n, NAME);
1760 name = STR(n);
1761 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001762 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001763}
1764
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001766parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001767{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001768 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001769 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001770 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001771#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001772 int imflag;
1773#endif
1774
Guido van Rossum282914b1991-04-04 10:42:56 +00001775 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001776 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001777#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001778 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001779#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001780 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001782 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001784 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001785 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001786 }
1787 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001788 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001790 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001791 if (errno != 0)
1792 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001794 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001795 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001796#ifndef WITHOUT_COMPLEX
1797 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001798 Py_complex z;
1799 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001800 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001801 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001802 PyFPE_END_PROTECT(z)
1803 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001804 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001805 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001806#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001807 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001808 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001809 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001810 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001812 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001813}
1814
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001816decode_utf8(char **sPtr, char *end, char* encoding)
1817{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001818#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001819 Py_FatalError("decode_utf8 should not be called in this build.");
1820 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001821#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001822 PyObject *u, *v;
1823 char *s, *t;
1824 t = s = *sPtr;
1825 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1826 while (s < end && (*s & 0x80)) s++;
1827 *sPtr = s;
1828 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1829 if (u == NULL)
1830 return NULL;
1831 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1832 Py_DECREF(u);
1833 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001834#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001835}
1836
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001837/* compiler.transformer.Transformer.decode_literal depends on what
1838 might seem like minor details of this function -- changes here
1839 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001840static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001841parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001842{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001844 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001845 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001846 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001847 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001848 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001849 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001850
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001851 if (isalpha(quote) || quote == '_') {
1852 if (quote == 'u' || quote == 'U') {
1853 quote = *++s;
1854 unicode = 1;
1855 }
1856 if (quote == 'r' || quote == 'R') {
1857 quote = *++s;
1858 rawmode = 1;
1859 }
1860 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001861 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001863 return NULL;
1864 }
1865 s++;
1866 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001867 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001868 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001869 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001870 return NULL;
1871 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001872 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001874 return NULL;
1875 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001876 if (len >= 4 && s[0] == quote && s[1] == quote) {
1877 s += 2;
1878 len -= 2;
1879 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001881 return NULL;
1882 }
1883 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001884#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001885 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001886 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001887 char *buf;
1888 char *p;
1889 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001890 if (encoding == NULL) {
1891 buf = s;
1892 u = NULL;
1893 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1894 buf = s;
1895 u = NULL;
1896 } else {
1897 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1898 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1899 if (u == NULL)
1900 return NULL;
1901 p = buf = PyString_AsString(u);
1902 end = s + len;
1903 while (s < end) {
1904 if (*s == '\\') {
1905 *p++ = *s++;
1906 if (*s & 0x80) {
1907 strcpy(p, "u005c");
1908 p += 5;
1909 }
1910 }
1911 if (*s & 0x80) { /* XXX inefficient */
1912 char *r;
1913 int rn, i;
1914 w = decode_utf8(&s, end, "utf-16-be");
1915 if (w == NULL) {
1916 Py_DECREF(u);
1917 return NULL;
1918 }
1919 r = PyString_AsString(w);
1920 rn = PyString_Size(w);
1921 assert(rn % 2 == 0);
1922 for (i = 0; i < rn; i += 2) {
1923 sprintf(p, "\\u%02x%02x",
1924 r[i + 0] & 0xFF,
1925 r[i + 1] & 0xFF);
1926 p += 6;
1927 }
1928 Py_DECREF(w);
1929 } else {
1930 *p++ = *s++;
1931 }
1932 }
1933 len = p - buf;
1934 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001935 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001936 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001937 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001938 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1939 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001940 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001941 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001942 return v;
1943
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001944 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001945#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001946 need_encoding = (encoding != NULL &&
1947 strcmp(encoding, "utf-8") != 0 &&
1948 strcmp(encoding, "iso-8859-1") != 0);
1949 if (rawmode || strchr(s, '\\') == NULL) {
1950 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001951#ifndef Py_USING_UNICODE
1952 /* This should not happen - we never see any other
1953 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001954 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001955#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001956 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1957 if (u == NULL)
1958 return NULL;
1959 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1960 Py_DECREF(u);
1961 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001962#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001963 } else {
1964 return PyString_FromStringAndSize(s, len);
1965 }
1966 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001967
1968 v = PyString_DecodeEscape(s, len, NULL, unicode,
1969 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001970 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001971 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001972 return v;
1973}
1974
Guido van Rossum79f25d91997-04-29 20:08:16 +00001975static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001976parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001977{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001979 int i;
1980 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001981 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001982 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001983 for (i = 1; i < NCH(n); i++) {
1984 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001985 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001986 if (s == NULL)
1987 goto onError;
1988 if (PyString_Check(v) && PyString_Check(s)) {
1989 PyString_ConcatAndDel(&v, s);
1990 if (v == NULL)
1991 goto onError;
1992 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001993#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001994 else {
1995 PyObject *temp;
1996 temp = PyUnicode_Concat(v, s);
1997 Py_DECREF(s);
1998 if (temp == NULL)
1999 goto onError;
2000 Py_DECREF(v);
2001 v = temp;
2002 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002003#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002004 }
2005 }
2006 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002007
2008 onError:
2009 Py_XDECREF(v);
2010 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002011}
2012
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002013static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002014com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002015{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002016 int anchor = 0;
2017 int save_begin = c->c_begin;
2018
Raymond Hettinger354433a2004-05-19 08:20:33 +00002019 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002020 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002021 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002022 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002023 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002024 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002025 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002026 c->c_loops++;
2027 com_list_iter(c, n, e, t);
2028 c->c_loops--;
2029 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2030 c->c_begin = save_begin;
2031 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002032 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002033}
2034
2035static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002036com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2037{
2038 int break_anchor = 0;
2039 int anchor = 0;
2040 int save_begin = c->c_begin;
2041
2042 REQ(n, gen_for);
2043 /* gen_for: for v in test [gen_iter] */
2044
2045 com_addfwref(c, SETUP_LOOP, &break_anchor);
2046 block_push(c, SETUP_LOOP);
2047
2048 if (is_outmost) {
2049 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2050 com_push(c, 1);
2051 }
2052 else {
2053 com_node(c, CHILD(n, 3));
2054 com_addbyte(c, GET_ITER);
2055 }
2056
2057 c->c_begin = c->c_nexti;
2058 com_set_lineno(c, c->c_last_line);
2059 com_addfwref(c, FOR_ITER, &anchor);
2060 com_push(c, 1);
2061 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2062
2063 if (NCH(n) == 5)
2064 com_gen_iter(c, CHILD(n, 4), t);
2065 else {
2066 com_test(c, t);
2067 com_addbyte(c, YIELD_VALUE);
2068 com_pop(c, 1);
2069 }
2070
2071 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2072 c->c_begin = save_begin;
2073
2074 com_backpatch(c, anchor);
2075 com_pop(c, 1); /* FOR_ITER has popped this */
2076 com_addbyte(c, POP_BLOCK);
2077 block_pop(c, SETUP_LOOP);
2078 com_backpatch(c, break_anchor);
2079}
2080
2081static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002082com_list_if(struct compiling *c, node *n, node *e, char *t)
2083{
2084 int anchor = 0;
2085 int a = 0;
2086 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002087 com_node(c, CHILD(n, 1));
2088 com_addfwref(c, JUMP_IF_FALSE, &a);
2089 com_addbyte(c, POP_TOP);
2090 com_pop(c, 1);
2091 com_list_iter(c, n, e, t);
2092 com_addfwref(c, JUMP_FORWARD, &anchor);
2093 com_backpatch(c, a);
2094 /* We jump here with an extra entry which we now pop */
2095 com_addbyte(c, POP_TOP);
2096 com_backpatch(c, anchor);
2097}
2098
2099static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002100com_gen_if(struct compiling *c, node *n, node *t)
2101{
2102 /* gen_if: 'if' test [gen_iter] */
2103 int anchor = 0;
2104 int a=0;
2105
2106 com_node(c, CHILD(n, 1));
2107 com_addfwref(c, JUMP_IF_FALSE, &a);
2108 com_addbyte(c, POP_TOP);
2109 com_pop(c, 1);
2110
2111 if (NCH(n) == 3)
2112 com_gen_iter(c, CHILD(n, 2), t);
2113 else {
2114 com_test(c, t);
2115 com_addbyte(c, YIELD_VALUE);
2116 com_pop(c, 1);
2117 }
2118 com_addfwref(c, JUMP_FORWARD, &anchor);
2119 com_backpatch(c, a);
2120 /* We jump here with an extra entry which we now pop */
2121 com_addbyte(c, POP_TOP);
2122 com_backpatch(c, anchor);
2123}
2124
2125static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002126com_list_iter(struct compiling *c,
2127 node *p, /* parent of list_iter node */
2128 node *e, /* element expression node */
2129 char *t /* name of result list temp local */)
2130{
2131 /* list_iter is the last child in a listmaker, list_for, or list_if */
2132 node *n = CHILD(p, NCH(p)-1);
2133 if (TYPE(n) == list_iter) {
2134 n = CHILD(n, 0);
2135 switch (TYPE(n)) {
2136 case list_for:
2137 com_list_for(c, n, e, t);
2138 break;
2139 case list_if:
2140 com_list_if(c, n, e, t);
2141 break;
2142 default:
2143 com_error(c, PyExc_SystemError,
2144 "invalid list_iter node type");
2145 }
2146 }
2147 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002148 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002149 com_push(c, 1);
2150 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002151 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002152 com_pop(c, 2);
2153 }
2154}
2155
2156static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002157com_gen_iter(struct compiling *c, node *n, node *t)
2158{
2159 /* gen_iter: gen_for | gen_if */
2160 node *ch;
2161 REQ(n, gen_iter);
2162
2163 ch = CHILD(n, 0);
2164
2165 switch (TYPE(ch)) {
2166 case gen_for:
2167 com_gen_for(c, ch, t, 0);
2168 break;
2169 case gen_if:
2170 com_gen_if(c, ch, t);
2171 break;
2172 default:
2173 com_error(c, PyExc_SystemError,
2174 "invalid gen_iter node type");
2175 }
2176}
2177
2178static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002179com_list_comprehension(struct compiling *c, node *n)
2180{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002181 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002182 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002183
2184 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002185 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002186 com_addoparg(c, BUILD_LIST, 0);
2187 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2188 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002189 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002190 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002191 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002192 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002193 --c->c_tmpname;
2194}
2195
2196static void
2197com_listmaker(struct compiling *c, node *n)
2198{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002199 /* listmaker: test ( list_for | (',' test)* [','] ) */
2200 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002201 com_list_comprehension(c, n);
2202 else {
2203 int len = 0;
2204 int i;
2205 for (i = 0; i < NCH(n); i += 2, len++)
2206 com_node(c, CHILD(n, i));
2207 com_addoparg(c, BUILD_LIST, len);
2208 com_pop(c, len-1);
2209 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002210}
2211
2212static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002213com_generator_expression(struct compiling *c, node *n)
2214{
2215 /* testlist_gexp: test gen_for */
2216 /* argument: test gen_for */
2217 PyCodeObject *co;
2218
2219 REQ(CHILD(n, 0), test);
2220 REQ(CHILD(n, 1), gen_for);
2221
2222 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2223 n->n_lineno);
2224 co = icompile(n, c);
2225 symtable_exit_scope(c->c_symtable);
2226
2227 if (co == NULL)
2228 c->c_errors++;
2229 else {
2230 int closure = com_make_closure(c, co);
2231 int i = com_addconst(c, (PyObject *)co);
2232
2233 com_addoparg(c, LOAD_CONST, i);
2234 com_push(c, 1);
2235 if (closure)
2236 com_addoparg(c, MAKE_CLOSURE, 0);
2237 else
2238 com_addoparg(c, MAKE_FUNCTION, 0);
2239
2240 com_test(c, CHILD(CHILD(n, 1), 3));
2241 com_addbyte(c, GET_ITER);
2242 com_addoparg(c, CALL_FUNCTION, 1);
2243 com_pop(c, 1);
2244
2245 Py_DECREF(co);
2246 }
2247}
2248
2249static void
2250com_testlist_gexp(struct compiling *c, node *n)
2251{
2252 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2253 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2254 com_generator_expression(c, n);
2255 else com_list(c, n, 0);
2256}
2257
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002258
Raymond Hettinger354433a2004-05-19 08:20:33 +00002259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002261{
2262 int i;
2263 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2264 for (i = 0; i+2 < NCH(n); i += 4) {
2265 /* We must arrange things just right for STORE_SUBSCR.
2266 It wants the stack to look like (value) (dict) (key) */
2267 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002268 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002269 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002270 com_node(c, CHILD(n, i+2)); /* value */
2271 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002272 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002273 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002274 }
2275}
2276
2277static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002278com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002279{
2280 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002282 int i;
2283 REQ(n, atom);
2284 ch = CHILD(n, 0);
2285 switch (TYPE(ch)) {
2286 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002287 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002288 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002289 com_push(c, 1);
2290 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002291 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002292 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002293 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002294 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002295 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002296 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002297 com_push(c, 1);
2298 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002299 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002300 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002301 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002302 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002304 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002305 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002306 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002307 break;
2308 case BACKQUOTE:
2309 com_node(c, CHILD(n, 1));
2310 com_addbyte(c, UNARY_CONVERT);
2311 break;
2312 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002313 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 i = 255;
2315 }
2316 else {
2317 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002319 }
2320 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002322 break;
2323 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002324 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002325 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 c->c_errors++;
2327 i = 255;
2328 }
2329 else {
2330 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332 }
2333 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 break;
2336 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002337 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002338 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 break;
2340 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002341 com_error(c, PyExc_SystemError,
2342 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 }
2344}
2345
2346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002347com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348{
2349 if (NCH(n) == 1) {
2350 com_addbyte(c, op);
2351 }
2352 else if (NCH(n) == 2) {
2353 if (TYPE(CHILD(n, 0)) != COLON) {
2354 com_node(c, CHILD(n, 0));
2355 com_addbyte(c, op+1);
2356 }
2357 else {
2358 com_node(c, CHILD(n, 1));
2359 com_addbyte(c, op+2);
2360 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002361 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 }
2363 else {
2364 com_node(c, CHILD(n, 0));
2365 com_node(c, CHILD(n, 2));
2366 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002368 }
2369}
2370
Guido van Rossum635abd21997-01-06 22:56:52 +00002371static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002372com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2373{
2374 if (NCH(n) == 1) {
2375 com_addbyte(c, DUP_TOP);
2376 com_push(c, 1);
2377 com_addbyte(c, SLICE);
2378 com_node(c, augn);
2379 com_addbyte(c, opcode);
2380 com_pop(c, 1);
2381 com_addbyte(c, ROT_TWO);
2382 com_addbyte(c, STORE_SLICE);
2383 com_pop(c, 2);
2384 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2385 com_node(c, CHILD(n, 0));
2386 com_addoparg(c, DUP_TOPX, 2);
2387 com_push(c, 2);
2388 com_addbyte(c, SLICE+1);
2389 com_pop(c, 1);
2390 com_node(c, augn);
2391 com_addbyte(c, opcode);
2392 com_pop(c, 1);
2393 com_addbyte(c, ROT_THREE);
2394 com_addbyte(c, STORE_SLICE+1);
2395 com_pop(c, 3);
2396 } else if (NCH(n) == 2) {
2397 com_node(c, CHILD(n, 1));
2398 com_addoparg(c, DUP_TOPX, 2);
2399 com_push(c, 2);
2400 com_addbyte(c, SLICE+2);
2401 com_pop(c, 1);
2402 com_node(c, augn);
2403 com_addbyte(c, opcode);
2404 com_pop(c, 1);
2405 com_addbyte(c, ROT_THREE);
2406 com_addbyte(c, STORE_SLICE+2);
2407 com_pop(c, 3);
2408 } else {
2409 com_node(c, CHILD(n, 0));
2410 com_node(c, CHILD(n, 2));
2411 com_addoparg(c, DUP_TOPX, 3);
2412 com_push(c, 3);
2413 com_addbyte(c, SLICE+3);
2414 com_pop(c, 2);
2415 com_node(c, augn);
2416 com_addbyte(c, opcode);
2417 com_pop(c, 1);
2418 com_addbyte(c, ROT_FOUR);
2419 com_addbyte(c, STORE_SLICE+3);
2420 com_pop(c, 4);
2421 }
2422}
2423
2424static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002425com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002426{
2427 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002428 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002429 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002430 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002431 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002432 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002433 }
2434 else {
2435 com_node(c, CHILD(n, 0));
2436 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002437 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002438 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002439 if (NCH(n) == 2) {
2440 com_generator_expression(c, n);
2441 return;
2442 }
2443
Guido van Rossumf10570b1995-07-07 22:53:21 +00002444 m = n;
2445 do {
2446 m = CHILD(m, 0);
2447 } while (NCH(m) == 1);
2448 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002449 /* f(lambda x: x[0] = 3) ends up getting parsed with
2450 * LHS test = lambda x: x[0], and RHS test = 3.
2451 * SF bug 132313 points out that complaining about a keyword
2452 * then is very confusing.
2453 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002454 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002455 TYPE(m) == lambdef ?
2456 "lambda cannot contain assignment" :
2457 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002458 }
2459 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002460 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002461 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002462 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002463 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002464 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002465 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002466 else if (*pkeywords == NULL) {
2467 c->c_errors++;
2468 Py_DECREF(v);
2469 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002470 if (PyDict_GetItem(*pkeywords, v) != NULL)
2471 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002472 "duplicate keyword argument");
2473 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002474 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002475 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002476 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002477 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002478 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002479 }
2480 }
2481 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002482}
2483
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002485com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486{
2487 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002488 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002489 }
2490 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002491 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002492 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002493 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002494 int star_flag = 0;
2495 int starstar_flag = 0;
2496 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002497 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002498 na = 0;
2499 nk = 0;
2500 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002501 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002502 if (TYPE(ch) == STAR ||
2503 TYPE(ch) == DOUBLESTAR)
2504 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002505 if (ch->n_lineno != lineno) {
2506 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002507 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002508 }
2509 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002510 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002511 na++;
2512 else
2513 nk++;
2514 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002515 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002516 while (i < NCH(n)) {
2517 node *tok = CHILD(n, i);
2518 node *ch = CHILD(n, i+1);
2519 i += 3;
2520 switch (TYPE(tok)) {
2521 case STAR: star_flag = 1; break;
2522 case DOUBLESTAR: starstar_flag = 1; break;
2523 }
2524 com_node(c, ch);
2525 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002526 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002527 com_error(c, PyExc_SyntaxError,
2528 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002529 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002530 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002531 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002532 star_flag + (starstar_flag << 1);
2533 else
2534 opcode = CALL_FUNCTION;
2535 com_addoparg(c, opcode, na | (nk << 8));
2536 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537 }
2538}
2539
2540static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002541com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542{
2543 com_addopname(c, LOAD_ATTR, n);
2544}
2545
2546static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002547com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002548{
2549 int i=0;
2550 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002551 node *ch;
2552
2553 /* first argument */
2554 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002555 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002557 i++;
2558 }
2559 else {
2560 com_node(c, CHILD(n,i));
2561 i++;
2562 REQ(CHILD(n,i),COLON);
2563 i++;
2564 }
2565 /* second argument */
2566 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2567 com_node(c, CHILD(n,i));
2568 i++;
2569 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002571 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002572 com_push(c, 1);
2573 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002574 /* remaining arguments */
2575 for (; i < NCH(n); i++) {
2576 ns++;
2577 ch=CHILD(n,i);
2578 REQ(ch, sliceop);
2579 if (NCH(ch) == 1) {
2580 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002581 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002582 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002583 }
2584 else
2585 com_node(c, CHILD(ch,1));
2586 }
2587 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002588 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002589}
2590
2591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002592com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002593{
2594 node *ch;
2595 REQ(n, subscript);
2596 ch = CHILD(n,0);
2597 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002598 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002599 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002600 com_push(c, 1);
2601 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002602 else {
2603 /* check for slice */
2604 if ((TYPE(ch) == COLON || NCH(n) > 1))
2605 com_sliceobj(c, n);
2606 else {
2607 REQ(ch, test);
2608 com_node(c, ch);
2609 }
2610 }
2611}
2612
2613static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002614com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002615{
2616 int i, op;
2617 REQ(n, subscriptlist);
2618 /* Check to make backward compatible slice behavior for '[i:j]' */
2619 if (NCH(n) == 1) {
2620 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002621 /* 'Basic' slice, should have exactly one colon. */
2622 if ((TYPE(CHILD(sub, 0)) == COLON
2623 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2624 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2625 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002626 switch (assigning) {
2627 case OP_DELETE:
2628 op = DELETE_SLICE;
2629 break;
2630 case OP_ASSIGN:
2631 op = STORE_SLICE;
2632 break;
2633 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002634 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002635 break;
2636 default:
2637 com_augassign_slice(c, sub, assigning, augn);
2638 return;
2639 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002640 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 if (op == STORE_SLICE)
2642 com_pop(c, 2);
2643 else if (op == DELETE_SLICE)
2644 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002645 return;
2646 }
2647 }
2648 /* Else normal subscriptlist. Compile each subscript. */
2649 for (i = 0; i < NCH(n); i += 2)
2650 com_subscript(c, CHILD(n, i));
2651 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002652 if (NCH(n) > 1) {
2653 i = (NCH(n)+1) / 2;
2654 com_addoparg(c, BUILD_TUPLE, i);
2655 com_pop(c, i-1);
2656 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002657 switch (assigning) {
2658 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 op = DELETE_SUBSCR;
2660 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002661 break;
2662 default:
2663 case OP_ASSIGN:
2664 op = STORE_SUBSCR;
2665 i = 3;
2666 break;
2667 case OP_APPLY:
2668 op = BINARY_SUBSCR;
2669 i = 1;
2670 break;
2671 }
2672 if (assigning > OP_APPLY) {
2673 com_addoparg(c, DUP_TOPX, 2);
2674 com_push(c, 2);
2675 com_addbyte(c, BINARY_SUBSCR);
2676 com_pop(c, 1);
2677 com_node(c, augn);
2678 com_addbyte(c, assigning);
2679 com_pop(c, 1);
2680 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002682 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002683 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002684}
2685
2686static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002687com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002688{
2689 REQ(n, trailer);
2690 switch (TYPE(CHILD(n, 0))) {
2691 case LPAR:
2692 com_call_function(c, CHILD(n, 1));
2693 break;
2694 case DOT:
2695 com_select_member(c, CHILD(n, 1));
2696 break;
2697 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002698 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002699 break;
2700 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002701 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002702 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002703 }
2704}
2705
2706static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002707com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002708{
2709 int i;
2710 REQ(n, power);
2711 com_atom(c, CHILD(n, 0));
2712 for (i = 1; i < NCH(n); i++) {
2713 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2714 com_factor(c, CHILD(n, i+1));
2715 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002716 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002717 break;
2718 }
2719 else
2720 com_apply_trailer(c, CHILD(n, i));
2721 }
2722}
2723
2724static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002725com_invert_constant(struct compiling *c, node *n)
2726{
2727 /* Compute the inverse of int and longs and use them directly,
2728 but be prepared to generate code for all other
2729 possibilities (invalid numbers, floats, complex).
2730 */
2731 PyObject *num, *inv = NULL;
2732 int i;
2733
2734 REQ(n, NUMBER);
2735 num = parsenumber(c, STR(n));
2736 if (num == NULL)
2737 i = 255;
2738 else {
2739 inv = PyNumber_Invert(num);
2740 if (inv == NULL) {
2741 PyErr_Clear();
2742 i = com_addconst(c, num);
2743 } else {
2744 i = com_addconst(c, inv);
2745 Py_DECREF(inv);
2746 }
2747 Py_DECREF(num);
2748 }
2749 com_addoparg(c, LOAD_CONST, i);
2750 com_push(c, 1);
2751 if (num != NULL && inv == NULL)
2752 com_addbyte(c, UNARY_INVERT);
2753}
2754
Tim Peters51e26512001-09-07 08:45:55 +00002755static int
2756is_float_zero(const char *p)
2757{
2758 int found_radix_point = 0;
2759 int ch;
2760 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2761 switch (ch) {
2762 case '0':
2763 /* no reason to believe it's not 0 -- continue */
2764 break;
2765
2766 case 'e': case 'E': case 'j': case 'J':
2767 /* If this was a hex constant, we already would have
2768 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2769 must be an exponent marker, and we haven't yet
2770 seen a non-zero digit, and it doesn't matter what
2771 the exponent is then. For 'j' or 'J' similarly,
2772 except that this is an imaginary 0 then. */
2773 return 1;
2774
2775 case '.':
2776 found_radix_point = 1;
2777 break;
2778
2779 default:
2780 return 0;
2781 }
2782 }
2783 return found_radix_point;
2784}
2785
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002787com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002788{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002789 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002790 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002791 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002792 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002793 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002794 approriate value as a constant. If the value is negative,
2795 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002796 negative in the 0th position -- unless we're doing unary minus
2797 of a floating zero! In that case the sign is significant, but
2798 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002799 */
2800 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002801 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002802 && TYPE((pfactor = CHILD(n, 1))) == factor
2803 && NCH(pfactor) == 1
2804 && TYPE((ppower = CHILD(pfactor, 0))) == power
2805 && NCH(ppower) == 1
2806 && TYPE((patom = CHILD(ppower, 0))) == atom
2807 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002808 && !(childtype == MINUS &&
2809 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002810 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002811 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002812 return;
2813 }
2814 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002815 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002816 if (s == NULL) {
2817 com_error(c, PyExc_MemoryError, "");
2818 com_addbyte(c, 255);
2819 return;
2820 }
2821 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002822 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002823 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002824 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002825 }
Tim Peters51e26512001-09-07 08:45:55 +00002826 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002827 }
2828 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002829 com_factor(c, CHILD(n, 1));
2830 com_addbyte(c, UNARY_POSITIVE);
2831 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002832 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002833 com_factor(c, CHILD(n, 1));
2834 com_addbyte(c, UNARY_NEGATIVE);
2835 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002836 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002837 com_factor(c, CHILD(n, 1));
2838 com_addbyte(c, UNARY_INVERT);
2839 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002841 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002842 }
2843}
2844
2845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847{
2848 int i;
2849 int op;
2850 REQ(n, term);
2851 com_factor(c, CHILD(n, 0));
2852 for (i = 2; i < NCH(n); i += 2) {
2853 com_factor(c, CHILD(n, i));
2854 switch (TYPE(CHILD(n, i-1))) {
2855 case STAR:
2856 op = BINARY_MULTIPLY;
2857 break;
2858 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002859 if (c->c_flags & CO_FUTURE_DIVISION)
2860 op = BINARY_TRUE_DIVIDE;
2861 else
2862 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 break;
2864 case PERCENT:
2865 op = BINARY_MODULO;
2866 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002867 case DOUBLESLASH:
2868 op = BINARY_FLOOR_DIVIDE;
2869 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002871 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002872 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002873 op = 255;
2874 }
2875 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002876 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002877 }
2878}
2879
2880static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002881com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002882{
2883 int i;
2884 int op;
2885 REQ(n, arith_expr);
2886 com_term(c, CHILD(n, 0));
2887 for (i = 2; i < NCH(n); i += 2) {
2888 com_term(c, CHILD(n, i));
2889 switch (TYPE(CHILD(n, i-1))) {
2890 case PLUS:
2891 op = BINARY_ADD;
2892 break;
2893 case MINUS:
2894 op = BINARY_SUBTRACT;
2895 break;
2896 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002897 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002898 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002899 op = 255;
2900 }
2901 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002902 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002903 }
2904}
2905
2906static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002907com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002908{
2909 int i;
2910 int op;
2911 REQ(n, shift_expr);
2912 com_arith_expr(c, CHILD(n, 0));
2913 for (i = 2; i < NCH(n); i += 2) {
2914 com_arith_expr(c, CHILD(n, i));
2915 switch (TYPE(CHILD(n, i-1))) {
2916 case LEFTSHIFT:
2917 op = BINARY_LSHIFT;
2918 break;
2919 case RIGHTSHIFT:
2920 op = BINARY_RSHIFT;
2921 break;
2922 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002923 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002924 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002925 op = 255;
2926 }
2927 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002928 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002929 }
2930}
2931
2932static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002933com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002934{
2935 int i;
2936 int op;
2937 REQ(n, and_expr);
2938 com_shift_expr(c, CHILD(n, 0));
2939 for (i = 2; i < NCH(n); i += 2) {
2940 com_shift_expr(c, CHILD(n, i));
2941 if (TYPE(CHILD(n, i-1)) == AMPER) {
2942 op = BINARY_AND;
2943 }
2944 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002945 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002946 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002947 op = 255;
2948 }
2949 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002950 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002951 }
2952}
2953
2954static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002955com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002956{
2957 int i;
2958 int op;
2959 REQ(n, xor_expr);
2960 com_and_expr(c, CHILD(n, 0));
2961 for (i = 2; i < NCH(n); i += 2) {
2962 com_and_expr(c, CHILD(n, i));
2963 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2964 op = BINARY_XOR;
2965 }
2966 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002967 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002968 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002969 op = 255;
2970 }
2971 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002972 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002973 }
2974}
2975
2976static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002977com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002978{
2979 int i;
2980 int op;
2981 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002982 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002984 com_xor_expr(c, CHILD(n, i));
2985 if (TYPE(CHILD(n, i-1)) == VBAR) {
2986 op = BINARY_OR;
2987 }
2988 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002989 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002990 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002991 op = 255;
2992 }
2993 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002995 }
2996}
2997
2998static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002999cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000{
3001 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003002 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003003 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3004 if (NCH(n) == 1) {
3005 n = CHILD(n, 0);
3006 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003007 case LESS: return PyCmp_LT;
3008 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003009 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003010 case LESSEQUAL: return PyCmp_LE;
3011 case GREATEREQUAL: return PyCmp_GE;
3012 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3013 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3014 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003015 }
3016 }
3017 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003018 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003020 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003022 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003023 }
3024 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003025 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026}
3027
3028static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003029com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030{
3031 int i;
3032 enum cmp_op op;
3033 int anchor;
3034 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3035 com_expr(c, CHILD(n, 0));
3036 if (NCH(n) == 1)
3037 return;
3038
3039 /****************************************************************
3040 The following code is generated for all but the last
3041 comparison in a chain:
3042
3043 label: on stack: opcode: jump to:
3044
3045 a <code to load b>
3046 a, b DUP_TOP
3047 a, b, b ROT_THREE
3048 b, a, b COMPARE_OP
3049 b, 0-or-1 JUMP_IF_FALSE L1
3050 b, 1 POP_TOP
3051 b
3052
3053 We are now ready to repeat this sequence for the next
3054 comparison in the chain.
3055
3056 For the last we generate:
3057
3058 b <code to load c>
3059 b, c COMPARE_OP
3060 0-or-1
3061
3062 If there were any jumps to L1 (i.e., there was more than one
3063 comparison), we generate:
3064
3065 0-or-1 JUMP_FORWARD L2
3066 L1: b, 0 ROT_TWO
3067 0, b POP_TOP
3068 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003069 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 ****************************************************************/
3071
3072 anchor = 0;
3073
3074 for (i = 2; i < NCH(n); i += 2) {
3075 com_expr(c, CHILD(n, i));
3076 if (i+2 < NCH(n)) {
3077 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003078 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079 com_addbyte(c, ROT_THREE);
3080 }
3081 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003082 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003083 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003084 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 }
3086 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003087 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003088 if (i+2 < NCH(n)) {
3089 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3090 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003091 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 }
3093 }
3094
3095 if (anchor) {
3096 int anchor2 = 0;
3097 com_addfwref(c, JUMP_FORWARD, &anchor2);
3098 com_backpatch(c, anchor);
3099 com_addbyte(c, ROT_TWO);
3100 com_addbyte(c, POP_TOP);
3101 com_backpatch(c, anchor2);
3102 }
3103}
3104
3105static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003106com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003107{
3108 REQ(n, not_test); /* 'not' not_test | comparison */
3109 if (NCH(n) == 1) {
3110 com_comparison(c, CHILD(n, 0));
3111 }
3112 else {
3113 com_not_test(c, CHILD(n, 1));
3114 com_addbyte(c, UNARY_NOT);
3115 }
3116}
3117
3118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003119com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003120{
3121 int i;
3122 int anchor;
3123 REQ(n, and_test); /* not_test ('and' not_test)* */
3124 anchor = 0;
3125 i = 0;
3126 for (;;) {
3127 com_not_test(c, CHILD(n, i));
3128 if ((i += 2) >= NCH(n))
3129 break;
3130 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3131 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003132 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 }
3134 if (anchor)
3135 com_backpatch(c, anchor);
3136}
3137
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003138static int
3139com_make_closure(struct compiling *c, PyCodeObject *co)
3140{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003141 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003142 if (free == 0)
3143 return 0;
3144 for (i = 0; i < free; ++i) {
3145 /* Bypass com_addop_varname because it will generate
3146 LOAD_DEREF but LOAD_CLOSURE is needed.
3147 */
3148 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3149 int arg, reftype;
3150
3151 /* Special case: If a class contains a method with a
3152 free variable that has the same name as a method,
3153 the name will be considered free *and* local in the
3154 class. It should be handled by the closure, as
3155 well as by the normal name loookup logic.
3156 */
3157 reftype = get_ref_type(c, PyString_AS_STRING(name));
3158 if (reftype == CELL)
3159 arg = com_lookup_arg(c->c_cellvars, name);
3160 else /* (reftype == FREE) */
3161 arg = com_lookup_arg(c->c_freevars, name);
3162 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003163 fprintf(stderr, "lookup %s in %s %d %d\n"
3164 "freevars of %s: %s\n",
3165 PyObject_REPR(name),
3166 c->c_name,
3167 reftype, arg,
3168 PyString_AS_STRING(co->co_name),
3169 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003170 Py_FatalError("com_make_closure()");
3171 }
3172 com_addoparg(c, LOAD_CLOSURE, arg);
3173
3174 }
3175 com_push(c, free);
3176 return 1;
3177}
3178
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003180com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003181{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003182 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003183 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003184 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003185 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003186 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003187 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3188 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003189 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003190 if (co == NULL) {
3191 c->c_errors++;
3192 return;
3193 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003194 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003195 i = com_addconst(c, (PyObject *)co);
3196 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003197 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003198 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003199 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003200 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003201 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003202 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003203 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003204 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003207 else {
3208 int anchor = 0;
3209 int i = 0;
3210 for (;;) {
3211 com_and_test(c, CHILD(n, i));
3212 if ((i += 2) >= NCH(n))
3213 break;
3214 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3215 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003216 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003217 }
3218 if (anchor)
3219 com_backpatch(c, anchor);
3220 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003221}
3222
3223static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003224com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225{
3226 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003227 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228 com_node(c, CHILD(n, 0));
3229 }
3230 else {
3231 int i;
3232 int len;
3233 len = (NCH(n) + 1) / 2;
3234 for (i = 0; i < NCH(n); i += 2)
3235 com_node(c, CHILD(n, i));
3236 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003237 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 }
3239}
3240
3241
3242/* Begin of assignment compilation */
3243
Thomas Wouters434d0822000-08-24 20:11:32 +00003244
3245static void
3246com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3247{
3248 com_addbyte(c, DUP_TOP);
3249 com_push(c, 1);
3250 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003251 com_node(c, augn);
3252 com_addbyte(c, opcode);
3253 com_pop(c, 1);
3254 com_addbyte(c, ROT_TWO);
3255 com_addopname(c, STORE_ATTR, n);
3256 com_pop(c, 2);
3257}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258
3259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003262 if (none_assignment_check(c, STR(n), assigning))
3263 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003264 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003265 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003266}
3267
3268static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003269com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003270{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 REQ(n, trailer);
3272 switch (TYPE(CHILD(n, 0))) {
3273 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003274 if (assigning == OP_DELETE)
3275 com_error(c, PyExc_SyntaxError,
3276 "can't delete function call");
3277 else
3278 com_error(c, PyExc_SyntaxError,
3279 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280 break;
3281 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003282 if (assigning > OP_APPLY)
3283 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3284 else
3285 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003287 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003288 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289 break;
3290 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003291 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003292 }
3293}
3294
3295static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003296com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297{
3298 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003299 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3300 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003302 if (assigning) {
3303 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003304 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003305 com_push(c, i-1);
3306 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003308 com_assign(c, CHILD(n, i), assigning, NULL);
3309}
3310
3311static void
3312com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3313{
3314 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003315 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003316 com_push(c, 1);
3317 com_node(c, augn);
3318 com_addbyte(c, opcode);
3319 com_pop(c, 1);
3320 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003321}
3322
3323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003324com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325{
3326 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003327 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003328 if (assigning)
3329 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330}
3331
3332static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003333com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003334{
3335 /* Loop to avoid trivial recursion */
3336 for (;;) {
3337 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003338
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 case exprlist:
3340 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003341 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003342 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003343 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003344 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003345 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003346 "assign to generator expression not possible");
3347 return;
3348 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003349 if (assigning > OP_APPLY) {
3350 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003351 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003352 return;
3353 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003354 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003355 return;
3356 }
3357 n = CHILD(n, 0);
3358 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003359
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 case test:
3361 case and_test:
3362 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003363 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003365 case xor_expr:
3366 case and_expr:
3367 case shift_expr:
3368 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003370 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003372 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003373 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374 return;
3375 }
3376 n = CHILD(n, 0);
3377 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003378
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003379 case power: /* atom trailer* ('**' power)*
3380 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003381 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003382 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003383 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384 return;
3385 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003386 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387 int i;
3388 com_node(c, CHILD(n, 0));
3389 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003390 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003391 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003392 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003393 return;
3394 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003395 com_apply_trailer(c, CHILD(n, i));
3396 } /* NB i is still alive */
3397 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003398 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003399 return;
3400 }
3401 n = CHILD(n, 0);
3402 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003403
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003404 case atom:
3405 switch (TYPE(CHILD(n, 0))) {
3406 case LPAR:
3407 n = CHILD(n, 1);
3408 if (TYPE(n) == RPAR) {
3409 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003410 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003411 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003412 return;
3413 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003414 if (assigning > OP_APPLY) {
3415 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003416 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003417 return;
3418 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 break;
3420 case LSQB:
3421 n = CHILD(n, 1);
3422 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003423 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003424 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003425 return;
3426 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003427 if (assigning > OP_APPLY) {
3428 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003429 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003430 return;
3431 }
3432 if (NCH(n) > 1
3433 && TYPE(CHILD(n, 1)) == list_for) {
3434 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003435 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003436 return;
3437 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003438 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 return;
3440 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003441 if (assigning > OP_APPLY)
3442 com_augassign_name(c, CHILD(n, 0),
3443 assigning, augn);
3444 else
3445 com_assign_name(c, CHILD(n, 0),
3446 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003447 return;
3448 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003449 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003450 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 return;
3452 }
3453 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003454
3455 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003456 com_error(c, PyExc_SyntaxError,
3457 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003458 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003459
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003460 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 com_error(c, PyExc_SystemError,
3462 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003464
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 }
3466 }
3467}
Guido van Rossum7c531111997-03-11 18:42:21 +00003468
Thomas Wouters434d0822000-08-24 20:11:32 +00003469static void
3470com_augassign(struct compiling *c, node *n)
3471{
3472 int opcode;
3473
3474 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3475 case '+': opcode = INPLACE_ADD; break;
3476 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003477 case '/':
3478 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3479 opcode = INPLACE_FLOOR_DIVIDE;
3480 else if (c->c_flags & CO_FUTURE_DIVISION)
3481 opcode = INPLACE_TRUE_DIVIDE;
3482 else
3483 opcode = INPLACE_DIVIDE;
3484 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003485 case '%': opcode = INPLACE_MODULO; break;
3486 case '<': opcode = INPLACE_LSHIFT; break;
3487 case '>': opcode = INPLACE_RSHIFT; break;
3488 case '&': opcode = INPLACE_AND; break;
3489 case '^': opcode = INPLACE_XOR; break;
3490 case '|': opcode = INPLACE_OR; break;
3491 case '*':
3492 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3493 opcode = INPLACE_POWER;
3494 else
3495 opcode = INPLACE_MULTIPLY;
3496 break;
3497 default:
3498 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3499 return;
3500 }
3501 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3502}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003503
3504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003505com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506{
Thomas Wouters434d0822000-08-24 20:11:32 +00003507 REQ(n, expr_stmt);
3508 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003510 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003511 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003512 if (NCH(n) == 1) {
3513 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003514 if (c->c_interactive)
3515 com_addbyte(c, PRINT_EXPR);
3516 else
3517 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003520 else if (TYPE(CHILD(n,1)) == augassign)
3521 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 else {
3523 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003524 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003525 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003528 com_push(c, 1);
3529 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003530 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003531 }
3532 }
3533}
3534
3535static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003536com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003537{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003538 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003539 int i;
3540 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003541 if (Py_OptimizeFlag)
3542 return;
3543 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003544
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003545 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003546 raise AssertionError [, <message>]
3547
3548 where <message> is the second test, if present.
3549 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003550 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003551 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003552 com_addbyte(c, POP_TOP);
3553 com_pop(c, 1);
3554 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003555 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003556 com_push(c, 1);
3557 i = NCH(n)/2; /* Either 2 or 4 */
3558 if (i > 1)
3559 com_node(c, CHILD(n, 3));
3560 com_addoparg(c, RAISE_VARARGS, i);
3561 com_pop(c, i);
3562 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003563 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003564 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003565 com_addbyte(c, POP_TOP);
3566}
3567
3568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003569com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003570{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003571 int i = 1;
3572 node* stream = NULL;
3573
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003574 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003575
3576 /* are we using the extended print form? */
3577 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3578 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003579 com_node(c, stream);
3580 /* stack: [...] => [... stream] */
3581 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003582 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3583 i = 4;
3584 else
3585 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003587 for (; i < NCH(n); i += 2) {
3588 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003589 com_addbyte(c, DUP_TOP);
3590 /* stack: [stream] => [stream stream] */
3591 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003592 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003593 /* stack: [stream stream] => [stream stream obj] */
3594 com_addbyte(c, ROT_TWO);
3595 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003596 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003597 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003598 com_pop(c, 2);
3599 }
3600 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003601 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003602 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003603 com_addbyte(c, PRINT_ITEM);
3604 com_pop(c, 1);
3605 }
3606 }
3607 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003608 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003609 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003610 /* must pop the extra stream object off the stack */
3611 com_addbyte(c, POP_TOP);
3612 /* stack: [... stream] => [...] */
3613 com_pop(c, 1);
3614 }
3615 }
3616 else {
3617 if (stream != NULL) {
3618 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003619 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003620 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003621 com_pop(c, 1);
3622 }
3623 else
3624 com_addbyte(c, PRINT_NEWLINE);
3625 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003626}
3627
3628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003629com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003630{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003631 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003632 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003633 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003634 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003635 if (c->c_flags & CO_GENERATOR) {
3636 if (NCH(n) > 1) {
3637 com_error(c, PyExc_SyntaxError,
3638 "'return' with argument inside generator");
3639 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003640 }
3641 if (NCH(n) < 2) {
3642 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003643 com_push(c, 1);
3644 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003645 else
3646 com_node(c, CHILD(n, 1));
3647 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003648 com_pop(c, 1);
3649}
3650
3651static void
3652com_yield_stmt(struct compiling *c, node *n)
3653{
Tim Peters95c80f82001-06-23 02:07:08 +00003654 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003655 REQ(n, yield_stmt); /* 'yield' testlist */
3656 if (!c->c_infunction) {
3657 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3658 }
Tim Peters95c80f82001-06-23 02:07:08 +00003659
3660 for (i = 0; i < c->c_nblocks; ++i) {
3661 if (c->c_block[i] == SETUP_FINALLY) {
3662 com_error(c, PyExc_SyntaxError,
3663 "'yield' not allowed in a 'try' block "
3664 "with a 'finally' clause");
3665 return;
3666 }
3667 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003668 com_node(c, CHILD(n, 1));
3669 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003670 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003671}
3672
3673static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003674com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003675{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003676 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003677 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3678 if (NCH(n) > 1) {
3679 com_node(c, CHILD(n, 1));
3680 if (NCH(n) > 3) {
3681 com_node(c, CHILD(n, 3));
3682 if (NCH(n) > 5)
3683 com_node(c, CHILD(n, 5));
3684 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003685 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003686 i = NCH(n)/2;
3687 com_addoparg(c, RAISE_VARARGS, i);
3688 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689}
3690
3691static void
Thomas Wouters52152252000-08-17 22:55:00 +00003692com_from_import(struct compiling *c, node *n)
3693{
3694 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3695 com_push(c, 1);
3696 if (NCH(n) > 1) {
3697 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3698 com_error(c, PyExc_SyntaxError, "invalid syntax");
3699 return;
3700 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003701 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003702 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003703 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003704 com_pop(c, 1);
3705}
3706
3707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003708com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003709{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003710 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003711 int i;
3712 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003713 n = CHILD(n, 0);
3714 /* import_stmt: import_name | import_from */
3715 if (TYPE(n) == import_from) {
3716 /* 'from' dotted_name 'import' ('*' |
3717 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003718 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003719 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003720 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3721 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003722 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003723 else {
3724 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3725 TYPE(CHILD(n, 3)) != LPAR) {
3726 com_error(c, PyExc_SyntaxError,
3727 "trailing comma not allowed "
3728 "without surrounding parentheses");
3729 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003730 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003731 REQ(nn, import_as_names);
3732 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003733 for (i = 0; i < NCH(nn); i += 2) {
3734 PyObject *s = PyString_FromString(
3735 STR(CHILD(CHILD(nn, i), 0)));
3736 if (s == NULL) {
3737 Py_CLEAR(tup);
3738 break;
3739 } else
3740 PyTuple_SET_ITEM(tup, i / 2, s);
3741 }
3742 if (tup == NULL) {
3743 /* Assume that failue above was MemoryError */
3744 com_error(c, PyExc_MemoryError, "");
3745 return;
3746 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003747 }
3748 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003749 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003750 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003751 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003752 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003753 com_addbyte(c, IMPORT_STAR);
3754 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003755 for (i = 0; i < NCH(nn); i += 2)
3756 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003757 com_addbyte(c, POP_TOP);
3758 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003759 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003760 }
3761 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003762 /* 'import' dotted_as_names */
3763 nn = CHILD(n, 1);
3764 REQ(nn, dotted_as_names);
3765 for (i = 0; i < NCH(nn); i += 2) {
3766 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003767 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003768 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003769 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003770 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003771 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003772 int j;
3773 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003774 com_error(c, PyExc_SyntaxError,
3775 "invalid syntax");
3776 return;
3777 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003778 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3779 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003780 CHILD(CHILD(subn, 0),
3781 j));
3782 com_addop_varname(c, VAR_STORE,
3783 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003784 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003785 com_addop_varname(c, VAR_STORE,
3786 STR(CHILD(CHILD(subn, 0),
3787 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003788 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 }
3790 }
3791}
3792
3793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003794com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003795{
3796 REQ(n, exec_stmt);
3797 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3798 com_node(c, CHILD(n, 1));
3799 if (NCH(n) >= 4)
3800 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003801 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003802 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003803 com_push(c, 1);
3804 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003805 if (NCH(n) >= 6)
3806 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003807 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003808 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 com_push(c, 1);
3810 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003811 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003812 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003813}
3814
Guido van Rossum7c531111997-03-11 18:42:21 +00003815static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003816is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003817{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003818 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003819 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003820 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003821
3822 /* Label to avoid tail recursion */
3823 next:
3824 switch (TYPE(n)) {
3825
3826 case suite:
3827 if (NCH(n) == 1) {
3828 n = CHILD(n, 0);
3829 goto next;
3830 }
3831 /* Fall through */
3832 case file_input:
3833 for (i = 0; i < NCH(n); i++) {
3834 node *ch = CHILD(n, i);
3835 if (TYPE(ch) == stmt) {
3836 n = ch;
3837 goto next;
3838 }
3839 }
3840 break;
3841
3842 case stmt:
3843 case simple_stmt:
3844 case small_stmt:
3845 n = CHILD(n, 0);
3846 goto next;
3847
3848 case expr_stmt:
3849 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003850 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003851 case test:
3852 case and_test:
3853 case not_test:
3854 case comparison:
3855 case expr:
3856 case xor_expr:
3857 case and_expr:
3858 case shift_expr:
3859 case arith_expr:
3860 case term:
3861 case factor:
3862 case power:
3863 case atom:
3864 if (NCH(n) == 1) {
3865 n = CHILD(n, 0);
3866 goto next;
3867 }
3868 break;
3869
3870 case NAME:
3871 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3872 return 1;
3873 break;
3874
3875 case NUMBER:
3876 v = parsenumber(c, STR(n));
3877 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003878 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003879 break;
3880 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 i = PyObject_IsTrue(v);
3882 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003883 return i == 0;
3884
3885 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003886 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003887 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003888 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003889 break;
3890 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003891 i = PyObject_IsTrue(v);
3892 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003893 return i == 0;
3894
3895 }
3896 return 0;
3897}
3898
Tim Peters08a898f2001-06-28 01:52:22 +00003899
3900/* Look under n for a return stmt with an expression.
3901 * This hack is used to find illegal returns under "if 0:" blocks in
3902 * functions already known to be generators (as determined by the symtable
3903 * pass).
3904 * Return the offending return node if found, else NULL.
3905 */
3906static node *
3907look_for_offending_return(node *n)
3908{
3909 int i;
3910
3911 for (i = 0; i < NCH(n); ++i) {
3912 node *kid = CHILD(n, i);
3913
3914 switch (TYPE(kid)) {
3915 case classdef:
3916 case funcdef:
3917 case lambdef:
3918 /* Stuff in nested functions & classes doesn't
3919 affect the code block we started in. */
3920 return NULL;
3921
3922 case return_stmt:
3923 if (NCH(kid) > 1)
3924 return kid;
3925 break;
3926
3927 default: {
3928 node *bad = look_for_offending_return(kid);
3929 if (bad != NULL)
3930 return bad;
3931 }
3932 }
3933 }
3934
3935 return NULL;
3936}
3937
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003939com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003940{
3941 int i;
3942 int anchor = 0;
3943 REQ(n, if_stmt);
3944 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3945 for (i = 0; i+3 < NCH(n); i+=4) {
3946 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003947 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003948 if (is_constant_false(c, ch)) {
3949 /* We're going to skip this block. However, if this
3950 is a generator, we have to check the dead code
3951 anyway to make sure there aren't any return stmts
3952 with expressions, in the same scope. */
3953 if (c->c_flags & CO_GENERATOR) {
3954 node *p = look_for_offending_return(n);
3955 if (p != NULL) {
3956 int savelineno = c->c_lineno;
3957 c->c_lineno = p->n_lineno;
3958 com_error(c, PyExc_SyntaxError,
3959 "'return' with argument "
3960 "inside generator");
3961 c->c_lineno = savelineno;
3962 }
3963 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003964 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003965 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003966 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003967 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003968 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003969 com_addfwref(c, JUMP_IF_FALSE, &a);
3970 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003971 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003972 com_node(c, CHILD(n, i+3));
3973 com_addfwref(c, JUMP_FORWARD, &anchor);
3974 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003975 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 com_addbyte(c, POP_TOP);
3977 }
3978 if (i+2 < NCH(n))
3979 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003980 if (anchor)
3981 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003982}
3983
3984static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003985com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003986{
3987 int break_anchor = 0;
3988 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003989 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3991 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003992 block_push(c, SETUP_LOOP);
3993 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003994 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003995 com_node(c, CHILD(n, 1));
3996 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3997 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003998 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003999 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004000 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004001 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004002 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4003 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004004 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004006 com_addbyte(c, POP_TOP);
4007 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004008 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004009 if (NCH(n) > 4)
4010 com_node(c, CHILD(n, 6));
4011 com_backpatch(c, break_anchor);
4012}
4013
4014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004015com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004017 int break_anchor = 0;
4018 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004019 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004020 REQ(n, for_stmt);
4021 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4022 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004023 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004024 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004025 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004026 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004027 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004028 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004029 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004030 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004031 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004032 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004033 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004034 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4035 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004036 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004037 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004038 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004039 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004040 if (NCH(n) > 8)
4041 com_node(c, CHILD(n, 8));
4042 com_backpatch(c, break_anchor);
4043}
4044
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004045/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004046
4047 SETUP_FINALLY L
4048 <code for S>
4049 POP_BLOCK
4050 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004051 L: <code for Sf>
4052 END_FINALLY
4053
4054 The special instructions use the block stack. Each block
4055 stack entry contains the instruction that created it (here
4056 SETUP_FINALLY), the level of the value stack at the time the
4057 block stack entry was created, and a label (here L).
4058
4059 SETUP_FINALLY:
4060 Pushes the current value stack level and the label
4061 onto the block stack.
4062 POP_BLOCK:
4063 Pops en entry from the block stack, and pops the value
4064 stack until its level is the same as indicated on the
4065 block stack. (The label is ignored.)
4066 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004067 Pops a variable number of entries from the *value* stack
4068 and re-raises the exception they specify. The number of
4069 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004070
4071 The block stack is unwound when an exception is raised:
4072 when a SETUP_FINALLY entry is found, the exception is pushed
4073 onto the value stack (and the exception condition is cleared),
4074 and the interpreter jumps to the label gotten from the block
4075 stack.
4076
4077 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004078 (The contents of the value stack is shown in [], with the top
4079 at the right; 'tb' is trace-back info, 'val' the exception's
4080 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004081
4082 Value stack Label Instruction Argument
4083 [] SETUP_EXCEPT L1
4084 [] <code for S>
4085 [] POP_BLOCK
4086 [] JUMP_FORWARD L0
4087
Guido van Rossum3f5da241990-12-20 15:06:42 +00004088 [tb, val, exc] L1: DUP )
4089 [tb, val, exc, exc] <evaluate E1> )
4090 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4091 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4092 [tb, val, exc, 1] POP )
4093 [tb, val, exc] POP
4094 [tb, val] <assign to V1> (or POP if no V1)
4095 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004096 [] <code for S1>
4097 JUMP_FORWARD L0
4098
Guido van Rossum3f5da241990-12-20 15:06:42 +00004099 [tb, val, exc, 0] L2: POP
4100 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004101 .............................etc.......................
4102
Guido van Rossum3f5da241990-12-20 15:06:42 +00004103 [tb, val, exc, 0] Ln+1: POP
4104 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004105
4106 [] L0: <next statement>
4107
4108 Of course, parts are not generated if Vi or Ei is not present.
4109*/
4110
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004112com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004113{
4114 int except_anchor = 0;
4115 int end_anchor = 0;
4116 int else_anchor = 0;
4117 int i;
4118 node *ch;
4119
4120 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4121 block_push(c, SETUP_EXCEPT);
4122 com_node(c, CHILD(n, 2));
4123 com_addbyte(c, POP_BLOCK);
4124 block_pop(c, SETUP_EXCEPT);
4125 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4126 com_backpatch(c, except_anchor);
4127 for (i = 3;
4128 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4129 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004130 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004131 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004132 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004133 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004134 break;
4135 }
4136 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004138 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004139 if (NCH(ch) > 1) {
4140 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004141 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004142 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004143 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004144 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004145 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4146 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004147 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004148 }
4149 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004150 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004151 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004152 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004153 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004154 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004155 com_pop(c, 1);
4156 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004157 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004158 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004159 com_node(c, CHILD(n, i+2));
4160 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4161 if (except_anchor) {
4162 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004163 /* We come in with [tb, val, exc, 0] on the
4164 stack; one pop and it's the same as
4165 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004166 com_addbyte(c, POP_TOP);
4167 }
4168 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004169 /* We actually come in here with [tb, val, exc] but the
4170 END_FINALLY will zap those and jump around.
4171 The c_stacklevel does not reflect them so we need not pop
4172 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004173 com_addbyte(c, END_FINALLY);
4174 com_backpatch(c, else_anchor);
4175 if (i < NCH(n))
4176 com_node(c, CHILD(n, i+2));
4177 com_backpatch(c, end_anchor);
4178}
4179
4180static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004181com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004182{
4183 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004184 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004185
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004186 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4187 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004188 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004189 com_addbyte(c, POP_BLOCK);
4190 block_pop(c, SETUP_FINALLY);
4191 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004192 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004193 /* While the generated code pushes only one item,
4194 the try-finally handling can enter here with
4195 up to three items. OK, here are the details:
4196 3 for an exception, 2 for RETURN, 1 for BREAK. */
4197 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004198 com_backpatch(c, finally_anchor);
4199 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004200 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004201 com_node(c, ch);
4202 com_addbyte(c, END_FINALLY);
4203 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004204 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004205}
4206
4207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004208com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004209{
4210 REQ(n, try_stmt);
4211 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4212 | 'try' ':' suite 'finally' ':' suite */
4213 if (TYPE(CHILD(n, 3)) != except_clause)
4214 com_try_finally(c, n);
4215 else
4216 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004217}
4218
Guido van Rossum8b993a91997-01-17 21:04:03 +00004219static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004220get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004221{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004222 int i;
4223
Guido van Rossum8b993a91997-01-17 21:04:03 +00004224 /* Label to avoid tail recursion */
4225 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004226 switch (TYPE(n)) {
4227
4228 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004229 if (NCH(n) == 1) {
4230 n = CHILD(n, 0);
4231 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004232 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004233 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004234 case file_input:
4235 for (i = 0; i < NCH(n); i++) {
4236 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004237 if (TYPE(ch) == stmt) {
4238 n = ch;
4239 goto next;
4240 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004241 }
4242 break;
4243
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004244 case stmt:
4245 case simple_stmt:
4246 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004247 n = CHILD(n, 0);
4248 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004249
4250 case expr_stmt:
4251 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004252 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004253 case test:
4254 case and_test:
4255 case not_test:
4256 case comparison:
4257 case expr:
4258 case xor_expr:
4259 case and_expr:
4260 case shift_expr:
4261 case arith_expr:
4262 case term:
4263 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004264 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004265 if (NCH(n) == 1) {
4266 n = CHILD(n, 0);
4267 goto next;
4268 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004269 break;
4270
4271 case atom:
4272 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004273 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004274 break;
4275
4276 }
4277 return NULL;
4278}
4279
Guido van Rossum79f25d91997-04-29 20:08:16 +00004280static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004281get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004282{
Guido van Rossum541563e1999-01-28 15:08:09 +00004283 /* Don't generate doc-strings if run with -OO */
4284 if (Py_OptimizeFlag > 1)
4285 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004286 n = get_rawdocstring(n);
4287 if (n == NULL)
4288 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004289 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004290}
4291
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004292static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004293com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004294{
4295 REQ(n, suite);
4296 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4297 if (NCH(n) == 1) {
4298 com_node(c, CHILD(n, 0));
4299 }
4300 else {
4301 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004302 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004303 node *ch = CHILD(n, i);
4304 if (TYPE(ch) == stmt)
4305 com_node(c, ch);
4306 }
4307 }
4308}
4309
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004310/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004312com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004313{
4314 int i = c->c_nblocks;
4315 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4316 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4317 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004318 else if (i <= 0) {
4319 /* at the outer level */
4320 com_error(c, PyExc_SyntaxError,
4321 "'continue' not properly in loop");
4322 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004323 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004324 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004325 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004326 if (c->c_block[j] == SETUP_LOOP)
4327 break;
4328 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004329 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004330 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004331 for (; i > j; --i) {
4332 if (c->c_block[i] == SETUP_EXCEPT ||
4333 c->c_block[i] == SETUP_FINALLY) {
4334 com_addoparg(c, CONTINUE_LOOP,
4335 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004336 return;
4337 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004338 if (c->c_block[i] == END_FINALLY) {
4339 com_error(c, PyExc_SyntaxError,
4340 "'continue' not supported inside 'finally' clause");
4341 return;
4342 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004343 }
4344 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004345 com_error(c, PyExc_SyntaxError,
4346 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004347 }
4348 /* XXX Could allow it inside a 'finally' clause
4349 XXX if we could pop the exception still on the stack */
4350}
4351
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004352/* Return the number of default values in the argument list.
4353
4354 If a non-default argument follows a default argument, set an
4355 exception and return -1.
4356*/
4357
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004358static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004359com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004360{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004361 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004362 if (TYPE(n) == lambdef) {
4363 /* lambdef: 'lambda' [varargslist] ':' test */
4364 n = CHILD(n, 1);
4365 }
4366 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004367 REQ(n, funcdef);
4368 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4369 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004370 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4371 n = CHILD(n, 1);
4372 }
4373 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004374 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004375 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004376 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004377 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4378 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004379 ndefs = 0;
4380 for (i = 0; i < nch; i++) {
4381 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004382 if (TYPE(CHILD(n, i)) == STAR ||
4383 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004384 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004385 i++;
4386 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004387 t = RPAR; /* Anything except EQUAL or COMMA */
4388 else
4389 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004390 if (t == EQUAL) {
4391 i++;
4392 ndefs++;
4393 com_node(c, CHILD(n, i));
4394 i++;
4395 if (i >= nch)
4396 break;
4397 t = TYPE(CHILD(n, i));
4398 }
4399 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004400 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004401 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004402 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004403 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004404 return -1;
4405 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004406 }
4407 if (t != COMMA)
4408 break;
4409 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004410 return ndefs;
4411}
4412
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004413static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004414com_decorator_name(struct compiling *c, node *n)
4415{
4416 /* dotted_name: NAME ('.' NAME)* */
4417
4418 int i, nch;
4419 node *varname;
4420
4421 REQ(n, dotted_name);
4422 nch = NCH(n);
4423 assert(nch >= 1 && nch % 2 == 1);
4424
4425 varname = CHILD(n, 0);
4426 REQ(varname, NAME);
4427 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004428 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004429
4430 for (i = 1; i < nch; i += 2) {
4431 node *attrname;
4432
4433 REQ(CHILD(n, i), DOT);
4434
4435 attrname = CHILD(n, i + 1);
4436 REQ(attrname, NAME);
4437 com_addop_name(c, LOAD_ATTR, STR(attrname));
4438 }
4439}
4440
4441static void
4442com_decorator(struct compiling *c, node *n)
4443{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004444 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004445 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004446 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004447 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004448 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004449 com_decorator_name(c, CHILD(n, 1));
4450
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004451 if (nch > 3) {
4452 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004453 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004454 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004455 com_call_function(c, CHILD(n, 3));
4456 }
4457}
4458
4459static int
4460com_decorators(struct compiling *c, node *n)
4461{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004462 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004463
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004464 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004465 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004466 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004467
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004468 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004469 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004470 REQ(ch, decorator);
4471
4472 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004473 }
4474
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004475 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004476}
4477
4478static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004479com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004480{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004481 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004482 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004483
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004484 REQ(n, funcdef);
4485 /* -6 -5 -4 -3 -2 -1
4486 funcdef: [decorators] 'def' NAME parameters ':' suite */
4487
4488 if (NCH(n) == 6)
4489 ndecorators = com_decorators(c, CHILD(n, 0));
4490 else
4491 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004492
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004493 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004494 if (ndefs < 0)
4495 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004496 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004497 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004498 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004499 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004500 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004501 c->c_errors++;
4502 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004503 int closure = com_make_closure(c, (PyCodeObject *)co);
4504 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004506 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 if (closure)
4508 com_addoparg(c, MAKE_CLOSURE, ndefs);
4509 else
4510 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004511 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004512
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004513 while (ndecorators > 0) {
4514 com_addoparg(c, CALL_FUNCTION, 1);
4515 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004516 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004517 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004518
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004519 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004520 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004521 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004522 }
4523}
4524
4525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004526com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004527{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004528 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004529 REQ(n, testlist);
4530 /* testlist: test (',' test)* [','] */
4531 for (i = 0; i < NCH(n); i += 2)
4532 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004533 i = (NCH(n)+1) / 2;
4534 com_addoparg(c, BUILD_TUPLE, i);
4535 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004536}
4537
4538static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004539com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004540{
Guido van Rossum25831651993-05-19 14:50:45 +00004541 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004542 PyObject *v;
4543 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004544 char *name;
4545
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004546 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004547 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004548 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004549 c->c_errors++;
4550 return;
4551 }
4552 /* Push the class name on the stack */
4553 i = com_addconst(c, v);
4554 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004555 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004556 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004557 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004558 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004559 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004560 com_push(c, 1);
4561 }
Guido van Rossum25831651993-05-19 14:50:45 +00004562 else
4563 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004564 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004565 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004566 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004567 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004569 c->c_errors++;
4570 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004571 int closure = com_make_closure(c, co);
4572 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004573 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004574 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004575 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004576 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004577 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004578 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004580 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004581 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004582 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004583 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004584 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004585 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004586 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004587}
4588
4589static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004590com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004591{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004592 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004593 if (c->c_errors)
4594 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004595 switch (TYPE(n)) {
4596
4597 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004598
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004599 case funcdef:
4600 com_funcdef(c, n);
4601 break;
4602 case classdef:
4603 com_classdef(c, n);
4604 break;
4605
4606 /* Trivial parse tree nodes */
4607
4608 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004609 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004610 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004611 n = CHILD(n, 0);
4612 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004613
4614 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004615 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004616 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004617 {
4618 int i;
4619 for (i = 0; i < NCH(n)-1; i += 2)
4620 com_node(c, CHILD(n, i));
4621 }
4622 break;
4623
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004624 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004625 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626 n = CHILD(n, 0);
4627 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004628
4629 /* Statement nodes */
4630
4631 case expr_stmt:
4632 com_expr_stmt(c, n);
4633 break;
4634 case print_stmt:
4635 com_print_stmt(c, n);
4636 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004637 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004638 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004639 break;
4640 case pass_stmt:
4641 break;
4642 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004643 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004644 com_error(c, PyExc_SyntaxError,
4645 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004646 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004647 com_addbyte(c, BREAK_LOOP);
4648 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004649 case continue_stmt:
4650 com_continue_stmt(c, n);
4651 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004652 case return_stmt:
4653 com_return_stmt(c, n);
4654 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004655 case yield_stmt:
4656 com_yield_stmt(c, n);
4657 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004658 case raise_stmt:
4659 com_raise_stmt(c, n);
4660 break;
4661 case import_stmt:
4662 com_import_stmt(c, n);
4663 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004664 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004665 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004666 case exec_stmt:
4667 com_exec_stmt(c, n);
4668 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004669 case assert_stmt:
4670 com_assert_stmt(c, n);
4671 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004672 case if_stmt:
4673 com_if_stmt(c, n);
4674 break;
4675 case while_stmt:
4676 com_while_stmt(c, n);
4677 break;
4678 case for_stmt:
4679 com_for_stmt(c, n);
4680 break;
4681 case try_stmt:
4682 com_try_stmt(c, n);
4683 break;
4684 case suite:
4685 com_suite(c, n);
4686 break;
4687
4688 /* Expression nodes */
4689
4690 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004691 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004692 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004693 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004694 break;
4695 case test:
4696 com_test(c, n);
4697 break;
4698 case and_test:
4699 com_and_test(c, n);
4700 break;
4701 case not_test:
4702 com_not_test(c, n);
4703 break;
4704 case comparison:
4705 com_comparison(c, n);
4706 break;
4707 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004708 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004709 break;
4710 case expr:
4711 com_expr(c, n);
4712 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004713 case xor_expr:
4714 com_xor_expr(c, n);
4715 break;
4716 case and_expr:
4717 com_and_expr(c, n);
4718 break;
4719 case shift_expr:
4720 com_shift_expr(c, n);
4721 break;
4722 case arith_expr:
4723 com_arith_expr(c, n);
4724 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004725 case term:
4726 com_term(c, n);
4727 break;
4728 case factor:
4729 com_factor(c, n);
4730 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004731 case power:
4732 com_power(c, n);
4733 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004734 case atom:
4735 com_atom(c, n);
4736 break;
4737
4738 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004739 com_error(c, PyExc_SystemError,
4740 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 }
4742}
4743
Tim Petersdbd9ba62000-07-09 03:09:57 +00004744static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004745
4746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004747com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004748{
4749 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4750 if (TYPE(CHILD(n, 0)) == LPAR)
4751 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004752 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004753 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004754 com_pop(c, 1);
4755 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004756}
4757
4758static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004759com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004760{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004761 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004762 if (NCH(n) == 1) {
4763 com_fpdef(c, CHILD(n, 0));
4764 }
4765 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004766 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004767 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004768 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004769 for (i = 0; i < NCH(n); i += 2)
4770 com_fpdef(c, CHILD(n, i));
4771 }
4772}
4773
4774static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004775com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004776{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004777 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004778 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004779 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004780 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004781 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004782 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004783 nch = NCH(n);
4784 /* Enter all arguments in table of locals */
4785 for (i = 0, narg = 0; i < nch; i++) {
4786 node *ch = CHILD(n, i);
4787 node *fp;
4788 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004789 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004790 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4791 fp = CHILD(ch, 0);
4792 if (TYPE(fp) != NAME) {
4793 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4794 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004795 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004796 narg++;
4797 /* all name updates handled by symtable */
4798 if (++i >= nch)
4799 break;
4800 ch = CHILD(n, i);
4801 if (TYPE(ch) == EQUAL)
4802 i += 2;
4803 else
4804 REQ(ch, COMMA);
4805 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004806 if (complex) {
4807 /* Generate code for complex arguments only after
4808 having counted the simple arguments */
4809 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004810 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004811 node *ch = CHILD(n, i);
4812 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004813 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004814 break;
4815 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4816 fp = CHILD(ch, 0);
4817 if (TYPE(fp) != NAME) {
4818 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004819 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004820 com_fpdef(c, ch);
4821 }
4822 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004823 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004824 break;
4825 ch = CHILD(n, i);
4826 if (TYPE(ch) == EQUAL)
4827 i += 2;
4828 else
4829 REQ(ch, COMMA);
4830 }
4831 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004832}
4833
4834static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004835com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004836{
4837 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004838 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004839 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004840 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004841 if (doc != NULL) {
4842 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004843 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004844 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004845 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004847 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004848 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004849 for (i = 0; i < NCH(n); i++) {
4850 node *ch = CHILD(n, i);
4851 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4852 com_node(c, ch);
4853 }
4854}
4855
4856/* Top-level compile-node interface */
4857
4858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004859compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004860{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004861 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004862 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004863 REQ(n, funcdef);
4864 /* -6 -5 -4 -3 -2 -1
4865 funcdef: [decorators] 'def' NAME parameters ':' suite */
4866 c->c_name = STR(RCHILD(n, -4));
4867 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004868 if (doc != NULL) {
4869 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004870 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004871 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004872 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004873 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004874 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004875 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004876 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004877 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004878 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004879 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004880 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004881 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004882 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4883 com_push(c, 1);
4884 com_addbyte(c, RETURN_VALUE);
4885 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004886}
4887
4888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004889compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004890{
Guido van Rossum590baa41993-11-30 13:40:46 +00004891 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004892 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004893 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004894
4895 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004896 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004897 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004898 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004899 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004900 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004901 else
4902 ch = CHILD(n, 2);
4903 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004904 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004905 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004906}
4907
4908static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004909compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004910{
4911 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004912 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004913 REQ(n, classdef);
4914 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4915 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004916 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004917 /* Initialize local __module__ from global __name__ */
4918 com_addop_name(c, LOAD_GLOBAL, "__name__");
4919 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004920 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004921 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004922 if (doc != NULL) {
4923 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004924 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004925 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004926 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004928 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004929 }
4930 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004931 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004932 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004933 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004934 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004935 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004936 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004937 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004938}
4939
4940static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004941compile_generator_expression(struct compiling *c, node *n)
4942{
4943 /* testlist_gexp: test gen_for */
4944 /* argument: test gen_for */
4945 REQ(CHILD(n, 0), test);
4946 REQ(CHILD(n, 1), gen_for);
4947
4948 c->c_name = "<generator expression>";
4949 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4950
4951 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4952 com_push(c, 1);
4953 com_addbyte(c, RETURN_VALUE);
4954 com_pop(c, 1);
4955}
4956
4957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004958compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004959{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004960 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004961
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004962 switch (TYPE(n)) {
4963
Guido van Rossum4c417781991-01-21 16:09:22 +00004964 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004965 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004966 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004967 n = CHILD(n, 0);
4968 if (TYPE(n) != NEWLINE)
4969 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004970 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004971 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4972 com_push(c, 1);
4973 com_addbyte(c, RETURN_VALUE);
4974 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004975 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004976 break;
4977
Guido van Rossum4c417781991-01-21 16:09:22 +00004978 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004979 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004980 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004981 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4982 com_push(c, 1);
4983 com_addbyte(c, RETURN_VALUE);
4984 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004985 break;
4986
Guido van Rossum590baa41993-11-30 13:40:46 +00004987 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004988 com_node(c, CHILD(n, 0));
4989 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004990 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004991 break;
4992
Guido van Rossum590baa41993-11-30 13:40:46 +00004993 case lambdef: /* anonymous function definition */
4994 compile_lambdef(c, n);
4995 break;
4996
Guido van Rossum4c417781991-01-21 16:09:22 +00004997 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004998 compile_funcdef(c, n);
4999 break;
5000
Guido van Rossum4c417781991-01-21 16:09:22 +00005001 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005002 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005003 break;
5004
Raymond Hettinger354433a2004-05-19 08:20:33 +00005005 case testlist_gexp: /* A generator expression */
5006 case argument: /* A generator expression */
5007 compile_generator_expression(c, n);
5008 break;
5009
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005010 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005011 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005012 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005013 }
5014}
5015
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005016static PyObject *
5017dict_keys_inorder(PyObject *dict, int offset)
5018{
5019 PyObject *tuple, *k, *v;
5020 int i, pos = 0, size = PyDict_Size(dict);
5021
5022 tuple = PyTuple_New(size);
5023 if (tuple == NULL)
5024 return NULL;
5025 while (PyDict_Next(dict, &pos, &k, &v)) {
5026 i = PyInt_AS_LONG(v);
5027 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005028 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005029 PyTuple_SET_ITEM(tuple, i - offset, k);
5030 }
5031 return tuple;
5032}
5033
Guido van Rossum79f25d91997-04-29 20:08:16 +00005034PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005035PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005036{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005037 return PyNode_CompileFlags(n, filename, NULL);
5038}
5039
5040PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005041PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005042{
5043 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005044}
5045
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005046struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005047PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005048{
5049 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005050 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005051
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005052 ff = PyNode_Future(n, filename);
5053 if (ff == NULL)
5054 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005055 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005056 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005057 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005058 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005059 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005060 return st;
5061}
5062
Guido van Rossum79f25d91997-04-29 20:08:16 +00005063static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005064icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005065{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005066 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005067}
5068
Guido van Rossum79f25d91997-04-29 20:08:16 +00005069static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005070jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005071 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005072{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005073 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005074 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005075 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005076 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005077 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5078 sc.c_encoding = "utf-8";
5079 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005080 sc.c_encoding = STR(n);
5081 n = CHILD(n, 0);
5082 } else {
5083 sc.c_encoding = NULL;
5084 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005085 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005086 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005087 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088 /* c_symtable still points to parent's symbols */
5089 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005090 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005091 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005092 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005093 if (base->c_encoding != NULL) {
5094 assert(sc.c_encoding == NULL);
5095 sc.c_encoding = base->c_encoding;
5096 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005097 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005098 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005099 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005100 if (sc.c_future == NULL) {
5101 com_free(&sc);
5102 return NULL;
5103 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005104 if (flags) {
5105 int merged = sc.c_future->ff_features |
5106 flags->cf_flags;
5107 sc.c_future->ff_features = merged;
5108 flags->cf_flags = merged;
5109 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005110 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5111 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005112 com_free(&sc);
5113 return NULL;
5114 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005115 /* reset symbol table for second pass */
5116 sc.c_symtable->st_nscopes = 1;
5117 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005118 }
5119 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005120 if (symtable_load_symbols(&sc) < 0) {
5121 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005122 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005123 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005124 compile_node(&sc, n);
5125 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005126 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005127 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005128 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005129 names = PyList_AsTuple(sc.c_names);
5130 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005131 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5132 freevars = dict_keys_inorder(sc.c_freevars,
5133 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005134 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005135 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005136 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5137 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005138 if (!PyErr_Occurred())
5139 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005140 sc.c_nlocals,
5141 sc.c_maxstacklevel,
5142 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005143 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 consts,
5145 names,
5146 varnames,
5147 freevars,
5148 cellvars,
5149 filename,
5150 name,
5151 sc.c_firstlineno,
5152 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005153 Py_XDECREF(consts);
5154 Py_XDECREF(names);
5155 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005156 Py_XDECREF(freevars);
5157 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005158 Py_XDECREF(filename);
5159 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005160 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005161 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005162 else if (!PyErr_Occurred()) {
5163 /* This could happen if someone called PyErr_Clear() after an
5164 error was reported above. That's not supposed to happen,
5165 but I just plugged one case and I'm not sure there can't be
5166 others. In that case, raise SystemError so that at least
5167 it gets reported instead dumping core. */
5168 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5169 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005170 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005171 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005172 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005173 sc.c_symtable = NULL;
5174 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005175 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005176 return co;
5177}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005178
5179int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005180PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005181{
5182 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005183 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005184 int line = co->co_firstlineno;
5185 int addr = 0;
5186 while (--size >= 0) {
5187 addr += *p++;
5188 if (addr > addrq)
5189 break;
5190 line += *p++;
5191 }
5192 return line;
5193}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005194
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005195/* The test for LOCAL must come before the test for FREE in order to
5196 handle classes where name is both local and free. The local var is
5197 a method and the free var is a free var referenced within a method.
5198*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005199
5200static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005201get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005202{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005203 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005204 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005205
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005206 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5207 return CELL;
5208 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5209 return LOCAL;
5210 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5211 return FREE;
5212 v = PyDict_GetItemString(c->c_globals, name);
5213 if (v) {
5214 if (v == Py_None)
5215 return GLOBAL_EXPLICIT;
5216 else {
5217 return GLOBAL_IMPLICIT;
5218 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005219 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005220 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005221 "unknown scope for %.100s in %.100s(%s) "
5222 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5223 name, c->c_name,
5224 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5225 c->c_filename,
5226 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5227 PyObject_REPR(c->c_locals),
5228 PyObject_REPR(c->c_globals)
5229 );
5230
5231 Py_FatalError(buf);
5232 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005233}
5234
Guido van Rossum207fda62001-03-02 03:30:41 +00005235/* Helper functions to issue warnings */
5236
5237static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005238issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005239{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005240 if (PyErr_Occurred()) {
5241 /* This can happen because symtable_node continues
5242 processing even after raising a SyntaxError.
5243 Calling PyErr_WarnExplicit now would clobber the
5244 pending exception; instead we fail and let that
5245 exception propagate.
5246 */
5247 return -1;
5248 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005249 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5250 lineno, NULL, NULL) < 0) {
5251 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5252 PyErr_SetString(PyExc_SyntaxError, msg);
5253 PyErr_SyntaxLocation(filename, lineno);
5254 }
5255 return -1;
5256 }
5257 return 0;
5258}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005259
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005260static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005261symtable_warn(struct symtable *st, char *msg)
5262{
Guido van Rossum207fda62001-03-02 03:30:41 +00005263 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005264 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005265 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005266 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005267 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005268}
5269
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005270/* Helper function for setting lineno and filename */
5271
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005272static struct symtable *
5273symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005274{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005275 struct symtable *st;
5276
5277 st = symtable_init();
5278 if (st == NULL)
5279 return NULL;
5280 st->st_future = ff;
5281 st->st_filename = filename;
5282 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5283 if (st->st_errors > 0)
5284 goto fail;
5285 symtable_node(st, n);
5286 if (st->st_errors > 0)
5287 goto fail;
5288 return st;
5289 fail:
5290 if (!PyErr_Occurred()) {
5291 /* This could happen because after a syntax error is
5292 detected, the symbol-table-building continues for
5293 a while, and PyErr_Clear() might erroneously be
5294 called during that process. One such case has been
5295 fixed, but there might be more (now or later).
5296 */
5297 PyErr_SetString(PyExc_SystemError, "lost exception");
5298 }
5299 st->st_future = NULL;
5300 st->st_filename = NULL;
5301 PySymtable_Free(st);
5302 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005303}
5304
5305static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005306symtable_init_compiling_symbols(struct compiling *c)
5307{
5308 PyObject *varnames;
5309
5310 varnames = c->c_symtable->st_cur->ste_varnames;
5311 if (varnames == NULL) {
5312 varnames = PyList_New(0);
5313 if (varnames == NULL)
5314 return -1;
5315 c->c_symtable->st_cur->ste_varnames = varnames;
5316 Py_INCREF(varnames);
5317 } else
5318 Py_INCREF(varnames);
5319 c->c_varnames = varnames;
5320
5321 c->c_globals = PyDict_New();
5322 if (c->c_globals == NULL)
5323 return -1;
5324 c->c_freevars = PyDict_New();
5325 if (c->c_freevars == NULL)
5326 return -1;
5327 c->c_cellvars = PyDict_New();
5328 if (c->c_cellvars == NULL)
5329 return -1;
5330 return 0;
5331}
5332
5333struct symbol_info {
5334 int si_nlocals;
5335 int si_ncells;
5336 int si_nfrees;
5337 int si_nimplicit;
5338};
5339
5340static void
5341symtable_init_info(struct symbol_info *si)
5342{
5343 si->si_nlocals = 0;
5344 si->si_ncells = 0;
5345 si->si_nfrees = 0;
5346 si->si_nimplicit = 0;
5347}
5348
5349static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005350symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005351 struct symbol_info *si)
5352{
5353 PyObject *dict, *v;
5354
5355 /* Seperate logic for DEF_FREE. If it occurs in a function,
5356 it indicates a local that we must allocate storage for (a
5357 cell var). If it occurs in a class, then the class has a
5358 method and a free variable with the same name.
5359 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005360 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005361 /* If it isn't declared locally, it can't be a cell. */
5362 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5363 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005364 v = PyInt_FromLong(si->si_ncells++);
5365 dict = c->c_cellvars;
5366 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005367 /* If it is free anyway, then there is no need to do
5368 anything here.
5369 */
5370 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005371 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005372 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005373 v = PyInt_FromLong(si->si_nfrees++);
5374 dict = c->c_freevars;
5375 }
5376 if (v == NULL)
5377 return -1;
5378 if (PyDict_SetItem(dict, name, v) < 0) {
5379 Py_DECREF(v);
5380 return -1;
5381 }
5382 Py_DECREF(v);
5383 return 0;
5384}
5385
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005386/* If a variable is a cell and an argument, make sure that appears in
5387 co_cellvars before any variable to its right in varnames.
5388*/
5389
5390
5391static int
5392symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5393 PyObject *varnames, int flags)
5394{
Tim Petersb39903b2003-03-24 17:22:24 +00005395 PyObject *v = NULL;
5396 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005397 int i, pos;
5398
5399 if (flags & CO_VARARGS)
5400 argcount++;
5401 if (flags & CO_VARKEYWORDS)
5402 argcount++;
5403 for (i = argcount; --i >= 0; ) {
5404 v = PyList_GET_ITEM(varnames, i);
5405 if (PyDict_GetItem(*cellvars, v)) {
5406 if (list == NULL) {
5407 list = PyList_New(1);
5408 if (list == NULL)
5409 return -1;
5410 PyList_SET_ITEM(list, 0, v);
5411 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005412 } else {
5413 if (PyList_Insert(list, 0, v) < 0) {
5414 Py_DECREF(list);
5415 return -1;
5416 }
5417 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005418 }
5419 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005420 if (list == NULL)
5421 return 0;
5422
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005423 /* There are cellvars that are also arguments. Create a dict
5424 to replace cellvars and put the args at the front.
5425 */
5426 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005427 if (d == NULL)
5428 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005429 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5430 v = PyInt_FromLong(i);
5431 if (v == NULL)
5432 goto fail;
5433 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5434 goto fail;
5435 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5436 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005437 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005438 }
5439 pos = 0;
5440 i = PyList_GET_SIZE(list);
5441 Py_DECREF(list);
5442 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5443 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005444 if (w == NULL)
5445 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005446 if (PyDict_SetItem(d, v, w) < 0) {
5447 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005448 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005449 goto fail;
5450 }
5451 Py_DECREF(w);
5452 }
5453 Py_DECREF(*cellvars);
5454 *cellvars = d;
5455 return 1;
5456 fail:
5457 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005458 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005459 return -1;
5460}
5461
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005462static int
5463symtable_freevar_offsets(PyObject *freevars, int offset)
5464{
5465 PyObject *name, *v;
5466 int pos;
5467
5468 /* The cell vars are the first elements of the closure,
5469 followed by the free vars. Update the offsets in
5470 c_freevars to account for number of cellvars. */
5471 pos = 0;
5472 while (PyDict_Next(freevars, &pos, &name, &v)) {
5473 int i = PyInt_AS_LONG(v) + offset;
5474 PyObject *o = PyInt_FromLong(i);
5475 if (o == NULL)
5476 return -1;
5477 if (PyDict_SetItem(freevars, name, o) < 0) {
5478 Py_DECREF(o);
5479 return -1;
5480 }
5481 Py_DECREF(o);
5482 }
5483 return 0;
5484}
5485
5486static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005487symtable_check_unoptimized(struct compiling *c,
5488 PySymtableEntryObject *ste,
5489 struct symbol_info *si)
5490{
5491 char buf[300];
5492
5493 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5494 || (ste->ste_nested && si->si_nimplicit)))
5495 return 0;
5496
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005497#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5498
5499#define ILLEGAL_IS "is a nested function"
5500
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005501#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005502"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005503
5504#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005505"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005506
5507#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005508"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005509"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005510
5511 /* XXX perhaps the linenos for these opt-breaking statements
5512 should be stored so the exception can point to them. */
5513
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005514 if (ste->ste_child_free) {
5515 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005516 PyOS_snprintf(buf, sizeof(buf),
5517 ILLEGAL_IMPORT_STAR,
5518 PyString_AS_STRING(ste->ste_name),
5519 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005520 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005521 PyOS_snprintf(buf, sizeof(buf),
5522 ILLEGAL_BARE_EXEC,
5523 PyString_AS_STRING(ste->ste_name),
5524 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005525 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005526 PyOS_snprintf(buf, sizeof(buf),
5527 ILLEGAL_EXEC_AND_IMPORT_STAR,
5528 PyString_AS_STRING(ste->ste_name),
5529 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005530 }
5531 } else {
5532 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005533 PyOS_snprintf(buf, sizeof(buf),
5534 ILLEGAL_IMPORT_STAR,
5535 PyString_AS_STRING(ste->ste_name),
5536 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005537 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005538 PyOS_snprintf(buf, sizeof(buf),
5539 ILLEGAL_BARE_EXEC,
5540 PyString_AS_STRING(ste->ste_name),
5541 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005542 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005543 PyOS_snprintf(buf, sizeof(buf),
5544 ILLEGAL_EXEC_AND_IMPORT_STAR,
5545 PyString_AS_STRING(ste->ste_name),
5546 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005547 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005548 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005549
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005550 PyErr_SetString(PyExc_SyntaxError, buf);
5551 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5552 ste->ste_opt_lineno);
5553 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005554}
5555
5556static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005557symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5558 struct symbol_info *si)
5559{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005560 if (c->c_future)
5561 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005562 if (ste->ste_generator)
5563 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005564 if (ste->ste_type != TYPE_MODULE)
5565 c->c_flags |= CO_NEWLOCALS;
5566 if (ste->ste_type == TYPE_FUNCTION) {
5567 c->c_nlocals = si->si_nlocals;
5568 if (ste->ste_optimized == 0)
5569 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005570 else if (ste->ste_optimized != OPT_EXEC)
5571 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005572 }
5573 return 0;
5574}
5575
5576static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005577symtable_error(struct symtable *st, int lineno)
5578{
5579 if (lineno == 0)
5580 lineno = st->st_cur->ste_lineno;
5581 PyErr_SyntaxLocation(st->st_filename, lineno);
5582 st->st_errors++;
5583 return -1;
5584}
5585
5586static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005587symtable_load_symbols(struct compiling *c)
5588{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005589 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005590 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005591 PyObject *name, *varnames, *v;
5592 int i, flags, pos;
5593 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005595 v = NULL;
5596
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005597 if (symtable_init_compiling_symbols(c) < 0)
5598 goto fail;
5599 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005600 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005601 si.si_nlocals = PyList_GET_SIZE(varnames);
5602 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005604 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005605 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005606 if (v == NULL)
5607 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005608 if (PyDict_SetItem(c->c_locals,
5609 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005610 goto fail;
5611 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005612 }
5613
5614 /* XXX The cases below define the rules for whether a name is
5615 local or global. The logic could probably be clearer. */
5616 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005617 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5618 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005620 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005621 /* undo the original DEF_FREE */
5622 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005624 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005625 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005626 2. Free variables in methods that are also class
5627 variables or declared global.
5628 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005629 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005630 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005631
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005632 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005633 c->c_argcount--;
5634 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005635 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 c->c_argcount--;
5637 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005638 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005639 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005640 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005641 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005642 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005643 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005644 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005645 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005647 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5648 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005649 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005650 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005651 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005652 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005653 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005654 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005655 if (v == NULL)
5656 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005657 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 goto fail;
5659 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005660 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005661 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005663 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005664 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005665 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 if (v == NULL)
5667 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005668 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 goto fail;
5670 Py_DECREF(v);
5671 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005673 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005674 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005675 goto fail;
5676 if (st->st_nscopes != 1) {
5677 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005678 if (v == NULL)
5679 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005680 if (PyDict_SetItem(st->st_global,
5681 name, v))
5682 goto fail;
5683 Py_DECREF(v);
5684 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005685 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 }
5687 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005688 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5689
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005690 if (si.si_ncells > 1) { /* one cell is always in order */
5691 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5692 c->c_varnames, c->c_flags) < 0)
5693 return -1;
5694 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005695 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5696 return -1;
5697 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005698 fail:
5699 /* is this always the right thing to do? */
5700 Py_XDECREF(v);
5701 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005702}
5703
5704static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005705symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005706{
5707 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005709 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 if (st == NULL)
5711 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005712 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005713
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005714 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005715 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 goto fail;
5718 if ((st->st_symbols = PyDict_New()) == NULL)
5719 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005721 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005722 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005723 st->st_private = NULL;
5724 return st;
5725 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005726 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005727 return NULL;
5728}
5729
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005730void
5731PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005732{
5733 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005735 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005736 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737}
5738
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739/* When the compiler exits a scope, it must should update the scope's
5740 free variable information with the list of free variables in its
5741 children.
5742
5743 Variables that are free in children and defined in the current
5744 scope are cellvars.
5745
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005746 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005747 false), free variables in children that are not defined here are
5748 implicit globals.
5749
5750*/
5751
5752static int
5753symtable_update_free_vars(struct symtable *st)
5754{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005755 int i, j, def;
5756 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005757 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005759 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 def = DEF_FREE_CLASS;
5761 else
5762 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005763 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 int pos = 0;
5765
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005766 if (list && PyList_SetSlice(list, 0,
5767 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005768 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005769 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005770 PyList_GET_ITEM(ste->ste_children, i);
5771 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005772 int flags = PyInt_AS_LONG(o);
5773 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005774 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005775 if (list == NULL) {
5776 list = PyList_New(0);
5777 if (list == NULL)
5778 return -1;
5779 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005780 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005781 if (PyList_Append(list, name) < 0) {
5782 Py_DECREF(list);
5783 return -1;
5784 }
5785 }
5786 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005787 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005788 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005789 v = PyDict_GetItem(ste->ste_symbols, name);
5790 /* If a name N is declared global in scope A and
5791 referenced in scope B contained (perhaps
5792 indirectly) in A and there are no scopes
5793 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005794 is global in B. Unless A is a class scope,
5795 because class scopes are not considered for
5796 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005797 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005798 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005799 int flags = PyInt_AS_LONG(v);
5800 if (flags & DEF_GLOBAL) {
5801 symtable_undo_free(st, child->ste_id,
5802 name);
5803 continue;
5804 }
5805 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005806 if (ste->ste_nested) {
5807 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005808 name, def) < 0) {
5809 Py_DECREF(list);
5810 return -1;
5811 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005812 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005813 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005814 name) < 0) {
5815 Py_DECREF(list);
5816 return -1;
5817 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005818 }
5819 }
5820 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005821
5822 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005823 return 0;
5824}
5825
5826/* If the current scope is a non-nested class or if name is not
5827 defined in the current, non-nested scope, then it is an implicit
5828 global in all nested scopes.
5829*/
5830
5831static int
5832symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5833{
5834 PyObject *o;
5835 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005836 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005837
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005838 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005839 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005840 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005841 if (o == NULL)
5842 return symtable_undo_free(st, child, name);
5843 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005844
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005845 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005846 return symtable_undo_free(st, child, name);
5847 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005848 return symtable_add_def_o(st, ste->ste_symbols,
5849 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005850}
5851
5852static int
5853symtable_undo_free(struct symtable *st, PyObject *id,
5854 PyObject *name)
5855{
5856 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005857 PyObject *info;
5858 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005859
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005860 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5861 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005862 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005863
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005864 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005865 if (info == NULL)
5866 return 0;
5867 v = PyInt_AS_LONG(info);
5868 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005869 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005870 DEF_FREE_GLOBAL) < 0)
5871 return -1;
5872 } else
5873 /* If the name is defined here or declared global,
5874 then the recursion stops. */
5875 return 0;
5876
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005877 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5878 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005879 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005880 PyList_GET_ITEM(ste->ste_children, i);
5881 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005882 if (x < 0)
5883 return x;
5884 }
5885 return 0;
5886}
5887
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005888/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5889 This reference is released when the scope is exited, via the DECREF
5890 in symtable_exit_scope().
5891*/
5892
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005893static int
5894symtable_exit_scope(struct symtable *st)
5895{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005896 int end;
5897
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005898 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005899 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005900 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005901 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005902 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5903 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005904 if (PySequence_DelItem(st->st_stack, end) < 0)
5905 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005906 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005907}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005908
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005909static void
5910symtable_enter_scope(struct symtable *st, char *name, int type,
5911 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005912{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005913 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005914
5915 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005916 prev = st->st_cur;
5917 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005918 st->st_errors++;
5919 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005920 }
5921 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005922 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005923 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005924 if (st->st_cur == NULL) {
5925 st->st_errors++;
5926 return;
5927 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005928 if (strcmp(name, TOP) == 0)
5929 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005930 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005931 if (PyList_Append(prev->ste_children,
5932 (PyObject *)st->st_cur) < 0)
5933 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005934 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935}
5936
5937static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005938symtable_lookup(struct symtable *st, char *name)
5939{
5940 char buffer[MANGLE_LEN];
5941 PyObject *v;
5942 int flags;
5943
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005944 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005945 name = buffer;
5946 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5947 if (v == NULL) {
5948 if (PyErr_Occurred())
5949 return -1;
5950 else
5951 return 0;
5952 }
5953
5954 flags = PyInt_AS_LONG(v);
5955 return flags;
5956}
5957
5958static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005959symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005960{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005961 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005962 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005963 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005964
Guido van Rossumb7164622002-08-16 02:48:11 +00005965 /* Warn about None, except inside a tuple (where the assignment
5966 code already issues a warning). */
5967 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5968 *name == 'N' && strcmp(name, "None") == 0)
5969 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005970 PyErr_SetString(PyExc_SyntaxError,
5971 "Invalid syntax. Assignment to None.");
5972 symtable_error(st, 0);
5973 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005974 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005975 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005976 name = buffer;
5977 if ((s = PyString_InternFromString(name)) == NULL)
5978 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005979 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5980 Py_DECREF(s);
5981 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005982}
5983
5984/* Must only be called with mangled names */
5985
5986static int
5987symtable_add_def_o(struct symtable *st, PyObject *dict,
5988 PyObject *name, int flag)
5989{
5990 PyObject *o;
5991 int val;
5992
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005993 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005994 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005995 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005996 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005997 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005998 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005999 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006000 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006001 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006002 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006003 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006004 if (o == NULL)
6005 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006006 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006007 Py_DECREF(o);
6008 return -1;
6009 }
6010 Py_DECREF(o);
6011
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006012 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006013 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006015 } else if (flag & DEF_GLOBAL) {
6016 /* XXX need to update DEF_GLOBAL for other flags too;
6017 perhaps only DEF_FREE_GLOBAL */
6018 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006020 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006022 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006024 if (o == NULL)
6025 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006026 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006027 Py_DECREF(o);
6028 return -1;
6029 }
6030 Py_DECREF(o);
6031 }
6032 return 0;
6033}
6034
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006035#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006036
Tim Peters08a898f2001-06-28 01:52:22 +00006037/* Look for a yield stmt under n. Return 1 if found, else 0.
6038 This hack is used to look inside "if 0:" blocks (which are normally
6039 ignored) in case those are the only places a yield occurs (so that this
6040 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006041static int
6042look_for_yield(node *n)
6043{
6044 int i;
6045
6046 for (i = 0; i < NCH(n); ++i) {
6047 node *kid = CHILD(n, i);
6048
6049 switch (TYPE(kid)) {
6050
6051 case classdef:
6052 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006053 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006054 /* Stuff in nested functions and classes can't make
6055 the parent a generator. */
6056 return 0;
6057
6058 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006059 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006060
6061 default:
6062 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006063 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006064 }
6065 }
6066 return 0;
6067}
6068
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006069static void
6070symtable_node(struct symtable *st, node *n)
6071{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006072 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006073
6074 loop:
6075 switch (TYPE(n)) {
6076 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006077 char *func_name;
6078 if (NCH(n) == 6)
6079 symtable_node(st, CHILD(n, 0));
6080 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006081 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006082 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006083 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006084 symtable_funcdef(st, n);
6085 symtable_exit_scope(st);
6086 break;
6087 }
6088 case lambdef:
6089 if (NCH(n) == 4)
6090 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006091 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006092 symtable_funcdef(st, n);
6093 symtable_exit_scope(st);
6094 break;
6095 case classdef: {
6096 char *tmp, *class_name = STR(CHILD(n, 1));
6097 symtable_add_def(st, class_name, DEF_LOCAL);
6098 if (TYPE(CHILD(n, 2)) == LPAR) {
6099 node *bases = CHILD(n, 3);
6100 int i;
6101 for (i = 0; i < NCH(bases); i += 2) {
6102 symtable_node(st, CHILD(bases, i));
6103 }
6104 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006105 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006106 tmp = st->st_private;
6107 st->st_private = class_name;
6108 symtable_node(st, CHILD(n, NCH(n) - 1));
6109 st->st_private = tmp;
6110 symtable_exit_scope(st);
6111 break;
6112 }
6113 case if_stmt:
6114 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006115 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6116 if (st->st_cur->ste_generator == 0)
6117 st->st_cur->ste_generator =
6118 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006119 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006121 symtable_node(st, CHILD(n, i + 1));
6122 symtable_node(st, CHILD(n, i + 3));
6123 }
6124 if (i + 2 < NCH(n))
6125 symtable_node(st, CHILD(n, i + 2));
6126 break;
6127 case global_stmt:
6128 symtable_global(st, n);
6129 break;
6130 case import_stmt:
6131 symtable_import(st, n);
6132 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006133 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006134 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006135 symtable_node(st, CHILD(n, 1));
6136 if (NCH(n) > 2)
6137 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006138 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006139 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006140 st->st_cur->ste_opt_lineno = n->n_lineno;
6141 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006142 if (NCH(n) > 4)
6143 symtable_node(st, CHILD(n, 5));
6144 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006145
6146 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006147 case assert_stmt:
6148 if (Py_OptimizeFlag)
6149 return;
6150 if (NCH(n) == 2) {
6151 n = CHILD(n, 1);
6152 goto loop;
6153 } else {
6154 symtable_node(st, CHILD(n, 1));
6155 n = CHILD(n, 3);
6156 goto loop;
6157 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006158 case except_clause:
6159 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006160 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006161 if (NCH(n) > 1) {
6162 n = CHILD(n, 1);
6163 goto loop;
6164 }
6165 break;
6166 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006167 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006169 case yield_stmt:
6170 st->st_cur->ste_generator = 1;
6171 n = CHILD(n, 1);
6172 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006173 case expr_stmt:
6174 if (NCH(n) == 1)
6175 n = CHILD(n, 0);
6176 else {
6177 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006178 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006179 symtable_node(st, CHILD(n, 2));
6180 break;
6181 } else {
6182 int i;
6183 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006184 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006185 n = CHILD(n, NCH(n) - 1);
6186 }
6187 }
6188 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006189 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006190 /* only occurs when there are multiple for loops
6191 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006192 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006193 if (TYPE(n) == list_for)
6194 symtable_list_for(st, n);
6195 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006196 REQ(n, list_if);
6197 symtable_node(st, CHILD(n, 1));
6198 if (NCH(n) == 3) {
6199 n = CHILD(n, 2);
6200 goto loop;
6201 }
6202 }
6203 break;
6204 case for_stmt:
6205 symtable_assign(st, CHILD(n, 1), 0);
6206 for (i = 3; i < NCH(n); ++i)
6207 if (TYPE(CHILD(n, i)) >= single_input)
6208 symtable_node(st, CHILD(n, i));
6209 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006210 case arglist:
6211 if (NCH(n) > 1)
6212 for (i = 0; i < NCH(n); ++i) {
6213 node *ch = CHILD(n, i);
6214 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6215 TYPE(CHILD(ch, 1)) == gen_for) {
6216 PyErr_SetString(PyExc_SyntaxError,
6217 "invalid syntax");
6218 symtable_error(st, n->n_lineno);
6219 return;
6220 }
6221 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006222 /* The remaining cases fall through to default except in
6223 special circumstances. This requires the individual cases
6224 to be coded with great care, even though they look like
6225 rather innocuous. Each case must double-check TYPE(n).
6226 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006227 case decorator:
6228 if (TYPE(n) == decorator) {
6229 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6230 node *name, *varname;
6231 name = CHILD(n, 1);
6232 REQ(name, dotted_name);
6233 varname = CHILD(name, 0);
6234 REQ(varname, NAME);
6235 symtable_add_use(st, STR(varname));
6236 }
6237 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006238 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006239 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006240 n = CHILD(n, 2);
6241 goto loop;
6242 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006243 else if (TYPE(n) == argument && NCH(n) == 2 &&
6244 TYPE(CHILD(n, 1)) == gen_for) {
6245 symtable_generator_expression(st, n);
6246 break;
6247 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006248 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006249 case listmaker:
6250 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006251 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006252 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006253 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006254 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006255 case testlist_gexp:
6256 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6257 symtable_generator_expression(st, n);
6258 break;
6259 }
6260 /* fall through */
6261
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006262 case atom:
6263 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6264 symtable_add_use(st, STR(CHILD(n, 0)));
6265 break;
6266 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006267 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006268 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006269 /* Walk over every non-token child with a special case
6270 for one child.
6271 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006272 if (NCH(n) == 1) {
6273 n = CHILD(n, 0);
6274 goto loop;
6275 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006276 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006277 if (TYPE(CHILD(n, i)) >= single_input)
6278 symtable_node(st, CHILD(n, i));
6279 }
6280}
6281
6282static void
6283symtable_funcdef(struct symtable *st, node *n)
6284{
6285 node *body;
6286
6287 if (TYPE(n) == lambdef) {
6288 if (NCH(n) == 4)
6289 symtable_params(st, CHILD(n, 1));
6290 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006291 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006292 body = CHILD(n, NCH(n) - 1);
6293 symtable_node(st, body);
6294}
6295
6296/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006297 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006298 which are references in the defining scope. symtable_params()
6299 parses the parameter names, which are defined in the function's
6300 body.
6301
6302 varargslist:
6303 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6304 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6305*/
6306
6307static void
6308symtable_default_args(struct symtable *st, node *n)
6309{
6310 node *c;
6311 int i;
6312
6313 if (TYPE(n) == parameters) {
6314 n = CHILD(n, 1);
6315 if (TYPE(n) == RPAR)
6316 return;
6317 }
6318 REQ(n, varargslist);
6319 for (i = 0; i < NCH(n); i += 2) {
6320 c = CHILD(n, i);
6321 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6322 break;
6323 }
6324 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6325 symtable_node(st, CHILD(n, i));
6326 }
6327}
6328
6329static void
6330symtable_params(struct symtable *st, node *n)
6331{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006332 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006333 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006334
6335 if (TYPE(n) == parameters) {
6336 n = CHILD(n, 1);
6337 if (TYPE(n) == RPAR)
6338 return;
6339 }
6340 REQ(n, varargslist);
6341 for (i = 0; i < NCH(n); i += 2) {
6342 c = CHILD(n, i);
6343 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6344 ext = 1;
6345 break;
6346 }
6347 if (TYPE(c) == test) {
6348 continue;
6349 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006350 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006351 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006352 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006353 char nbuf[30];
6354 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006355 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006356 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006357 }
6358 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006359 if (ext) {
6360 c = CHILD(n, i);
6361 if (TYPE(c) == STAR) {
6362 i++;
6363 symtable_add_def(st, STR(CHILD(n, i)),
6364 DEF_PARAM | DEF_STAR);
6365 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006366 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006367 c = NULL;
6368 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006369 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006370 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006371 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006372 i++;
6373 symtable_add_def(st, STR(CHILD(n, i)),
6374 DEF_PARAM | DEF_DOUBLESTAR);
6375 }
6376 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006377 if (complex >= 0) {
6378 int j;
6379 for (j = 0; j <= complex; j++) {
6380 c = CHILD(n, j);
6381 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006382 c = CHILD(n, ++j);
6383 else if (TYPE(c) == EQUAL)
6384 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006385 if (TYPE(CHILD(c, 0)) == LPAR)
6386 symtable_params_fplist(st, CHILD(c, 1));
6387 }
6388 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006389}
6390
6391static void
6392symtable_params_fplist(struct symtable *st, node *n)
6393{
6394 int i;
6395 node *c;
6396
6397 REQ(n, fplist);
6398 for (i = 0; i < NCH(n); i += 2) {
6399 c = CHILD(n, i);
6400 REQ(c, fpdef);
6401 if (NCH(c) == 1)
6402 symtable_add_def(st, STR(CHILD(c, 0)),
6403 DEF_PARAM | DEF_INTUPLE);
6404 else
6405 symtable_params_fplist(st, CHILD(c, 1));
6406 }
6407
6408}
6409
6410static void
6411symtable_global(struct symtable *st, node *n)
6412{
6413 int i;
6414
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006415 /* XXX It might be helpful to warn about module-level global
6416 statements, but it's hard to tell the difference between
6417 module-level and a string passed to exec.
6418 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006419
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006420 for (i = 1; i < NCH(n); i += 2) {
6421 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006422 int flags;
6423
6424 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006425 if (flags < 0)
6426 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006427 if (flags && flags != DEF_GLOBAL) {
6428 char buf[500];
6429 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006430 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006431 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006432 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006433 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006434 }
6435 else {
6436 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006437 PyOS_snprintf(buf, sizeof(buf),
6438 GLOBAL_AFTER_ASSIGN,
6439 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006440 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006441 PyOS_snprintf(buf, sizeof(buf),
6442 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006443 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006444 }
6445 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006446 symtable_add_def(st, name, DEF_GLOBAL);
6447 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006448}
6449
6450static void
6451symtable_list_comprehension(struct symtable *st, node *n)
6452{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006453 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006454 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006455
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006456 REQ(n, listmaker);
6457 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6458 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006459 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006460 symtable_list_for(st, CHILD(n, 1));
6461 symtable_node(st, CHILD(n, 0));
6462 --st->st_cur->ste_tmpname;
6463}
6464
6465static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006466symtable_generator_expression(struct symtable *st, node *n)
6467{
6468 /* testlist_gexp: test gen_for */
6469 REQ(CHILD(n, 0), test);
6470 REQ(CHILD(n, 1), gen_for);
6471
6472 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6473 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6474
6475 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6476
6477 symtable_gen_for(st, CHILD(n, 1), 1);
6478 symtable_node(st, CHILD(n, 0));
6479 symtable_exit_scope(st);
6480
6481 /* for outmost iterable precomputation */
6482 symtable_node(st, CHILD(CHILD(n, 1), 3));
6483}
6484
6485static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006486symtable_list_for(struct symtable *st, node *n)
6487{
6488 REQ(n, list_for);
6489 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006490 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006491 symtable_node(st, CHILD(n, 3));
6492 if (NCH(n) == 5)
6493 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006494}
6495
6496static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006497symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6498{
6499 REQ(n, gen_for);
6500
6501 /* gen_for: for v in test [gen_iter] */
6502 symtable_assign(st, CHILD(n, 1), 0);
6503 if (is_outmost)
6504 symtable_add_use(st, "[outmost-iterable]");
6505 else
6506 symtable_node(st, CHILD(n, 3));
6507
6508 if (NCH(n) == 5)
6509 symtable_gen_iter(st, CHILD(n, 4));
6510}
6511
6512static void
6513symtable_gen_iter(struct symtable *st, node *n)
6514{
6515 REQ(n, gen_iter);
6516
6517 n = CHILD(n, 0);
6518 if (TYPE(n) == gen_for)
6519 symtable_gen_for(st, n, 0);
6520 else {
6521 REQ(n, gen_if);
6522 symtable_node(st, CHILD(n, 1));
6523
6524 if (NCH(n) == 3)
6525 symtable_gen_iter(st, CHILD(n, 2));
6526 }
6527}
6528
6529static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006530symtable_import(struct symtable *st, node *n)
6531{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006532 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006533 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006534 /* import_stmt: import_name | import_from */
6535 n = CHILD(n, 0);
6536 if (TYPE(n) == import_from) {
6537 /* import_from: 'from' dotted_name 'import' ('*' |
6538 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006539 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006540 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006541 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6542 /* check for bogus imports */
6543 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6544 PyErr_SetString(PyExc_SyntaxError,
6545 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006546 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006547 return;
6548 }
6549 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006550 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6551 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006552 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006553 if (symtable_warn(st,
6554 "import * only allowed at module level") < 0)
6555 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006556 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006557 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006558 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006559 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006560 REQ(nn, import_as_names);
6561 for (i = 0; i < NCH(nn); i += 2) {
6562 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006563 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006564 symtable_assign(st, CHILD(c, 2),
6565 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006566 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006567 symtable_assign(st, CHILD(c, 0),
6568 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006569 }
6570 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006571 } else {
6572 /* 'import' dotted_as_names */
6573 nn = CHILD(n, 1);
6574 REQ(nn, dotted_as_names);
6575 for (i = 0; i < NCH(nn); i += 2)
6576 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006577 }
6578}
6579
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006580/* The third argument to symatble_assign() is a flag to be passed to
6581 symtable_add_def() if it is eventually called. The flag is useful
6582 to specify the particular type of assignment that should be
6583 recorded, e.g. an assignment caused by import.
6584 */
6585
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006586static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006587symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006588{
6589 node *tmp;
6590 int i;
6591
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006592 loop:
6593 switch (TYPE(n)) {
6594 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006595 /* invalid assignment, e.g. lambda x:x=2. The next
6596 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006597 return;
6598 case power:
6599 if (NCH(n) > 2) {
6600 for (i = 2; i < NCH(n); ++i)
6601 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6602 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006603 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006604 if (NCH(n) > 1) {
6605 symtable_node(st, CHILD(n, 0));
6606 symtable_node(st, CHILD(n, 1));
6607 } else {
6608 n = CHILD(n, 0);
6609 goto loop;
6610 }
6611 return;
6612 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006613 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6614 /* XXX This is an error, but the next pass
6615 will catch it. */
6616 return;
6617 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006618 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006619 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006620 }
6621 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006622 case testlist_gexp:
6623 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6624 /* XXX This is an error, but the next pass
6625 will catch it. */
6626 return;
6627 } else {
6628 for (i = 0; i < NCH(n); i += 2)
6629 symtable_assign(st, CHILD(n, i), def_flag);
6630 }
6631 return;
6632
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006633 case exprlist:
6634 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006635 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006636 if (NCH(n) == 1) {
6637 n = CHILD(n, 0);
6638 goto loop;
6639 }
6640 else {
6641 int i;
6642 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006643 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006644 return;
6645 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006646 case atom:
6647 tmp = CHILD(n, 0);
6648 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6649 n = CHILD(n, 1);
6650 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006651 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006652 if (strcmp(STR(tmp), "__debug__") == 0) {
6653 PyErr_SetString(PyExc_SyntaxError,
6654 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006655 symtable_error(st, n->n_lineno);
6656 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006657 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006658 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006659 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006660 return;
6661 case dotted_as_name:
6662 if (NCH(n) == 3)
6663 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006664 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006665 else
6666 symtable_add_def(st,
6667 STR(CHILD(CHILD(n,
6668 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006669 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006670 return;
6671 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006672 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006673 return;
6674 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006675 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006676 return;
6677 default:
6678 if (NCH(n) == 0)
6679 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006680 if (NCH(n) == 1) {
6681 n = CHILD(n, 0);
6682 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006683 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006684 /* Should only occur for errors like x + 1 = 1,
6685 which will be caught in the next pass. */
6686 for (i = 0; i < NCH(n); ++i)
6687 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006688 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006689 }
6690}