blob: c1c2fa9f134eab5850a4c5beab336ac54482d916 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000400 Bails out with no change if one or more of the LOAD_CONSTs is missing.
401 Also works for BUILD_LIST when followed by an "in" or "not in" test.
402*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000403static int
404tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
405{
406 PyObject *newconst, *constant;
407 int i, arg, len_consts;
408
409 /* Pre-conditions */
410 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000411 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000414 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000420 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421 for (i=0 ; i<n ; i++) {
422 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000423 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430 if (PyList_Append(consts, newconst)) {
431 Py_DECREF(newconst);
432 return 0;
433 }
434 Py_DECREF(newconst);
435
436 /* Write NOPs over old LOAD_CONSTS and
437 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
438 memset(codestr, NOP, n*3);
439 codestr[n*3] = LOAD_CONST;
440 SETARG(codestr, (n*3), len_consts);
441 return 1;
442}
443
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000444/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
445 with LOAD_CONST binop(c1,c2)
446 The consts table must still be in list form so that the
447 new constant can be appended.
448 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000449 Abandons the transformation if the folding fails (i.e. 1+'a').
450 If the new constant is a sequence, only folds when the size
451 is below a threshold value. That keeps pyc files from
452 becoming large in the presence of code like: (None,)*1000.
453*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454static int
455fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
456{
457 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000458 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459
460 /* Pre-conditions */
461 assert(PyList_CheckExact(consts));
462 assert(codestr[0] == LOAD_CONST);
463 assert(codestr[3] == LOAD_CONST);
464
465 /* Create new constant */
466 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
467 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
468 opcode = codestr[6];
469 switch (opcode) {
470 case BINARY_POWER:
471 newconst = PyNumber_Power(v, w, Py_None);
472 break;
473 case BINARY_MULTIPLY:
474 newconst = PyNumber_Multiply(v, w);
475 break;
476 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000477 /* Cannot fold this operation statically since
478 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000479 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000480 case BINARY_TRUE_DIVIDE:
481 newconst = PyNumber_TrueDivide(v, w);
482 break;
483 case BINARY_FLOOR_DIVIDE:
484 newconst = PyNumber_FloorDivide(v, w);
485 break;
486 case BINARY_MODULO:
487 newconst = PyNumber_Remainder(v, w);
488 break;
489 case BINARY_ADD:
490 newconst = PyNumber_Add(v, w);
491 break;
492 case BINARY_SUBTRACT:
493 newconst = PyNumber_Subtract(v, w);
494 break;
495 case BINARY_SUBSCR:
496 newconst = PyObject_GetItem(v, w);
497 break;
498 case BINARY_LSHIFT:
499 newconst = PyNumber_Lshift(v, w);
500 break;
501 case BINARY_RSHIFT:
502 newconst = PyNumber_Rshift(v, w);
503 break;
504 case BINARY_AND:
505 newconst = PyNumber_And(v, w);
506 break;
507 case BINARY_XOR:
508 newconst = PyNumber_Xor(v, w);
509 break;
510 case BINARY_OR:
511 newconst = PyNumber_Or(v, w);
512 break;
513 default:
514 /* Called with an unknown opcode */
515 assert(0);
516 return 0;
517 }
518 if (newconst == NULL) {
519 PyErr_Clear();
520 return 0;
521 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000522 size = PyObject_Size(newconst);
523 if (size == -1)
524 PyErr_Clear();
525 else if (size > 20) {
526 Py_DECREF(newconst);
527 return 0;
528 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000529
530 /* Append folded constant into consts table */
531 len_consts = PyList_GET_SIZE(consts);
532 if (PyList_Append(consts, newconst)) {
533 Py_DECREF(newconst);
534 return 0;
535 }
536 Py_DECREF(newconst);
537
538 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
539 memset(codestr, NOP, 4);
540 codestr[4] = LOAD_CONST;
541 SETARG(codestr, 4, len_consts);
542 return 1;
543}
544
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000545static unsigned int *
546markblocks(unsigned char *code, int len)
547{
548 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000549 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000550
551 if (blocks == NULL)
552 return NULL;
553 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000554
555 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000556 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
557 opcode = code[i];
558 switch (opcode) {
559 case FOR_ITER:
560 case JUMP_FORWARD:
561 case JUMP_IF_FALSE:
562 case JUMP_IF_TRUE:
563 case JUMP_ABSOLUTE:
564 case CONTINUE_LOOP:
565 case SETUP_LOOP:
566 case SETUP_EXCEPT:
567 case SETUP_FINALLY:
568 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000569 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000570 break;
571 }
572 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000573 /* Build block numbers in the second pass */
574 for (i=0 ; i<len ; i++) {
575 blockcnt += blocks[i]; /* increment blockcnt over labels */
576 blocks[i] = blockcnt;
577 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000578 return blocks;
579}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000580
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000581/* Perform basic peephole optimizations to components of a code object.
582 The consts object should still be in list form to allow new constants
583 to be appended.
584
585 To keep the optimizer simple, it bails out (does nothing) for code
586 containing extended arguments or that has a length over 32,700. That
587 allows us to avoid overflow and sign issues. Likewise, it bails when
588 the lineno table has complex encoding for gaps >= 255.
589
590 Optimizations are restricted to simple transformations occuring within a
591 single basic block. All transformations keep the code size the same or
592 smaller. For those that reduce size, the gaps are initially filled with
593 NOPs. Later those NOPs are removed and the jump addresses retargeted in
594 a single pass. Line numbering is adjusted accordingly. */
595
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000596static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000597optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000598{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000599 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000600 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000601 unsigned char *codestr = NULL;
602 unsigned char *lineno;
603 int *addrmap = NULL;
604 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000605 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000606 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000607 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000608
Raymond Hettingereffb3932004-10-30 08:55:08 +0000609 /* Bail out if an exception is set */
610 if (PyErr_Occurred())
611 goto exitUnchanged;
612
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000613 /* Bypass optimization when the lineno table is too complex */
614 assert(PyString_Check(lineno_obj));
615 lineno = PyString_AS_STRING(lineno_obj);
616 tabsiz = PyString_GET_SIZE(lineno_obj);
617 if (memchr(lineno, 255, tabsiz) != NULL)
618 goto exitUnchanged;
619
Raymond Hettingera12fa142004-08-24 04:34:16 +0000620 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000621 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000622 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000623 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000624 goto exitUnchanged;
625
626 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000627 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000628 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000629 goto exitUnchanged;
630 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000631
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000632 /* Mapping to new jump targets after NOPs are removed */
633 addrmap = PyMem_Malloc(codelen * sizeof(int));
634 if (addrmap == NULL)
635 goto exitUnchanged;
636
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000637 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000638 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000639 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000640 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000641
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000642 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000643 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000644
645 lastlc = cumlc;
646 cumlc = 0;
647
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648 switch (opcode) {
649
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000650 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000651 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000652 case UNARY_NOT:
653 if (codestr[i+1] != JUMP_IF_FALSE ||
654 codestr[i+4] != POP_TOP ||
655 !ISBASICBLOCK(blocks,i,5))
656 continue;
657 tgt = GETJUMPTGT(codestr, (i+1));
658 if (codestr[tgt] != POP_TOP)
659 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000660 j = GETARG(codestr, i+1) + 1;
661 codestr[i] = JUMP_IF_TRUE;
662 SETARG(codestr, i, j);
663 codestr[i+3] = POP_TOP;
664 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000665 break;
666
667 /* not a is b --> a is not b
668 not a in b --> a not in b
669 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000670 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000671 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000672 case COMPARE_OP:
673 j = GETARG(codestr, i);
674 if (j < 6 || j > 9 ||
675 codestr[i+3] != UNARY_NOT ||
676 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000677 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000678 SETARG(codestr, i, (j^1));
679 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000680 break;
681
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000682 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
683 case LOAD_NAME:
684 case LOAD_GLOBAL:
685 j = GETARG(codestr, i);
686 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
687 if (name == NULL || strcmp(name, "None") != 0)
688 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000689 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
690 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000691 codestr[i] = LOAD_CONST;
692 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000693 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000694 break;
695 }
696 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000697 break;
698
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000699 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000700 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000701 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000702 j = GETARG(codestr, i);
703 if (codestr[i+3] != JUMP_IF_FALSE ||
704 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000705 !ISBASICBLOCK(blocks,i,7) ||
706 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000707 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000708 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000709 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000710 break;
711
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000712 /* Try to fold tuples of constants (includes a case for lists
713 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000714 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000715 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
716 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000717 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000718 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000719 j = GETARG(codestr, i);
720 h = i - 3 * j;
721 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000722 j <= lastlc &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000723 (opcode == BUILD_TUPLE &&
724 ISBASICBLOCK(blocks, h, 3*(j+1)) ||
725 opcode == BUILD_LIST &&
726 codestr[i+3]==COMPARE_OP &&
727 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
728 (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000729 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000730 assert(codestr[i] == LOAD_CONST);
731 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000732 break;
733 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000734 if (codestr[i+3] != UNPACK_SEQUENCE ||
735 !ISBASICBLOCK(blocks,i,6) ||
736 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000737 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000738 if (j == 1) {
739 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000740 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000741 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000742 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000743 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000744 codestr[i] = ROT_THREE;
745 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000746 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000747 }
748 break;
749
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000750 /* Fold binary ops on constants.
751 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
752 case BINARY_POWER:
753 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000754 case BINARY_TRUE_DIVIDE:
755 case BINARY_FLOOR_DIVIDE:
756 case BINARY_MODULO:
757 case BINARY_ADD:
758 case BINARY_SUBTRACT:
759 case BINARY_SUBSCR:
760 case BINARY_LSHIFT:
761 case BINARY_RSHIFT:
762 case BINARY_AND:
763 case BINARY_XOR:
764 case BINARY_OR:
765 if (lastlc >= 2 &&
766 ISBASICBLOCK(blocks, i-6, 7) &&
767 fold_binops_on_constants(&codestr[i-6], consts)) {
768 i -= 2;
769 assert(codestr[i] == LOAD_CONST);
770 cumlc = 1;
771 }
772 break;
773
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000774 /* Simplify conditional jump to conditional jump where the
775 result of the first test implies the success of a similar
776 test or the failure of the opposite test.
777 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000778 "if a and b:"
779 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000780 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000781 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000782 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000783 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
784 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000785 */
786 case JUMP_IF_FALSE:
787 case JUMP_IF_TRUE:
788 tgt = GETJUMPTGT(codestr, i);
789 j = codestr[tgt];
790 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
791 if (j == opcode) {
792 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
793 SETARG(codestr, i, tgttgt);
794 } else {
795 tgt -= i;
796 SETARG(codestr, i, tgt);
797 }
798 break;
799 }
800 /* Intentional fallthrough */
801
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000802 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000803 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000804 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000805 case JUMP_ABSOLUTE:
806 case CONTINUE_LOOP:
807 case SETUP_LOOP:
808 case SETUP_EXCEPT:
809 case SETUP_FINALLY:
810 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000811 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000812 continue;
813 tgttgt = GETJUMPTGT(codestr, tgt);
814 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
815 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000816 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000817 tgttgt -= i + 3; /* Calc relative jump addr */
818 if (tgttgt < 0) /* No backward relative jumps */
819 continue;
820 codestr[i] = opcode;
821 SETARG(codestr, i, tgttgt);
822 break;
823
824 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000825 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000826
827 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
828 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000829 if (i+4 >= codelen ||
830 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000831 !ISBASICBLOCK(blocks,i,5))
832 continue;
833 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000834 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000835 }
836 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000837
838 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000839 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
840 addrmap[i] = i - nops;
841 if (codestr[i] == NOP)
842 nops++;
843 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000844 cum_orig_line = 0;
845 last_line = 0;
846 for (i=0 ; i < tabsiz ; i+=2) {
847 cum_orig_line += lineno[i];
848 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000849 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000850 lineno[i] =((unsigned char)(new_line - last_line));
851 last_line = new_line;
852 }
853
854 /* Remove NOPs and fixup jump targets */
855 for (i=0, h=0 ; i<codelen ; ) {
856 opcode = codestr[i];
857 switch (opcode) {
858 case NOP:
859 i++;
860 continue;
861
862 case JUMP_ABSOLUTE:
863 case CONTINUE_LOOP:
864 j = addrmap[GETARG(codestr, i)];
865 SETARG(codestr, i, j);
866 break;
867
868 case FOR_ITER:
869 case JUMP_FORWARD:
870 case JUMP_IF_FALSE:
871 case JUMP_IF_TRUE:
872 case SETUP_LOOP:
873 case SETUP_EXCEPT:
874 case SETUP_FINALLY:
875 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
876 SETARG(codestr, i, j);
877 break;
878 }
879 adj = CODESIZE(opcode);
880 while (adj--)
881 codestr[h++] = codestr[i++];
882 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000883 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000884
885 code = PyString_FromStringAndSize((char *)codestr, h);
886 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000887 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000888 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000889 return code;
890
891exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000892 if (blocks != NULL)
893 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000894 if (addrmap != NULL)
895 PyMem_Free(addrmap);
896 if (codestr != NULL)
897 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000898 Py_INCREF(code);
899 return code;
900}
901
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000902/* End: Peephole optimizations ----------------------------------------- */
903
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000905PyCode_New(int argcount, int nlocals, int stacksize, int flags,
906 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000907 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
908 PyObject *filename, PyObject *name, int firstlineno,
909 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000910{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000912 int i;
913 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000914 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000915 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 consts == NULL || !PyTuple_Check(consts) ||
917 names == NULL || !PyTuple_Check(names) ||
918 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000919 freevars == NULL || !PyTuple_Check(freevars) ||
920 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 name == NULL || !PyString_Check(name) ||
922 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000923 lnotab == NULL || !PyString_Check(lnotab) ||
924 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000925 PyErr_BadInternalCall();
926 return NULL;
927 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000928 intern_strings(names);
929 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000930 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000931 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000932 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 for (i = PyTuple_Size(consts); --i >= 0; ) {
934 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000936 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000937 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000938 continue;
939 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000940 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000942 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000943 co->co_argcount = argcount;
944 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000945 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000946 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000947 Py_INCREF(code);
948 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000954 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000955 Py_INCREF(freevars);
956 co->co_freevars = freevars;
957 Py_INCREF(cellvars);
958 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000960 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000962 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000963 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000965 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000966 if (PyTuple_GET_SIZE(freevars) == 0 &&
967 PyTuple_GET_SIZE(cellvars) == 0)
968 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969 }
970 return co;
971}
972
973
974/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000975
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976/* The compiler uses two passes to generate bytecodes. The first pass
977 builds the symbol table. The second pass generates the bytecode.
978
979 The first pass uses a single symtable struct. The second pass uses
980 a compiling struct for each code block. The compiling structs
981 share a reference to the symtable.
982
983 The two passes communicate via symtable_load_symbols() and via
984 is_local() and is_global(). The former initializes several slots
985 in the compiling struct: c_varnames, c_locals, c_nlocals,
986 c_argcount, c_globals, and c_flags.
987*/
988
Tim Peters2a7f3842001-06-09 09:26:21 +0000989/* All about c_lnotab.
990
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000991c_lnotab is an array of unsigned bytes disguised as a Python string. Since
992version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
993mapped to source code line #s via c_lnotab instead.
994
Tim Peters2a7f3842001-06-09 09:26:21 +0000995The array is conceptually a list of
996 (bytecode offset increment, line number increment)
997pairs. The details are important and delicate, best illustrated by example:
998
999 byte code offset source code line number
1000 0 1
1001 6 2
1002 50 7
1003 350 307
1004 361 308
1005
1006The first trick is that these numbers aren't stored, only the increments
1007from one row to the next (this doesn't really work, but it's a start):
1008
1009 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1010
1011The second trick is that an unsigned byte can't hold negative values, or
1012values larger than 255, so (a) there's a deep assumption that byte code
1013offsets and their corresponding line #s both increase monotonically, and (b)
1014if at least one column jumps by more than 255 from one row to the next, more
1015than one pair is written to the table. In case #b, there's no way to know
1016from looking at the table later how many were written. That's the delicate
1017part. A user of c_lnotab desiring to find the source line number
1018corresponding to a bytecode address A should do something like this
1019
1020 lineno = addr = 0
1021 for addr_incr, line_incr in c_lnotab:
1022 addr += addr_incr
1023 if addr > A:
1024 return lineno
1025 lineno += line_incr
1026
1027In order for this to work, when the addr field increments by more than 255,
1028the line # increment in each pair generated must be 0 until the remaining addr
1029increment is < 256. So, in the example above, com_set_lineno should not (as
1030was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1031255, 0, 45, 255, 0, 45.
1032*/
1033
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001034struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001035 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001037 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001038 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001039 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001040 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyObject *c_locals; /* dictionary (value=localID) */
1042 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001043 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001044 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001045 int c_nlocals; /* index of next local */
1046 int c_argcount; /* number of top-level arguments */
1047 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 int c_nexti; /* index into c_code */
1049 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001050 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001051 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001052 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001053 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001054 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001055 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001056 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001057 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001058 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001059 int c_stacklevel; /* Current stack level */
1060 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001061 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001063 int c_last_addr; /* last op addr seen and recorded in lnotab */
1064 int c_last_line; /* last line seen and recorded in lnotab */
1065 int c_lnotab_next; /* current length of lnotab */
1066 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001067 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001069 int c_nested; /* Is block nested funcdef or lamdef? */
1070 int c_closure; /* Is nested w/freevars? */
1071 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001072 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001073 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074};
1075
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001076static int
1077is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001078{
1079 if ((v & (USE | DEF_FREE))
1080 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1081 return 1;
1082 if (v & DEF_FREE_CLASS)
1083 return 1;
1084 return 0;
1085}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001086
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001088com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001089{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001090 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1091
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001092 if (c == NULL) {
1093 /* Error occurred via symtable call to
1094 is_constant_false */
1095 PyErr_SetString(exc, msg);
1096 return;
1097 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001098 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001099 if (c->c_lineno < 1 || c->c_interactive) {
1100 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001102 return;
1103 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001104 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001105 if (v == NULL)
1106 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001107
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001108 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001109 if (line == NULL) {
1110 Py_INCREF(Py_None);
1111 line = Py_None;
1112 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001113 if (exc == PyExc_SyntaxError) {
1114 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1115 Py_None, line);
1116 if (t == NULL)
1117 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001118 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001119 if (w == NULL)
1120 goto exit;
1121 PyErr_SetObject(exc, w);
1122 } else {
1123 /* Make sure additional exceptions are printed with
1124 file and line, also. */
1125 PyErr_SetObject(exc, v);
1126 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1127 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001128 exit:
1129 Py_XDECREF(t);
1130 Py_XDECREF(v);
1131 Py_XDECREF(w);
1132 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001133}
1134
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001135/* Interface to the block stack */
1136
1137static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001138block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001139{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001140 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 com_error(c, PyExc_SystemError,
1142 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001143 }
1144 else {
1145 c->c_block[c->c_nblocks++] = type;
1146 }
1147}
1148
1149static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001150block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001151{
1152 if (c->c_nblocks > 0)
1153 c->c_nblocks--;
1154 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001156 }
1157}
1158
Guido van Rossum681d79a1995-07-18 14:51:37 +00001159/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001160
Martin v. Löwis95292d62002-12-11 14:04:59 +00001161static int issue_warning(const char *, const char *, int);
1162static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001163static void com_free(struct compiling *);
1164static void com_push(struct compiling *, int);
1165static void com_pop(struct compiling *, int);
1166static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001167static void com_node(struct compiling *, node *);
1168static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001169static void com_addbyte(struct compiling *, int);
1170static void com_addint(struct compiling *, int);
1171static void com_addoparg(struct compiling *, int, int);
1172static void com_addfwref(struct compiling *, int, int *);
1173static void com_backpatch(struct compiling *, int);
1174static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1175static int com_addconst(struct compiling *, PyObject *);
1176static int com_addname(struct compiling *, PyObject *);
1177static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001178static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001179static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001180static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001181static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001182static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001183static void com_assign(struct compiling *, node *, int, node *);
1184static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001185static int com_make_closure(struct compiling *c, PyCodeObject *co);
1186
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001187static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001188static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001189 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001190static PyObject *parsestrplus(struct compiling*, node *);
1191static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001192static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001193
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001194static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001195
1196/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001197static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001198static struct symtable *symtable_build(node *, PyFutureFeatures *,
1199 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001200static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001201static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001202static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001203static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001204static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001205static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001206
1207static void symtable_node(struct symtable *, node *);
1208static void symtable_funcdef(struct symtable *, node *);
1209static void symtable_default_args(struct symtable *, node *);
1210static void symtable_params(struct symtable *, node *);
1211static void symtable_params_fplist(struct symtable *, node *n);
1212static void symtable_global(struct symtable *, node *);
1213static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001214static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001215static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001216static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001217static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001218static void symtable_gen_for(struct symtable *, node *, int);
1219static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001220
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001221static int symtable_update_free_vars(struct symtable *);
1222static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1223static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1224
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001225/* helper */
1226static void
1227do_pad(int pad)
1228{
1229 int i;
1230 for (i = 0; i < pad; ++i)
1231 fprintf(stderr, " ");
1232}
1233
1234static void
1235dump(node *n, int pad, int depth)
1236{
1237 int i;
1238 if (depth == 0)
1239 return;
1240 do_pad(pad);
1241 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1242 if (depth > 0)
1243 depth--;
1244 for (i = 0; i < NCH(n); ++i)
1245 dump(CHILD(n, i), pad + 1, depth);
1246}
1247
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001249com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001251 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1253 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001254 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001256 goto fail;
1257 if ((c->c_const_dict = PyDict_New()) == NULL)
1258 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001259 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001260 goto fail;
1261 if ((c->c_name_dict = PyDict_New()) == NULL)
1262 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001264 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001265 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1266 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001267 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001268 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001269 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001270 c->c_freevars = NULL;
1271 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001272 c->c_nlocals = 0;
1273 c->c_argcount = 0;
1274 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275 c->c_nexti = 0;
1276 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001278 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001280 c->c_begin = 0;
1281 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001283 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001284 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001285 c->c_stacklevel = 0;
1286 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001287 c->c_firstlineno = 0;
1288 c->c_last_addr = 0;
1289 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001290 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001291 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001292 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001293 c->c_nested = 0;
1294 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001295 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296 return 1;
1297
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001298 fail:
1299 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300 return 0;
1301}
1302
1303static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001304com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 Py_XDECREF(c->c_code);
1307 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001308 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001310 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 Py_XDECREF(c->c_globals);
1312 Py_XDECREF(c->c_locals);
1313 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001314 Py_XDECREF(c->c_freevars);
1315 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001317 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001318 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001319}
1320
1321static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001322com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001323{
1324 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001325 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001326 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001327 /*
1328 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1329 c->c_filename, c->c_name, c->c_lineno,
1330 c->c_nexti, c->c_stacklevel, n);
1331 */
1332 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001333}
1334
1335static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001336com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001337{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001338 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001339 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001340 else
1341 c->c_stacklevel -= n;
1342}
1343
1344static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001345com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346{
1347 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001349 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351}
1352
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001353static int
1354com_check_size(PyObject **s, int offset)
1355{
1356 int len = PyString_GET_SIZE(*s);
1357 if (offset >= len)
1358 return _PyString_Resize(s, len * 2);
1359 return 0;
1360}
1361
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001363com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001365 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001366 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001367 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001368 if (com_check_size(&c->c_code, c->c_nexti)) {
1369 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001370 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001372 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001373}
1374
1375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001378 com_addbyte(c, x & 0xff);
1379 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001380}
1381
1382static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001383com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001384{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001385 char *p;
1386 if (c->c_lnotab == NULL)
1387 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001388 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1389 c->c_errors++;
1390 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001391 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001392 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001393 *p++ = addr;
1394 *p++ = line;
1395 c->c_lnotab_next += 2;
1396}
1397
1398static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001399com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001400{
1401 c->c_lineno = lineno;
1402 if (c->c_firstlineno == 0) {
1403 c->c_firstlineno = c->c_last_line = lineno;
1404 }
1405 else {
1406 int incr_addr = c->c_nexti - c->c_last_addr;
1407 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001408 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001409 while (incr_addr > 255) {
1410 com_add_lnotab(c, 255, 0);
1411 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001412 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001413 while (incr_line > 255) {
1414 com_add_lnotab(c, incr_addr, 255);
1415 incr_line -=255;
1416 incr_addr = 0;
1417 }
1418 if (incr_addr > 0 || incr_line > 0)
1419 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001420 c->c_last_addr = c->c_nexti;
1421 c->c_last_line = lineno;
1422 }
1423}
1424
1425static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001426com_strip_lnotab(struct compiling *c)
1427{
1428 /* strip the last lnotab entry if no opcode were emitted.
1429 * This prevents a line number to be generated on a final
1430 * pass, like in the following example:
1431 *
1432 * if a:
1433 * print 5
1434 * else:
1435 * pass
1436 *
1437 * Without the fix, a line trace event would be generated
1438 * on the pass even if a is true (because of the implicit
1439 * return).
1440 */
1441 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1442 c->c_lnotab_next = c->c_lnotab_last;
1443 }
1444}
1445
1446static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001447com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001448{
Fred Drakeef8ace32000-08-24 00:32:09 +00001449 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001450 if (extended_arg){
1451 com_addbyte(c, EXTENDED_ARG);
1452 com_addint(c, extended_arg);
1453 arg &= 0xffff;
1454 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001455 com_addbyte(c, op);
1456 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001457}
1458
1459static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001460com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001461{
1462 /* Compile a forward reference for backpatching */
1463 int here;
1464 int anchor;
1465 com_addbyte(c, op);
1466 here = c->c_nexti;
1467 anchor = *p_anchor;
1468 *p_anchor = here;
1469 com_addint(c, anchor == 0 ? 0 : here - anchor);
1470}
1471
1472static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001473com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001474{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001475 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001476 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001477 int dist;
1478 int prev;
1479 for (;;) {
1480 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001481 prev = code[anchor] + (code[anchor+1] << 8);
1482 dist = target - (anchor+2);
1483 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001484 dist >>= 8;
1485 code[anchor+1] = dist;
1486 dist >>= 8;
1487 if (dist) {
1488 com_error(c, PyExc_SystemError,
1489 "com_backpatch: offset too large");
1490 break;
1491 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001492 if (!prev)
1493 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494 anchor -= prev;
1495 }
1496}
1497
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001498/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001499
1500static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001501com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001502{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001503 PyObject *w, *t, *np=NULL;
1504 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001505
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001506 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001507 if (t == NULL)
1508 goto fail;
1509 w = PyDict_GetItem(dict, t);
1510 if (w != NULL) {
1511 n = PyInt_AsLong(w);
1512 } else {
1513 n = PyList_Size(list);
1514 np = PyInt_FromLong(n);
1515 if (np == NULL)
1516 goto fail;
1517 if (PyList_Append(list, v) != 0)
1518 goto fail;
1519 if (PyDict_SetItem(dict, t, np) != 0)
1520 goto fail;
1521 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001522 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001523 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001524 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001525 fail:
1526 Py_XDECREF(np);
1527 Py_XDECREF(t);
1528 c->c_errors++;
1529 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001530}
1531
1532static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001533com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001535 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001536}
1537
1538static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001539com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001541 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542}
1543
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001544int
1545_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001546{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001547 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001548 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001549 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001550 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1551 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001552 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001553 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001554 return 0; /* Don't mangle __extremely_long_names */
1555 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1556 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001557 /* Strip leading underscores from class name */
1558 while (*p == '_')
1559 p++;
1560 if (*p == '\0')
1561 return 0; /* Don't mangle if class is just underscores */
1562 plen = strlen(p);
1563 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001564 plen = maxlen-nlen-2; /* Truncate class name if too long */
1565 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001566 buffer[0] = '_';
1567 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001568 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001569 return 1;
1570}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001571
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001572static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001573com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001577 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001578
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001579 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001580 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001581 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582 c->c_errors++;
1583 i = 255;
1584 }
1585 else {
1586 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001589 com_addoparg(c, op, i);
1590}
1591
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001592#define NAME_LOCAL 0
1593#define NAME_GLOBAL 1
1594#define NAME_DEFAULT 2
1595#define NAME_CLOSURE 3
1596
1597static int
1598com_lookup_arg(PyObject *dict, PyObject *name)
1599{
1600 PyObject *v = PyDict_GetItem(dict, name);
1601 if (v == NULL)
1602 return -1;
1603 else
1604 return PyInt_AS_LONG(v);
1605}
1606
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001607static int
1608none_assignment_check(struct compiling *c, char *name, int assigning)
1609{
1610 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1611 char *msg;
1612 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001613 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001614 else
1615 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001616 com_error(c, PyExc_SyntaxError, msg);
1617 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001618 }
1619 return 0;
1620}
1621
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001622static void
1623com_addop_varname(struct compiling *c, int kind, char *name)
1624{
1625 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001626 int i, reftype;
1627 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001628 int op = STOP_CODE;
1629 char buffer[MANGLE_LEN];
1630
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001631 if (kind != VAR_LOAD &&
1632 none_assignment_check(c, name, kind == VAR_STORE))
1633 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001634 i = 255;
1635 goto done;
1636 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001637 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001638 name = buffer;
1639 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1640 c->c_errors++;
1641 i = 255;
1642 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001643 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001644
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001645 reftype = get_ref_type(c, name);
1646 switch (reftype) {
1647 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001648 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001649 scope = NAME_LOCAL;
1650 break;
1651 case GLOBAL_EXPLICIT:
1652 scope = NAME_GLOBAL;
1653 break;
1654 case GLOBAL_IMPLICIT:
1655 if (c->c_flags & CO_OPTIMIZED)
1656 scope = NAME_GLOBAL;
1657 break;
1658 case FREE:
1659 case CELL:
1660 scope = NAME_CLOSURE;
1661 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001662 }
1663
1664 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001665 if (scope == NAME_LOCAL)
1666 i = com_lookup_arg(c->c_locals, v);
1667 else if (reftype == FREE)
1668 i = com_lookup_arg(c->c_freevars, v);
1669 else if (reftype == CELL)
1670 i = com_lookup_arg(c->c_cellvars, v);
1671 if (i == -1) {
1672 c->c_errors++; /* XXX no exception set */
1673 i = 255;
1674 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001675 }
1676 Py_DECREF(v);
1677
1678 switch (kind) {
1679 case VAR_LOAD:
1680 switch (scope) {
1681 case NAME_LOCAL:
1682 op = LOAD_FAST;
1683 break;
1684 case NAME_GLOBAL:
1685 op = LOAD_GLOBAL;
1686 break;
1687 case NAME_DEFAULT:
1688 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001689 break;
1690 case NAME_CLOSURE:
1691 op = LOAD_DEREF;
1692 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001693 }
1694 break;
1695 case VAR_STORE:
1696 switch (scope) {
1697 case NAME_LOCAL:
1698 op = STORE_FAST;
1699 break;
1700 case NAME_GLOBAL:
1701 op = STORE_GLOBAL;
1702 break;
1703 case NAME_DEFAULT:
1704 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001705 break;
1706 case NAME_CLOSURE:
1707 op = STORE_DEREF;
1708 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001709 }
1710 break;
1711 case VAR_DELETE:
1712 switch (scope) {
1713 case NAME_LOCAL:
1714 op = DELETE_FAST;
1715 break;
1716 case NAME_GLOBAL:
1717 op = DELETE_GLOBAL;
1718 break;
1719 case NAME_DEFAULT:
1720 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001721 break;
1722 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001723 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001724 PyOS_snprintf(buf, sizeof(buf),
1725 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001726 com_error(c, PyExc_SyntaxError, buf);
1727 i = 255;
1728 break;
1729 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001730 }
1731 break;
1732 }
1733done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001734 com_addoparg(c, op, i);
1735}
1736
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001738com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001739{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001740 char *name;
1741 char buffer[1000];
1742 /* XXX it is possible to write this code without the 1000
1743 chars on the total length of dotted names, I just can't be
1744 bothered right now */
1745 if (TYPE(n) == STAR)
1746 name = "*";
1747 else if (TYPE(n) == dotted_name) {
1748 char *p = buffer;
1749 int i;
1750 name = buffer;
1751 for (i = 0; i < NCH(n); i += 2) {
1752 char *s = STR(CHILD(n, i));
1753 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001755 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001756 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001757 break;
1758 }
1759 if (p != buffer)
1760 *p++ = '.';
1761 strcpy(p, s);
1762 p = strchr(p, '\0');
1763 }
1764 }
1765 else {
1766 REQ(n, NAME);
1767 name = STR(n);
1768 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001769 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001770}
1771
Guido van Rossum79f25d91997-04-29 20:08:16 +00001772static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001773parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001775 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001776 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001777 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001778#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001779 int imflag;
1780#endif
1781
Guido van Rossum282914b1991-04-04 10:42:56 +00001782 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001783 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001784#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001785 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001786#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001787 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001789 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001791 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001792 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001793 }
1794 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001795 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001797 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001798 if (errno != 0)
1799 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001801 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001802 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001803#ifndef WITHOUT_COMPLEX
1804 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001805 Py_complex z;
1806 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001807 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001808 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001809 PyFPE_END_PROTECT(z)
1810 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001811 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001812 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001813#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001814 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001815 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001816 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001817 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001819 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820}
1821
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001823decode_utf8(char **sPtr, char *end, char* encoding)
1824{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001825#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001826 Py_FatalError("decode_utf8 should not be called in this build.");
1827 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001828#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001829 PyObject *u, *v;
1830 char *s, *t;
1831 t = s = *sPtr;
1832 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1833 while (s < end && (*s & 0x80)) s++;
1834 *sPtr = s;
1835 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1836 if (u == NULL)
1837 return NULL;
1838 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1839 Py_DECREF(u);
1840 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001841#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001842}
1843
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001844/* compiler.transformer.Transformer.decode_literal depends on what
1845 might seem like minor details of this function -- changes here
1846 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001847static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001848parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001849{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001851 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001852 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001853 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001854 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001855 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001856 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001857
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001858 if (isalpha(quote) || quote == '_') {
1859 if (quote == 'u' || quote == 'U') {
1860 quote = *++s;
1861 unicode = 1;
1862 }
1863 if (quote == 'r' || quote == 'R') {
1864 quote = *++s;
1865 rawmode = 1;
1866 }
1867 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001868 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001870 return NULL;
1871 }
1872 s++;
1873 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001874 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001875 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001876 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001877 return NULL;
1878 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001879 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001881 return NULL;
1882 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001883 if (len >= 4 && s[0] == quote && s[1] == quote) {
1884 s += 2;
1885 len -= 2;
1886 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001888 return NULL;
1889 }
1890 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001891#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001892 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001893 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001894 char *buf;
1895 char *p;
1896 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001897 if (encoding == NULL) {
1898 buf = s;
1899 u = NULL;
1900 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1901 buf = s;
1902 u = NULL;
1903 } else {
1904 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1905 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1906 if (u == NULL)
1907 return NULL;
1908 p = buf = PyString_AsString(u);
1909 end = s + len;
1910 while (s < end) {
1911 if (*s == '\\') {
1912 *p++ = *s++;
1913 if (*s & 0x80) {
1914 strcpy(p, "u005c");
1915 p += 5;
1916 }
1917 }
1918 if (*s & 0x80) { /* XXX inefficient */
1919 char *r;
1920 int rn, i;
1921 w = decode_utf8(&s, end, "utf-16-be");
1922 if (w == NULL) {
1923 Py_DECREF(u);
1924 return NULL;
1925 }
1926 r = PyString_AsString(w);
1927 rn = PyString_Size(w);
1928 assert(rn % 2 == 0);
1929 for (i = 0; i < rn; i += 2) {
1930 sprintf(p, "\\u%02x%02x",
1931 r[i + 0] & 0xFF,
1932 r[i + 1] & 0xFF);
1933 p += 6;
1934 }
1935 Py_DECREF(w);
1936 } else {
1937 *p++ = *s++;
1938 }
1939 }
1940 len = p - buf;
1941 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001942 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001943 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001944 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001945 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1946 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001947 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001948 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001949 return v;
1950
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001951 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001952#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001953 need_encoding = (encoding != NULL &&
1954 strcmp(encoding, "utf-8") != 0 &&
1955 strcmp(encoding, "iso-8859-1") != 0);
1956 if (rawmode || strchr(s, '\\') == NULL) {
1957 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001958#ifndef Py_USING_UNICODE
1959 /* This should not happen - we never see any other
1960 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001961 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001962#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001963 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1964 if (u == NULL)
1965 return NULL;
1966 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1967 Py_DECREF(u);
1968 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001969#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001970 } else {
1971 return PyString_FromStringAndSize(s, len);
1972 }
1973 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001974
1975 v = PyString_DecodeEscape(s, len, NULL, unicode,
1976 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001977 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001978 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001979 return v;
1980}
1981
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001983parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001984{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001986 int i;
1987 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001988 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001989 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001990 for (i = 1; i < NCH(n); i++) {
1991 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001992 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001993 if (s == NULL)
1994 goto onError;
1995 if (PyString_Check(v) && PyString_Check(s)) {
1996 PyString_ConcatAndDel(&v, s);
1997 if (v == NULL)
1998 goto onError;
1999 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002000#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002001 else {
2002 PyObject *temp;
2003 temp = PyUnicode_Concat(v, s);
2004 Py_DECREF(s);
2005 if (temp == NULL)
2006 goto onError;
2007 Py_DECREF(v);
2008 v = temp;
2009 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002010#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002011 }
2012 }
2013 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002014
2015 onError:
2016 Py_XDECREF(v);
2017 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002018}
2019
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002020static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002021com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002022{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002023 int anchor = 0;
2024 int save_begin = c->c_begin;
2025
Raymond Hettinger354433a2004-05-19 08:20:33 +00002026 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002027 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002028 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002029 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002030 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002031 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002032 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002033 c->c_loops++;
2034 com_list_iter(c, n, e, t);
2035 c->c_loops--;
2036 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2037 c->c_begin = save_begin;
2038 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002039 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002040}
2041
2042static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002043com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2044{
2045 int break_anchor = 0;
2046 int anchor = 0;
2047 int save_begin = c->c_begin;
2048
2049 REQ(n, gen_for);
2050 /* gen_for: for v in test [gen_iter] */
2051
2052 com_addfwref(c, SETUP_LOOP, &break_anchor);
2053 block_push(c, SETUP_LOOP);
2054
2055 if (is_outmost) {
2056 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2057 com_push(c, 1);
2058 }
2059 else {
2060 com_node(c, CHILD(n, 3));
2061 com_addbyte(c, GET_ITER);
2062 }
2063
2064 c->c_begin = c->c_nexti;
2065 com_set_lineno(c, c->c_last_line);
2066 com_addfwref(c, FOR_ITER, &anchor);
2067 com_push(c, 1);
2068 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2069
2070 if (NCH(n) == 5)
2071 com_gen_iter(c, CHILD(n, 4), t);
2072 else {
2073 com_test(c, t);
2074 com_addbyte(c, YIELD_VALUE);
2075 com_pop(c, 1);
2076 }
2077
2078 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2079 c->c_begin = save_begin;
2080
2081 com_backpatch(c, anchor);
2082 com_pop(c, 1); /* FOR_ITER has popped this */
2083 com_addbyte(c, POP_BLOCK);
2084 block_pop(c, SETUP_LOOP);
2085 com_backpatch(c, break_anchor);
2086}
2087
2088static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002089com_list_if(struct compiling *c, node *n, node *e, char *t)
2090{
2091 int anchor = 0;
2092 int a = 0;
2093 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002094 com_node(c, CHILD(n, 1));
2095 com_addfwref(c, JUMP_IF_FALSE, &a);
2096 com_addbyte(c, POP_TOP);
2097 com_pop(c, 1);
2098 com_list_iter(c, n, e, t);
2099 com_addfwref(c, JUMP_FORWARD, &anchor);
2100 com_backpatch(c, a);
2101 /* We jump here with an extra entry which we now pop */
2102 com_addbyte(c, POP_TOP);
2103 com_backpatch(c, anchor);
2104}
2105
2106static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002107com_gen_if(struct compiling *c, node *n, node *t)
2108{
2109 /* gen_if: 'if' test [gen_iter] */
2110 int anchor = 0;
2111 int a=0;
2112
2113 com_node(c, CHILD(n, 1));
2114 com_addfwref(c, JUMP_IF_FALSE, &a);
2115 com_addbyte(c, POP_TOP);
2116 com_pop(c, 1);
2117
2118 if (NCH(n) == 3)
2119 com_gen_iter(c, CHILD(n, 2), t);
2120 else {
2121 com_test(c, t);
2122 com_addbyte(c, YIELD_VALUE);
2123 com_pop(c, 1);
2124 }
2125 com_addfwref(c, JUMP_FORWARD, &anchor);
2126 com_backpatch(c, a);
2127 /* We jump here with an extra entry which we now pop */
2128 com_addbyte(c, POP_TOP);
2129 com_backpatch(c, anchor);
2130}
2131
2132static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002133com_list_iter(struct compiling *c,
2134 node *p, /* parent of list_iter node */
2135 node *e, /* element expression node */
2136 char *t /* name of result list temp local */)
2137{
2138 /* list_iter is the last child in a listmaker, list_for, or list_if */
2139 node *n = CHILD(p, NCH(p)-1);
2140 if (TYPE(n) == list_iter) {
2141 n = CHILD(n, 0);
2142 switch (TYPE(n)) {
2143 case list_for:
2144 com_list_for(c, n, e, t);
2145 break;
2146 case list_if:
2147 com_list_if(c, n, e, t);
2148 break;
2149 default:
2150 com_error(c, PyExc_SystemError,
2151 "invalid list_iter node type");
2152 }
2153 }
2154 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002155 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002156 com_push(c, 1);
2157 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002158 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002159 com_pop(c, 2);
2160 }
2161}
2162
2163static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002164com_gen_iter(struct compiling *c, node *n, node *t)
2165{
2166 /* gen_iter: gen_for | gen_if */
2167 node *ch;
2168 REQ(n, gen_iter);
2169
2170 ch = CHILD(n, 0);
2171
2172 switch (TYPE(ch)) {
2173 case gen_for:
2174 com_gen_for(c, ch, t, 0);
2175 break;
2176 case gen_if:
2177 com_gen_if(c, ch, t);
2178 break;
2179 default:
2180 com_error(c, PyExc_SystemError,
2181 "invalid gen_iter node type");
2182 }
2183}
2184
2185static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002186com_list_comprehension(struct compiling *c, node *n)
2187{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002188 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002189 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002190
2191 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002192 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002193 com_addoparg(c, BUILD_LIST, 0);
2194 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2195 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002196 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002197 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002198 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002199 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002200 --c->c_tmpname;
2201}
2202
2203static void
2204com_listmaker(struct compiling *c, node *n)
2205{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002206 /* listmaker: test ( list_for | (',' test)* [','] ) */
2207 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002208 com_list_comprehension(c, n);
2209 else {
2210 int len = 0;
2211 int i;
2212 for (i = 0; i < NCH(n); i += 2, len++)
2213 com_node(c, CHILD(n, i));
2214 com_addoparg(c, BUILD_LIST, len);
2215 com_pop(c, len-1);
2216 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002217}
2218
2219static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002220com_generator_expression(struct compiling *c, node *n)
2221{
2222 /* testlist_gexp: test gen_for */
2223 /* argument: test gen_for */
2224 PyCodeObject *co;
2225
2226 REQ(CHILD(n, 0), test);
2227 REQ(CHILD(n, 1), gen_for);
2228
2229 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2230 n->n_lineno);
2231 co = icompile(n, c);
2232 symtable_exit_scope(c->c_symtable);
2233
2234 if (co == NULL)
2235 c->c_errors++;
2236 else {
2237 int closure = com_make_closure(c, co);
2238 int i = com_addconst(c, (PyObject *)co);
2239
2240 com_addoparg(c, LOAD_CONST, i);
2241 com_push(c, 1);
2242 if (closure)
2243 com_addoparg(c, MAKE_CLOSURE, 0);
2244 else
2245 com_addoparg(c, MAKE_FUNCTION, 0);
2246
2247 com_test(c, CHILD(CHILD(n, 1), 3));
2248 com_addbyte(c, GET_ITER);
2249 com_addoparg(c, CALL_FUNCTION, 1);
2250 com_pop(c, 1);
2251
2252 Py_DECREF(co);
2253 }
2254}
2255
2256static void
2257com_testlist_gexp(struct compiling *c, node *n)
2258{
2259 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2260 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2261 com_generator_expression(c, n);
2262 else com_list(c, n, 0);
2263}
2264
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002265
Raymond Hettinger354433a2004-05-19 08:20:33 +00002266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002267com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002268{
2269 int i;
2270 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2271 for (i = 0; i+2 < NCH(n); i += 4) {
2272 /* We must arrange things just right for STORE_SUBSCR.
2273 It wants the stack to look like (value) (dict) (key) */
2274 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002275 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002276 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002277 com_node(c, CHILD(n, i+2)); /* value */
2278 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002279 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002280 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002281 }
2282}
2283
2284static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002286{
2287 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289 int i;
2290 REQ(n, atom);
2291 ch = CHILD(n, 0);
2292 switch (TYPE(ch)) {
2293 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002294 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002295 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002296 com_push(c, 1);
2297 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002298 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002299 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002300 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002301 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002302 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002303 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002304 com_push(c, 1);
2305 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002306 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002307 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002308 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002309 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002310 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002311 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002312 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002313 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002314 break;
2315 case BACKQUOTE:
2316 com_node(c, CHILD(n, 1));
2317 com_addbyte(c, UNARY_CONVERT);
2318 break;
2319 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002320 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321 i = 255;
2322 }
2323 else {
2324 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326 }
2327 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002328 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 break;
2330 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002331 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002332 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002333 c->c_errors++;
2334 i = 255;
2335 }
2336 else {
2337 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002339 }
2340 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002341 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002342 break;
2343 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002344 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002345 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 break;
2347 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 com_error(c, PyExc_SystemError,
2349 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 }
2351}
2352
2353static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002354com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355{
2356 if (NCH(n) == 1) {
2357 com_addbyte(c, op);
2358 }
2359 else if (NCH(n) == 2) {
2360 if (TYPE(CHILD(n, 0)) != COLON) {
2361 com_node(c, CHILD(n, 0));
2362 com_addbyte(c, op+1);
2363 }
2364 else {
2365 com_node(c, CHILD(n, 1));
2366 com_addbyte(c, op+2);
2367 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 }
2370 else {
2371 com_node(c, CHILD(n, 0));
2372 com_node(c, CHILD(n, 2));
2373 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 }
2376}
2377
Guido van Rossum635abd21997-01-06 22:56:52 +00002378static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002379com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2380{
2381 if (NCH(n) == 1) {
2382 com_addbyte(c, DUP_TOP);
2383 com_push(c, 1);
2384 com_addbyte(c, SLICE);
2385 com_node(c, augn);
2386 com_addbyte(c, opcode);
2387 com_pop(c, 1);
2388 com_addbyte(c, ROT_TWO);
2389 com_addbyte(c, STORE_SLICE);
2390 com_pop(c, 2);
2391 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2392 com_node(c, CHILD(n, 0));
2393 com_addoparg(c, DUP_TOPX, 2);
2394 com_push(c, 2);
2395 com_addbyte(c, SLICE+1);
2396 com_pop(c, 1);
2397 com_node(c, augn);
2398 com_addbyte(c, opcode);
2399 com_pop(c, 1);
2400 com_addbyte(c, ROT_THREE);
2401 com_addbyte(c, STORE_SLICE+1);
2402 com_pop(c, 3);
2403 } else if (NCH(n) == 2) {
2404 com_node(c, CHILD(n, 1));
2405 com_addoparg(c, DUP_TOPX, 2);
2406 com_push(c, 2);
2407 com_addbyte(c, SLICE+2);
2408 com_pop(c, 1);
2409 com_node(c, augn);
2410 com_addbyte(c, opcode);
2411 com_pop(c, 1);
2412 com_addbyte(c, ROT_THREE);
2413 com_addbyte(c, STORE_SLICE+2);
2414 com_pop(c, 3);
2415 } else {
2416 com_node(c, CHILD(n, 0));
2417 com_node(c, CHILD(n, 2));
2418 com_addoparg(c, DUP_TOPX, 3);
2419 com_push(c, 3);
2420 com_addbyte(c, SLICE+3);
2421 com_pop(c, 2);
2422 com_node(c, augn);
2423 com_addbyte(c, opcode);
2424 com_pop(c, 1);
2425 com_addbyte(c, ROT_FOUR);
2426 com_addbyte(c, STORE_SLICE+3);
2427 com_pop(c, 4);
2428 }
2429}
2430
2431static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002432com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002433{
2434 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002435 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002436 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002437 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002438 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002439 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002440 }
2441 else {
2442 com_node(c, CHILD(n, 0));
2443 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002444 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002445 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002446 if (NCH(n) == 2) {
2447 com_generator_expression(c, n);
2448 return;
2449 }
2450
Guido van Rossumf10570b1995-07-07 22:53:21 +00002451 m = n;
2452 do {
2453 m = CHILD(m, 0);
2454 } while (NCH(m) == 1);
2455 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002456 /* f(lambda x: x[0] = 3) ends up getting parsed with
2457 * LHS test = lambda x: x[0], and RHS test = 3.
2458 * SF bug 132313 points out that complaining about a keyword
2459 * then is very confusing.
2460 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002461 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002462 TYPE(m) == lambdef ?
2463 "lambda cannot contain assignment" :
2464 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002465 }
2466 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002467 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002468 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002469 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002470 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002471 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002472 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002473 else if (*pkeywords == NULL) {
2474 c->c_errors++;
2475 Py_DECREF(v);
2476 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002477 if (PyDict_GetItem(*pkeywords, v) != NULL)
2478 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002479 "duplicate keyword argument");
2480 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002481 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002482 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002483 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002484 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002485 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002486 }
2487 }
2488 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002489}
2490
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002491static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002492com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002493{
2494 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002495 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002496 }
2497 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002498 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002499 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002500 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002501 int star_flag = 0;
2502 int starstar_flag = 0;
2503 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002504 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002505 na = 0;
2506 nk = 0;
2507 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002508 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002509 if (TYPE(ch) == STAR ||
2510 TYPE(ch) == DOUBLESTAR)
2511 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002512 if (ch->n_lineno != lineno) {
2513 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002514 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002515 }
2516 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002517 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002518 na++;
2519 else
2520 nk++;
2521 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002522 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002523 while (i < NCH(n)) {
2524 node *tok = CHILD(n, i);
2525 node *ch = CHILD(n, i+1);
2526 i += 3;
2527 switch (TYPE(tok)) {
2528 case STAR: star_flag = 1; break;
2529 case DOUBLESTAR: starstar_flag = 1; break;
2530 }
2531 com_node(c, ch);
2532 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002533 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002534 com_error(c, PyExc_SyntaxError,
2535 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002536 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002537 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002538 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002539 star_flag + (starstar_flag << 1);
2540 else
2541 opcode = CALL_FUNCTION;
2542 com_addoparg(c, opcode, na | (nk << 8));
2543 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002544 }
2545}
2546
2547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002548com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002549{
2550 com_addopname(c, LOAD_ATTR, n);
2551}
2552
2553static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002554com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002555{
2556 int i=0;
2557 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002558 node *ch;
2559
2560 /* first argument */
2561 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002562 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002563 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002564 i++;
2565 }
2566 else {
2567 com_node(c, CHILD(n,i));
2568 i++;
2569 REQ(CHILD(n,i),COLON);
2570 i++;
2571 }
2572 /* second argument */
2573 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2574 com_node(c, CHILD(n,i));
2575 i++;
2576 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002577 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002578 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002579 com_push(c, 1);
2580 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002581 /* remaining arguments */
2582 for (; i < NCH(n); i++) {
2583 ns++;
2584 ch=CHILD(n,i);
2585 REQ(ch, sliceop);
2586 if (NCH(ch) == 1) {
2587 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002588 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002589 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002590 }
2591 else
2592 com_node(c, CHILD(ch,1));
2593 }
2594 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002595 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002596}
2597
2598static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002599com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002600{
2601 node *ch;
2602 REQ(n, subscript);
2603 ch = CHILD(n,0);
2604 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002605 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002606 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002607 com_push(c, 1);
2608 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002609 else {
2610 /* check for slice */
2611 if ((TYPE(ch) == COLON || NCH(n) > 1))
2612 com_sliceobj(c, n);
2613 else {
2614 REQ(ch, test);
2615 com_node(c, ch);
2616 }
2617 }
2618}
2619
2620static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002621com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002622{
2623 int i, op;
2624 REQ(n, subscriptlist);
2625 /* Check to make backward compatible slice behavior for '[i:j]' */
2626 if (NCH(n) == 1) {
2627 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002628 /* 'Basic' slice, should have exactly one colon. */
2629 if ((TYPE(CHILD(sub, 0)) == COLON
2630 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2631 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2632 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002633 switch (assigning) {
2634 case OP_DELETE:
2635 op = DELETE_SLICE;
2636 break;
2637 case OP_ASSIGN:
2638 op = STORE_SLICE;
2639 break;
2640 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002641 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002642 break;
2643 default:
2644 com_augassign_slice(c, sub, assigning, augn);
2645 return;
2646 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002647 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002648 if (op == STORE_SLICE)
2649 com_pop(c, 2);
2650 else if (op == DELETE_SLICE)
2651 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002652 return;
2653 }
2654 }
2655 /* Else normal subscriptlist. Compile each subscript. */
2656 for (i = 0; i < NCH(n); i += 2)
2657 com_subscript(c, CHILD(n, i));
2658 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 if (NCH(n) > 1) {
2660 i = (NCH(n)+1) / 2;
2661 com_addoparg(c, BUILD_TUPLE, i);
2662 com_pop(c, i-1);
2663 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002664 switch (assigning) {
2665 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002666 op = DELETE_SUBSCR;
2667 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002668 break;
2669 default:
2670 case OP_ASSIGN:
2671 op = STORE_SUBSCR;
2672 i = 3;
2673 break;
2674 case OP_APPLY:
2675 op = BINARY_SUBSCR;
2676 i = 1;
2677 break;
2678 }
2679 if (assigning > OP_APPLY) {
2680 com_addoparg(c, DUP_TOPX, 2);
2681 com_push(c, 2);
2682 com_addbyte(c, BINARY_SUBSCR);
2683 com_pop(c, 1);
2684 com_node(c, augn);
2685 com_addbyte(c, assigning);
2686 com_pop(c, 1);
2687 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002689 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002690 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002691}
2692
2693static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002694com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002695{
2696 REQ(n, trailer);
2697 switch (TYPE(CHILD(n, 0))) {
2698 case LPAR:
2699 com_call_function(c, CHILD(n, 1));
2700 break;
2701 case DOT:
2702 com_select_member(c, CHILD(n, 1));
2703 break;
2704 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002705 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002706 break;
2707 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002708 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002709 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002710 }
2711}
2712
2713static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002714com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002715{
2716 int i;
2717 REQ(n, power);
2718 com_atom(c, CHILD(n, 0));
2719 for (i = 1; i < NCH(n); i++) {
2720 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2721 com_factor(c, CHILD(n, i+1));
2722 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002723 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002724 break;
2725 }
2726 else
2727 com_apply_trailer(c, CHILD(n, i));
2728 }
2729}
2730
2731static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002732com_invert_constant(struct compiling *c, node *n)
2733{
2734 /* Compute the inverse of int and longs and use them directly,
2735 but be prepared to generate code for all other
2736 possibilities (invalid numbers, floats, complex).
2737 */
2738 PyObject *num, *inv = NULL;
2739 int i;
2740
2741 REQ(n, NUMBER);
2742 num = parsenumber(c, STR(n));
2743 if (num == NULL)
2744 i = 255;
2745 else {
2746 inv = PyNumber_Invert(num);
2747 if (inv == NULL) {
2748 PyErr_Clear();
2749 i = com_addconst(c, num);
2750 } else {
2751 i = com_addconst(c, inv);
2752 Py_DECREF(inv);
2753 }
2754 Py_DECREF(num);
2755 }
2756 com_addoparg(c, LOAD_CONST, i);
2757 com_push(c, 1);
2758 if (num != NULL && inv == NULL)
2759 com_addbyte(c, UNARY_INVERT);
2760}
2761
Tim Peters51e26512001-09-07 08:45:55 +00002762static int
2763is_float_zero(const char *p)
2764{
2765 int found_radix_point = 0;
2766 int ch;
2767 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2768 switch (ch) {
2769 case '0':
2770 /* no reason to believe it's not 0 -- continue */
2771 break;
2772
2773 case 'e': case 'E': case 'j': case 'J':
2774 /* If this was a hex constant, we already would have
2775 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2776 must be an exponent marker, and we haven't yet
2777 seen a non-zero digit, and it doesn't matter what
2778 the exponent is then. For 'j' or 'J' similarly,
2779 except that this is an imaginary 0 then. */
2780 return 1;
2781
2782 case '.':
2783 found_radix_point = 1;
2784 break;
2785
2786 default:
2787 return 0;
2788 }
2789 }
2790 return found_radix_point;
2791}
2792
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002794com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002795{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002796 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002797 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002799 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002800 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002801 approriate value as a constant. If the value is negative,
2802 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002803 negative in the 0th position -- unless we're doing unary minus
2804 of a floating zero! In that case the sign is significant, but
2805 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002806 */
2807 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002808 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002809 && TYPE((pfactor = CHILD(n, 1))) == factor
2810 && NCH(pfactor) == 1
2811 && TYPE((ppower = CHILD(pfactor, 0))) == power
2812 && NCH(ppower) == 1
2813 && TYPE((patom = CHILD(ppower, 0))) == atom
2814 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002815 && !(childtype == MINUS &&
2816 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002817 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002818 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002819 return;
2820 }
2821 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002822 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002823 if (s == NULL) {
2824 com_error(c, PyExc_MemoryError, "");
2825 com_addbyte(c, 255);
2826 return;
2827 }
2828 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002829 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002830 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002831 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002832 }
Tim Peters51e26512001-09-07 08:45:55 +00002833 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002834 }
2835 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002836 com_factor(c, CHILD(n, 1));
2837 com_addbyte(c, UNARY_POSITIVE);
2838 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002839 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 com_factor(c, CHILD(n, 1));
2841 com_addbyte(c, UNARY_NEGATIVE);
2842 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002843 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002844 com_factor(c, CHILD(n, 1));
2845 com_addbyte(c, UNARY_INVERT);
2846 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002848 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 }
2850}
2851
2852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002853com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002854{
2855 int i;
2856 int op;
2857 REQ(n, term);
2858 com_factor(c, CHILD(n, 0));
2859 for (i = 2; i < NCH(n); i += 2) {
2860 com_factor(c, CHILD(n, i));
2861 switch (TYPE(CHILD(n, i-1))) {
2862 case STAR:
2863 op = BINARY_MULTIPLY;
2864 break;
2865 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002866 if (c->c_flags & CO_FUTURE_DIVISION)
2867 op = BINARY_TRUE_DIVIDE;
2868 else
2869 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 break;
2871 case PERCENT:
2872 op = BINARY_MODULO;
2873 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002874 case DOUBLESLASH:
2875 op = BINARY_FLOOR_DIVIDE;
2876 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002877 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002878 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002879 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002880 op = 255;
2881 }
2882 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002883 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002884 }
2885}
2886
2887static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002888com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002889{
2890 int i;
2891 int op;
2892 REQ(n, arith_expr);
2893 com_term(c, CHILD(n, 0));
2894 for (i = 2; i < NCH(n); i += 2) {
2895 com_term(c, CHILD(n, i));
2896 switch (TYPE(CHILD(n, i-1))) {
2897 case PLUS:
2898 op = BINARY_ADD;
2899 break;
2900 case MINUS:
2901 op = BINARY_SUBTRACT;
2902 break;
2903 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002904 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002905 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002906 op = 255;
2907 }
2908 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002909 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002910 }
2911}
2912
2913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002914com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002915{
2916 int i;
2917 int op;
2918 REQ(n, shift_expr);
2919 com_arith_expr(c, CHILD(n, 0));
2920 for (i = 2; i < NCH(n); i += 2) {
2921 com_arith_expr(c, CHILD(n, i));
2922 switch (TYPE(CHILD(n, i-1))) {
2923 case LEFTSHIFT:
2924 op = BINARY_LSHIFT;
2925 break;
2926 case RIGHTSHIFT:
2927 op = BINARY_RSHIFT;
2928 break;
2929 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002930 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002931 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002932 op = 255;
2933 }
2934 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002935 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002936 }
2937}
2938
2939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002941{
2942 int i;
2943 int op;
2944 REQ(n, and_expr);
2945 com_shift_expr(c, CHILD(n, 0));
2946 for (i = 2; i < NCH(n); i += 2) {
2947 com_shift_expr(c, CHILD(n, i));
2948 if (TYPE(CHILD(n, i-1)) == AMPER) {
2949 op = BINARY_AND;
2950 }
2951 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002952 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002953 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002954 op = 255;
2955 }
2956 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002957 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002958 }
2959}
2960
2961static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002962com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002963{
2964 int i;
2965 int op;
2966 REQ(n, xor_expr);
2967 com_and_expr(c, CHILD(n, 0));
2968 for (i = 2; i < NCH(n); i += 2) {
2969 com_and_expr(c, CHILD(n, i));
2970 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2971 op = BINARY_XOR;
2972 }
2973 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002974 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002975 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976 op = 255;
2977 }
2978 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002979 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980 }
2981}
2982
2983static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002984com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985{
2986 int i;
2987 int op;
2988 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002989 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002990 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002991 com_xor_expr(c, CHILD(n, i));
2992 if (TYPE(CHILD(n, i-1)) == VBAR) {
2993 op = BINARY_OR;
2994 }
2995 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002996 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002997 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002998 op = 255;
2999 }
3000 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003001 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003002 }
3003}
3004
3005static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003006cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007{
3008 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003009 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003010 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3011 if (NCH(n) == 1) {
3012 n = CHILD(n, 0);
3013 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003014 case LESS: return PyCmp_LT;
3015 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003016 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003017 case LESSEQUAL: return PyCmp_LE;
3018 case GREATEREQUAL: return PyCmp_GE;
3019 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3020 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3021 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022 }
3023 }
3024 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003027 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003028 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003029 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 }
3031 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003032 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003033}
3034
3035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003036com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037{
3038 int i;
3039 enum cmp_op op;
3040 int anchor;
3041 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3042 com_expr(c, CHILD(n, 0));
3043 if (NCH(n) == 1)
3044 return;
3045
3046 /****************************************************************
3047 The following code is generated for all but the last
3048 comparison in a chain:
3049
3050 label: on stack: opcode: jump to:
3051
3052 a <code to load b>
3053 a, b DUP_TOP
3054 a, b, b ROT_THREE
3055 b, a, b COMPARE_OP
3056 b, 0-or-1 JUMP_IF_FALSE L1
3057 b, 1 POP_TOP
3058 b
3059
3060 We are now ready to repeat this sequence for the next
3061 comparison in the chain.
3062
3063 For the last we generate:
3064
3065 b <code to load c>
3066 b, c COMPARE_OP
3067 0-or-1
3068
3069 If there were any jumps to L1 (i.e., there was more than one
3070 comparison), we generate:
3071
3072 0-or-1 JUMP_FORWARD L2
3073 L1: b, 0 ROT_TWO
3074 0, b POP_TOP
3075 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003076 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 ****************************************************************/
3078
3079 anchor = 0;
3080
3081 for (i = 2; i < NCH(n); i += 2) {
3082 com_expr(c, CHILD(n, i));
3083 if (i+2 < NCH(n)) {
3084 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 com_addbyte(c, ROT_THREE);
3087 }
3088 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003089 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003090 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003091 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003092 }
3093 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003094 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003095 if (i+2 < NCH(n)) {
3096 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3097 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003098 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099 }
3100 }
3101
3102 if (anchor) {
3103 int anchor2 = 0;
3104 com_addfwref(c, JUMP_FORWARD, &anchor2);
3105 com_backpatch(c, anchor);
3106 com_addbyte(c, ROT_TWO);
3107 com_addbyte(c, POP_TOP);
3108 com_backpatch(c, anchor2);
3109 }
3110}
3111
3112static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003113com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003114{
3115 REQ(n, not_test); /* 'not' not_test | comparison */
3116 if (NCH(n) == 1) {
3117 com_comparison(c, CHILD(n, 0));
3118 }
3119 else {
3120 com_not_test(c, CHILD(n, 1));
3121 com_addbyte(c, UNARY_NOT);
3122 }
3123}
3124
3125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003126com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003127{
3128 int i;
3129 int anchor;
3130 REQ(n, and_test); /* not_test ('and' not_test)* */
3131 anchor = 0;
3132 i = 0;
3133 for (;;) {
3134 com_not_test(c, CHILD(n, i));
3135 if ((i += 2) >= NCH(n))
3136 break;
3137 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3138 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003139 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003140 }
3141 if (anchor)
3142 com_backpatch(c, anchor);
3143}
3144
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003145static int
3146com_make_closure(struct compiling *c, PyCodeObject *co)
3147{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003148 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003149 if (free == 0)
3150 return 0;
3151 for (i = 0; i < free; ++i) {
3152 /* Bypass com_addop_varname because it will generate
3153 LOAD_DEREF but LOAD_CLOSURE is needed.
3154 */
3155 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3156 int arg, reftype;
3157
3158 /* Special case: If a class contains a method with a
3159 free variable that has the same name as a method,
3160 the name will be considered free *and* local in the
3161 class. It should be handled by the closure, as
3162 well as by the normal name loookup logic.
3163 */
3164 reftype = get_ref_type(c, PyString_AS_STRING(name));
3165 if (reftype == CELL)
3166 arg = com_lookup_arg(c->c_cellvars, name);
3167 else /* (reftype == FREE) */
3168 arg = com_lookup_arg(c->c_freevars, name);
3169 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003170 fprintf(stderr, "lookup %s in %s %d %d\n"
3171 "freevars of %s: %s\n",
3172 PyObject_REPR(name),
3173 c->c_name,
3174 reftype, arg,
3175 PyString_AS_STRING(co->co_name),
3176 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003177 Py_FatalError("com_make_closure()");
3178 }
3179 com_addoparg(c, LOAD_CLOSURE, arg);
3180
3181 }
3182 com_push(c, free);
3183 return 1;
3184}
3185
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003187com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003188{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003189 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003190 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003191 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003192 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003193 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003194 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3195 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003196 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003197 if (co == NULL) {
3198 c->c_errors++;
3199 return;
3200 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003201 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003202 i = com_addconst(c, (PyObject *)co);
3203 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003204 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003205 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003206 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003207 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003208 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003209 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003210 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003211 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003212 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003213 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003214 else {
3215 int anchor = 0;
3216 int i = 0;
3217 for (;;) {
3218 com_and_test(c, CHILD(n, i));
3219 if ((i += 2) >= NCH(n))
3220 break;
3221 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3222 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003223 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003224 }
3225 if (anchor)
3226 com_backpatch(c, anchor);
3227 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228}
3229
3230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003231com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232{
3233 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003234 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003235 com_node(c, CHILD(n, 0));
3236 }
3237 else {
3238 int i;
3239 int len;
3240 len = (NCH(n) + 1) / 2;
3241 for (i = 0; i < NCH(n); i += 2)
3242 com_node(c, CHILD(n, i));
3243 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003244 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003245 }
3246}
3247
3248
3249/* Begin of assignment compilation */
3250
Thomas Wouters434d0822000-08-24 20:11:32 +00003251
3252static void
3253com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3254{
3255 com_addbyte(c, DUP_TOP);
3256 com_push(c, 1);
3257 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003258 com_node(c, augn);
3259 com_addbyte(c, opcode);
3260 com_pop(c, 1);
3261 com_addbyte(c, ROT_TWO);
3262 com_addopname(c, STORE_ATTR, n);
3263 com_pop(c, 2);
3264}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265
3266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003267com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003269 if (none_assignment_check(c, STR(n), assigning))
3270 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003271 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003272 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003273}
3274
3275static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003276com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278 REQ(n, trailer);
3279 switch (TYPE(CHILD(n, 0))) {
3280 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003281 if (assigning == OP_DELETE)
3282 com_error(c, PyExc_SyntaxError,
3283 "can't delete function call");
3284 else
3285 com_error(c, PyExc_SyntaxError,
3286 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 break;
3288 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003289 if (assigning > OP_APPLY)
3290 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3291 else
3292 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003293 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003294 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003295 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003296 break;
3297 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003298 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003299 }
3300}
3301
3302static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003303com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
3305 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003306 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3307 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 if (assigning) {
3310 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003311 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_push(c, i-1);
3313 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003315 com_assign(c, CHILD(n, i), assigning, NULL);
3316}
3317
3318static void
3319com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3320{
3321 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003322 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003323 com_push(c, 1);
3324 com_node(c, augn);
3325 com_addbyte(c, opcode);
3326 com_pop(c, 1);
3327 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003328}
3329
3330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003331com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003332{
3333 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003334 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003335 if (assigning)
3336 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337}
3338
3339static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003340com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341{
3342 /* Loop to avoid trivial recursion */
3343 for (;;) {
3344 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003345
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003346 case exprlist:
3347 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003348 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003349 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003351 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003352 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003353 "assign to generator expression not possible");
3354 return;
3355 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003356 if (assigning > OP_APPLY) {
3357 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003358 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003359 return;
3360 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003361 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003362 return;
3363 }
3364 n = CHILD(n, 0);
3365 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003366
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003367 case test:
3368 case and_test:
3369 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003370 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003372 case xor_expr:
3373 case and_expr:
3374 case shift_expr:
3375 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003377 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003379 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003380 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381 return;
3382 }
3383 n = CHILD(n, 0);
3384 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003385
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003386 case power: /* atom trailer* ('**' power)*
3387 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003388 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003389 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003390 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003391 return;
3392 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003393 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003394 int i;
3395 com_node(c, CHILD(n, 0));
3396 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003397 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003398 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003399 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003400 return;
3401 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 com_apply_trailer(c, CHILD(n, i));
3403 } /* NB i is still alive */
3404 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003405 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003406 return;
3407 }
3408 n = CHILD(n, 0);
3409 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003410
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 case atom:
3412 switch (TYPE(CHILD(n, 0))) {
3413 case LPAR:
3414 n = CHILD(n, 1);
3415 if (TYPE(n) == RPAR) {
3416 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003417 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003418 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 return;
3420 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003421 if (assigning > OP_APPLY) {
3422 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003423 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003424 return;
3425 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426 break;
3427 case LSQB:
3428 n = CHILD(n, 1);
3429 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003430 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003431 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003432 return;
3433 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003434 if (assigning > OP_APPLY) {
3435 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003436 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003437 return;
3438 }
3439 if (NCH(n) > 1
3440 && TYPE(CHILD(n, 1)) == list_for) {
3441 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003442 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003443 return;
3444 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003445 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 return;
3447 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003448 if (assigning > OP_APPLY)
3449 com_augassign_name(c, CHILD(n, 0),
3450 assigning, augn);
3451 else
3452 com_assign_name(c, CHILD(n, 0),
3453 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 return;
3455 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003456 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003457 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458 return;
3459 }
3460 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003461
3462 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 com_error(c, PyExc_SyntaxError,
3464 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003465 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003466
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003468 com_error(c, PyExc_SystemError,
3469 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003470 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003471
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 }
3473 }
3474}
Guido van Rossum7c531111997-03-11 18:42:21 +00003475
Thomas Wouters434d0822000-08-24 20:11:32 +00003476static void
3477com_augassign(struct compiling *c, node *n)
3478{
3479 int opcode;
3480
3481 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3482 case '+': opcode = INPLACE_ADD; break;
3483 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003484 case '/':
3485 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3486 opcode = INPLACE_FLOOR_DIVIDE;
3487 else if (c->c_flags & CO_FUTURE_DIVISION)
3488 opcode = INPLACE_TRUE_DIVIDE;
3489 else
3490 opcode = INPLACE_DIVIDE;
3491 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003492 case '%': opcode = INPLACE_MODULO; break;
3493 case '<': opcode = INPLACE_LSHIFT; break;
3494 case '>': opcode = INPLACE_RSHIFT; break;
3495 case '&': opcode = INPLACE_AND; break;
3496 case '^': opcode = INPLACE_XOR; break;
3497 case '|': opcode = INPLACE_OR; break;
3498 case '*':
3499 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3500 opcode = INPLACE_POWER;
3501 else
3502 opcode = INPLACE_MULTIPLY;
3503 break;
3504 default:
3505 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3506 return;
3507 }
3508 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3509}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510
3511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003512com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513{
Thomas Wouters434d0822000-08-24 20:11:32 +00003514 REQ(n, expr_stmt);
3515 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003516 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003517 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003519 if (NCH(n) == 1) {
3520 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003521 if (c->c_interactive)
3522 com_addbyte(c, PRINT_EXPR);
3523 else
3524 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003525 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003527 else if (TYPE(CHILD(n,1)) == augassign)
3528 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003529 else {
3530 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003531 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003532 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003533 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003534 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003535 com_push(c, 1);
3536 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003537 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003538 }
3539 }
3540}
3541
3542static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003543com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003544{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003545 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003546 int i;
3547 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003548 if (Py_OptimizeFlag)
3549 return;
3550 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003551
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003552 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003553 raise AssertionError [, <message>]
3554
3555 where <message> is the second test, if present.
3556 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003557 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003558 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003559 com_addbyte(c, POP_TOP);
3560 com_pop(c, 1);
3561 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003562 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003563 com_push(c, 1);
3564 i = NCH(n)/2; /* Either 2 or 4 */
3565 if (i > 1)
3566 com_node(c, CHILD(n, 3));
3567 com_addoparg(c, RAISE_VARARGS, i);
3568 com_pop(c, i);
3569 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003570 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003571 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003572 com_addbyte(c, POP_TOP);
3573}
3574
3575static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003576com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003577{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003578 int i = 1;
3579 node* stream = NULL;
3580
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003581 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003582
3583 /* are we using the extended print form? */
3584 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3585 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003586 com_node(c, stream);
3587 /* stack: [...] => [... stream] */
3588 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003589 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3590 i = 4;
3591 else
3592 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003593 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003594 for (; i < NCH(n); i += 2) {
3595 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003596 com_addbyte(c, DUP_TOP);
3597 /* stack: [stream] => [stream stream] */
3598 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003599 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003600 /* stack: [stream stream] => [stream stream obj] */
3601 com_addbyte(c, ROT_TWO);
3602 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003603 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003604 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003605 com_pop(c, 2);
3606 }
3607 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003608 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003609 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003610 com_addbyte(c, PRINT_ITEM);
3611 com_pop(c, 1);
3612 }
3613 }
3614 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003615 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003616 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003617 /* must pop the extra stream object off the stack */
3618 com_addbyte(c, POP_TOP);
3619 /* stack: [... stream] => [...] */
3620 com_pop(c, 1);
3621 }
3622 }
3623 else {
3624 if (stream != NULL) {
3625 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003626 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003627 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003628 com_pop(c, 1);
3629 }
3630 else
3631 com_addbyte(c, PRINT_NEWLINE);
3632 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633}
3634
3635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003636com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003637{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003638 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003639 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003640 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003641 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003642 if (c->c_flags & CO_GENERATOR) {
3643 if (NCH(n) > 1) {
3644 com_error(c, PyExc_SyntaxError,
3645 "'return' with argument inside generator");
3646 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003647 }
3648 if (NCH(n) < 2) {
3649 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003650 com_push(c, 1);
3651 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003652 else
3653 com_node(c, CHILD(n, 1));
3654 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003655 com_pop(c, 1);
3656}
3657
3658static void
3659com_yield_stmt(struct compiling *c, node *n)
3660{
Tim Peters95c80f82001-06-23 02:07:08 +00003661 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003662 REQ(n, yield_stmt); /* 'yield' testlist */
3663 if (!c->c_infunction) {
3664 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3665 }
Tim Peters95c80f82001-06-23 02:07:08 +00003666
3667 for (i = 0; i < c->c_nblocks; ++i) {
3668 if (c->c_block[i] == SETUP_FINALLY) {
3669 com_error(c, PyExc_SyntaxError,
3670 "'yield' not allowed in a 'try' block "
3671 "with a 'finally' clause");
3672 return;
3673 }
3674 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003675 com_node(c, CHILD(n, 1));
3676 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003677 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003678}
3679
3680static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003681com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003682{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003683 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003684 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3685 if (NCH(n) > 1) {
3686 com_node(c, CHILD(n, 1));
3687 if (NCH(n) > 3) {
3688 com_node(c, CHILD(n, 3));
3689 if (NCH(n) > 5)
3690 com_node(c, CHILD(n, 5));
3691 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003692 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003693 i = NCH(n)/2;
3694 com_addoparg(c, RAISE_VARARGS, i);
3695 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003696}
3697
3698static void
Thomas Wouters52152252000-08-17 22:55:00 +00003699com_from_import(struct compiling *c, node *n)
3700{
3701 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3702 com_push(c, 1);
3703 if (NCH(n) > 1) {
3704 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3705 com_error(c, PyExc_SyntaxError, "invalid syntax");
3706 return;
3707 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003708 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003709 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003710 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003711 com_pop(c, 1);
3712}
3713
3714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003715com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003716{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003717 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003718 int i;
3719 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003720 n = CHILD(n, 0);
3721 /* import_stmt: import_name | import_from */
3722 if (TYPE(n) == import_from) {
3723 /* 'from' dotted_name 'import' ('*' |
3724 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003725 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003726 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003727 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3728 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003729 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003730 else {
3731 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3732 TYPE(CHILD(n, 3)) != LPAR) {
3733 com_error(c, PyExc_SyntaxError,
3734 "trailing comma not allowed "
3735 "without surrounding parentheses");
3736 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003737 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003738 REQ(nn, import_as_names);
3739 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003740 for (i = 0; i < NCH(nn); i += 2) {
3741 PyObject *s = PyString_FromString(
3742 STR(CHILD(CHILD(nn, i), 0)));
3743 if (s == NULL) {
3744 Py_CLEAR(tup);
3745 break;
3746 } else
3747 PyTuple_SET_ITEM(tup, i / 2, s);
3748 }
3749 if (tup == NULL) {
3750 /* Assume that failue above was MemoryError */
3751 com_error(c, PyExc_MemoryError, "");
3752 return;
3753 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003754 }
3755 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003756 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003757 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003758 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003759 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003760 com_addbyte(c, IMPORT_STAR);
3761 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003762 for (i = 0; i < NCH(nn); i += 2)
3763 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003764 com_addbyte(c, POP_TOP);
3765 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003766 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 }
3768 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003769 /* 'import' dotted_as_names */
3770 nn = CHILD(n, 1);
3771 REQ(nn, dotted_as_names);
3772 for (i = 0; i < NCH(nn); i += 2) {
3773 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003774 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003775 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003776 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003777 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003778 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003779 int j;
3780 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003781 com_error(c, PyExc_SyntaxError,
3782 "invalid syntax");
3783 return;
3784 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003785 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3786 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003787 CHILD(CHILD(subn, 0),
3788 j));
3789 com_addop_varname(c, VAR_STORE,
3790 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003791 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003792 com_addop_varname(c, VAR_STORE,
3793 STR(CHILD(CHILD(subn, 0),
3794 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003795 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 }
3797 }
3798}
3799
3800static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003801com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003802{
3803 REQ(n, exec_stmt);
3804 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3805 com_node(c, CHILD(n, 1));
3806 if (NCH(n) >= 4)
3807 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003808 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003809 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003810 com_push(c, 1);
3811 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003812 if (NCH(n) >= 6)
3813 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003814 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003815 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_push(c, 1);
3817 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003818 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003819 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003820}
3821
Guido van Rossum7c531111997-03-11 18:42:21 +00003822static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003823is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003824{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003825 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003826 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003827 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003828
3829 /* Label to avoid tail recursion */
3830 next:
3831 switch (TYPE(n)) {
3832
3833 case suite:
3834 if (NCH(n) == 1) {
3835 n = CHILD(n, 0);
3836 goto next;
3837 }
3838 /* Fall through */
3839 case file_input:
3840 for (i = 0; i < NCH(n); i++) {
3841 node *ch = CHILD(n, i);
3842 if (TYPE(ch) == stmt) {
3843 n = ch;
3844 goto next;
3845 }
3846 }
3847 break;
3848
3849 case stmt:
3850 case simple_stmt:
3851 case small_stmt:
3852 n = CHILD(n, 0);
3853 goto next;
3854
3855 case expr_stmt:
3856 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003857 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003858 case test:
3859 case and_test:
3860 case not_test:
3861 case comparison:
3862 case expr:
3863 case xor_expr:
3864 case and_expr:
3865 case shift_expr:
3866 case arith_expr:
3867 case term:
3868 case factor:
3869 case power:
3870 case atom:
3871 if (NCH(n) == 1) {
3872 n = CHILD(n, 0);
3873 goto next;
3874 }
3875 break;
3876
3877 case NAME:
3878 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3879 return 1;
3880 break;
3881
3882 case NUMBER:
3883 v = parsenumber(c, STR(n));
3884 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003885 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003886 break;
3887 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003888 i = PyObject_IsTrue(v);
3889 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003890 return i == 0;
3891
3892 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003893 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003894 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003895 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003896 break;
3897 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003898 i = PyObject_IsTrue(v);
3899 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003900 return i == 0;
3901
3902 }
3903 return 0;
3904}
3905
Tim Peters08a898f2001-06-28 01:52:22 +00003906
3907/* Look under n for a return stmt with an expression.
3908 * This hack is used to find illegal returns under "if 0:" blocks in
3909 * functions already known to be generators (as determined by the symtable
3910 * pass).
3911 * Return the offending return node if found, else NULL.
3912 */
3913static node *
3914look_for_offending_return(node *n)
3915{
3916 int i;
3917
3918 for (i = 0; i < NCH(n); ++i) {
3919 node *kid = CHILD(n, i);
3920
3921 switch (TYPE(kid)) {
3922 case classdef:
3923 case funcdef:
3924 case lambdef:
3925 /* Stuff in nested functions & classes doesn't
3926 affect the code block we started in. */
3927 return NULL;
3928
3929 case return_stmt:
3930 if (NCH(kid) > 1)
3931 return kid;
3932 break;
3933
3934 default: {
3935 node *bad = look_for_offending_return(kid);
3936 if (bad != NULL)
3937 return bad;
3938 }
3939 }
3940 }
3941
3942 return NULL;
3943}
3944
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003945static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003946com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003947{
3948 int i;
3949 int anchor = 0;
3950 REQ(n, if_stmt);
3951 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3952 for (i = 0; i+3 < NCH(n); i+=4) {
3953 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003954 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003955 if (is_constant_false(c, ch)) {
3956 /* We're going to skip this block. However, if this
3957 is a generator, we have to check the dead code
3958 anyway to make sure there aren't any return stmts
3959 with expressions, in the same scope. */
3960 if (c->c_flags & CO_GENERATOR) {
3961 node *p = look_for_offending_return(n);
3962 if (p != NULL) {
3963 int savelineno = c->c_lineno;
3964 c->c_lineno = p->n_lineno;
3965 com_error(c, PyExc_SyntaxError,
3966 "'return' with argument "
3967 "inside generator");
3968 c->c_lineno = savelineno;
3969 }
3970 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003971 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003972 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003973 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003974 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003975 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003976 com_addfwref(c, JUMP_IF_FALSE, &a);
3977 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003978 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979 com_node(c, CHILD(n, i+3));
3980 com_addfwref(c, JUMP_FORWARD, &anchor);
3981 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003982 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003983 com_addbyte(c, POP_TOP);
3984 }
3985 if (i+2 < NCH(n))
3986 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003987 if (anchor)
3988 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003989}
3990
3991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003992com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993{
3994 int break_anchor = 0;
3995 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003996 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003997 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3998 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003999 block_push(c, SETUP_LOOP);
4000 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004001 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004002 com_node(c, CHILD(n, 1));
4003 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4004 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004006 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004007 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004008 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004009 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4010 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004011 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004012 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004013 com_addbyte(c, POP_TOP);
4014 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004015 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 if (NCH(n) > 4)
4017 com_node(c, CHILD(n, 6));
4018 com_backpatch(c, break_anchor);
4019}
4020
4021static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004022com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004024 int break_anchor = 0;
4025 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004026 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004027 REQ(n, for_stmt);
4028 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4029 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004030 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004032 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004033 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004034 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004035 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004036 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004037 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004038 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004039 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004040 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004041 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4042 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004044 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004045 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004046 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004047 if (NCH(n) > 8)
4048 com_node(c, CHILD(n, 8));
4049 com_backpatch(c, break_anchor);
4050}
4051
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004052/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004053
4054 SETUP_FINALLY L
4055 <code for S>
4056 POP_BLOCK
4057 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004058 L: <code for Sf>
4059 END_FINALLY
4060
4061 The special instructions use the block stack. Each block
4062 stack entry contains the instruction that created it (here
4063 SETUP_FINALLY), the level of the value stack at the time the
4064 block stack entry was created, and a label (here L).
4065
4066 SETUP_FINALLY:
4067 Pushes the current value stack level and the label
4068 onto the block stack.
4069 POP_BLOCK:
4070 Pops en entry from the block stack, and pops the value
4071 stack until its level is the same as indicated on the
4072 block stack. (The label is ignored.)
4073 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004074 Pops a variable number of entries from the *value* stack
4075 and re-raises the exception they specify. The number of
4076 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004077
4078 The block stack is unwound when an exception is raised:
4079 when a SETUP_FINALLY entry is found, the exception is pushed
4080 onto the value stack (and the exception condition is cleared),
4081 and the interpreter jumps to the label gotten from the block
4082 stack.
4083
4084 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004085 (The contents of the value stack is shown in [], with the top
4086 at the right; 'tb' is trace-back info, 'val' the exception's
4087 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004088
4089 Value stack Label Instruction Argument
4090 [] SETUP_EXCEPT L1
4091 [] <code for S>
4092 [] POP_BLOCK
4093 [] JUMP_FORWARD L0
4094
Guido van Rossum3f5da241990-12-20 15:06:42 +00004095 [tb, val, exc] L1: DUP )
4096 [tb, val, exc, exc] <evaluate E1> )
4097 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4098 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4099 [tb, val, exc, 1] POP )
4100 [tb, val, exc] POP
4101 [tb, val] <assign to V1> (or POP if no V1)
4102 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004103 [] <code for S1>
4104 JUMP_FORWARD L0
4105
Guido van Rossum3f5da241990-12-20 15:06:42 +00004106 [tb, val, exc, 0] L2: POP
4107 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004108 .............................etc.......................
4109
Guido van Rossum3f5da241990-12-20 15:06:42 +00004110 [tb, val, exc, 0] Ln+1: POP
4111 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004112
4113 [] L0: <next statement>
4114
4115 Of course, parts are not generated if Vi or Ei is not present.
4116*/
4117
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004118static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004119com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004120{
4121 int except_anchor = 0;
4122 int end_anchor = 0;
4123 int else_anchor = 0;
4124 int i;
4125 node *ch;
4126
4127 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4128 block_push(c, SETUP_EXCEPT);
4129 com_node(c, CHILD(n, 2));
4130 com_addbyte(c, POP_BLOCK);
4131 block_pop(c, SETUP_EXCEPT);
4132 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4133 com_backpatch(c, except_anchor);
4134 for (i = 3;
4135 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4136 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004137 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004138 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004139 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004140 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004141 break;
4142 }
4143 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004144 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004145 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004146 if (NCH(ch) > 1) {
4147 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004148 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004149 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004150 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004151 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004152 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4153 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004154 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004155 }
4156 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004157 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004158 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004159 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004160 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004161 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004162 com_pop(c, 1);
4163 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004164 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004165 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004166 com_node(c, CHILD(n, i+2));
4167 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4168 if (except_anchor) {
4169 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004170 /* We come in with [tb, val, exc, 0] on the
4171 stack; one pop and it's the same as
4172 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004173 com_addbyte(c, POP_TOP);
4174 }
4175 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004176 /* We actually come in here with [tb, val, exc] but the
4177 END_FINALLY will zap those and jump around.
4178 The c_stacklevel does not reflect them so we need not pop
4179 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004180 com_addbyte(c, END_FINALLY);
4181 com_backpatch(c, else_anchor);
4182 if (i < NCH(n))
4183 com_node(c, CHILD(n, i+2));
4184 com_backpatch(c, end_anchor);
4185}
4186
4187static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004188com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004189{
4190 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004191 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004192
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004193 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4194 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004195 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004196 com_addbyte(c, POP_BLOCK);
4197 block_pop(c, SETUP_FINALLY);
4198 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004199 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004200 /* While the generated code pushes only one item,
4201 the try-finally handling can enter here with
4202 up to three items. OK, here are the details:
4203 3 for an exception, 2 for RETURN, 1 for BREAK. */
4204 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004205 com_backpatch(c, finally_anchor);
4206 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004207 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004208 com_node(c, ch);
4209 com_addbyte(c, END_FINALLY);
4210 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004211 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004212}
4213
4214static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004215com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004216{
4217 REQ(n, try_stmt);
4218 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4219 | 'try' ':' suite 'finally' ':' suite */
4220 if (TYPE(CHILD(n, 3)) != except_clause)
4221 com_try_finally(c, n);
4222 else
4223 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004224}
4225
Guido van Rossum8b993a91997-01-17 21:04:03 +00004226static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004227get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004228{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004229 int i;
4230
Guido van Rossum8b993a91997-01-17 21:04:03 +00004231 /* Label to avoid tail recursion */
4232 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004233 switch (TYPE(n)) {
4234
4235 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004236 if (NCH(n) == 1) {
4237 n = CHILD(n, 0);
4238 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004239 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004240 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004241 case file_input:
4242 for (i = 0; i < NCH(n); i++) {
4243 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004244 if (TYPE(ch) == stmt) {
4245 n = ch;
4246 goto next;
4247 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004248 }
4249 break;
4250
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004251 case stmt:
4252 case simple_stmt:
4253 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004254 n = CHILD(n, 0);
4255 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004256
4257 case expr_stmt:
4258 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004259 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004260 case test:
4261 case and_test:
4262 case not_test:
4263 case comparison:
4264 case expr:
4265 case xor_expr:
4266 case and_expr:
4267 case shift_expr:
4268 case arith_expr:
4269 case term:
4270 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004271 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272 if (NCH(n) == 1) {
4273 n = CHILD(n, 0);
4274 goto next;
4275 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004276 break;
4277
4278 case atom:
4279 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004280 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004281 break;
4282
4283 }
4284 return NULL;
4285}
4286
Guido van Rossum79f25d91997-04-29 20:08:16 +00004287static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004288get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004289{
Guido van Rossum541563e1999-01-28 15:08:09 +00004290 /* Don't generate doc-strings if run with -OO */
4291 if (Py_OptimizeFlag > 1)
4292 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004293 n = get_rawdocstring(n);
4294 if (n == NULL)
4295 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004296 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004297}
4298
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004299static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004300com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004301{
4302 REQ(n, suite);
4303 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4304 if (NCH(n) == 1) {
4305 com_node(c, CHILD(n, 0));
4306 }
4307 else {
4308 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004309 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004310 node *ch = CHILD(n, i);
4311 if (TYPE(ch) == stmt)
4312 com_node(c, ch);
4313 }
4314 }
4315}
4316
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004317/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004319com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004320{
4321 int i = c->c_nblocks;
4322 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4323 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4324 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004325 else if (i <= 0) {
4326 /* at the outer level */
4327 com_error(c, PyExc_SyntaxError,
4328 "'continue' not properly in loop");
4329 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004330 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004331 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004332 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004333 if (c->c_block[j] == SETUP_LOOP)
4334 break;
4335 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004336 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004337 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004338 for (; i > j; --i) {
4339 if (c->c_block[i] == SETUP_EXCEPT ||
4340 c->c_block[i] == SETUP_FINALLY) {
4341 com_addoparg(c, CONTINUE_LOOP,
4342 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004343 return;
4344 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004345 if (c->c_block[i] == END_FINALLY) {
4346 com_error(c, PyExc_SyntaxError,
4347 "'continue' not supported inside 'finally' clause");
4348 return;
4349 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004350 }
4351 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004352 com_error(c, PyExc_SyntaxError,
4353 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004354 }
4355 /* XXX Could allow it inside a 'finally' clause
4356 XXX if we could pop the exception still on the stack */
4357}
4358
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004359/* Return the number of default values in the argument list.
4360
4361 If a non-default argument follows a default argument, set an
4362 exception and return -1.
4363*/
4364
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004365static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004366com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004367{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004368 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004369 if (TYPE(n) == lambdef) {
4370 /* lambdef: 'lambda' [varargslist] ':' test */
4371 n = CHILD(n, 1);
4372 }
4373 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004374 REQ(n, funcdef);
4375 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4376 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004377 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4378 n = CHILD(n, 1);
4379 }
4380 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004381 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004382 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004383 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004384 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4385 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004386 ndefs = 0;
4387 for (i = 0; i < nch; i++) {
4388 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004389 if (TYPE(CHILD(n, i)) == STAR ||
4390 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004391 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004392 i++;
4393 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004394 t = RPAR; /* Anything except EQUAL or COMMA */
4395 else
4396 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004397 if (t == EQUAL) {
4398 i++;
4399 ndefs++;
4400 com_node(c, CHILD(n, i));
4401 i++;
4402 if (i >= nch)
4403 break;
4404 t = TYPE(CHILD(n, i));
4405 }
4406 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004407 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004408 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004409 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004410 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004411 return -1;
4412 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004413 }
4414 if (t != COMMA)
4415 break;
4416 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004417 return ndefs;
4418}
4419
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004420static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004421com_decorator_name(struct compiling *c, node *n)
4422{
4423 /* dotted_name: NAME ('.' NAME)* */
4424
4425 int i, nch;
4426 node *varname;
4427
4428 REQ(n, dotted_name);
4429 nch = NCH(n);
4430 assert(nch >= 1 && nch % 2 == 1);
4431
4432 varname = CHILD(n, 0);
4433 REQ(varname, NAME);
4434 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004435 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004436
4437 for (i = 1; i < nch; i += 2) {
4438 node *attrname;
4439
4440 REQ(CHILD(n, i), DOT);
4441
4442 attrname = CHILD(n, i + 1);
4443 REQ(attrname, NAME);
4444 com_addop_name(c, LOAD_ATTR, STR(attrname));
4445 }
4446}
4447
4448static void
4449com_decorator(struct compiling *c, node *n)
4450{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004451 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004452 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004453 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004454 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004455 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004456 com_decorator_name(c, CHILD(n, 1));
4457
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004458 if (nch > 3) {
4459 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004460 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004461 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004462 com_call_function(c, CHILD(n, 3));
4463 }
4464}
4465
4466static int
4467com_decorators(struct compiling *c, node *n)
4468{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004469 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004470
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004471 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004472 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004473 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004474
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004475 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004476 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004477 REQ(ch, decorator);
4478
4479 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004480 }
4481
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004482 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004483}
4484
4485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004486com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004487{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004488 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004489 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004490
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004491 REQ(n, funcdef);
4492 /* -6 -5 -4 -3 -2 -1
4493 funcdef: [decorators] 'def' NAME parameters ':' suite */
4494
4495 if (NCH(n) == 6)
4496 ndecorators = com_decorators(c, CHILD(n, 0));
4497 else
4498 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004499
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004500 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004501 if (ndefs < 0)
4502 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004503 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004504 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004505 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004506 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004507 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004508 c->c_errors++;
4509 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004510 int closure = com_make_closure(c, (PyCodeObject *)co);
4511 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004512 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004513 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004514 if (closure)
4515 com_addoparg(c, MAKE_CLOSURE, ndefs);
4516 else
4517 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004518 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004519
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004520 while (ndecorators > 0) {
4521 com_addoparg(c, CALL_FUNCTION, 1);
4522 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004523 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004524 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004525
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004526 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004527 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004529 }
4530}
4531
4532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004533com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004534{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004535 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004536 REQ(n, testlist);
4537 /* testlist: test (',' test)* [','] */
4538 for (i = 0; i < NCH(n); i += 2)
4539 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004540 i = (NCH(n)+1) / 2;
4541 com_addoparg(c, BUILD_TUPLE, i);
4542 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004543}
4544
4545static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004546com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004547{
Guido van Rossum25831651993-05-19 14:50:45 +00004548 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004549 PyObject *v;
4550 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004551 char *name;
4552
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004553 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004554 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004555 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004556 c->c_errors++;
4557 return;
4558 }
4559 /* Push the class name on the stack */
4560 i = com_addconst(c, v);
4561 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004562 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004563 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004564 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004565 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004566 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004567 com_push(c, 1);
4568 }
Guido van Rossum25831651993-05-19 14:50:45 +00004569 else
4570 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004571 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004572 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004573 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004574 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004575 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004576 c->c_errors++;
4577 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004578 int closure = com_make_closure(c, co);
4579 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004580 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004581 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004582 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004583 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004584 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004585 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004586 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004587 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004588 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004589 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004590 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004591 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004592 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004593 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594}
4595
4596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004597com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004598{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004599 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004600 if (c->c_errors)
4601 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004602 switch (TYPE(n)) {
4603
4604 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004605
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004606 case funcdef:
4607 com_funcdef(c, n);
4608 break;
4609 case classdef:
4610 com_classdef(c, n);
4611 break;
4612
4613 /* Trivial parse tree nodes */
4614
4615 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004616 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004618 n = CHILD(n, 0);
4619 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004620
4621 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004622 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004623 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004624 {
4625 int i;
4626 for (i = 0; i < NCH(n)-1; i += 2)
4627 com_node(c, CHILD(n, i));
4628 }
4629 break;
4630
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004631 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004632 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004633 n = CHILD(n, 0);
4634 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004635
4636 /* Statement nodes */
4637
4638 case expr_stmt:
4639 com_expr_stmt(c, n);
4640 break;
4641 case print_stmt:
4642 com_print_stmt(c, n);
4643 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004644 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004645 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004646 break;
4647 case pass_stmt:
4648 break;
4649 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004650 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004651 com_error(c, PyExc_SyntaxError,
4652 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004653 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004654 com_addbyte(c, BREAK_LOOP);
4655 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004656 case continue_stmt:
4657 com_continue_stmt(c, n);
4658 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004659 case return_stmt:
4660 com_return_stmt(c, n);
4661 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004662 case yield_stmt:
4663 com_yield_stmt(c, n);
4664 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004665 case raise_stmt:
4666 com_raise_stmt(c, n);
4667 break;
4668 case import_stmt:
4669 com_import_stmt(c, n);
4670 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004671 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004672 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004673 case exec_stmt:
4674 com_exec_stmt(c, n);
4675 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004676 case assert_stmt:
4677 com_assert_stmt(c, n);
4678 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004679 case if_stmt:
4680 com_if_stmt(c, n);
4681 break;
4682 case while_stmt:
4683 com_while_stmt(c, n);
4684 break;
4685 case for_stmt:
4686 com_for_stmt(c, n);
4687 break;
4688 case try_stmt:
4689 com_try_stmt(c, n);
4690 break;
4691 case suite:
4692 com_suite(c, n);
4693 break;
4694
4695 /* Expression nodes */
4696
4697 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004698 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004699 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004700 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004701 break;
4702 case test:
4703 com_test(c, n);
4704 break;
4705 case and_test:
4706 com_and_test(c, n);
4707 break;
4708 case not_test:
4709 com_not_test(c, n);
4710 break;
4711 case comparison:
4712 com_comparison(c, n);
4713 break;
4714 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004715 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004716 break;
4717 case expr:
4718 com_expr(c, n);
4719 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004720 case xor_expr:
4721 com_xor_expr(c, n);
4722 break;
4723 case and_expr:
4724 com_and_expr(c, n);
4725 break;
4726 case shift_expr:
4727 com_shift_expr(c, n);
4728 break;
4729 case arith_expr:
4730 com_arith_expr(c, n);
4731 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004732 case term:
4733 com_term(c, n);
4734 break;
4735 case factor:
4736 com_factor(c, n);
4737 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004738 case power:
4739 com_power(c, n);
4740 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 case atom:
4742 com_atom(c, n);
4743 break;
4744
4745 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004746 com_error(c, PyExc_SystemError,
4747 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004748 }
4749}
4750
Tim Petersdbd9ba62000-07-09 03:09:57 +00004751static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004752
4753static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004754com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004755{
4756 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4757 if (TYPE(CHILD(n, 0)) == LPAR)
4758 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004759 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004760 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004761 com_pop(c, 1);
4762 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004763}
4764
4765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004766com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004767{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004768 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004769 if (NCH(n) == 1) {
4770 com_fpdef(c, CHILD(n, 0));
4771 }
4772 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004773 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004774 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004775 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004776 for (i = 0; i < NCH(n); i += 2)
4777 com_fpdef(c, CHILD(n, i));
4778 }
4779}
4780
4781static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004782com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004783{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004784 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004785 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004786 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004787 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004788 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004789 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004790 nch = NCH(n);
4791 /* Enter all arguments in table of locals */
4792 for (i = 0, narg = 0; i < nch; i++) {
4793 node *ch = CHILD(n, i);
4794 node *fp;
4795 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004796 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004797 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4798 fp = CHILD(ch, 0);
4799 if (TYPE(fp) != NAME) {
4800 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4801 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004802 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004803 narg++;
4804 /* all name updates handled by symtable */
4805 if (++i >= nch)
4806 break;
4807 ch = CHILD(n, i);
4808 if (TYPE(ch) == EQUAL)
4809 i += 2;
4810 else
4811 REQ(ch, COMMA);
4812 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004813 if (complex) {
4814 /* Generate code for complex arguments only after
4815 having counted the simple arguments */
4816 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004817 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004818 node *ch = CHILD(n, i);
4819 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004820 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004821 break;
4822 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4823 fp = CHILD(ch, 0);
4824 if (TYPE(fp) != NAME) {
4825 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004826 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004827 com_fpdef(c, ch);
4828 }
4829 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004830 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004831 break;
4832 ch = CHILD(n, i);
4833 if (TYPE(ch) == EQUAL)
4834 i += 2;
4835 else
4836 REQ(ch, COMMA);
4837 }
4838 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004839}
4840
4841static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004842com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004843{
4844 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004845 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004846 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004847 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004848 if (doc != NULL) {
4849 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004850 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004851 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004852 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004853 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004854 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004855 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004856 for (i = 0; i < NCH(n); i++) {
4857 node *ch = CHILD(n, i);
4858 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4859 com_node(c, ch);
4860 }
4861}
4862
4863/* Top-level compile-node interface */
4864
4865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004866compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004867{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004868 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004869 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004870 REQ(n, funcdef);
4871 /* -6 -5 -4 -3 -2 -1
4872 funcdef: [decorators] 'def' NAME parameters ':' suite */
4873 c->c_name = STR(RCHILD(n, -4));
4874 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004875 if (doc != NULL) {
4876 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004877 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004878 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004879 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004880 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004881 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004882 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004883 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004884 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004885 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004886 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004887 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004888 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004889 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4890 com_push(c, 1);
4891 com_addbyte(c, RETURN_VALUE);
4892 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004893}
4894
4895static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004896compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004897{
Guido van Rossum590baa41993-11-30 13:40:46 +00004898 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004899 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004900 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004901
4902 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004903 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004904 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004905 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004906 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004907 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004908 else
4909 ch = CHILD(n, 2);
4910 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004911 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004912 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004913}
4914
4915static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004916compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004917{
4918 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004919 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004920 REQ(n, classdef);
4921 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4922 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004923 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004924 /* Initialize local __module__ from global __name__ */
4925 com_addop_name(c, LOAD_GLOBAL, "__name__");
4926 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004927 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004928 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004929 if (doc != NULL) {
4930 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004931 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004932 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004933 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004934 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004935 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004936 }
4937 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004938 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004939 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004940 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004941 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004942 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004943 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004944 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004945}
4946
4947static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004948compile_generator_expression(struct compiling *c, node *n)
4949{
4950 /* testlist_gexp: test gen_for */
4951 /* argument: test gen_for */
4952 REQ(CHILD(n, 0), test);
4953 REQ(CHILD(n, 1), gen_for);
4954
4955 c->c_name = "<generator expression>";
4956 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4957
4958 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4959 com_push(c, 1);
4960 com_addbyte(c, RETURN_VALUE);
4961 com_pop(c, 1);
4962}
4963
4964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004965compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004966{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004967 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004968
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004969 switch (TYPE(n)) {
4970
Guido van Rossum4c417781991-01-21 16:09:22 +00004971 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004972 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004973 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004974 n = CHILD(n, 0);
4975 if (TYPE(n) != NEWLINE)
4976 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004977 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004978 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4979 com_push(c, 1);
4980 com_addbyte(c, RETURN_VALUE);
4981 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004982 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004983 break;
4984
Guido van Rossum4c417781991-01-21 16:09:22 +00004985 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004986 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004987 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004988 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4989 com_push(c, 1);
4990 com_addbyte(c, RETURN_VALUE);
4991 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004992 break;
4993
Guido van Rossum590baa41993-11-30 13:40:46 +00004994 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004995 com_node(c, CHILD(n, 0));
4996 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004997 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004998 break;
4999
Guido van Rossum590baa41993-11-30 13:40:46 +00005000 case lambdef: /* anonymous function definition */
5001 compile_lambdef(c, n);
5002 break;
5003
Guido van Rossum4c417781991-01-21 16:09:22 +00005004 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005005 compile_funcdef(c, n);
5006 break;
5007
Guido van Rossum4c417781991-01-21 16:09:22 +00005008 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005009 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005010 break;
5011
Raymond Hettinger354433a2004-05-19 08:20:33 +00005012 case testlist_gexp: /* A generator expression */
5013 case argument: /* A generator expression */
5014 compile_generator_expression(c, n);
5015 break;
5016
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005017 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005018 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005019 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005020 }
5021}
5022
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005023static PyObject *
5024dict_keys_inorder(PyObject *dict, int offset)
5025{
5026 PyObject *tuple, *k, *v;
5027 int i, pos = 0, size = PyDict_Size(dict);
5028
5029 tuple = PyTuple_New(size);
5030 if (tuple == NULL)
5031 return NULL;
5032 while (PyDict_Next(dict, &pos, &k, &v)) {
5033 i = PyInt_AS_LONG(v);
5034 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005035 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005036 PyTuple_SET_ITEM(tuple, i - offset, k);
5037 }
5038 return tuple;
5039}
5040
Guido van Rossum79f25d91997-04-29 20:08:16 +00005041PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005042PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005043{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005044 return PyNode_CompileFlags(n, filename, NULL);
5045}
5046
5047PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005048PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005049{
5050 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005051}
5052
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005053struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005054PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005055{
5056 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005057 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005058
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005059 ff = PyNode_Future(n, filename);
5060 if (ff == NULL)
5061 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005062 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005063 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005064 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005065 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005066 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005067 return st;
5068}
5069
Guido van Rossum79f25d91997-04-29 20:08:16 +00005070static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005071icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005072{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005073 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005074}
5075
Guido van Rossum79f25d91997-04-29 20:08:16 +00005076static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005077jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005078 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005079{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005080 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005081 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005082 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005083 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005084 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5085 sc.c_encoding = "utf-8";
5086 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005087 sc.c_encoding = STR(n);
5088 n = CHILD(n, 0);
5089 } else {
5090 sc.c_encoding = NULL;
5091 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005092 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005093 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005094 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095 /* c_symtable still points to parent's symbols */
5096 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005097 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005098 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005099 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005100 if (base->c_encoding != NULL) {
5101 assert(sc.c_encoding == NULL);
5102 sc.c_encoding = base->c_encoding;
5103 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005104 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005105 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005106 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005107 if (sc.c_future == NULL) {
5108 com_free(&sc);
5109 return NULL;
5110 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005111 if (flags) {
5112 int merged = sc.c_future->ff_features |
5113 flags->cf_flags;
5114 sc.c_future->ff_features = merged;
5115 flags->cf_flags = merged;
5116 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005117 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5118 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005119 com_free(&sc);
5120 return NULL;
5121 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005122 /* reset symbol table for second pass */
5123 sc.c_symtable->st_nscopes = 1;
5124 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005125 }
5126 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005127 if (symtable_load_symbols(&sc) < 0) {
5128 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005129 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005130 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005131 compile_node(&sc, n);
5132 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005133 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005134 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005135 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005136 names = PyList_AsTuple(sc.c_names);
5137 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5139 freevars = dict_keys_inorder(sc.c_freevars,
5140 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005141 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005142 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005143 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5144 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005145 if (!PyErr_Occurred())
5146 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 sc.c_nlocals,
5148 sc.c_maxstacklevel,
5149 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005150 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005151 consts,
5152 names,
5153 varnames,
5154 freevars,
5155 cellvars,
5156 filename,
5157 name,
5158 sc.c_firstlineno,
5159 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005160 Py_XDECREF(consts);
5161 Py_XDECREF(names);
5162 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005163 Py_XDECREF(freevars);
5164 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005165 Py_XDECREF(filename);
5166 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005167 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005168 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005169 else if (!PyErr_Occurred()) {
5170 /* This could happen if someone called PyErr_Clear() after an
5171 error was reported above. That's not supposed to happen,
5172 but I just plugged one case and I'm not sure there can't be
5173 others. In that case, raise SystemError so that at least
5174 it gets reported instead dumping core. */
5175 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5176 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005178 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005179 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005180 sc.c_symtable = NULL;
5181 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005182 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005183 return co;
5184}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005185
5186int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005187PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005188{
5189 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005190 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005191 int line = co->co_firstlineno;
5192 int addr = 0;
5193 while (--size >= 0) {
5194 addr += *p++;
5195 if (addr > addrq)
5196 break;
5197 line += *p++;
5198 }
5199 return line;
5200}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005202/* The test for LOCAL must come before the test for FREE in order to
5203 handle classes where name is both local and free. The local var is
5204 a method and the free var is a free var referenced within a method.
5205*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005206
5207static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005208get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005209{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005210 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005211 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005212
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005213 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5214 return CELL;
5215 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5216 return LOCAL;
5217 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5218 return FREE;
5219 v = PyDict_GetItemString(c->c_globals, name);
5220 if (v) {
5221 if (v == Py_None)
5222 return GLOBAL_EXPLICIT;
5223 else {
5224 return GLOBAL_IMPLICIT;
5225 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005226 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005227 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005228 "unknown scope for %.100s in %.100s(%s) "
5229 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5230 name, c->c_name,
5231 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5232 c->c_filename,
5233 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5234 PyObject_REPR(c->c_locals),
5235 PyObject_REPR(c->c_globals)
5236 );
5237
5238 Py_FatalError(buf);
5239 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005240}
5241
Guido van Rossum207fda62001-03-02 03:30:41 +00005242/* Helper functions to issue warnings */
5243
5244static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005245issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005246{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005247 if (PyErr_Occurred()) {
5248 /* This can happen because symtable_node continues
5249 processing even after raising a SyntaxError.
5250 Calling PyErr_WarnExplicit now would clobber the
5251 pending exception; instead we fail and let that
5252 exception propagate.
5253 */
5254 return -1;
5255 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005256 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5257 lineno, NULL, NULL) < 0) {
5258 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5259 PyErr_SetString(PyExc_SyntaxError, msg);
5260 PyErr_SyntaxLocation(filename, lineno);
5261 }
5262 return -1;
5263 }
5264 return 0;
5265}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005266
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005267static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005268symtable_warn(struct symtable *st, char *msg)
5269{
Guido van Rossum207fda62001-03-02 03:30:41 +00005270 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005271 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005272 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005273 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005274 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005275}
5276
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005277/* Helper function for setting lineno and filename */
5278
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005279static struct symtable *
5280symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005282 struct symtable *st;
5283
5284 st = symtable_init();
5285 if (st == NULL)
5286 return NULL;
5287 st->st_future = ff;
5288 st->st_filename = filename;
5289 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5290 if (st->st_errors > 0)
5291 goto fail;
5292 symtable_node(st, n);
5293 if (st->st_errors > 0)
5294 goto fail;
5295 return st;
5296 fail:
5297 if (!PyErr_Occurred()) {
5298 /* This could happen because after a syntax error is
5299 detected, the symbol-table-building continues for
5300 a while, and PyErr_Clear() might erroneously be
5301 called during that process. One such case has been
5302 fixed, but there might be more (now or later).
5303 */
5304 PyErr_SetString(PyExc_SystemError, "lost exception");
5305 }
5306 st->st_future = NULL;
5307 st->st_filename = NULL;
5308 PySymtable_Free(st);
5309 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005310}
5311
5312static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005313symtable_init_compiling_symbols(struct compiling *c)
5314{
5315 PyObject *varnames;
5316
5317 varnames = c->c_symtable->st_cur->ste_varnames;
5318 if (varnames == NULL) {
5319 varnames = PyList_New(0);
5320 if (varnames == NULL)
5321 return -1;
5322 c->c_symtable->st_cur->ste_varnames = varnames;
5323 Py_INCREF(varnames);
5324 } else
5325 Py_INCREF(varnames);
5326 c->c_varnames = varnames;
5327
5328 c->c_globals = PyDict_New();
5329 if (c->c_globals == NULL)
5330 return -1;
5331 c->c_freevars = PyDict_New();
5332 if (c->c_freevars == NULL)
5333 return -1;
5334 c->c_cellvars = PyDict_New();
5335 if (c->c_cellvars == NULL)
5336 return -1;
5337 return 0;
5338}
5339
5340struct symbol_info {
5341 int si_nlocals;
5342 int si_ncells;
5343 int si_nfrees;
5344 int si_nimplicit;
5345};
5346
5347static void
5348symtable_init_info(struct symbol_info *si)
5349{
5350 si->si_nlocals = 0;
5351 si->si_ncells = 0;
5352 si->si_nfrees = 0;
5353 si->si_nimplicit = 0;
5354}
5355
5356static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005357symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005358 struct symbol_info *si)
5359{
5360 PyObject *dict, *v;
5361
5362 /* Seperate logic for DEF_FREE. If it occurs in a function,
5363 it indicates a local that we must allocate storage for (a
5364 cell var). If it occurs in a class, then the class has a
5365 method and a free variable with the same name.
5366 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005367 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005368 /* If it isn't declared locally, it can't be a cell. */
5369 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5370 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005371 v = PyInt_FromLong(si->si_ncells++);
5372 dict = c->c_cellvars;
5373 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005374 /* If it is free anyway, then there is no need to do
5375 anything here.
5376 */
5377 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005378 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005379 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005380 v = PyInt_FromLong(si->si_nfrees++);
5381 dict = c->c_freevars;
5382 }
5383 if (v == NULL)
5384 return -1;
5385 if (PyDict_SetItem(dict, name, v) < 0) {
5386 Py_DECREF(v);
5387 return -1;
5388 }
5389 Py_DECREF(v);
5390 return 0;
5391}
5392
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005393/* If a variable is a cell and an argument, make sure that appears in
5394 co_cellvars before any variable to its right in varnames.
5395*/
5396
5397
5398static int
5399symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5400 PyObject *varnames, int flags)
5401{
Tim Petersb39903b2003-03-24 17:22:24 +00005402 PyObject *v = NULL;
5403 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005404 int i, pos;
5405
5406 if (flags & CO_VARARGS)
5407 argcount++;
5408 if (flags & CO_VARKEYWORDS)
5409 argcount++;
5410 for (i = argcount; --i >= 0; ) {
5411 v = PyList_GET_ITEM(varnames, i);
5412 if (PyDict_GetItem(*cellvars, v)) {
5413 if (list == NULL) {
5414 list = PyList_New(1);
5415 if (list == NULL)
5416 return -1;
5417 PyList_SET_ITEM(list, 0, v);
5418 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005419 } else {
5420 if (PyList_Insert(list, 0, v) < 0) {
5421 Py_DECREF(list);
5422 return -1;
5423 }
5424 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005425 }
5426 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005427 if (list == NULL)
5428 return 0;
5429
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005430 /* There are cellvars that are also arguments. Create a dict
5431 to replace cellvars and put the args at the front.
5432 */
5433 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005434 if (d == NULL)
5435 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005436 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5437 v = PyInt_FromLong(i);
5438 if (v == NULL)
5439 goto fail;
5440 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5441 goto fail;
5442 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5443 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005444 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005445 }
5446 pos = 0;
5447 i = PyList_GET_SIZE(list);
5448 Py_DECREF(list);
5449 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5450 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005451 if (w == NULL)
5452 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005453 if (PyDict_SetItem(d, v, w) < 0) {
5454 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005455 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005456 goto fail;
5457 }
5458 Py_DECREF(w);
5459 }
5460 Py_DECREF(*cellvars);
5461 *cellvars = d;
5462 return 1;
5463 fail:
5464 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005465 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005466 return -1;
5467}
5468
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005469static int
5470symtable_freevar_offsets(PyObject *freevars, int offset)
5471{
5472 PyObject *name, *v;
5473 int pos;
5474
5475 /* The cell vars are the first elements of the closure,
5476 followed by the free vars. Update the offsets in
5477 c_freevars to account for number of cellvars. */
5478 pos = 0;
5479 while (PyDict_Next(freevars, &pos, &name, &v)) {
5480 int i = PyInt_AS_LONG(v) + offset;
5481 PyObject *o = PyInt_FromLong(i);
5482 if (o == NULL)
5483 return -1;
5484 if (PyDict_SetItem(freevars, name, o) < 0) {
5485 Py_DECREF(o);
5486 return -1;
5487 }
5488 Py_DECREF(o);
5489 }
5490 return 0;
5491}
5492
5493static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005494symtable_check_unoptimized(struct compiling *c,
5495 PySymtableEntryObject *ste,
5496 struct symbol_info *si)
5497{
5498 char buf[300];
5499
5500 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5501 || (ste->ste_nested && si->si_nimplicit)))
5502 return 0;
5503
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005504#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5505
5506#define ILLEGAL_IS "is a nested function"
5507
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005508#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005509"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005510
5511#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005512"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005513
5514#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005515"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005516"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005517
5518 /* XXX perhaps the linenos for these opt-breaking statements
5519 should be stored so the exception can point to them. */
5520
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005521 if (ste->ste_child_free) {
5522 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005523 PyOS_snprintf(buf, sizeof(buf),
5524 ILLEGAL_IMPORT_STAR,
5525 PyString_AS_STRING(ste->ste_name),
5526 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005527 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005528 PyOS_snprintf(buf, sizeof(buf),
5529 ILLEGAL_BARE_EXEC,
5530 PyString_AS_STRING(ste->ste_name),
5531 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005532 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005533 PyOS_snprintf(buf, sizeof(buf),
5534 ILLEGAL_EXEC_AND_IMPORT_STAR,
5535 PyString_AS_STRING(ste->ste_name),
5536 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005537 }
5538 } else {
5539 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005540 PyOS_snprintf(buf, sizeof(buf),
5541 ILLEGAL_IMPORT_STAR,
5542 PyString_AS_STRING(ste->ste_name),
5543 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005544 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005545 PyOS_snprintf(buf, sizeof(buf),
5546 ILLEGAL_BARE_EXEC,
5547 PyString_AS_STRING(ste->ste_name),
5548 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005549 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005550 PyOS_snprintf(buf, sizeof(buf),
5551 ILLEGAL_EXEC_AND_IMPORT_STAR,
5552 PyString_AS_STRING(ste->ste_name),
5553 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005554 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005555 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005556
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005557 PyErr_SetString(PyExc_SyntaxError, buf);
5558 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5559 ste->ste_opt_lineno);
5560 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005561}
5562
5563static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005564symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5565 struct symbol_info *si)
5566{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005567 if (c->c_future)
5568 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005569 if (ste->ste_generator)
5570 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005571 if (ste->ste_type != TYPE_MODULE)
5572 c->c_flags |= CO_NEWLOCALS;
5573 if (ste->ste_type == TYPE_FUNCTION) {
5574 c->c_nlocals = si->si_nlocals;
5575 if (ste->ste_optimized == 0)
5576 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005577 else if (ste->ste_optimized != OPT_EXEC)
5578 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005579 }
5580 return 0;
5581}
5582
5583static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005584symtable_error(struct symtable *st, int lineno)
5585{
5586 if (lineno == 0)
5587 lineno = st->st_cur->ste_lineno;
5588 PyErr_SyntaxLocation(st->st_filename, lineno);
5589 st->st_errors++;
5590 return -1;
5591}
5592
5593static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005594symtable_load_symbols(struct compiling *c)
5595{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005596 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005597 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005598 PyObject *name, *varnames, *v;
5599 int i, flags, pos;
5600 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005601
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005602 v = NULL;
5603
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005604 if (symtable_init_compiling_symbols(c) < 0)
5605 goto fail;
5606 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005607 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005608 si.si_nlocals = PyList_GET_SIZE(varnames);
5609 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005610
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005611 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005612 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005613 if (v == NULL)
5614 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005615 if (PyDict_SetItem(c->c_locals,
5616 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617 goto fail;
5618 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005619 }
5620
5621 /* XXX The cases below define the rules for whether a name is
5622 local or global. The logic could probably be clearer. */
5623 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005624 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5625 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005626
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005627 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005628 /* undo the original DEF_FREE */
5629 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005630
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005631 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005632 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005633 2. Free variables in methods that are also class
5634 variables or declared global.
5635 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005636 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005637 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005639 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005640 c->c_argcount--;
5641 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005642 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005643 c->c_argcount--;
5644 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005645 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005647 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005648 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005649 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005650 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005651 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005652 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005653 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005654 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5655 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005656 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005657 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005658 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005660 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005661 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 if (v == NULL)
5663 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005664 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005665 goto fail;
5666 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005667 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005670 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005671 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005673 if (v == NULL)
5674 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005675 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676 goto fail;
5677 Py_DECREF(v);
5678 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005679 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005680 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005681 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005682 goto fail;
5683 if (st->st_nscopes != 1) {
5684 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005685 if (v == NULL)
5686 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005687 if (PyDict_SetItem(st->st_global,
5688 name, v))
5689 goto fail;
5690 Py_DECREF(v);
5691 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 }
5694 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005695 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5696
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005697 if (si.si_ncells > 1) { /* one cell is always in order */
5698 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5699 c->c_varnames, c->c_flags) < 0)
5700 return -1;
5701 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005702 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5703 return -1;
5704 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005705 fail:
5706 /* is this always the right thing to do? */
5707 Py_XDECREF(v);
5708 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005709}
5710
5711static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005712symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005713{
5714 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005715
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005716 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717 if (st == NULL)
5718 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005719 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005720
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005721 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005722 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005724 goto fail;
5725 if ((st->st_symbols = PyDict_New()) == NULL)
5726 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005727 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005728 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005729 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005730 st->st_private = NULL;
5731 return st;
5732 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005733 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005734 return NULL;
5735}
5736
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005737void
5738PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005739{
5740 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005741 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005742 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005743 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005744}
5745
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746/* When the compiler exits a scope, it must should update the scope's
5747 free variable information with the list of free variables in its
5748 children.
5749
5750 Variables that are free in children and defined in the current
5751 scope are cellvars.
5752
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005753 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 false), free variables in children that are not defined here are
5755 implicit globals.
5756
5757*/
5758
5759static int
5760symtable_update_free_vars(struct symtable *st)
5761{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005762 int i, j, def;
5763 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005764 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005766 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005767 def = DEF_FREE_CLASS;
5768 else
5769 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005770 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005771 int pos = 0;
5772
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005773 if (list && PyList_SetSlice(list, 0,
5774 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005775 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005776 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005777 PyList_GET_ITEM(ste->ste_children, i);
5778 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005779 int flags = PyInt_AS_LONG(o);
5780 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005781 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005782 if (list == NULL) {
5783 list = PyList_New(0);
5784 if (list == NULL)
5785 return -1;
5786 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005787 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005788 if (PyList_Append(list, name) < 0) {
5789 Py_DECREF(list);
5790 return -1;
5791 }
5792 }
5793 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005794 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005795 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005796 v = PyDict_GetItem(ste->ste_symbols, name);
5797 /* If a name N is declared global in scope A and
5798 referenced in scope B contained (perhaps
5799 indirectly) in A and there are no scopes
5800 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005801 is global in B. Unless A is a class scope,
5802 because class scopes are not considered for
5803 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005804 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005805 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005806 int flags = PyInt_AS_LONG(v);
5807 if (flags & DEF_GLOBAL) {
5808 symtable_undo_free(st, child->ste_id,
5809 name);
5810 continue;
5811 }
5812 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005813 if (ste->ste_nested) {
5814 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005815 name, def) < 0) {
5816 Py_DECREF(list);
5817 return -1;
5818 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005819 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005820 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005821 name) < 0) {
5822 Py_DECREF(list);
5823 return -1;
5824 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005825 }
5826 }
5827 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005828
5829 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005830 return 0;
5831}
5832
5833/* If the current scope is a non-nested class or if name is not
5834 defined in the current, non-nested scope, then it is an implicit
5835 global in all nested scopes.
5836*/
5837
5838static int
5839symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5840{
5841 PyObject *o;
5842 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005843 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005844
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005845 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005846 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005847 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005848 if (o == NULL)
5849 return symtable_undo_free(st, child, name);
5850 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005851
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005852 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 return symtable_undo_free(st, child, name);
5854 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005855 return symtable_add_def_o(st, ste->ste_symbols,
5856 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005857}
5858
5859static int
5860symtable_undo_free(struct symtable *st, PyObject *id,
5861 PyObject *name)
5862{
5863 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005864 PyObject *info;
5865 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005866
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005867 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5868 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005869 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005870
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005871 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005872 if (info == NULL)
5873 return 0;
5874 v = PyInt_AS_LONG(info);
5875 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005876 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005877 DEF_FREE_GLOBAL) < 0)
5878 return -1;
5879 } else
5880 /* If the name is defined here or declared global,
5881 then the recursion stops. */
5882 return 0;
5883
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005884 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5885 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005886 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005887 PyList_GET_ITEM(ste->ste_children, i);
5888 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005889 if (x < 0)
5890 return x;
5891 }
5892 return 0;
5893}
5894
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005895/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5896 This reference is released when the scope is exited, via the DECREF
5897 in symtable_exit_scope().
5898*/
5899
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005900static int
5901symtable_exit_scope(struct symtable *st)
5902{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005903 int end;
5904
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005905 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005906 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005907 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005908 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005909 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5910 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005911 if (PySequence_DelItem(st->st_stack, end) < 0)
5912 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005913 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005914}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005915
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005916static void
5917symtable_enter_scope(struct symtable *st, char *name, int type,
5918 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005919{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005920 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005921
5922 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005923 prev = st->st_cur;
5924 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005925 st->st_errors++;
5926 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005927 }
5928 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005929 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005930 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005931 if (st->st_cur == NULL) {
5932 st->st_errors++;
5933 return;
5934 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005935 if (strcmp(name, TOP) == 0)
5936 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005937 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005938 if (PyList_Append(prev->ste_children,
5939 (PyObject *)st->st_cur) < 0)
5940 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005941 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005942}
5943
5944static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005945symtable_lookup(struct symtable *st, char *name)
5946{
5947 char buffer[MANGLE_LEN];
5948 PyObject *v;
5949 int flags;
5950
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005951 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005952 name = buffer;
5953 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5954 if (v == NULL) {
5955 if (PyErr_Occurred())
5956 return -1;
5957 else
5958 return 0;
5959 }
5960
5961 flags = PyInt_AS_LONG(v);
5962 return flags;
5963}
5964
5965static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005966symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005967{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005968 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005969 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005970 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005971
Guido van Rossumb7164622002-08-16 02:48:11 +00005972 /* Warn about None, except inside a tuple (where the assignment
5973 code already issues a warning). */
5974 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5975 *name == 'N' && strcmp(name, "None") == 0)
5976 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005977 PyErr_SetString(PyExc_SyntaxError,
5978 "Invalid syntax. Assignment to None.");
5979 symtable_error(st, 0);
5980 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005981 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005982 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005983 name = buffer;
5984 if ((s = PyString_InternFromString(name)) == NULL)
5985 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005986 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5987 Py_DECREF(s);
5988 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005989}
5990
5991/* Must only be called with mangled names */
5992
5993static int
5994symtable_add_def_o(struct symtable *st, PyObject *dict,
5995 PyObject *name, int flag)
5996{
5997 PyObject *o;
5998 int val;
5999
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006000 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006001 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006002 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006003 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006004 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006005 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006006 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006007 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006008 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006009 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006010 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006011 if (o == NULL)
6012 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006013 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014 Py_DECREF(o);
6015 return -1;
6016 }
6017 Py_DECREF(o);
6018
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006019 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006020 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006022 } else if (flag & DEF_GLOBAL) {
6023 /* XXX need to update DEF_GLOBAL for other flags too;
6024 perhaps only DEF_FREE_GLOBAL */
6025 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006027 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006028 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006029 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006031 if (o == NULL)
6032 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006033 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 Py_DECREF(o);
6035 return -1;
6036 }
6037 Py_DECREF(o);
6038 }
6039 return 0;
6040}
6041
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006042#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006043
Tim Peters08a898f2001-06-28 01:52:22 +00006044/* Look for a yield stmt under n. Return 1 if found, else 0.
6045 This hack is used to look inside "if 0:" blocks (which are normally
6046 ignored) in case those are the only places a yield occurs (so that this
6047 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006048static int
6049look_for_yield(node *n)
6050{
6051 int i;
6052
6053 for (i = 0; i < NCH(n); ++i) {
6054 node *kid = CHILD(n, i);
6055
6056 switch (TYPE(kid)) {
6057
6058 case classdef:
6059 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006060 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006061 /* Stuff in nested functions and classes can't make
6062 the parent a generator. */
6063 return 0;
6064
6065 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006066 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006067
6068 default:
6069 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006070 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006071 }
6072 }
6073 return 0;
6074}
6075
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006076static void
6077symtable_node(struct symtable *st, node *n)
6078{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006079 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006080
6081 loop:
6082 switch (TYPE(n)) {
6083 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006084 char *func_name;
6085 if (NCH(n) == 6)
6086 symtable_node(st, CHILD(n, 0));
6087 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006088 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006089 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006090 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006091 symtable_funcdef(st, n);
6092 symtable_exit_scope(st);
6093 break;
6094 }
6095 case lambdef:
6096 if (NCH(n) == 4)
6097 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006098 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006099 symtable_funcdef(st, n);
6100 symtable_exit_scope(st);
6101 break;
6102 case classdef: {
6103 char *tmp, *class_name = STR(CHILD(n, 1));
6104 symtable_add_def(st, class_name, DEF_LOCAL);
6105 if (TYPE(CHILD(n, 2)) == LPAR) {
6106 node *bases = CHILD(n, 3);
6107 int i;
6108 for (i = 0; i < NCH(bases); i += 2) {
6109 symtable_node(st, CHILD(bases, i));
6110 }
6111 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006112 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006113 tmp = st->st_private;
6114 st->st_private = class_name;
6115 symtable_node(st, CHILD(n, NCH(n) - 1));
6116 st->st_private = tmp;
6117 symtable_exit_scope(st);
6118 break;
6119 }
6120 case if_stmt:
6121 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006122 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6123 if (st->st_cur->ste_generator == 0)
6124 st->st_cur->ste_generator =
6125 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006126 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006127 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 symtable_node(st, CHILD(n, i + 1));
6129 symtable_node(st, CHILD(n, i + 3));
6130 }
6131 if (i + 2 < NCH(n))
6132 symtable_node(st, CHILD(n, i + 2));
6133 break;
6134 case global_stmt:
6135 symtable_global(st, n);
6136 break;
6137 case import_stmt:
6138 symtable_import(st, n);
6139 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006140 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006141 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006142 symtable_node(st, CHILD(n, 1));
6143 if (NCH(n) > 2)
6144 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006145 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006146 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006147 st->st_cur->ste_opt_lineno = n->n_lineno;
6148 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006149 if (NCH(n) > 4)
6150 symtable_node(st, CHILD(n, 5));
6151 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006152
6153 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006154 case assert_stmt:
6155 if (Py_OptimizeFlag)
6156 return;
6157 if (NCH(n) == 2) {
6158 n = CHILD(n, 1);
6159 goto loop;
6160 } else {
6161 symtable_node(st, CHILD(n, 1));
6162 n = CHILD(n, 3);
6163 goto loop;
6164 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006165 case except_clause:
6166 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006167 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 if (NCH(n) > 1) {
6169 n = CHILD(n, 1);
6170 goto loop;
6171 }
6172 break;
6173 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006174 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006175 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006176 case yield_stmt:
6177 st->st_cur->ste_generator = 1;
6178 n = CHILD(n, 1);
6179 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006180 case expr_stmt:
6181 if (NCH(n) == 1)
6182 n = CHILD(n, 0);
6183 else {
6184 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006185 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006186 symtable_node(st, CHILD(n, 2));
6187 break;
6188 } else {
6189 int i;
6190 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006191 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006192 n = CHILD(n, NCH(n) - 1);
6193 }
6194 }
6195 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006196 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006197 /* only occurs when there are multiple for loops
6198 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006199 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006200 if (TYPE(n) == list_for)
6201 symtable_list_for(st, n);
6202 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006203 REQ(n, list_if);
6204 symtable_node(st, CHILD(n, 1));
6205 if (NCH(n) == 3) {
6206 n = CHILD(n, 2);
6207 goto loop;
6208 }
6209 }
6210 break;
6211 case for_stmt:
6212 symtable_assign(st, CHILD(n, 1), 0);
6213 for (i = 3; i < NCH(n); ++i)
6214 if (TYPE(CHILD(n, i)) >= single_input)
6215 symtable_node(st, CHILD(n, i));
6216 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006217 case arglist:
6218 if (NCH(n) > 1)
6219 for (i = 0; i < NCH(n); ++i) {
6220 node *ch = CHILD(n, i);
6221 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6222 TYPE(CHILD(ch, 1)) == gen_for) {
6223 PyErr_SetString(PyExc_SyntaxError,
6224 "invalid syntax");
6225 symtable_error(st, n->n_lineno);
6226 return;
6227 }
6228 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006229 /* The remaining cases fall through to default except in
6230 special circumstances. This requires the individual cases
6231 to be coded with great care, even though they look like
6232 rather innocuous. Each case must double-check TYPE(n).
6233 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006234 case decorator:
6235 if (TYPE(n) == decorator) {
6236 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6237 node *name, *varname;
6238 name = CHILD(n, 1);
6239 REQ(name, dotted_name);
6240 varname = CHILD(name, 0);
6241 REQ(varname, NAME);
6242 symtable_add_use(st, STR(varname));
6243 }
6244 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006245 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006246 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006247 n = CHILD(n, 2);
6248 goto loop;
6249 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006250 else if (TYPE(n) == argument && NCH(n) == 2 &&
6251 TYPE(CHILD(n, 1)) == gen_for) {
6252 symtable_generator_expression(st, n);
6253 break;
6254 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006255 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006256 case listmaker:
6257 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006258 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006259 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006260 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006261 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006262 case testlist_gexp:
6263 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6264 symtable_generator_expression(st, n);
6265 break;
6266 }
6267 /* fall through */
6268
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006269 case atom:
6270 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6271 symtable_add_use(st, STR(CHILD(n, 0)));
6272 break;
6273 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006274 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006275 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006276 /* Walk over every non-token child with a special case
6277 for one child.
6278 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006279 if (NCH(n) == 1) {
6280 n = CHILD(n, 0);
6281 goto loop;
6282 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006283 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006284 if (TYPE(CHILD(n, i)) >= single_input)
6285 symtable_node(st, CHILD(n, i));
6286 }
6287}
6288
6289static void
6290symtable_funcdef(struct symtable *st, node *n)
6291{
6292 node *body;
6293
6294 if (TYPE(n) == lambdef) {
6295 if (NCH(n) == 4)
6296 symtable_params(st, CHILD(n, 1));
6297 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006298 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006299 body = CHILD(n, NCH(n) - 1);
6300 symtable_node(st, body);
6301}
6302
6303/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006304 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006305 which are references in the defining scope. symtable_params()
6306 parses the parameter names, which are defined in the function's
6307 body.
6308
6309 varargslist:
6310 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6311 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6312*/
6313
6314static void
6315symtable_default_args(struct symtable *st, node *n)
6316{
6317 node *c;
6318 int i;
6319
6320 if (TYPE(n) == parameters) {
6321 n = CHILD(n, 1);
6322 if (TYPE(n) == RPAR)
6323 return;
6324 }
6325 REQ(n, varargslist);
6326 for (i = 0; i < NCH(n); i += 2) {
6327 c = CHILD(n, i);
6328 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6329 break;
6330 }
6331 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6332 symtable_node(st, CHILD(n, i));
6333 }
6334}
6335
6336static void
6337symtable_params(struct symtable *st, node *n)
6338{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006339 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006340 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006341
6342 if (TYPE(n) == parameters) {
6343 n = CHILD(n, 1);
6344 if (TYPE(n) == RPAR)
6345 return;
6346 }
6347 REQ(n, varargslist);
6348 for (i = 0; i < NCH(n); i += 2) {
6349 c = CHILD(n, i);
6350 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6351 ext = 1;
6352 break;
6353 }
6354 if (TYPE(c) == test) {
6355 continue;
6356 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006357 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006358 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006359 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006360 char nbuf[30];
6361 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006362 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006363 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006364 }
6365 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006366 if (ext) {
6367 c = CHILD(n, i);
6368 if (TYPE(c) == STAR) {
6369 i++;
6370 symtable_add_def(st, STR(CHILD(n, i)),
6371 DEF_PARAM | DEF_STAR);
6372 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006373 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006374 c = NULL;
6375 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006376 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006377 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006378 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006379 i++;
6380 symtable_add_def(st, STR(CHILD(n, i)),
6381 DEF_PARAM | DEF_DOUBLESTAR);
6382 }
6383 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006384 if (complex >= 0) {
6385 int j;
6386 for (j = 0; j <= complex; j++) {
6387 c = CHILD(n, j);
6388 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006389 c = CHILD(n, ++j);
6390 else if (TYPE(c) == EQUAL)
6391 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006392 if (TYPE(CHILD(c, 0)) == LPAR)
6393 symtable_params_fplist(st, CHILD(c, 1));
6394 }
6395 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006396}
6397
6398static void
6399symtable_params_fplist(struct symtable *st, node *n)
6400{
6401 int i;
6402 node *c;
6403
6404 REQ(n, fplist);
6405 for (i = 0; i < NCH(n); i += 2) {
6406 c = CHILD(n, i);
6407 REQ(c, fpdef);
6408 if (NCH(c) == 1)
6409 symtable_add_def(st, STR(CHILD(c, 0)),
6410 DEF_PARAM | DEF_INTUPLE);
6411 else
6412 symtable_params_fplist(st, CHILD(c, 1));
6413 }
6414
6415}
6416
6417static void
6418symtable_global(struct symtable *st, node *n)
6419{
6420 int i;
6421
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006422 /* XXX It might be helpful to warn about module-level global
6423 statements, but it's hard to tell the difference between
6424 module-level and a string passed to exec.
6425 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006426
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006427 for (i = 1; i < NCH(n); i += 2) {
6428 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006429 int flags;
6430
6431 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006432 if (flags < 0)
6433 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006434 if (flags && flags != DEF_GLOBAL) {
6435 char buf[500];
6436 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006437 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006438 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006439 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006440 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006441 }
6442 else {
6443 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006444 PyOS_snprintf(buf, sizeof(buf),
6445 GLOBAL_AFTER_ASSIGN,
6446 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006447 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006448 PyOS_snprintf(buf, sizeof(buf),
6449 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006450 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006451 }
6452 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006453 symtable_add_def(st, name, DEF_GLOBAL);
6454 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006455}
6456
6457static void
6458symtable_list_comprehension(struct symtable *st, node *n)
6459{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006460 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006461 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006462
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006463 REQ(n, listmaker);
6464 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6465 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006466 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006467 symtable_list_for(st, CHILD(n, 1));
6468 symtable_node(st, CHILD(n, 0));
6469 --st->st_cur->ste_tmpname;
6470}
6471
6472static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006473symtable_generator_expression(struct symtable *st, node *n)
6474{
6475 /* testlist_gexp: test gen_for */
6476 REQ(CHILD(n, 0), test);
6477 REQ(CHILD(n, 1), gen_for);
6478
6479 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6480 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6481
6482 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6483
6484 symtable_gen_for(st, CHILD(n, 1), 1);
6485 symtable_node(st, CHILD(n, 0));
6486 symtable_exit_scope(st);
6487
6488 /* for outmost iterable precomputation */
6489 symtable_node(st, CHILD(CHILD(n, 1), 3));
6490}
6491
6492static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006493symtable_list_for(struct symtable *st, node *n)
6494{
6495 REQ(n, list_for);
6496 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006497 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006498 symtable_node(st, CHILD(n, 3));
6499 if (NCH(n) == 5)
6500 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006501}
6502
6503static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006504symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6505{
6506 REQ(n, gen_for);
6507
6508 /* gen_for: for v in test [gen_iter] */
6509 symtable_assign(st, CHILD(n, 1), 0);
6510 if (is_outmost)
6511 symtable_add_use(st, "[outmost-iterable]");
6512 else
6513 symtable_node(st, CHILD(n, 3));
6514
6515 if (NCH(n) == 5)
6516 symtable_gen_iter(st, CHILD(n, 4));
6517}
6518
6519static void
6520symtable_gen_iter(struct symtable *st, node *n)
6521{
6522 REQ(n, gen_iter);
6523
6524 n = CHILD(n, 0);
6525 if (TYPE(n) == gen_for)
6526 symtable_gen_for(st, n, 0);
6527 else {
6528 REQ(n, gen_if);
6529 symtable_node(st, CHILD(n, 1));
6530
6531 if (NCH(n) == 3)
6532 symtable_gen_iter(st, CHILD(n, 2));
6533 }
6534}
6535
6536static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006537symtable_import(struct symtable *st, node *n)
6538{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006539 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006540 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006541 /* import_stmt: import_name | import_from */
6542 n = CHILD(n, 0);
6543 if (TYPE(n) == import_from) {
6544 /* import_from: 'from' dotted_name 'import' ('*' |
6545 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006546 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006547 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006548 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6549 /* check for bogus imports */
6550 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6551 PyErr_SetString(PyExc_SyntaxError,
6552 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006553 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006554 return;
6555 }
6556 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006557 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6558 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006559 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006560 if (symtable_warn(st,
6561 "import * only allowed at module level") < 0)
6562 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006563 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006564 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006565 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006566 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006567 REQ(nn, import_as_names);
6568 for (i = 0; i < NCH(nn); i += 2) {
6569 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006570 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006571 symtable_assign(st, CHILD(c, 2),
6572 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006573 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006574 symtable_assign(st, CHILD(c, 0),
6575 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006576 }
6577 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006578 } else {
6579 /* 'import' dotted_as_names */
6580 nn = CHILD(n, 1);
6581 REQ(nn, dotted_as_names);
6582 for (i = 0; i < NCH(nn); i += 2)
6583 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006584 }
6585}
6586
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006587/* The third argument to symatble_assign() is a flag to be passed to
6588 symtable_add_def() if it is eventually called. The flag is useful
6589 to specify the particular type of assignment that should be
6590 recorded, e.g. an assignment caused by import.
6591 */
6592
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006593static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006594symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006595{
6596 node *tmp;
6597 int i;
6598
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006599 loop:
6600 switch (TYPE(n)) {
6601 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006602 /* invalid assignment, e.g. lambda x:x=2. The next
6603 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006604 return;
6605 case power:
6606 if (NCH(n) > 2) {
6607 for (i = 2; i < NCH(n); ++i)
6608 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6609 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006610 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006611 if (NCH(n) > 1) {
6612 symtable_node(st, CHILD(n, 0));
6613 symtable_node(st, CHILD(n, 1));
6614 } else {
6615 n = CHILD(n, 0);
6616 goto loop;
6617 }
6618 return;
6619 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006620 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6621 /* XXX This is an error, but the next pass
6622 will catch it. */
6623 return;
6624 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006625 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006626 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006627 }
6628 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006629 case testlist_gexp:
6630 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6631 /* XXX This is an error, but the next pass
6632 will catch it. */
6633 return;
6634 } else {
6635 for (i = 0; i < NCH(n); i += 2)
6636 symtable_assign(st, CHILD(n, i), def_flag);
6637 }
6638 return;
6639
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006640 case exprlist:
6641 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006642 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006643 if (NCH(n) == 1) {
6644 n = CHILD(n, 0);
6645 goto loop;
6646 }
6647 else {
6648 int i;
6649 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006650 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006651 return;
6652 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006653 case atom:
6654 tmp = CHILD(n, 0);
6655 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6656 n = CHILD(n, 1);
6657 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006658 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006659 if (strcmp(STR(tmp), "__debug__") == 0) {
6660 PyErr_SetString(PyExc_SyntaxError,
6661 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006662 symtable_error(st, n->n_lineno);
6663 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006664 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006665 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006666 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006667 return;
6668 case dotted_as_name:
6669 if (NCH(n) == 3)
6670 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006671 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006672 else
6673 symtable_add_def(st,
6674 STR(CHILD(CHILD(n,
6675 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006676 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006677 return;
6678 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006679 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006680 return;
6681 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006682 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006683 return;
6684 default:
6685 if (NCH(n) == 0)
6686 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006687 if (NCH(n) == 1) {
6688 n = CHILD(n, 0);
6689 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006690 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006691 /* Should only occur for errors like x + 1 = 1,
6692 which will be caught in the next pass. */
6693 for (i = 0; i < NCH(n); ++i)
6694 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006695 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006696 }
6697}