blob: de07c974000ea9280e6537aa94aa7e12741b0d04 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
400 Bails out with no change if one or more of the LOAD_CONSTs is missing. */
401static int
402tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
403{
404 PyObject *newconst, *constant;
405 int i, arg, len_consts;
406
407 /* Pre-conditions */
408 assert(PyList_CheckExact(consts));
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000409 assert(codestr[n*3] == BUILD_TUPLE);
410 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000411 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000412 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413
414 /* Buildup new tuple of constants */
415 newconst = PyTuple_New(n);
416 if (newconst == NULL)
417 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000418 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000419 for (i=0 ; i<n ; i++) {
420 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000421 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000422 constant = PyList_GET_ITEM(consts, arg);
423 Py_INCREF(constant);
424 PyTuple_SET_ITEM(newconst, i, constant);
425 }
426
427 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000428 if (PyList_Append(consts, newconst)) {
429 Py_DECREF(newconst);
430 return 0;
431 }
432 Py_DECREF(newconst);
433
434 /* Write NOPs over old LOAD_CONSTS and
435 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
436 memset(codestr, NOP, n*3);
437 codestr[n*3] = LOAD_CONST;
438 SETARG(codestr, (n*3), len_consts);
439 return 1;
440}
441
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000442/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
443 with LOAD_CONST binop(c1,c2)
444 The consts table must still be in list form so that the
445 new constant can be appended.
446 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000447 Abandons the transformation if the folding fails (i.e. 1+'a').
448 If the new constant is a sequence, only folds when the size
449 is below a threshold value. That keeps pyc files from
450 becoming large in the presence of code like: (None,)*1000.
451*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000452static int
453fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
454{
455 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000456 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000457
458 /* Pre-conditions */
459 assert(PyList_CheckExact(consts));
460 assert(codestr[0] == LOAD_CONST);
461 assert(codestr[3] == LOAD_CONST);
462
463 /* Create new constant */
464 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
465 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
466 opcode = codestr[6];
467 switch (opcode) {
468 case BINARY_POWER:
469 newconst = PyNumber_Power(v, w, Py_None);
470 break;
471 case BINARY_MULTIPLY:
472 newconst = PyNumber_Multiply(v, w);
473 break;
474 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000475 /* Cannot fold this operation statically since
476 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000477 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000478 case BINARY_TRUE_DIVIDE:
479 newconst = PyNumber_TrueDivide(v, w);
480 break;
481 case BINARY_FLOOR_DIVIDE:
482 newconst = PyNumber_FloorDivide(v, w);
483 break;
484 case BINARY_MODULO:
485 newconst = PyNumber_Remainder(v, w);
486 break;
487 case BINARY_ADD:
488 newconst = PyNumber_Add(v, w);
489 break;
490 case BINARY_SUBTRACT:
491 newconst = PyNumber_Subtract(v, w);
492 break;
493 case BINARY_SUBSCR:
494 newconst = PyObject_GetItem(v, w);
495 break;
496 case BINARY_LSHIFT:
497 newconst = PyNumber_Lshift(v, w);
498 break;
499 case BINARY_RSHIFT:
500 newconst = PyNumber_Rshift(v, w);
501 break;
502 case BINARY_AND:
503 newconst = PyNumber_And(v, w);
504 break;
505 case BINARY_XOR:
506 newconst = PyNumber_Xor(v, w);
507 break;
508 case BINARY_OR:
509 newconst = PyNumber_Or(v, w);
510 break;
511 default:
512 /* Called with an unknown opcode */
513 assert(0);
514 return 0;
515 }
516 if (newconst == NULL) {
517 PyErr_Clear();
518 return 0;
519 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000520 size = PyObject_Size(newconst);
521 if (size == -1)
522 PyErr_Clear();
523 else if (size > 20) {
524 Py_DECREF(newconst);
525 return 0;
526 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000527
528 /* Append folded constant into consts table */
529 len_consts = PyList_GET_SIZE(consts);
530 if (PyList_Append(consts, newconst)) {
531 Py_DECREF(newconst);
532 return 0;
533 }
534 Py_DECREF(newconst);
535
536 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
537 memset(codestr, NOP, 4);
538 codestr[4] = LOAD_CONST;
539 SETARG(codestr, 4, len_consts);
540 return 1;
541}
542
Raymond Hettingera1645742005-02-06 22:05:42 +0000543/* Replace LOAD_CONST tuple with LOAD_CONST frozenset in the context
544 of a single-use constant for "in" and "not in" tests.
545*/
546int
547try_set_conversion(unsigned char *codestr, PyObject *consts)
548{
549 PyObject *newconst, *constant;
550 int arg, len_consts;
551
552 /* Pre-conditions */
553 assert(PyList_CheckExact(consts));
554 assert(codestr[0] == LOAD_CONST);
555 assert(codestr[3] == COMPARE_OP);
556 assert(GETARG(codestr, 3) == 6 || GETARG(codestr, 3) == 7);
557
558 /* Attempt to convert constant to a frozenset. Bail-out with no
559 changes if the tuple contains unhashable values. */
560 arg = GETARG(codestr, 0);
561 constant = PyList_GET_ITEM(consts, arg);
562 if (constant->ob_type != &PyTuple_Type)
563 return 0;
564 newconst = PyObject_CallFunctionObjArgs(
565 (PyObject *)&PyFrozenSet_Type, constant, NULL);
566 if (newconst == NULL) {
567 PyErr_Clear();
568 return 0;
569 }
570
571 /* Append new constant onto consts list.*/
572 len_consts = PyList_GET_SIZE(consts);
573 if (PyList_Append(consts, newconst)) {
574 Py_DECREF(newconst);
575 return 0;
576 }
577 Py_DECREF(newconst);
578
579 /* Write new LOAD_CONST newconst on top of LOAD_CONST oldconst */
580 SETARG(codestr, 0, len_consts);
581 return 1;
582}
583
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000584static unsigned int *
585markblocks(unsigned char *code, int len)
586{
587 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000588 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000589
590 if (blocks == NULL)
591 return NULL;
592 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000593
594 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
596 opcode = code[i];
597 switch (opcode) {
598 case FOR_ITER:
599 case JUMP_FORWARD:
600 case JUMP_IF_FALSE:
601 case JUMP_IF_TRUE:
602 case JUMP_ABSOLUTE:
603 case CONTINUE_LOOP:
604 case SETUP_LOOP:
605 case SETUP_EXCEPT:
606 case SETUP_FINALLY:
607 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000608 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000609 break;
610 }
611 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000612 /* Build block numbers in the second pass */
613 for (i=0 ; i<len ; i++) {
614 blockcnt += blocks[i]; /* increment blockcnt over labels */
615 blocks[i] = blockcnt;
616 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000617 return blocks;
618}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000619
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000620/* Perform basic peephole optimizations to components of a code object.
621 The consts object should still be in list form to allow new constants
622 to be appended.
623
624 To keep the optimizer simple, it bails out (does nothing) for code
625 containing extended arguments or that has a length over 32,700. That
626 allows us to avoid overflow and sign issues. Likewise, it bails when
627 the lineno table has complex encoding for gaps >= 255.
628
629 Optimizations are restricted to simple transformations occuring within a
630 single basic block. All transformations keep the code size the same or
631 smaller. For those that reduce size, the gaps are initially filled with
632 NOPs. Later those NOPs are removed and the jump addresses retargeted in
633 a single pass. Line numbering is adjusted accordingly. */
634
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000635static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000636optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000637{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000638 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000639 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000640 unsigned char *codestr = NULL;
641 unsigned char *lineno;
642 int *addrmap = NULL;
643 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000644 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000645 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000646 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000647
Raymond Hettingereffb3932004-10-30 08:55:08 +0000648 /* Bail out if an exception is set */
649 if (PyErr_Occurred())
650 goto exitUnchanged;
651
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000652 /* Bypass optimization when the lineno table is too complex */
653 assert(PyString_Check(lineno_obj));
654 lineno = PyString_AS_STRING(lineno_obj);
655 tabsiz = PyString_GET_SIZE(lineno_obj);
656 if (memchr(lineno, 255, tabsiz) != NULL)
657 goto exitUnchanged;
658
Raymond Hettingera12fa142004-08-24 04:34:16 +0000659 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000660 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000661 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000662 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000663 goto exitUnchanged;
664
665 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000666 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000667 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000668 goto exitUnchanged;
669 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000670
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000671 /* Mapping to new jump targets after NOPs are removed */
672 addrmap = PyMem_Malloc(codelen * sizeof(int));
673 if (addrmap == NULL)
674 goto exitUnchanged;
675
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000676 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000677 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000678 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000679 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000680
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000681 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000682 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000683
684 lastlc = cumlc;
685 cumlc = 0;
686
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000687 switch (opcode) {
688
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000689 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000690 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000691 case UNARY_NOT:
692 if (codestr[i+1] != JUMP_IF_FALSE ||
693 codestr[i+4] != POP_TOP ||
694 !ISBASICBLOCK(blocks,i,5))
695 continue;
696 tgt = GETJUMPTGT(codestr, (i+1));
697 if (codestr[tgt] != POP_TOP)
698 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000699 j = GETARG(codestr, i+1) + 1;
700 codestr[i] = JUMP_IF_TRUE;
701 SETARG(codestr, i, j);
702 codestr[i+3] = POP_TOP;
703 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000704 break;
705
706 /* not a is b --> a is not b
707 not a in b --> a not in b
708 not a is not b --> a is b
Raymond Hettingera1645742005-02-06 22:05:42 +0000709 not a not in b --> a in b
710
711 a in c --> a in frozenset(c)
712 where c is a constant tuple of hashable values
713 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000714 case COMPARE_OP:
715 j = GETARG(codestr, i);
Raymond Hettingera1645742005-02-06 22:05:42 +0000716 if (lastlc >= 1 && (j == 6 || j == 7) && ISBASICBLOCK(blocks,i-3,6))
717 try_set_conversion(&codestr[i-3], consts);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000718 if (j < 6 || j > 9 ||
719 codestr[i+3] != UNARY_NOT ||
720 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000721 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000722 SETARG(codestr, i, (j^1));
723 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000724 break;
725
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000726 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
727 case LOAD_NAME:
728 case LOAD_GLOBAL:
729 j = GETARG(codestr, i);
730 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
731 if (name == NULL || strcmp(name, "None") != 0)
732 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000733 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
734 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000735 codestr[i] = LOAD_CONST;
736 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000737 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000738 break;
739 }
740 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000741 break;
742
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000743 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000744 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000745 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000746 j = GETARG(codestr, i);
747 if (codestr[i+3] != JUMP_IF_FALSE ||
748 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000749 !ISBASICBLOCK(blocks,i,7) ||
750 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000751 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000752 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000753 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000754 break;
755
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000756 /* Try to fold tuples of constants.
757 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000758 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
759 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000760 case BUILD_TUPLE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000761 j = GETARG(codestr, i);
762 h = i - 3 * j;
763 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000764 j <= lastlc &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000765 ISBASICBLOCK(blocks, h, 3*(j+1)) &&
766 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000767 assert(codestr[i] == LOAD_CONST);
768 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000769 break;
770 }
771 /* Intentional fallthrough */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000772 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000773 j = GETARG(codestr, i);
774 if (codestr[i+3] != UNPACK_SEQUENCE ||
775 !ISBASICBLOCK(blocks,i,6) ||
776 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000777 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000778 if (j == 1) {
779 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000780 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000781 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000782 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000783 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000784 codestr[i] = ROT_THREE;
785 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000786 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000787 }
788 break;
789
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000790 /* Fold binary ops on constants.
791 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
792 case BINARY_POWER:
793 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000794 case BINARY_TRUE_DIVIDE:
795 case BINARY_FLOOR_DIVIDE:
796 case BINARY_MODULO:
797 case BINARY_ADD:
798 case BINARY_SUBTRACT:
799 case BINARY_SUBSCR:
800 case BINARY_LSHIFT:
801 case BINARY_RSHIFT:
802 case BINARY_AND:
803 case BINARY_XOR:
804 case BINARY_OR:
805 if (lastlc >= 2 &&
806 ISBASICBLOCK(blocks, i-6, 7) &&
807 fold_binops_on_constants(&codestr[i-6], consts)) {
808 i -= 2;
809 assert(codestr[i] == LOAD_CONST);
810 cumlc = 1;
811 }
812 break;
813
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000814 /* Simplify conditional jump to conditional jump where the
815 result of the first test implies the success of a similar
816 test or the failure of the opposite test.
817 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000818 "if a and b:"
819 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000820 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000821 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000822 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000823 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
824 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000825 */
826 case JUMP_IF_FALSE:
827 case JUMP_IF_TRUE:
828 tgt = GETJUMPTGT(codestr, i);
829 j = codestr[tgt];
830 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
831 if (j == opcode) {
832 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
833 SETARG(codestr, i, tgttgt);
834 } else {
835 tgt -= i;
836 SETARG(codestr, i, tgt);
837 }
838 break;
839 }
840 /* Intentional fallthrough */
841
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000842 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000843 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000844 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000845 case JUMP_ABSOLUTE:
846 case CONTINUE_LOOP:
847 case SETUP_LOOP:
848 case SETUP_EXCEPT:
849 case SETUP_FINALLY:
850 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000851 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000852 continue;
853 tgttgt = GETJUMPTGT(codestr, tgt);
854 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
855 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000856 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000857 tgttgt -= i + 3; /* Calc relative jump addr */
858 if (tgttgt < 0) /* No backward relative jumps */
859 continue;
860 codestr[i] = opcode;
861 SETARG(codestr, i, tgttgt);
862 break;
863
864 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000865 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000866
867 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
868 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000869 if (i+4 >= codelen ||
870 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000871 !ISBASICBLOCK(blocks,i,5))
872 continue;
873 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000874 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000875 }
876 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000877
878 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000879 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
880 addrmap[i] = i - nops;
881 if (codestr[i] == NOP)
882 nops++;
883 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000884 cum_orig_line = 0;
885 last_line = 0;
886 for (i=0 ; i < tabsiz ; i+=2) {
887 cum_orig_line += lineno[i];
888 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000889 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000890 lineno[i] =((unsigned char)(new_line - last_line));
891 last_line = new_line;
892 }
893
894 /* Remove NOPs and fixup jump targets */
895 for (i=0, h=0 ; i<codelen ; ) {
896 opcode = codestr[i];
897 switch (opcode) {
898 case NOP:
899 i++;
900 continue;
901
902 case JUMP_ABSOLUTE:
903 case CONTINUE_LOOP:
904 j = addrmap[GETARG(codestr, i)];
905 SETARG(codestr, i, j);
906 break;
907
908 case FOR_ITER:
909 case JUMP_FORWARD:
910 case JUMP_IF_FALSE:
911 case JUMP_IF_TRUE:
912 case SETUP_LOOP:
913 case SETUP_EXCEPT:
914 case SETUP_FINALLY:
915 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
916 SETARG(codestr, i, j);
917 break;
918 }
919 adj = CODESIZE(opcode);
920 while (adj--)
921 codestr[h++] = codestr[i++];
922 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000923 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000924
925 code = PyString_FromStringAndSize((char *)codestr, h);
926 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000927 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000928 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000929 return code;
930
931exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000932 if (blocks != NULL)
933 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000934 if (addrmap != NULL)
935 PyMem_Free(addrmap);
936 if (codestr != NULL)
937 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000938 Py_INCREF(code);
939 return code;
940}
941
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000942/* End: Peephole optimizations ----------------------------------------- */
943
Guido van Rossum79f25d91997-04-29 20:08:16 +0000944PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000945PyCode_New(int argcount, int nlocals, int stacksize, int flags,
946 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000947 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
948 PyObject *filename, PyObject *name, int firstlineno,
949 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000950{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000952 int i;
953 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000954 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000955 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 consts == NULL || !PyTuple_Check(consts) ||
957 names == NULL || !PyTuple_Check(names) ||
958 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000959 freevars == NULL || !PyTuple_Check(freevars) ||
960 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 name == NULL || !PyString_Check(name) ||
962 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000963 lnotab == NULL || !PyString_Check(lnotab) ||
964 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000965 PyErr_BadInternalCall();
966 return NULL;
967 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000968 intern_strings(names);
969 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000971 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000972 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 for (i = PyTuple_Size(consts); --i >= 0; ) {
974 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000976 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000978 continue;
979 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000980 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000983 co->co_argcount = argcount;
984 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000985 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000986 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000987 Py_INCREF(code);
988 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000990 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000994 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000995 Py_INCREF(freevars);
996 co->co_freevars = freevars;
997 Py_INCREF(cellvars);
998 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001000 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001001 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001002 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001003 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001004 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001005 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001006 if (PyTuple_GET_SIZE(freevars) == 0 &&
1007 PyTuple_GET_SIZE(cellvars) == 0)
1008 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001009 }
1010 return co;
1011}
1012
1013
1014/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001015
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001016/* The compiler uses two passes to generate bytecodes. The first pass
1017 builds the symbol table. The second pass generates the bytecode.
1018
1019 The first pass uses a single symtable struct. The second pass uses
1020 a compiling struct for each code block. The compiling structs
1021 share a reference to the symtable.
1022
1023 The two passes communicate via symtable_load_symbols() and via
1024 is_local() and is_global(). The former initializes several slots
1025 in the compiling struct: c_varnames, c_locals, c_nlocals,
1026 c_argcount, c_globals, and c_flags.
1027*/
1028
Tim Peters2a7f3842001-06-09 09:26:21 +00001029/* All about c_lnotab.
1030
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001031c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1032version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1033mapped to source code line #s via c_lnotab instead.
1034
Tim Peters2a7f3842001-06-09 09:26:21 +00001035The array is conceptually a list of
1036 (bytecode offset increment, line number increment)
1037pairs. The details are important and delicate, best illustrated by example:
1038
1039 byte code offset source code line number
1040 0 1
1041 6 2
1042 50 7
1043 350 307
1044 361 308
1045
1046The first trick is that these numbers aren't stored, only the increments
1047from one row to the next (this doesn't really work, but it's a start):
1048
1049 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1050
1051The second trick is that an unsigned byte can't hold negative values, or
1052values larger than 255, so (a) there's a deep assumption that byte code
1053offsets and their corresponding line #s both increase monotonically, and (b)
1054if at least one column jumps by more than 255 from one row to the next, more
1055than one pair is written to the table. In case #b, there's no way to know
1056from looking at the table later how many were written. That's the delicate
1057part. A user of c_lnotab desiring to find the source line number
1058corresponding to a bytecode address A should do something like this
1059
1060 lineno = addr = 0
1061 for addr_incr, line_incr in c_lnotab:
1062 addr += addr_incr
1063 if addr > A:
1064 return lineno
1065 lineno += line_incr
1066
1067In order for this to work, when the addr field increments by more than 255,
1068the line # increment in each pair generated must be 0 until the remaining addr
1069increment is < 256. So, in the example above, com_set_lineno should not (as
1070was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1071255, 0, 45, 255, 0, 45.
1072*/
1073
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001074struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001075 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001077 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001079 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001080 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 PyObject *c_locals; /* dictionary (value=localID) */
1082 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001083 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001084 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001085 int c_nlocals; /* index of next local */
1086 int c_argcount; /* number of top-level arguments */
1087 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001088 int c_nexti; /* index into c_code */
1089 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001090 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001091 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001092 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001093 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001095 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001096 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001097 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001098 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099 int c_stacklevel; /* Current stack level */
1100 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001101 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001103 int c_last_addr; /* last op addr seen and recorded in lnotab */
1104 int c_last_line; /* last line seen and recorded in lnotab */
1105 int c_lnotab_next; /* current length of lnotab */
1106 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001107 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001108 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001109 int c_nested; /* Is block nested funcdef or lamdef? */
1110 int c_closure; /* Is nested w/freevars? */
1111 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001112 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001113 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001114};
1115
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001116static int
1117is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001118{
1119 if ((v & (USE | DEF_FREE))
1120 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1121 return 1;
1122 if (v & DEF_FREE_CLASS)
1123 return 1;
1124 return 0;
1125}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001126
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001127static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001128com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001129{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001130 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1131
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001132 if (c == NULL) {
1133 /* Error occurred via symtable call to
1134 is_constant_false */
1135 PyErr_SetString(exc, msg);
1136 return;
1137 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001138 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001139 if (c->c_lineno < 1 || c->c_interactive) {
1140 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001142 return;
1143 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001144 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001145 if (v == NULL)
1146 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001147
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001148 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001149 if (line == NULL) {
1150 Py_INCREF(Py_None);
1151 line = Py_None;
1152 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001153 if (exc == PyExc_SyntaxError) {
1154 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1155 Py_None, line);
1156 if (t == NULL)
1157 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001158 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001159 if (w == NULL)
1160 goto exit;
1161 PyErr_SetObject(exc, w);
1162 } else {
1163 /* Make sure additional exceptions are printed with
1164 file and line, also. */
1165 PyErr_SetObject(exc, v);
1166 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1167 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001168 exit:
1169 Py_XDECREF(t);
1170 Py_XDECREF(v);
1171 Py_XDECREF(w);
1172 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001173}
1174
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001175/* Interface to the block stack */
1176
1177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001178block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001179{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001180 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 com_error(c, PyExc_SystemError,
1182 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001183 }
1184 else {
1185 c->c_block[c->c_nblocks++] = type;
1186 }
1187}
1188
1189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001191{
1192 if (c->c_nblocks > 0)
1193 c->c_nblocks--;
1194 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001196 }
1197}
1198
Guido van Rossum681d79a1995-07-18 14:51:37 +00001199/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001200
Martin v. Löwis95292d62002-12-11 14:04:59 +00001201static int issue_warning(const char *, const char *, int);
1202static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001203static void com_free(struct compiling *);
1204static void com_push(struct compiling *, int);
1205static void com_pop(struct compiling *, int);
1206static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001207static void com_node(struct compiling *, node *);
1208static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001209static void com_addbyte(struct compiling *, int);
1210static void com_addint(struct compiling *, int);
1211static void com_addoparg(struct compiling *, int, int);
1212static void com_addfwref(struct compiling *, int, int *);
1213static void com_backpatch(struct compiling *, int);
1214static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1215static int com_addconst(struct compiling *, PyObject *);
1216static int com_addname(struct compiling *, PyObject *);
1217static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001218static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001219static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001220static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001221static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001222static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001223static void com_assign(struct compiling *, node *, int, node *);
1224static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001225static int com_make_closure(struct compiling *c, PyCodeObject *co);
1226
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001227static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001228static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001229 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001230static PyObject *parsestrplus(struct compiling*, node *);
1231static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001232static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001234static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001235
1236/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001237static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001238static struct symtable *symtable_build(node *, PyFutureFeatures *,
1239 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001240static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001241static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001242static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001243static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001244static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001245static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001246
1247static void symtable_node(struct symtable *, node *);
1248static void symtable_funcdef(struct symtable *, node *);
1249static void symtable_default_args(struct symtable *, node *);
1250static void symtable_params(struct symtable *, node *);
1251static void symtable_params_fplist(struct symtable *, node *n);
1252static void symtable_global(struct symtable *, node *);
1253static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001254static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001255static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001256static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001257static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001258static void symtable_gen_for(struct symtable *, node *, int);
1259static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001260
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001261static int symtable_update_free_vars(struct symtable *);
1262static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1263static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1264
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001265/* helper */
1266static void
1267do_pad(int pad)
1268{
1269 int i;
1270 for (i = 0; i < pad; ++i)
1271 fprintf(stderr, " ");
1272}
1273
1274static void
1275dump(node *n, int pad, int depth)
1276{
1277 int i;
1278 if (depth == 0)
1279 return;
1280 do_pad(pad);
1281 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1282 if (depth > 0)
1283 depth--;
1284 for (i = 0; i < NCH(n); ++i)
1285 dump(CHILD(n, i), pad + 1, depth);
1286}
1287
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001289com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001291 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001292 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1293 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001294 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001296 goto fail;
1297 if ((c->c_const_dict = PyDict_New()) == NULL)
1298 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001300 goto fail;
1301 if ((c->c_name_dict = PyDict_New()) == NULL)
1302 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001304 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1306 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001307 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001308 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001309 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001310 c->c_freevars = NULL;
1311 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001312 c->c_nlocals = 0;
1313 c->c_argcount = 0;
1314 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001315 c->c_nexti = 0;
1316 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001317 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001318 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001320 c->c_begin = 0;
1321 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001322 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001323 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001324 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001325 c->c_stacklevel = 0;
1326 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001327 c->c_firstlineno = 0;
1328 c->c_last_addr = 0;
1329 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001330 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001331 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001332 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001333 c->c_nested = 0;
1334 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001335 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 return 1;
1337
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001338 fail:
1339 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001340 return 0;
1341}
1342
1343static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001344com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 Py_XDECREF(c->c_code);
1347 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001348 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001350 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 Py_XDECREF(c->c_globals);
1352 Py_XDECREF(c->c_locals);
1353 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001354 Py_XDECREF(c->c_freevars);
1355 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001357 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001358 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359}
1360
1361static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001362com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001363{
1364 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001365 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001366 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001367 /*
1368 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1369 c->c_filename, c->c_name, c->c_lineno,
1370 c->c_nexti, c->c_stacklevel, n);
1371 */
1372 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001373}
1374
1375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001377{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001378 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001380 else
1381 c->c_stacklevel -= n;
1382}
1383
1384static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001385com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001386{
1387 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001389 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391}
1392
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001393static int
1394com_check_size(PyObject **s, int offset)
1395{
1396 int len = PyString_GET_SIZE(*s);
1397 if (offset >= len)
1398 return _PyString_Resize(s, len * 2);
1399 return 0;
1400}
1401
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001403com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001404{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001405 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001406 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001407 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001408 if (com_check_size(&c->c_code, c->c_nexti)) {
1409 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001411 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001412 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001413}
1414
1415static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001416com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001418 com_addbyte(c, x & 0xff);
1419 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001420}
1421
1422static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001423com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001424{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001425 char *p;
1426 if (c->c_lnotab == NULL)
1427 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001428 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1429 c->c_errors++;
1430 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001431 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001432 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001433 *p++ = addr;
1434 *p++ = line;
1435 c->c_lnotab_next += 2;
1436}
1437
1438static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001439com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001440{
1441 c->c_lineno = lineno;
1442 if (c->c_firstlineno == 0) {
1443 c->c_firstlineno = c->c_last_line = lineno;
1444 }
1445 else {
1446 int incr_addr = c->c_nexti - c->c_last_addr;
1447 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001448 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001449 while (incr_addr > 255) {
1450 com_add_lnotab(c, 255, 0);
1451 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001452 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001453 while (incr_line > 255) {
1454 com_add_lnotab(c, incr_addr, 255);
1455 incr_line -=255;
1456 incr_addr = 0;
1457 }
1458 if (incr_addr > 0 || incr_line > 0)
1459 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001460 c->c_last_addr = c->c_nexti;
1461 c->c_last_line = lineno;
1462 }
1463}
1464
1465static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001466com_strip_lnotab(struct compiling *c)
1467{
1468 /* strip the last lnotab entry if no opcode were emitted.
1469 * This prevents a line number to be generated on a final
1470 * pass, like in the following example:
1471 *
1472 * if a:
1473 * print 5
1474 * else:
1475 * pass
1476 *
1477 * Without the fix, a line trace event would be generated
1478 * on the pass even if a is true (because of the implicit
1479 * return).
1480 */
1481 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1482 c->c_lnotab_next = c->c_lnotab_last;
1483 }
1484}
1485
1486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001487com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001488{
Fred Drakeef8ace32000-08-24 00:32:09 +00001489 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001490 if (extended_arg){
1491 com_addbyte(c, EXTENDED_ARG);
1492 com_addint(c, extended_arg);
1493 arg &= 0xffff;
1494 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001495 com_addbyte(c, op);
1496 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001497}
1498
1499static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001500com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001501{
1502 /* Compile a forward reference for backpatching */
1503 int here;
1504 int anchor;
1505 com_addbyte(c, op);
1506 here = c->c_nexti;
1507 anchor = *p_anchor;
1508 *p_anchor = here;
1509 com_addint(c, anchor == 0 ? 0 : here - anchor);
1510}
1511
1512static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001513com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001514{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001515 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001516 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001517 int dist;
1518 int prev;
1519 for (;;) {
1520 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001521 prev = code[anchor] + (code[anchor+1] << 8);
1522 dist = target - (anchor+2);
1523 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001524 dist >>= 8;
1525 code[anchor+1] = dist;
1526 dist >>= 8;
1527 if (dist) {
1528 com_error(c, PyExc_SystemError,
1529 "com_backpatch: offset too large");
1530 break;
1531 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001532 if (!prev)
1533 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001534 anchor -= prev;
1535 }
1536}
1537
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001538/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001539
1540static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001541com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001542{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001543 PyObject *w, *t, *np=NULL;
1544 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001545
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001546 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001547 if (t == NULL)
1548 goto fail;
1549 w = PyDict_GetItem(dict, t);
1550 if (w != NULL) {
1551 n = PyInt_AsLong(w);
1552 } else {
1553 n = PyList_Size(list);
1554 np = PyInt_FromLong(n);
1555 if (np == NULL)
1556 goto fail;
1557 if (PyList_Append(list, v) != 0)
1558 goto fail;
1559 if (PyDict_SetItem(dict, t, np) != 0)
1560 goto fail;
1561 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001562 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001563 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001564 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001565 fail:
1566 Py_XDECREF(np);
1567 Py_XDECREF(t);
1568 c->c_errors++;
1569 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001570}
1571
1572static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001573com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001575 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576}
1577
1578static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001579com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001580{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001581 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582}
1583
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001584int
1585_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001586{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001587 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001588 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001589 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001590 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1591 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001592 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001593 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001594 return 0; /* Don't mangle __extremely_long_names */
1595 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1596 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001597 /* Strip leading underscores from class name */
1598 while (*p == '_')
1599 p++;
1600 if (*p == '\0')
1601 return 0; /* Don't mangle if class is just underscores */
1602 plen = strlen(p);
1603 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001604 plen = maxlen-nlen-2; /* Truncate class name if too long */
1605 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001606 buffer[0] = '_';
1607 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001608 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001609 return 1;
1610}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001611
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001613com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001616 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001617 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001618
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001619 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001620 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001621 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 c->c_errors++;
1623 i = 255;
1624 }
1625 else {
1626 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001629 com_addoparg(c, op, i);
1630}
1631
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001632#define NAME_LOCAL 0
1633#define NAME_GLOBAL 1
1634#define NAME_DEFAULT 2
1635#define NAME_CLOSURE 3
1636
1637static int
1638com_lookup_arg(PyObject *dict, PyObject *name)
1639{
1640 PyObject *v = PyDict_GetItem(dict, name);
1641 if (v == NULL)
1642 return -1;
1643 else
1644 return PyInt_AS_LONG(v);
1645}
1646
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001647static int
1648none_assignment_check(struct compiling *c, char *name, int assigning)
1649{
1650 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1651 char *msg;
1652 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001653 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001654 else
1655 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001656 com_error(c, PyExc_SyntaxError, msg);
1657 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001658 }
1659 return 0;
1660}
1661
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001662static void
1663com_addop_varname(struct compiling *c, int kind, char *name)
1664{
1665 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001666 int i, reftype;
1667 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001668 int op = STOP_CODE;
1669 char buffer[MANGLE_LEN];
1670
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001671 if (kind != VAR_LOAD &&
1672 none_assignment_check(c, name, kind == VAR_STORE))
1673 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001674 i = 255;
1675 goto done;
1676 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001677 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001678 name = buffer;
1679 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1680 c->c_errors++;
1681 i = 255;
1682 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001683 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001684
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001685 reftype = get_ref_type(c, name);
1686 switch (reftype) {
1687 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001688 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001689 scope = NAME_LOCAL;
1690 break;
1691 case GLOBAL_EXPLICIT:
1692 scope = NAME_GLOBAL;
1693 break;
1694 case GLOBAL_IMPLICIT:
1695 if (c->c_flags & CO_OPTIMIZED)
1696 scope = NAME_GLOBAL;
1697 break;
1698 case FREE:
1699 case CELL:
1700 scope = NAME_CLOSURE;
1701 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001702 }
1703
1704 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001705 if (scope == NAME_LOCAL)
1706 i = com_lookup_arg(c->c_locals, v);
1707 else if (reftype == FREE)
1708 i = com_lookup_arg(c->c_freevars, v);
1709 else if (reftype == CELL)
1710 i = com_lookup_arg(c->c_cellvars, v);
1711 if (i == -1) {
1712 c->c_errors++; /* XXX no exception set */
1713 i = 255;
1714 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001715 }
1716 Py_DECREF(v);
1717
1718 switch (kind) {
1719 case VAR_LOAD:
1720 switch (scope) {
1721 case NAME_LOCAL:
1722 op = LOAD_FAST;
1723 break;
1724 case NAME_GLOBAL:
1725 op = LOAD_GLOBAL;
1726 break;
1727 case NAME_DEFAULT:
1728 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001729 break;
1730 case NAME_CLOSURE:
1731 op = LOAD_DEREF;
1732 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001733 }
1734 break;
1735 case VAR_STORE:
1736 switch (scope) {
1737 case NAME_LOCAL:
1738 op = STORE_FAST;
1739 break;
1740 case NAME_GLOBAL:
1741 op = STORE_GLOBAL;
1742 break;
1743 case NAME_DEFAULT:
1744 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001745 break;
1746 case NAME_CLOSURE:
1747 op = STORE_DEREF;
1748 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001749 }
1750 break;
1751 case VAR_DELETE:
1752 switch (scope) {
1753 case NAME_LOCAL:
1754 op = DELETE_FAST;
1755 break;
1756 case NAME_GLOBAL:
1757 op = DELETE_GLOBAL;
1758 break;
1759 case NAME_DEFAULT:
1760 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 break;
1762 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001763 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001764 PyOS_snprintf(buf, sizeof(buf),
1765 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001766 com_error(c, PyExc_SyntaxError, buf);
1767 i = 255;
1768 break;
1769 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001770 }
1771 break;
1772 }
1773done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001774 com_addoparg(c, op, i);
1775}
1776
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001777static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001778com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001779{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001780 char *name;
1781 char buffer[1000];
1782 /* XXX it is possible to write this code without the 1000
1783 chars on the total length of dotted names, I just can't be
1784 bothered right now */
1785 if (TYPE(n) == STAR)
1786 name = "*";
1787 else if (TYPE(n) == dotted_name) {
1788 char *p = buffer;
1789 int i;
1790 name = buffer;
1791 for (i = 0; i < NCH(n); i += 2) {
1792 char *s = STR(CHILD(n, i));
1793 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001795 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001796 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001797 break;
1798 }
1799 if (p != buffer)
1800 *p++ = '.';
1801 strcpy(p, s);
1802 p = strchr(p, '\0');
1803 }
1804 }
1805 else {
1806 REQ(n, NAME);
1807 name = STR(n);
1808 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001809 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001810}
1811
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001813parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001814{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001815 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001816 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001817 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001818#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001819 int imflag;
1820#endif
1821
Guido van Rossum282914b1991-04-04 10:42:56 +00001822 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001823 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001824#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001825 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001826#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001827 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001829 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001831 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001832 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001833 }
1834 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001835 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001837 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001838 if (errno != 0)
1839 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001841 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001842 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001843#ifndef WITHOUT_COMPLEX
1844 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001845 Py_complex z;
1846 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001847 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001848 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001849 PyFPE_END_PROTECT(z)
1850 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001851 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001852 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001853#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001854 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001855 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001856 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001857 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001859 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001860}
1861
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001863decode_utf8(char **sPtr, char *end, char* encoding)
1864{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001865#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001866 Py_FatalError("decode_utf8 should not be called in this build.");
1867 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001868#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001869 PyObject *u, *v;
1870 char *s, *t;
1871 t = s = *sPtr;
1872 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1873 while (s < end && (*s & 0x80)) s++;
1874 *sPtr = s;
1875 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1876 if (u == NULL)
1877 return NULL;
1878 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1879 Py_DECREF(u);
1880 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001881#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001882}
1883
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001884/* compiler.transformer.Transformer.decode_literal depends on what
1885 might seem like minor details of this function -- changes here
1886 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001887static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001888parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001889{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001891 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001892 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001893 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001894 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001895 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001896 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001897
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001898 if (isalpha(quote) || quote == '_') {
1899 if (quote == 'u' || quote == 'U') {
1900 quote = *++s;
1901 unicode = 1;
1902 }
1903 if (quote == 'r' || quote == 'R') {
1904 quote = *++s;
1905 rawmode = 1;
1906 }
1907 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001908 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001909 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001910 return NULL;
1911 }
1912 s++;
1913 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001914 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001915 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001916 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001917 return NULL;
1918 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001919 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921 return NULL;
1922 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001923 if (len >= 4 && s[0] == quote && s[1] == quote) {
1924 s += 2;
1925 len -= 2;
1926 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001928 return NULL;
1929 }
1930 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001931#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001932 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001933 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001934 char *buf;
1935 char *p;
1936 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001937 if (encoding == NULL) {
1938 buf = s;
1939 u = NULL;
1940 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1941 buf = s;
1942 u = NULL;
1943 } else {
1944 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1945 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1946 if (u == NULL)
1947 return NULL;
1948 p = buf = PyString_AsString(u);
1949 end = s + len;
1950 while (s < end) {
1951 if (*s == '\\') {
1952 *p++ = *s++;
1953 if (*s & 0x80) {
1954 strcpy(p, "u005c");
1955 p += 5;
1956 }
1957 }
1958 if (*s & 0x80) { /* XXX inefficient */
1959 char *r;
1960 int rn, i;
1961 w = decode_utf8(&s, end, "utf-16-be");
1962 if (w == NULL) {
1963 Py_DECREF(u);
1964 return NULL;
1965 }
1966 r = PyString_AsString(w);
1967 rn = PyString_Size(w);
1968 assert(rn % 2 == 0);
1969 for (i = 0; i < rn; i += 2) {
1970 sprintf(p, "\\u%02x%02x",
1971 r[i + 0] & 0xFF,
1972 r[i + 1] & 0xFF);
1973 p += 6;
1974 }
1975 Py_DECREF(w);
1976 } else {
1977 *p++ = *s++;
1978 }
1979 }
1980 len = p - buf;
1981 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001982 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001983 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001984 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001985 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1986 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001987 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001988 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001989 return v;
1990
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001991 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001992#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001993 need_encoding = (encoding != NULL &&
1994 strcmp(encoding, "utf-8") != 0 &&
1995 strcmp(encoding, "iso-8859-1") != 0);
1996 if (rawmode || strchr(s, '\\') == NULL) {
1997 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001998#ifndef Py_USING_UNICODE
1999 /* This should not happen - we never see any other
2000 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002001 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002002#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002003 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2004 if (u == NULL)
2005 return NULL;
2006 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2007 Py_DECREF(u);
2008 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002009#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002010 } else {
2011 return PyString_FromStringAndSize(s, len);
2012 }
2013 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002014
2015 v = PyString_DecodeEscape(s, len, NULL, unicode,
2016 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002017 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002018 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002019 return v;
2020}
2021
Guido van Rossum79f25d91997-04-29 20:08:16 +00002022static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002023parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002024{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002026 int i;
2027 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002028 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002029 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002030 for (i = 1; i < NCH(n); i++) {
2031 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002032 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002033 if (s == NULL)
2034 goto onError;
2035 if (PyString_Check(v) && PyString_Check(s)) {
2036 PyString_ConcatAndDel(&v, s);
2037 if (v == NULL)
2038 goto onError;
2039 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002040#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002041 else {
2042 PyObject *temp;
2043 temp = PyUnicode_Concat(v, s);
2044 Py_DECREF(s);
2045 if (temp == NULL)
2046 goto onError;
2047 Py_DECREF(v);
2048 v = temp;
2049 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002050#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002051 }
2052 }
2053 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002054
2055 onError:
2056 Py_XDECREF(v);
2057 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002058}
2059
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002061com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002063 int anchor = 0;
2064 int save_begin = c->c_begin;
2065
Raymond Hettinger354433a2004-05-19 08:20:33 +00002066 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002067 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002068 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002069 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002070 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002071 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002072 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002073 c->c_loops++;
2074 com_list_iter(c, n, e, t);
2075 c->c_loops--;
2076 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2077 c->c_begin = save_begin;
2078 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002079 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002080}
2081
2082static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002083com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2084{
2085 int break_anchor = 0;
2086 int anchor = 0;
2087 int save_begin = c->c_begin;
2088
2089 REQ(n, gen_for);
2090 /* gen_for: for v in test [gen_iter] */
2091
2092 com_addfwref(c, SETUP_LOOP, &break_anchor);
2093 block_push(c, SETUP_LOOP);
2094
2095 if (is_outmost) {
2096 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2097 com_push(c, 1);
2098 }
2099 else {
2100 com_node(c, CHILD(n, 3));
2101 com_addbyte(c, GET_ITER);
2102 }
2103
2104 c->c_begin = c->c_nexti;
2105 com_set_lineno(c, c->c_last_line);
2106 com_addfwref(c, FOR_ITER, &anchor);
2107 com_push(c, 1);
2108 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2109
2110 if (NCH(n) == 5)
2111 com_gen_iter(c, CHILD(n, 4), t);
2112 else {
2113 com_test(c, t);
2114 com_addbyte(c, YIELD_VALUE);
2115 com_pop(c, 1);
2116 }
2117
2118 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2119 c->c_begin = save_begin;
2120
2121 com_backpatch(c, anchor);
2122 com_pop(c, 1); /* FOR_ITER has popped this */
2123 com_addbyte(c, POP_BLOCK);
2124 block_pop(c, SETUP_LOOP);
2125 com_backpatch(c, break_anchor);
2126}
2127
2128static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002129com_list_if(struct compiling *c, node *n, node *e, char *t)
2130{
2131 int anchor = 0;
2132 int a = 0;
2133 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002134 com_node(c, CHILD(n, 1));
2135 com_addfwref(c, JUMP_IF_FALSE, &a);
2136 com_addbyte(c, POP_TOP);
2137 com_pop(c, 1);
2138 com_list_iter(c, n, e, t);
2139 com_addfwref(c, JUMP_FORWARD, &anchor);
2140 com_backpatch(c, a);
2141 /* We jump here with an extra entry which we now pop */
2142 com_addbyte(c, POP_TOP);
2143 com_backpatch(c, anchor);
2144}
2145
2146static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002147com_gen_if(struct compiling *c, node *n, node *t)
2148{
2149 /* gen_if: 'if' test [gen_iter] */
2150 int anchor = 0;
2151 int a=0;
2152
2153 com_node(c, CHILD(n, 1));
2154 com_addfwref(c, JUMP_IF_FALSE, &a);
2155 com_addbyte(c, POP_TOP);
2156 com_pop(c, 1);
2157
2158 if (NCH(n) == 3)
2159 com_gen_iter(c, CHILD(n, 2), t);
2160 else {
2161 com_test(c, t);
2162 com_addbyte(c, YIELD_VALUE);
2163 com_pop(c, 1);
2164 }
2165 com_addfwref(c, JUMP_FORWARD, &anchor);
2166 com_backpatch(c, a);
2167 /* We jump here with an extra entry which we now pop */
2168 com_addbyte(c, POP_TOP);
2169 com_backpatch(c, anchor);
2170}
2171
2172static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002173com_list_iter(struct compiling *c,
2174 node *p, /* parent of list_iter node */
2175 node *e, /* element expression node */
2176 char *t /* name of result list temp local */)
2177{
2178 /* list_iter is the last child in a listmaker, list_for, or list_if */
2179 node *n = CHILD(p, NCH(p)-1);
2180 if (TYPE(n) == list_iter) {
2181 n = CHILD(n, 0);
2182 switch (TYPE(n)) {
2183 case list_for:
2184 com_list_for(c, n, e, t);
2185 break;
2186 case list_if:
2187 com_list_if(c, n, e, t);
2188 break;
2189 default:
2190 com_error(c, PyExc_SystemError,
2191 "invalid list_iter node type");
2192 }
2193 }
2194 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002195 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002196 com_push(c, 1);
2197 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002198 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002199 com_pop(c, 2);
2200 }
2201}
2202
2203static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002204com_gen_iter(struct compiling *c, node *n, node *t)
2205{
2206 /* gen_iter: gen_for | gen_if */
2207 node *ch;
2208 REQ(n, gen_iter);
2209
2210 ch = CHILD(n, 0);
2211
2212 switch (TYPE(ch)) {
2213 case gen_for:
2214 com_gen_for(c, ch, t, 0);
2215 break;
2216 case gen_if:
2217 com_gen_if(c, ch, t);
2218 break;
2219 default:
2220 com_error(c, PyExc_SystemError,
2221 "invalid gen_iter node type");
2222 }
2223}
2224
2225static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002226com_list_comprehension(struct compiling *c, node *n)
2227{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002228 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002229 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002230
2231 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002232 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002233 com_addoparg(c, BUILD_LIST, 0);
2234 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2235 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002236 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002237 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002238 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002239 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002240 --c->c_tmpname;
2241}
2242
2243static void
2244com_listmaker(struct compiling *c, node *n)
2245{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002246 /* listmaker: test ( list_for | (',' test)* [','] ) */
2247 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002248 com_list_comprehension(c, n);
2249 else {
2250 int len = 0;
2251 int i;
2252 for (i = 0; i < NCH(n); i += 2, len++)
2253 com_node(c, CHILD(n, i));
2254 com_addoparg(c, BUILD_LIST, len);
2255 com_pop(c, len-1);
2256 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002257}
2258
2259static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002260com_generator_expression(struct compiling *c, node *n)
2261{
2262 /* testlist_gexp: test gen_for */
2263 /* argument: test gen_for */
2264 PyCodeObject *co;
2265
2266 REQ(CHILD(n, 0), test);
2267 REQ(CHILD(n, 1), gen_for);
2268
2269 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2270 n->n_lineno);
2271 co = icompile(n, c);
2272 symtable_exit_scope(c->c_symtable);
2273
2274 if (co == NULL)
2275 c->c_errors++;
2276 else {
2277 int closure = com_make_closure(c, co);
2278 int i = com_addconst(c, (PyObject *)co);
2279
2280 com_addoparg(c, LOAD_CONST, i);
2281 com_push(c, 1);
2282 if (closure)
2283 com_addoparg(c, MAKE_CLOSURE, 0);
2284 else
2285 com_addoparg(c, MAKE_FUNCTION, 0);
2286
2287 com_test(c, CHILD(CHILD(n, 1), 3));
2288 com_addbyte(c, GET_ITER);
2289 com_addoparg(c, CALL_FUNCTION, 1);
2290 com_pop(c, 1);
2291
2292 Py_DECREF(co);
2293 }
2294}
2295
2296static void
2297com_testlist_gexp(struct compiling *c, node *n)
2298{
2299 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2300 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2301 com_generator_expression(c, n);
2302 else com_list(c, n, 0);
2303}
2304
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002305
Raymond Hettinger354433a2004-05-19 08:20:33 +00002306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002307com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002308{
2309 int i;
2310 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2311 for (i = 0; i+2 < NCH(n); i += 4) {
2312 /* We must arrange things just right for STORE_SUBSCR.
2313 It wants the stack to look like (value) (dict) (key) */
2314 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002315 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002316 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002317 com_node(c, CHILD(n, i+2)); /* value */
2318 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002319 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002320 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002321 }
2322}
2323
2324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002326{
2327 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002328 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002329 int i;
2330 REQ(n, atom);
2331 ch = CHILD(n, 0);
2332 switch (TYPE(ch)) {
2333 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002336 com_push(c, 1);
2337 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002339 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002340 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002341 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002343 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002344 com_push(c, 1);
2345 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002347 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002348 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002349 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002352 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002353 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 break;
2355 case BACKQUOTE:
2356 com_node(c, CHILD(n, 1));
2357 com_addbyte(c, UNARY_CONVERT);
2358 break;
2359 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002360 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 i = 255;
2362 }
2363 else {
2364 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 }
2367 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002369 break;
2370 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002371 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002372 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 c->c_errors++;
2374 i = 255;
2375 }
2376 else {
2377 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 }
2380 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 break;
2383 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002384 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002385 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 break;
2387 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002388 com_error(c, PyExc_SystemError,
2389 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002390 }
2391}
2392
2393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002394com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002395{
2396 if (NCH(n) == 1) {
2397 com_addbyte(c, op);
2398 }
2399 else if (NCH(n) == 2) {
2400 if (TYPE(CHILD(n, 0)) != COLON) {
2401 com_node(c, CHILD(n, 0));
2402 com_addbyte(c, op+1);
2403 }
2404 else {
2405 com_node(c, CHILD(n, 1));
2406 com_addbyte(c, op+2);
2407 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002408 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002409 }
2410 else {
2411 com_node(c, CHILD(n, 0));
2412 com_node(c, CHILD(n, 2));
2413 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
2416}
2417
Guido van Rossum635abd21997-01-06 22:56:52 +00002418static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002419com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2420{
2421 if (NCH(n) == 1) {
2422 com_addbyte(c, DUP_TOP);
2423 com_push(c, 1);
2424 com_addbyte(c, SLICE);
2425 com_node(c, augn);
2426 com_addbyte(c, opcode);
2427 com_pop(c, 1);
2428 com_addbyte(c, ROT_TWO);
2429 com_addbyte(c, STORE_SLICE);
2430 com_pop(c, 2);
2431 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2432 com_node(c, CHILD(n, 0));
2433 com_addoparg(c, DUP_TOPX, 2);
2434 com_push(c, 2);
2435 com_addbyte(c, SLICE+1);
2436 com_pop(c, 1);
2437 com_node(c, augn);
2438 com_addbyte(c, opcode);
2439 com_pop(c, 1);
2440 com_addbyte(c, ROT_THREE);
2441 com_addbyte(c, STORE_SLICE+1);
2442 com_pop(c, 3);
2443 } else if (NCH(n) == 2) {
2444 com_node(c, CHILD(n, 1));
2445 com_addoparg(c, DUP_TOPX, 2);
2446 com_push(c, 2);
2447 com_addbyte(c, SLICE+2);
2448 com_pop(c, 1);
2449 com_node(c, augn);
2450 com_addbyte(c, opcode);
2451 com_pop(c, 1);
2452 com_addbyte(c, ROT_THREE);
2453 com_addbyte(c, STORE_SLICE+2);
2454 com_pop(c, 3);
2455 } else {
2456 com_node(c, CHILD(n, 0));
2457 com_node(c, CHILD(n, 2));
2458 com_addoparg(c, DUP_TOPX, 3);
2459 com_push(c, 3);
2460 com_addbyte(c, SLICE+3);
2461 com_pop(c, 2);
2462 com_node(c, augn);
2463 com_addbyte(c, opcode);
2464 com_pop(c, 1);
2465 com_addbyte(c, ROT_FOUR);
2466 com_addbyte(c, STORE_SLICE+3);
2467 com_pop(c, 4);
2468 }
2469}
2470
2471static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002472com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002473{
2474 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002475 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002476 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002477 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002478 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002479 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002480 }
2481 else {
2482 com_node(c, CHILD(n, 0));
2483 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002484 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002485 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002486 if (NCH(n) == 2) {
2487 com_generator_expression(c, n);
2488 return;
2489 }
2490
Guido van Rossumf10570b1995-07-07 22:53:21 +00002491 m = n;
2492 do {
2493 m = CHILD(m, 0);
2494 } while (NCH(m) == 1);
2495 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002496 /* f(lambda x: x[0] = 3) ends up getting parsed with
2497 * LHS test = lambda x: x[0], and RHS test = 3.
2498 * SF bug 132313 points out that complaining about a keyword
2499 * then is very confusing.
2500 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002501 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002502 TYPE(m) == lambdef ?
2503 "lambda cannot contain assignment" :
2504 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002505 }
2506 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002507 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002508 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002509 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002510 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002511 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002512 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002513 else if (*pkeywords == NULL) {
2514 c->c_errors++;
2515 Py_DECREF(v);
2516 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002517 if (PyDict_GetItem(*pkeywords, v) != NULL)
2518 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002519 "duplicate keyword argument");
2520 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002521 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002522 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002523 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002524 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002525 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002526 }
2527 }
2528 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002529}
2530
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002532com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002533{
2534 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002535 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002536 }
2537 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002538 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002539 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002540 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002541 int star_flag = 0;
2542 int starstar_flag = 0;
2543 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002544 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002545 na = 0;
2546 nk = 0;
2547 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002548 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002549 if (TYPE(ch) == STAR ||
2550 TYPE(ch) == DOUBLESTAR)
2551 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002552 if (ch->n_lineno != lineno) {
2553 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002554 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002555 }
2556 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002557 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002558 na++;
2559 else
2560 nk++;
2561 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002562 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002563 while (i < NCH(n)) {
2564 node *tok = CHILD(n, i);
2565 node *ch = CHILD(n, i+1);
2566 i += 3;
2567 switch (TYPE(tok)) {
2568 case STAR: star_flag = 1; break;
2569 case DOUBLESTAR: starstar_flag = 1; break;
2570 }
2571 com_node(c, ch);
2572 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002573 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002574 com_error(c, PyExc_SyntaxError,
2575 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002576 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002577 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002578 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002579 star_flag + (starstar_flag << 1);
2580 else
2581 opcode = CALL_FUNCTION;
2582 com_addoparg(c, opcode, na | (nk << 8));
2583 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 }
2585}
2586
2587static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002588com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002589{
2590 com_addopname(c, LOAD_ATTR, n);
2591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002595{
2596 int i=0;
2597 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002598 node *ch;
2599
2600 /* first argument */
2601 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002602 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002603 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002604 i++;
2605 }
2606 else {
2607 com_node(c, CHILD(n,i));
2608 i++;
2609 REQ(CHILD(n,i),COLON);
2610 i++;
2611 }
2612 /* second argument */
2613 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2614 com_node(c, CHILD(n,i));
2615 i++;
2616 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002617 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002618 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002619 com_push(c, 1);
2620 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002621 /* remaining arguments */
2622 for (; i < NCH(n); i++) {
2623 ns++;
2624 ch=CHILD(n,i);
2625 REQ(ch, sliceop);
2626 if (NCH(ch) == 1) {
2627 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002628 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002629 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002630 }
2631 else
2632 com_node(c, CHILD(ch,1));
2633 }
2634 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002636}
2637
2638static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002639com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002640{
2641 node *ch;
2642 REQ(n, subscript);
2643 ch = CHILD(n,0);
2644 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002645 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002646 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 com_push(c, 1);
2648 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002649 else {
2650 /* check for slice */
2651 if ((TYPE(ch) == COLON || NCH(n) > 1))
2652 com_sliceobj(c, n);
2653 else {
2654 REQ(ch, test);
2655 com_node(c, ch);
2656 }
2657 }
2658}
2659
2660static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002661com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002662{
2663 int i, op;
2664 REQ(n, subscriptlist);
2665 /* Check to make backward compatible slice behavior for '[i:j]' */
2666 if (NCH(n) == 1) {
2667 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002668 /* 'Basic' slice, should have exactly one colon. */
2669 if ((TYPE(CHILD(sub, 0)) == COLON
2670 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2671 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2672 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002673 switch (assigning) {
2674 case OP_DELETE:
2675 op = DELETE_SLICE;
2676 break;
2677 case OP_ASSIGN:
2678 op = STORE_SLICE;
2679 break;
2680 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002681 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002682 break;
2683 default:
2684 com_augassign_slice(c, sub, assigning, augn);
2685 return;
2686 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002687 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002688 if (op == STORE_SLICE)
2689 com_pop(c, 2);
2690 else if (op == DELETE_SLICE)
2691 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002692 return;
2693 }
2694 }
2695 /* Else normal subscriptlist. Compile each subscript. */
2696 for (i = 0; i < NCH(n); i += 2)
2697 com_subscript(c, CHILD(n, i));
2698 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002699 if (NCH(n) > 1) {
2700 i = (NCH(n)+1) / 2;
2701 com_addoparg(c, BUILD_TUPLE, i);
2702 com_pop(c, i-1);
2703 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002704 switch (assigning) {
2705 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 op = DELETE_SUBSCR;
2707 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002708 break;
2709 default:
2710 case OP_ASSIGN:
2711 op = STORE_SUBSCR;
2712 i = 3;
2713 break;
2714 case OP_APPLY:
2715 op = BINARY_SUBSCR;
2716 i = 1;
2717 break;
2718 }
2719 if (assigning > OP_APPLY) {
2720 com_addoparg(c, DUP_TOPX, 2);
2721 com_push(c, 2);
2722 com_addbyte(c, BINARY_SUBSCR);
2723 com_pop(c, 1);
2724 com_node(c, augn);
2725 com_addbyte(c, assigning);
2726 com_pop(c, 1);
2727 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002729 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002730 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002731}
2732
2733static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002734com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002735{
2736 REQ(n, trailer);
2737 switch (TYPE(CHILD(n, 0))) {
2738 case LPAR:
2739 com_call_function(c, CHILD(n, 1));
2740 break;
2741 case DOT:
2742 com_select_member(c, CHILD(n, 1));
2743 break;
2744 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002745 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 break;
2747 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002748 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002749 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 }
2751}
2752
2753static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002754com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002755{
2756 int i;
2757 REQ(n, power);
2758 com_atom(c, CHILD(n, 0));
2759 for (i = 1; i < NCH(n); i++) {
2760 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2761 com_factor(c, CHILD(n, i+1));
2762 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002763 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002764 break;
2765 }
2766 else
2767 com_apply_trailer(c, CHILD(n, i));
2768 }
2769}
2770
2771static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002772com_invert_constant(struct compiling *c, node *n)
2773{
2774 /* Compute the inverse of int and longs and use them directly,
2775 but be prepared to generate code for all other
2776 possibilities (invalid numbers, floats, complex).
2777 */
2778 PyObject *num, *inv = NULL;
2779 int i;
2780
2781 REQ(n, NUMBER);
2782 num = parsenumber(c, STR(n));
2783 if (num == NULL)
2784 i = 255;
2785 else {
2786 inv = PyNumber_Invert(num);
2787 if (inv == NULL) {
2788 PyErr_Clear();
2789 i = com_addconst(c, num);
2790 } else {
2791 i = com_addconst(c, inv);
2792 Py_DECREF(inv);
2793 }
2794 Py_DECREF(num);
2795 }
2796 com_addoparg(c, LOAD_CONST, i);
2797 com_push(c, 1);
2798 if (num != NULL && inv == NULL)
2799 com_addbyte(c, UNARY_INVERT);
2800}
2801
Tim Peters51e26512001-09-07 08:45:55 +00002802static int
2803is_float_zero(const char *p)
2804{
2805 int found_radix_point = 0;
2806 int ch;
2807 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2808 switch (ch) {
2809 case '0':
2810 /* no reason to believe it's not 0 -- continue */
2811 break;
2812
2813 case 'e': case 'E': case 'j': case 'J':
2814 /* If this was a hex constant, we already would have
2815 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2816 must be an exponent marker, and we haven't yet
2817 seen a non-zero digit, and it doesn't matter what
2818 the exponent is then. For 'j' or 'J' similarly,
2819 except that this is an imaginary 0 then. */
2820 return 1;
2821
2822 case '.':
2823 found_radix_point = 1;
2824 break;
2825
2826 default:
2827 return 0;
2828 }
2829 }
2830 return found_radix_point;
2831}
2832
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002834com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002835{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002836 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002837 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002838 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002839 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002840 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002841 approriate value as a constant. If the value is negative,
2842 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002843 negative in the 0th position -- unless we're doing unary minus
2844 of a floating zero! In that case the sign is significant, but
2845 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002846 */
2847 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002848 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002849 && TYPE((pfactor = CHILD(n, 1))) == factor
2850 && NCH(pfactor) == 1
2851 && TYPE((ppower = CHILD(pfactor, 0))) == power
2852 && NCH(ppower) == 1
2853 && TYPE((patom = CHILD(ppower, 0))) == atom
2854 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002855 && !(childtype == MINUS &&
2856 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002857 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002858 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002859 return;
2860 }
2861 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002862 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002863 if (s == NULL) {
2864 com_error(c, PyExc_MemoryError, "");
2865 com_addbyte(c, 255);
2866 return;
2867 }
2868 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002869 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002870 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002871 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002872 }
Tim Peters51e26512001-09-07 08:45:55 +00002873 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002874 }
2875 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002876 com_factor(c, CHILD(n, 1));
2877 com_addbyte(c, UNARY_POSITIVE);
2878 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002879 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002880 com_factor(c, CHILD(n, 1));
2881 com_addbyte(c, UNARY_NEGATIVE);
2882 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002883 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002884 com_factor(c, CHILD(n, 1));
2885 com_addbyte(c, UNARY_INVERT);
2886 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002887 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002888 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002889 }
2890}
2891
2892static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002893com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002894{
2895 int i;
2896 int op;
2897 REQ(n, term);
2898 com_factor(c, CHILD(n, 0));
2899 for (i = 2; i < NCH(n); i += 2) {
2900 com_factor(c, CHILD(n, i));
2901 switch (TYPE(CHILD(n, i-1))) {
2902 case STAR:
2903 op = BINARY_MULTIPLY;
2904 break;
2905 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002906 if (c->c_flags & CO_FUTURE_DIVISION)
2907 op = BINARY_TRUE_DIVIDE;
2908 else
2909 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002910 break;
2911 case PERCENT:
2912 op = BINARY_MODULO;
2913 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002914 case DOUBLESLASH:
2915 op = BINARY_FLOOR_DIVIDE;
2916 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002917 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002918 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002919 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002920 op = 255;
2921 }
2922 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002923 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002924 }
2925}
2926
2927static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002928com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002929{
2930 int i;
2931 int op;
2932 REQ(n, arith_expr);
2933 com_term(c, CHILD(n, 0));
2934 for (i = 2; i < NCH(n); i += 2) {
2935 com_term(c, CHILD(n, i));
2936 switch (TYPE(CHILD(n, i-1))) {
2937 case PLUS:
2938 op = BINARY_ADD;
2939 break;
2940 case MINUS:
2941 op = BINARY_SUBTRACT;
2942 break;
2943 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002944 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002945 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002946 op = 255;
2947 }
2948 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002949 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002950 }
2951}
2952
2953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002954com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002955{
2956 int i;
2957 int op;
2958 REQ(n, shift_expr);
2959 com_arith_expr(c, CHILD(n, 0));
2960 for (i = 2; i < NCH(n); i += 2) {
2961 com_arith_expr(c, CHILD(n, i));
2962 switch (TYPE(CHILD(n, i-1))) {
2963 case LEFTSHIFT:
2964 op = BINARY_LSHIFT;
2965 break;
2966 case RIGHTSHIFT:
2967 op = BINARY_RSHIFT;
2968 break;
2969 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002970 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002971 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002972 op = 255;
2973 }
2974 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002975 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002976 }
2977}
2978
2979static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002980com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002981{
2982 int i;
2983 int op;
2984 REQ(n, and_expr);
2985 com_shift_expr(c, CHILD(n, 0));
2986 for (i = 2; i < NCH(n); i += 2) {
2987 com_shift_expr(c, CHILD(n, i));
2988 if (TYPE(CHILD(n, i-1)) == AMPER) {
2989 op = BINARY_AND;
2990 }
2991 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002992 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002993 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002994 op = 255;
2995 }
2996 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002997 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002998 }
2999}
3000
3001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003003{
3004 int i;
3005 int op;
3006 REQ(n, xor_expr);
3007 com_and_expr(c, CHILD(n, 0));
3008 for (i = 2; i < NCH(n); i += 2) {
3009 com_and_expr(c, CHILD(n, i));
3010 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3011 op = BINARY_XOR;
3012 }
3013 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003014 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003015 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 op = 255;
3017 }
3018 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003019 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003020 }
3021}
3022
3023static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003024com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025{
3026 int i;
3027 int op;
3028 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003029 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003030 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003031 com_xor_expr(c, CHILD(n, i));
3032 if (TYPE(CHILD(n, i-1)) == VBAR) {
3033 op = BINARY_OR;
3034 }
3035 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003036 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003037 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003038 op = 255;
3039 }
3040 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003041 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 }
3043}
3044
3045static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003046cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047{
3048 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003049 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3051 if (NCH(n) == 1) {
3052 n = CHILD(n, 0);
3053 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003054 case LESS: return PyCmp_LT;
3055 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003056 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003057 case LESSEQUAL: return PyCmp_LE;
3058 case GREATEREQUAL: return PyCmp_GE;
3059 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3060 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3061 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 }
3063 }
3064 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003066 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003067 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003069 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 }
3071 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003072 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003073}
3074
3075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003076com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077{
3078 int i;
3079 enum cmp_op op;
3080 int anchor;
3081 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3082 com_expr(c, CHILD(n, 0));
3083 if (NCH(n) == 1)
3084 return;
3085
3086 /****************************************************************
3087 The following code is generated for all but the last
3088 comparison in a chain:
3089
3090 label: on stack: opcode: jump to:
3091
3092 a <code to load b>
3093 a, b DUP_TOP
3094 a, b, b ROT_THREE
3095 b, a, b COMPARE_OP
3096 b, 0-or-1 JUMP_IF_FALSE L1
3097 b, 1 POP_TOP
3098 b
3099
3100 We are now ready to repeat this sequence for the next
3101 comparison in the chain.
3102
3103 For the last we generate:
3104
3105 b <code to load c>
3106 b, c COMPARE_OP
3107 0-or-1
3108
3109 If there were any jumps to L1 (i.e., there was more than one
3110 comparison), we generate:
3111
3112 0-or-1 JUMP_FORWARD L2
3113 L1: b, 0 ROT_TWO
3114 0, b POP_TOP
3115 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003116 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117 ****************************************************************/
3118
3119 anchor = 0;
3120
3121 for (i = 2; i < NCH(n); i += 2) {
3122 com_expr(c, CHILD(n, i));
3123 if (i+2 < NCH(n)) {
3124 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003125 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 com_addbyte(c, ROT_THREE);
3127 }
3128 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003129 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003130 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003131 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 }
3133 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003134 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003135 if (i+2 < NCH(n)) {
3136 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3137 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003138 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 }
3140 }
3141
3142 if (anchor) {
3143 int anchor2 = 0;
3144 com_addfwref(c, JUMP_FORWARD, &anchor2);
3145 com_backpatch(c, anchor);
3146 com_addbyte(c, ROT_TWO);
3147 com_addbyte(c, POP_TOP);
3148 com_backpatch(c, anchor2);
3149 }
3150}
3151
3152static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003153com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154{
3155 REQ(n, not_test); /* 'not' not_test | comparison */
3156 if (NCH(n) == 1) {
3157 com_comparison(c, CHILD(n, 0));
3158 }
3159 else {
3160 com_not_test(c, CHILD(n, 1));
3161 com_addbyte(c, UNARY_NOT);
3162 }
3163}
3164
3165static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003166com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167{
3168 int i;
3169 int anchor;
3170 REQ(n, and_test); /* not_test ('and' not_test)* */
3171 anchor = 0;
3172 i = 0;
3173 for (;;) {
3174 com_not_test(c, CHILD(n, i));
3175 if ((i += 2) >= NCH(n))
3176 break;
3177 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3178 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003179 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 }
3181 if (anchor)
3182 com_backpatch(c, anchor);
3183}
3184
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003185static int
3186com_make_closure(struct compiling *c, PyCodeObject *co)
3187{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003188 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003189 if (free == 0)
3190 return 0;
3191 for (i = 0; i < free; ++i) {
3192 /* Bypass com_addop_varname because it will generate
3193 LOAD_DEREF but LOAD_CLOSURE is needed.
3194 */
3195 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3196 int arg, reftype;
3197
3198 /* Special case: If a class contains a method with a
3199 free variable that has the same name as a method,
3200 the name will be considered free *and* local in the
3201 class. It should be handled by the closure, as
3202 well as by the normal name loookup logic.
3203 */
3204 reftype = get_ref_type(c, PyString_AS_STRING(name));
3205 if (reftype == CELL)
3206 arg = com_lookup_arg(c->c_cellvars, name);
3207 else /* (reftype == FREE) */
3208 arg = com_lookup_arg(c->c_freevars, name);
3209 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003210 fprintf(stderr, "lookup %s in %s %d %d\n"
3211 "freevars of %s: %s\n",
3212 PyObject_REPR(name),
3213 c->c_name,
3214 reftype, arg,
3215 PyString_AS_STRING(co->co_name),
3216 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003217 Py_FatalError("com_make_closure()");
3218 }
3219 com_addoparg(c, LOAD_CLOSURE, arg);
3220
3221 }
3222 com_push(c, free);
3223 return 1;
3224}
3225
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003227com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003228{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003229 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003230 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003231 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003232 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003233 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003234 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3235 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003236 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003237 if (co == NULL) {
3238 c->c_errors++;
3239 return;
3240 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003241 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003242 i = com_addconst(c, (PyObject *)co);
3243 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003244 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003245 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003246 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003247 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003248 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003249 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003250 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003251 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003252 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003253 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003254 else {
3255 int anchor = 0;
3256 int i = 0;
3257 for (;;) {
3258 com_and_test(c, CHILD(n, i));
3259 if ((i += 2) >= NCH(n))
3260 break;
3261 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3262 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003263 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003264 }
3265 if (anchor)
3266 com_backpatch(c, anchor);
3267 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003268}
3269
3270static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003271com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003272{
3273 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003274 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003275 com_node(c, CHILD(n, 0));
3276 }
3277 else {
3278 int i;
3279 int len;
3280 len = (NCH(n) + 1) / 2;
3281 for (i = 0; i < NCH(n); i += 2)
3282 com_node(c, CHILD(n, i));
3283 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 }
3286}
3287
3288
3289/* Begin of assignment compilation */
3290
Thomas Wouters434d0822000-08-24 20:11:32 +00003291
3292static void
3293com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3294{
3295 com_addbyte(c, DUP_TOP);
3296 com_push(c, 1);
3297 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003298 com_node(c, augn);
3299 com_addbyte(c, opcode);
3300 com_pop(c, 1);
3301 com_addbyte(c, ROT_TWO);
3302 com_addopname(c, STORE_ATTR, n);
3303 com_pop(c, 2);
3304}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305
3306static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003307com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003308{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003309 if (none_assignment_check(c, STR(n), assigning))
3310 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003312 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003313}
3314
3315static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003316com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003318 REQ(n, trailer);
3319 switch (TYPE(CHILD(n, 0))) {
3320 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003321 if (assigning == OP_DELETE)
3322 com_error(c, PyExc_SyntaxError,
3323 "can't delete function call");
3324 else
3325 com_error(c, PyExc_SyntaxError,
3326 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003327 break;
3328 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003329 if (assigning > OP_APPLY)
3330 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3331 else
3332 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003334 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003335 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003336 break;
3337 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003338 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 }
3340}
3341
3342static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003343com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003344{
3345 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003346 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3347 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003349 if (assigning) {
3350 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003351 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003352 com_push(c, i-1);
3353 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003355 com_assign(c, CHILD(n, i), assigning, NULL);
3356}
3357
3358static void
3359com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3360{
3361 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003362 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003363 com_push(c, 1);
3364 com_node(c, augn);
3365 com_addbyte(c, opcode);
3366 com_pop(c, 1);
3367 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368}
3369
3370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003371com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003372{
3373 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003374 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003375 if (assigning)
3376 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003377}
3378
3379static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003380com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381{
3382 /* Loop to avoid trivial recursion */
3383 for (;;) {
3384 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003385
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003386 case exprlist:
3387 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003388 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003389 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003390 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003391 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003392 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003393 "assign to generator expression not possible");
3394 return;
3395 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003396 if (assigning > OP_APPLY) {
3397 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003398 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003399 return;
3400 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003401 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 return;
3403 }
3404 n = CHILD(n, 0);
3405 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003406
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003407 case test:
3408 case and_test:
3409 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003410 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003411 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003412 case xor_expr:
3413 case and_expr:
3414 case shift_expr:
3415 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003417 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003419 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003420 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003421 return;
3422 }
3423 n = CHILD(n, 0);
3424 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003425
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003426 case power: /* atom trailer* ('**' power)*
3427 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003428 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003429 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003430 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003431 return;
3432 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003433 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434 int i;
3435 com_node(c, CHILD(n, 0));
3436 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003437 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003438 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003439 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003440 return;
3441 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 com_apply_trailer(c, CHILD(n, i));
3443 } /* NB i is still alive */
3444 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003445 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 return;
3447 }
3448 n = CHILD(n, 0);
3449 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003450
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003451 case atom:
3452 switch (TYPE(CHILD(n, 0))) {
3453 case LPAR:
3454 n = CHILD(n, 1);
3455 if (TYPE(n) == RPAR) {
3456 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003457 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003458 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003459 return;
3460 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003461 if (assigning > OP_APPLY) {
3462 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003463 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003464 return;
3465 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 break;
3467 case LSQB:
3468 n = CHILD(n, 1);
3469 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003470 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003471 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 return;
3473 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003474 if (assigning > OP_APPLY) {
3475 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003476 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003477 return;
3478 }
3479 if (NCH(n) > 1
3480 && TYPE(CHILD(n, 1)) == list_for) {
3481 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003482 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003483 return;
3484 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003485 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003486 return;
3487 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003488 if (assigning > OP_APPLY)
3489 com_augassign_name(c, CHILD(n, 0),
3490 assigning, augn);
3491 else
3492 com_assign_name(c, CHILD(n, 0),
3493 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 return;
3495 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003496 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003497 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 return;
3499 }
3500 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003501
3502 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003503 com_error(c, PyExc_SyntaxError,
3504 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003505 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003506
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003507 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003508 com_error(c, PyExc_SystemError,
3509 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003511
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003512 }
3513 }
3514}
Guido van Rossum7c531111997-03-11 18:42:21 +00003515
Thomas Wouters434d0822000-08-24 20:11:32 +00003516static void
3517com_augassign(struct compiling *c, node *n)
3518{
3519 int opcode;
3520
3521 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3522 case '+': opcode = INPLACE_ADD; break;
3523 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003524 case '/':
3525 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3526 opcode = INPLACE_FLOOR_DIVIDE;
3527 else if (c->c_flags & CO_FUTURE_DIVISION)
3528 opcode = INPLACE_TRUE_DIVIDE;
3529 else
3530 opcode = INPLACE_DIVIDE;
3531 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003532 case '%': opcode = INPLACE_MODULO; break;
3533 case '<': opcode = INPLACE_LSHIFT; break;
3534 case '>': opcode = INPLACE_RSHIFT; break;
3535 case '&': opcode = INPLACE_AND; break;
3536 case '^': opcode = INPLACE_XOR; break;
3537 case '|': opcode = INPLACE_OR; break;
3538 case '*':
3539 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3540 opcode = INPLACE_POWER;
3541 else
3542 opcode = INPLACE_MULTIPLY;
3543 break;
3544 default:
3545 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3546 return;
3547 }
3548 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3549}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003550
3551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003552com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003553{
Thomas Wouters434d0822000-08-24 20:11:32 +00003554 REQ(n, expr_stmt);
3555 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003556 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003557 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003559 if (NCH(n) == 1) {
3560 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003561 if (c->c_interactive)
3562 com_addbyte(c, PRINT_EXPR);
3563 else
3564 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003566 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003567 else if (TYPE(CHILD(n,1)) == augassign)
3568 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003569 else {
3570 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003571 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003572 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003573 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003574 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003575 com_push(c, 1);
3576 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003577 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 }
3579 }
3580}
3581
3582static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003583com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003584{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003585 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003586 int i;
3587 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003588 if (Py_OptimizeFlag)
3589 return;
3590 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003591
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003592 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003593 raise AssertionError [, <message>]
3594
3595 where <message> is the second test, if present.
3596 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003597 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003598 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003599 com_addbyte(c, POP_TOP);
3600 com_pop(c, 1);
3601 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003602 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003603 com_push(c, 1);
3604 i = NCH(n)/2; /* Either 2 or 4 */
3605 if (i > 1)
3606 com_node(c, CHILD(n, 3));
3607 com_addoparg(c, RAISE_VARARGS, i);
3608 com_pop(c, i);
3609 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003610 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003611 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003612 com_addbyte(c, POP_TOP);
3613}
3614
3615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003616com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003617{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003618 int i = 1;
3619 node* stream = NULL;
3620
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003621 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003622
3623 /* are we using the extended print form? */
3624 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3625 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003626 com_node(c, stream);
3627 /* stack: [...] => [... stream] */
3628 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003629 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3630 i = 4;
3631 else
3632 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003633 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003634 for (; i < NCH(n); i += 2) {
3635 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003636 com_addbyte(c, DUP_TOP);
3637 /* stack: [stream] => [stream stream] */
3638 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003639 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003640 /* stack: [stream stream] => [stream stream obj] */
3641 com_addbyte(c, ROT_TWO);
3642 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003643 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003644 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003645 com_pop(c, 2);
3646 }
3647 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003648 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003649 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003650 com_addbyte(c, PRINT_ITEM);
3651 com_pop(c, 1);
3652 }
3653 }
3654 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003655 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003656 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003657 /* must pop the extra stream object off the stack */
3658 com_addbyte(c, POP_TOP);
3659 /* stack: [... stream] => [...] */
3660 com_pop(c, 1);
3661 }
3662 }
3663 else {
3664 if (stream != NULL) {
3665 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003666 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003667 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003668 com_pop(c, 1);
3669 }
3670 else
3671 com_addbyte(c, PRINT_NEWLINE);
3672 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003673}
3674
3675static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003676com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003677{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003678 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003679 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003680 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003681 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003682 if (c->c_flags & CO_GENERATOR) {
3683 if (NCH(n) > 1) {
3684 com_error(c, PyExc_SyntaxError,
3685 "'return' with argument inside generator");
3686 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003687 }
3688 if (NCH(n) < 2) {
3689 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003690 com_push(c, 1);
3691 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003692 else
3693 com_node(c, CHILD(n, 1));
3694 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003695 com_pop(c, 1);
3696}
3697
3698static void
3699com_yield_stmt(struct compiling *c, node *n)
3700{
Tim Peters95c80f82001-06-23 02:07:08 +00003701 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003702 REQ(n, yield_stmt); /* 'yield' testlist */
3703 if (!c->c_infunction) {
3704 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3705 }
Tim Peters95c80f82001-06-23 02:07:08 +00003706
3707 for (i = 0; i < c->c_nblocks; ++i) {
3708 if (c->c_block[i] == SETUP_FINALLY) {
3709 com_error(c, PyExc_SyntaxError,
3710 "'yield' not allowed in a 'try' block "
3711 "with a 'finally' clause");
3712 return;
3713 }
3714 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003715 com_node(c, CHILD(n, 1));
3716 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003717 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003718}
3719
3720static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003721com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003722{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003724 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3725 if (NCH(n) > 1) {
3726 com_node(c, CHILD(n, 1));
3727 if (NCH(n) > 3) {
3728 com_node(c, CHILD(n, 3));
3729 if (NCH(n) > 5)
3730 com_node(c, CHILD(n, 5));
3731 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003732 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 i = NCH(n)/2;
3734 com_addoparg(c, RAISE_VARARGS, i);
3735 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003736}
3737
3738static void
Thomas Wouters52152252000-08-17 22:55:00 +00003739com_from_import(struct compiling *c, node *n)
3740{
3741 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3742 com_push(c, 1);
3743 if (NCH(n) > 1) {
3744 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3745 com_error(c, PyExc_SyntaxError, "invalid syntax");
3746 return;
3747 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003748 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003749 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003750 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003751 com_pop(c, 1);
3752}
3753
3754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003755com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003756{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003757 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 int i;
3759 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003760 n = CHILD(n, 0);
3761 /* import_stmt: import_name | import_from */
3762 if (TYPE(n) == import_from) {
3763 /* 'from' dotted_name 'import' ('*' |
3764 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003765 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003766 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003767 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3768 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003769 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003770 else {
3771 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3772 TYPE(CHILD(n, 3)) != LPAR) {
3773 com_error(c, PyExc_SyntaxError,
3774 "trailing comma not allowed "
3775 "without surrounding parentheses");
3776 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003777 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003778 REQ(nn, import_as_names);
3779 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003780 for (i = 0; i < NCH(nn); i += 2) {
3781 PyObject *s = PyString_FromString(
3782 STR(CHILD(CHILD(nn, i), 0)));
3783 if (s == NULL) {
3784 Py_CLEAR(tup);
3785 break;
3786 } else
3787 PyTuple_SET_ITEM(tup, i / 2, s);
3788 }
3789 if (tup == NULL) {
3790 /* Assume that failue above was MemoryError */
3791 com_error(c, PyExc_MemoryError, "");
3792 return;
3793 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003794 }
3795 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003796 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003797 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003798 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003799 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003800 com_addbyte(c, IMPORT_STAR);
3801 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003802 for (i = 0; i < NCH(nn); i += 2)
3803 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003804 com_addbyte(c, POP_TOP);
3805 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003806 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003807 }
3808 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003809 /* 'import' dotted_as_names */
3810 nn = CHILD(n, 1);
3811 REQ(nn, dotted_as_names);
3812 for (i = 0; i < NCH(nn); i += 2) {
3813 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003814 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003815 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003816 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003817 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003818 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003819 int j;
3820 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003821 com_error(c, PyExc_SyntaxError,
3822 "invalid syntax");
3823 return;
3824 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003825 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3826 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003827 CHILD(CHILD(subn, 0),
3828 j));
3829 com_addop_varname(c, VAR_STORE,
3830 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003831 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003832 com_addop_varname(c, VAR_STORE,
3833 STR(CHILD(CHILD(subn, 0),
3834 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003835 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003836 }
3837 }
3838}
3839
3840static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003841com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003842{
3843 REQ(n, exec_stmt);
3844 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3845 com_node(c, CHILD(n, 1));
3846 if (NCH(n) >= 4)
3847 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003848 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003849 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003850 com_push(c, 1);
3851 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003852 if (NCH(n) >= 6)
3853 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003854 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003855 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003856 com_push(c, 1);
3857 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003858 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003859 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003860}
3861
Guido van Rossum7c531111997-03-11 18:42:21 +00003862static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003863is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003864{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003865 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003866 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003867 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003868
3869 /* Label to avoid tail recursion */
3870 next:
3871 switch (TYPE(n)) {
3872
3873 case suite:
3874 if (NCH(n) == 1) {
3875 n = CHILD(n, 0);
3876 goto next;
3877 }
3878 /* Fall through */
3879 case file_input:
3880 for (i = 0; i < NCH(n); i++) {
3881 node *ch = CHILD(n, i);
3882 if (TYPE(ch) == stmt) {
3883 n = ch;
3884 goto next;
3885 }
3886 }
3887 break;
3888
3889 case stmt:
3890 case simple_stmt:
3891 case small_stmt:
3892 n = CHILD(n, 0);
3893 goto next;
3894
3895 case expr_stmt:
3896 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003897 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003898 case test:
3899 case and_test:
3900 case not_test:
3901 case comparison:
3902 case expr:
3903 case xor_expr:
3904 case and_expr:
3905 case shift_expr:
3906 case arith_expr:
3907 case term:
3908 case factor:
3909 case power:
3910 case atom:
3911 if (NCH(n) == 1) {
3912 n = CHILD(n, 0);
3913 goto next;
3914 }
3915 break;
3916
3917 case NAME:
3918 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3919 return 1;
3920 break;
3921
3922 case NUMBER:
3923 v = parsenumber(c, STR(n));
3924 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003925 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003926 break;
3927 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003928 i = PyObject_IsTrue(v);
3929 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003930 return i == 0;
3931
3932 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003933 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003934 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003935 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003936 break;
3937 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003938 i = PyObject_IsTrue(v);
3939 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003940 return i == 0;
3941
3942 }
3943 return 0;
3944}
3945
Tim Peters08a898f2001-06-28 01:52:22 +00003946
3947/* Look under n for a return stmt with an expression.
3948 * This hack is used to find illegal returns under "if 0:" blocks in
3949 * functions already known to be generators (as determined by the symtable
3950 * pass).
3951 * Return the offending return node if found, else NULL.
3952 */
3953static node *
3954look_for_offending_return(node *n)
3955{
3956 int i;
3957
3958 for (i = 0; i < NCH(n); ++i) {
3959 node *kid = CHILD(n, i);
3960
3961 switch (TYPE(kid)) {
3962 case classdef:
3963 case funcdef:
3964 case lambdef:
3965 /* Stuff in nested functions & classes doesn't
3966 affect the code block we started in. */
3967 return NULL;
3968
3969 case return_stmt:
3970 if (NCH(kid) > 1)
3971 return kid;
3972 break;
3973
3974 default: {
3975 node *bad = look_for_offending_return(kid);
3976 if (bad != NULL)
3977 return bad;
3978 }
3979 }
3980 }
3981
3982 return NULL;
3983}
3984
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003986com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003987{
3988 int i;
3989 int anchor = 0;
3990 REQ(n, if_stmt);
3991 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3992 for (i = 0; i+3 < NCH(n); i+=4) {
3993 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003994 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003995 if (is_constant_false(c, ch)) {
3996 /* We're going to skip this block. However, if this
3997 is a generator, we have to check the dead code
3998 anyway to make sure there aren't any return stmts
3999 with expressions, in the same scope. */
4000 if (c->c_flags & CO_GENERATOR) {
4001 node *p = look_for_offending_return(n);
4002 if (p != NULL) {
4003 int savelineno = c->c_lineno;
4004 c->c_lineno = p->n_lineno;
4005 com_error(c, PyExc_SyntaxError,
4006 "'return' with argument "
4007 "inside generator");
4008 c->c_lineno = savelineno;
4009 }
4010 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004011 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004012 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004013 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004014 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004015 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004016 com_addfwref(c, JUMP_IF_FALSE, &a);
4017 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004018 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004019 com_node(c, CHILD(n, i+3));
4020 com_addfwref(c, JUMP_FORWARD, &anchor);
4021 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004023 com_addbyte(c, POP_TOP);
4024 }
4025 if (i+2 < NCH(n))
4026 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004027 if (anchor)
4028 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029}
4030
4031static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004032com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004033{
4034 int break_anchor = 0;
4035 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004036 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004037 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4038 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004039 block_push(c, SETUP_LOOP);
4040 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004041 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004042 com_node(c, CHILD(n, 1));
4043 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4044 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004045 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004046 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004047 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004048 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004049 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4050 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004052 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004053 com_addbyte(c, POP_TOP);
4054 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004055 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004056 if (NCH(n) > 4)
4057 com_node(c, CHILD(n, 6));
4058 com_backpatch(c, break_anchor);
4059}
4060
4061static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004062com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004063{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004064 int break_anchor = 0;
4065 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004066 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004067 REQ(n, for_stmt);
4068 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4069 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004070 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004071 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004072 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004073 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004074 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004075 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004076 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004077 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004078 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004080 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004081 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4082 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004084 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004086 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004087 if (NCH(n) > 8)
4088 com_node(c, CHILD(n, 8));
4089 com_backpatch(c, break_anchor);
4090}
4091
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004092/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004093
4094 SETUP_FINALLY L
4095 <code for S>
4096 POP_BLOCK
4097 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004098 L: <code for Sf>
4099 END_FINALLY
4100
4101 The special instructions use the block stack. Each block
4102 stack entry contains the instruction that created it (here
4103 SETUP_FINALLY), the level of the value stack at the time the
4104 block stack entry was created, and a label (here L).
4105
4106 SETUP_FINALLY:
4107 Pushes the current value stack level and the label
4108 onto the block stack.
4109 POP_BLOCK:
4110 Pops en entry from the block stack, and pops the value
4111 stack until its level is the same as indicated on the
4112 block stack. (The label is ignored.)
4113 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004114 Pops a variable number of entries from the *value* stack
4115 and re-raises the exception they specify. The number of
4116 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004117
4118 The block stack is unwound when an exception is raised:
4119 when a SETUP_FINALLY entry is found, the exception is pushed
4120 onto the value stack (and the exception condition is cleared),
4121 and the interpreter jumps to the label gotten from the block
4122 stack.
4123
4124 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004125 (The contents of the value stack is shown in [], with the top
4126 at the right; 'tb' is trace-back info, 'val' the exception's
4127 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004128
4129 Value stack Label Instruction Argument
4130 [] SETUP_EXCEPT L1
4131 [] <code for S>
4132 [] POP_BLOCK
4133 [] JUMP_FORWARD L0
4134
Guido van Rossum3f5da241990-12-20 15:06:42 +00004135 [tb, val, exc] L1: DUP )
4136 [tb, val, exc, exc] <evaluate E1> )
4137 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4138 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4139 [tb, val, exc, 1] POP )
4140 [tb, val, exc] POP
4141 [tb, val] <assign to V1> (or POP if no V1)
4142 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004143 [] <code for S1>
4144 JUMP_FORWARD L0
4145
Guido van Rossum3f5da241990-12-20 15:06:42 +00004146 [tb, val, exc, 0] L2: POP
4147 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004148 .............................etc.......................
4149
Guido van Rossum3f5da241990-12-20 15:06:42 +00004150 [tb, val, exc, 0] Ln+1: POP
4151 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004152
4153 [] L0: <next statement>
4154
4155 Of course, parts are not generated if Vi or Ei is not present.
4156*/
4157
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004159com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004160{
4161 int except_anchor = 0;
4162 int end_anchor = 0;
4163 int else_anchor = 0;
4164 int i;
4165 node *ch;
4166
4167 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4168 block_push(c, SETUP_EXCEPT);
4169 com_node(c, CHILD(n, 2));
4170 com_addbyte(c, POP_BLOCK);
4171 block_pop(c, SETUP_EXCEPT);
4172 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4173 com_backpatch(c, except_anchor);
4174 for (i = 3;
4175 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4176 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004177 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004178 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004179 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004180 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004181 break;
4182 }
4183 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004184 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004185 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004186 if (NCH(ch) > 1) {
4187 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004188 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004189 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004190 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004191 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004192 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4193 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004194 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004195 }
4196 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004197 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004198 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004199 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004200 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004201 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004202 com_pop(c, 1);
4203 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004204 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004205 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004206 com_node(c, CHILD(n, i+2));
4207 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4208 if (except_anchor) {
4209 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004210 /* We come in with [tb, val, exc, 0] on the
4211 stack; one pop and it's the same as
4212 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004213 com_addbyte(c, POP_TOP);
4214 }
4215 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004216 /* We actually come in here with [tb, val, exc] but the
4217 END_FINALLY will zap those and jump around.
4218 The c_stacklevel does not reflect them so we need not pop
4219 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004220 com_addbyte(c, END_FINALLY);
4221 com_backpatch(c, else_anchor);
4222 if (i < NCH(n))
4223 com_node(c, CHILD(n, i+2));
4224 com_backpatch(c, end_anchor);
4225}
4226
4227static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004228com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004229{
4230 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004231 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004232
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004233 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4234 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004235 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 com_addbyte(c, POP_BLOCK);
4237 block_pop(c, SETUP_FINALLY);
4238 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004239 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004240 /* While the generated code pushes only one item,
4241 the try-finally handling can enter here with
4242 up to three items. OK, here are the details:
4243 3 for an exception, 2 for RETURN, 1 for BREAK. */
4244 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004245 com_backpatch(c, finally_anchor);
4246 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004247 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004248 com_node(c, ch);
4249 com_addbyte(c, END_FINALLY);
4250 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004251 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004252}
4253
4254static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004255com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004256{
4257 REQ(n, try_stmt);
4258 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4259 | 'try' ':' suite 'finally' ':' suite */
4260 if (TYPE(CHILD(n, 3)) != except_clause)
4261 com_try_finally(c, n);
4262 else
4263 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004264}
4265
Guido van Rossum8b993a91997-01-17 21:04:03 +00004266static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004267get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004268{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004269 int i;
4270
Guido van Rossum8b993a91997-01-17 21:04:03 +00004271 /* Label to avoid tail recursion */
4272 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004273 switch (TYPE(n)) {
4274
4275 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004276 if (NCH(n) == 1) {
4277 n = CHILD(n, 0);
4278 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004279 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004280 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004281 case file_input:
4282 for (i = 0; i < NCH(n); i++) {
4283 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004284 if (TYPE(ch) == stmt) {
4285 n = ch;
4286 goto next;
4287 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004288 }
4289 break;
4290
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004291 case stmt:
4292 case simple_stmt:
4293 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004294 n = CHILD(n, 0);
4295 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004296
4297 case expr_stmt:
4298 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004299 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004300 case test:
4301 case and_test:
4302 case not_test:
4303 case comparison:
4304 case expr:
4305 case xor_expr:
4306 case and_expr:
4307 case shift_expr:
4308 case arith_expr:
4309 case term:
4310 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004311 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004312 if (NCH(n) == 1) {
4313 n = CHILD(n, 0);
4314 goto next;
4315 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004316 break;
4317
4318 case atom:
4319 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004320 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004321 break;
4322
4323 }
4324 return NULL;
4325}
4326
Guido van Rossum79f25d91997-04-29 20:08:16 +00004327static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004328get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004329{
Guido van Rossum541563e1999-01-28 15:08:09 +00004330 /* Don't generate doc-strings if run with -OO */
4331 if (Py_OptimizeFlag > 1)
4332 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004333 n = get_rawdocstring(n);
4334 if (n == NULL)
4335 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004336 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004337}
4338
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004339static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004340com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004341{
4342 REQ(n, suite);
4343 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4344 if (NCH(n) == 1) {
4345 com_node(c, CHILD(n, 0));
4346 }
4347 else {
4348 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004349 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004350 node *ch = CHILD(n, i);
4351 if (TYPE(ch) == stmt)
4352 com_node(c, ch);
4353 }
4354 }
4355}
4356
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004357/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004359com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004360{
4361 int i = c->c_nblocks;
4362 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4363 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4364 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004365 else if (i <= 0) {
4366 /* at the outer level */
4367 com_error(c, PyExc_SyntaxError,
4368 "'continue' not properly in loop");
4369 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004370 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004371 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004372 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004373 if (c->c_block[j] == SETUP_LOOP)
4374 break;
4375 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004376 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004377 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004378 for (; i > j; --i) {
4379 if (c->c_block[i] == SETUP_EXCEPT ||
4380 c->c_block[i] == SETUP_FINALLY) {
4381 com_addoparg(c, CONTINUE_LOOP,
4382 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004383 return;
4384 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004385 if (c->c_block[i] == END_FINALLY) {
4386 com_error(c, PyExc_SyntaxError,
4387 "'continue' not supported inside 'finally' clause");
4388 return;
4389 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004390 }
4391 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004392 com_error(c, PyExc_SyntaxError,
4393 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004394 }
4395 /* XXX Could allow it inside a 'finally' clause
4396 XXX if we could pop the exception still on the stack */
4397}
4398
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004399/* Return the number of default values in the argument list.
4400
4401 If a non-default argument follows a default argument, set an
4402 exception and return -1.
4403*/
4404
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004405static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004406com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004407{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004408 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004409 if (TYPE(n) == lambdef) {
4410 /* lambdef: 'lambda' [varargslist] ':' test */
4411 n = CHILD(n, 1);
4412 }
4413 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004414 REQ(n, funcdef);
4415 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4416 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004417 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4418 n = CHILD(n, 1);
4419 }
4420 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004421 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004422 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004423 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004424 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4425 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004426 ndefs = 0;
4427 for (i = 0; i < nch; i++) {
4428 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004429 if (TYPE(CHILD(n, i)) == STAR ||
4430 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004431 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004432 i++;
4433 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004434 t = RPAR; /* Anything except EQUAL or COMMA */
4435 else
4436 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004437 if (t == EQUAL) {
4438 i++;
4439 ndefs++;
4440 com_node(c, CHILD(n, i));
4441 i++;
4442 if (i >= nch)
4443 break;
4444 t = TYPE(CHILD(n, i));
4445 }
4446 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004447 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004448 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004449 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004450 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004451 return -1;
4452 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004453 }
4454 if (t != COMMA)
4455 break;
4456 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004457 return ndefs;
4458}
4459
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004460static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004461com_decorator_name(struct compiling *c, node *n)
4462{
4463 /* dotted_name: NAME ('.' NAME)* */
4464
4465 int i, nch;
4466 node *varname;
4467
4468 REQ(n, dotted_name);
4469 nch = NCH(n);
4470 assert(nch >= 1 && nch % 2 == 1);
4471
4472 varname = CHILD(n, 0);
4473 REQ(varname, NAME);
4474 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004475 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004476
4477 for (i = 1; i < nch; i += 2) {
4478 node *attrname;
4479
4480 REQ(CHILD(n, i), DOT);
4481
4482 attrname = CHILD(n, i + 1);
4483 REQ(attrname, NAME);
4484 com_addop_name(c, LOAD_ATTR, STR(attrname));
4485 }
4486}
4487
4488static void
4489com_decorator(struct compiling *c, node *n)
4490{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004491 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004492 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004493 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004494 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004495 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004496 com_decorator_name(c, CHILD(n, 1));
4497
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004498 if (nch > 3) {
4499 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004500 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004501 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004502 com_call_function(c, CHILD(n, 3));
4503 }
4504}
4505
4506static int
4507com_decorators(struct compiling *c, node *n)
4508{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004509 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004510
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004511 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004512 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004513 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004514
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004515 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004516 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004517 REQ(ch, decorator);
4518
4519 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004520 }
4521
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004522 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004523}
4524
4525static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004526com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004528 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004529 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004530
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004531 REQ(n, funcdef);
4532 /* -6 -5 -4 -3 -2 -1
4533 funcdef: [decorators] 'def' NAME parameters ':' suite */
4534
4535 if (NCH(n) == 6)
4536 ndecorators = com_decorators(c, CHILD(n, 0));
4537 else
4538 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004539
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004540 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004541 if (ndefs < 0)
4542 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004543 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004544 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004545 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004546 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004547 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004548 c->c_errors++;
4549 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004550 int closure = com_make_closure(c, (PyCodeObject *)co);
4551 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004552 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004553 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004554 if (closure)
4555 com_addoparg(c, MAKE_CLOSURE, ndefs);
4556 else
4557 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004558 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004559
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004560 while (ndecorators > 0) {
4561 com_addoparg(c, CALL_FUNCTION, 1);
4562 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004563 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004564 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004565
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004566 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004567 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004568 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004569 }
4570}
4571
4572static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004573com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004574{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004575 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004576 REQ(n, testlist);
4577 /* testlist: test (',' test)* [','] */
4578 for (i = 0; i < NCH(n); i += 2)
4579 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004580 i = (NCH(n)+1) / 2;
4581 com_addoparg(c, BUILD_TUPLE, i);
4582 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004583}
4584
4585static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004586com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004587{
Guido van Rossum25831651993-05-19 14:50:45 +00004588 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004589 PyObject *v;
4590 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004591 char *name;
4592
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004593 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004594 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004595 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004596 c->c_errors++;
4597 return;
4598 }
4599 /* Push the class name on the stack */
4600 i = com_addconst(c, v);
4601 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004602 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004603 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004604 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004605 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004606 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004607 com_push(c, 1);
4608 }
Guido van Rossum25831651993-05-19 14:50:45 +00004609 else
4610 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004611 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004612 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004613 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004614 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004615 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004616 c->c_errors++;
4617 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004618 int closure = com_make_closure(c, co);
4619 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004620 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004621 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004622 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004623 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004624 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004625 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004626 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004627 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004628 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004629 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004630 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004631 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004632 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004633 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004634}
4635
4636static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004637com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004638{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004639 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004640 if (c->c_errors)
4641 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004642 switch (TYPE(n)) {
4643
4644 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004645
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004646 case funcdef:
4647 com_funcdef(c, n);
4648 break;
4649 case classdef:
4650 com_classdef(c, n);
4651 break;
4652
4653 /* Trivial parse tree nodes */
4654
4655 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004656 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004657 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004658 n = CHILD(n, 0);
4659 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004660
4661 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004662 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004663 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004664 {
4665 int i;
4666 for (i = 0; i < NCH(n)-1; i += 2)
4667 com_node(c, CHILD(n, i));
4668 }
4669 break;
4670
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004671 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004672 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004673 n = CHILD(n, 0);
4674 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004675
4676 /* Statement nodes */
4677
4678 case expr_stmt:
4679 com_expr_stmt(c, n);
4680 break;
4681 case print_stmt:
4682 com_print_stmt(c, n);
4683 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004684 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004685 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004686 break;
4687 case pass_stmt:
4688 break;
4689 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004690 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004691 com_error(c, PyExc_SyntaxError,
4692 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004693 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004694 com_addbyte(c, BREAK_LOOP);
4695 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004696 case continue_stmt:
4697 com_continue_stmt(c, n);
4698 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004699 case return_stmt:
4700 com_return_stmt(c, n);
4701 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004702 case yield_stmt:
4703 com_yield_stmt(c, n);
4704 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004705 case raise_stmt:
4706 com_raise_stmt(c, n);
4707 break;
4708 case import_stmt:
4709 com_import_stmt(c, n);
4710 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004711 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004712 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004713 case exec_stmt:
4714 com_exec_stmt(c, n);
4715 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004716 case assert_stmt:
4717 com_assert_stmt(c, n);
4718 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004719 case if_stmt:
4720 com_if_stmt(c, n);
4721 break;
4722 case while_stmt:
4723 com_while_stmt(c, n);
4724 break;
4725 case for_stmt:
4726 com_for_stmt(c, n);
4727 break;
4728 case try_stmt:
4729 com_try_stmt(c, n);
4730 break;
4731 case suite:
4732 com_suite(c, n);
4733 break;
4734
4735 /* Expression nodes */
4736
4737 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004738 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004739 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004740 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 break;
4742 case test:
4743 com_test(c, n);
4744 break;
4745 case and_test:
4746 com_and_test(c, n);
4747 break;
4748 case not_test:
4749 com_not_test(c, n);
4750 break;
4751 case comparison:
4752 com_comparison(c, n);
4753 break;
4754 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004755 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004756 break;
4757 case expr:
4758 com_expr(c, n);
4759 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004760 case xor_expr:
4761 com_xor_expr(c, n);
4762 break;
4763 case and_expr:
4764 com_and_expr(c, n);
4765 break;
4766 case shift_expr:
4767 com_shift_expr(c, n);
4768 break;
4769 case arith_expr:
4770 com_arith_expr(c, n);
4771 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004772 case term:
4773 com_term(c, n);
4774 break;
4775 case factor:
4776 com_factor(c, n);
4777 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004778 case power:
4779 com_power(c, n);
4780 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004781 case atom:
4782 com_atom(c, n);
4783 break;
4784
4785 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004786 com_error(c, PyExc_SystemError,
4787 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004788 }
4789}
4790
Tim Petersdbd9ba62000-07-09 03:09:57 +00004791static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004792
4793static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004794com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004795{
4796 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4797 if (TYPE(CHILD(n, 0)) == LPAR)
4798 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004799 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004800 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004801 com_pop(c, 1);
4802 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004803}
4804
4805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004806com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004807{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004808 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004809 if (NCH(n) == 1) {
4810 com_fpdef(c, CHILD(n, 0));
4811 }
4812 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004813 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004814 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004815 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004816 for (i = 0; i < NCH(n); i += 2)
4817 com_fpdef(c, CHILD(n, i));
4818 }
4819}
4820
4821static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004822com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004823{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004824 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004825 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004826 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004827 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004828 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004829 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004830 nch = NCH(n);
4831 /* Enter all arguments in table of locals */
4832 for (i = 0, narg = 0; i < nch; i++) {
4833 node *ch = CHILD(n, i);
4834 node *fp;
4835 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004836 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004837 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4838 fp = CHILD(ch, 0);
4839 if (TYPE(fp) != NAME) {
4840 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4841 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004842 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004843 narg++;
4844 /* all name updates handled by symtable */
4845 if (++i >= nch)
4846 break;
4847 ch = CHILD(n, i);
4848 if (TYPE(ch) == EQUAL)
4849 i += 2;
4850 else
4851 REQ(ch, COMMA);
4852 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004853 if (complex) {
4854 /* Generate code for complex arguments only after
4855 having counted the simple arguments */
4856 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004857 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004858 node *ch = CHILD(n, i);
4859 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004860 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004861 break;
4862 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4863 fp = CHILD(ch, 0);
4864 if (TYPE(fp) != NAME) {
4865 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004866 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004867 com_fpdef(c, ch);
4868 }
4869 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004870 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004871 break;
4872 ch = CHILD(n, i);
4873 if (TYPE(ch) == EQUAL)
4874 i += 2;
4875 else
4876 REQ(ch, COMMA);
4877 }
4878 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004879}
4880
4881static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004882com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004883{
4884 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004885 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004886 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004887 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004888 if (doc != NULL) {
4889 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004890 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004891 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004892 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004893 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004894 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004895 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004896 for (i = 0; i < NCH(n); i++) {
4897 node *ch = CHILD(n, i);
4898 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4899 com_node(c, ch);
4900 }
4901}
4902
4903/* Top-level compile-node interface */
4904
4905static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004906compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004907{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004908 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004909 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004910 REQ(n, funcdef);
4911 /* -6 -5 -4 -3 -2 -1
4912 funcdef: [decorators] 'def' NAME parameters ':' suite */
4913 c->c_name = STR(RCHILD(n, -4));
4914 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004915 if (doc != NULL) {
4916 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004917 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004918 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004919 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004920 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004921 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004922 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004923 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004924 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004925 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004926 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004927 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004928 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004929 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4930 com_push(c, 1);
4931 com_addbyte(c, RETURN_VALUE);
4932 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004933}
4934
4935static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004936compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004937{
Guido van Rossum590baa41993-11-30 13:40:46 +00004938 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004939 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004940 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004941
4942 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004943 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004944 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004945 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004946 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004947 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004948 else
4949 ch = CHILD(n, 2);
4950 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004951 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004952 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004953}
4954
4955static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004956compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004957{
4958 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004959 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004960 REQ(n, classdef);
4961 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4962 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004963 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004964 /* Initialize local __module__ from global __name__ */
4965 com_addop_name(c, LOAD_GLOBAL, "__name__");
4966 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004967 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004968 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004969 if (doc != NULL) {
4970 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004971 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004972 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004973 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004974 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004975 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004976 }
4977 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004978 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004979 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004980 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004981 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004982 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004983 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004984 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004985}
4986
4987static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004988compile_generator_expression(struct compiling *c, node *n)
4989{
4990 /* testlist_gexp: test gen_for */
4991 /* argument: test gen_for */
4992 REQ(CHILD(n, 0), test);
4993 REQ(CHILD(n, 1), gen_for);
4994
4995 c->c_name = "<generator expression>";
4996 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4997
4998 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4999 com_push(c, 1);
5000 com_addbyte(c, RETURN_VALUE);
5001 com_pop(c, 1);
5002}
5003
5004static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005005compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005006{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005007 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005008
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005009 switch (TYPE(n)) {
5010
Guido van Rossum4c417781991-01-21 16:09:22 +00005011 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005012 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005013 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005014 n = CHILD(n, 0);
5015 if (TYPE(n) != NEWLINE)
5016 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005017 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005018 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5019 com_push(c, 1);
5020 com_addbyte(c, RETURN_VALUE);
5021 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005022 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005023 break;
5024
Guido van Rossum4c417781991-01-21 16:09:22 +00005025 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005026 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005027 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005028 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5029 com_push(c, 1);
5030 com_addbyte(c, RETURN_VALUE);
5031 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005032 break;
5033
Guido van Rossum590baa41993-11-30 13:40:46 +00005034 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005035 com_node(c, CHILD(n, 0));
5036 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005037 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005038 break;
5039
Guido van Rossum590baa41993-11-30 13:40:46 +00005040 case lambdef: /* anonymous function definition */
5041 compile_lambdef(c, n);
5042 break;
5043
Guido van Rossum4c417781991-01-21 16:09:22 +00005044 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005045 compile_funcdef(c, n);
5046 break;
5047
Guido van Rossum4c417781991-01-21 16:09:22 +00005048 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005049 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005050 break;
5051
Raymond Hettinger354433a2004-05-19 08:20:33 +00005052 case testlist_gexp: /* A generator expression */
5053 case argument: /* A generator expression */
5054 compile_generator_expression(c, n);
5055 break;
5056
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005057 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005058 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005059 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005060 }
5061}
5062
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005063static PyObject *
5064dict_keys_inorder(PyObject *dict, int offset)
5065{
5066 PyObject *tuple, *k, *v;
5067 int i, pos = 0, size = PyDict_Size(dict);
5068
5069 tuple = PyTuple_New(size);
5070 if (tuple == NULL)
5071 return NULL;
5072 while (PyDict_Next(dict, &pos, &k, &v)) {
5073 i = PyInt_AS_LONG(v);
5074 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005075 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005076 PyTuple_SET_ITEM(tuple, i - offset, k);
5077 }
5078 return tuple;
5079}
5080
Guido van Rossum79f25d91997-04-29 20:08:16 +00005081PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005082PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005083{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005084 return PyNode_CompileFlags(n, filename, NULL);
5085}
5086
5087PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005088PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005089{
5090 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005091}
5092
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005093struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005094PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005095{
5096 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005097 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005098
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005099 ff = PyNode_Future(n, filename);
5100 if (ff == NULL)
5101 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005102 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005103 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005104 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005105 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005106 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005107 return st;
5108}
5109
Guido van Rossum79f25d91997-04-29 20:08:16 +00005110static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005111icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005112{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005113 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005114}
5115
Guido van Rossum79f25d91997-04-29 20:08:16 +00005116static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005117jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005118 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005119{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005120 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005121 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005122 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005123 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005124 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5125 sc.c_encoding = "utf-8";
5126 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005127 sc.c_encoding = STR(n);
5128 n = CHILD(n, 0);
5129 } else {
5130 sc.c_encoding = NULL;
5131 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005132 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005133 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005134 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005135 /* c_symtable still points to parent's symbols */
5136 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005137 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005138 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005139 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005140 if (base->c_encoding != NULL) {
5141 assert(sc.c_encoding == NULL);
5142 sc.c_encoding = base->c_encoding;
5143 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005144 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005145 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005146 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005147 if (sc.c_future == NULL) {
5148 com_free(&sc);
5149 return NULL;
5150 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005151 if (flags) {
5152 int merged = sc.c_future->ff_features |
5153 flags->cf_flags;
5154 sc.c_future->ff_features = merged;
5155 flags->cf_flags = merged;
5156 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005157 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5158 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005159 com_free(&sc);
5160 return NULL;
5161 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005162 /* reset symbol table for second pass */
5163 sc.c_symtable->st_nscopes = 1;
5164 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 }
5166 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005167 if (symtable_load_symbols(&sc) < 0) {
5168 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005169 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005170 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005171 compile_node(&sc, n);
5172 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005173 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005174 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005175 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005176 names = PyList_AsTuple(sc.c_names);
5177 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005178 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5179 freevars = dict_keys_inorder(sc.c_freevars,
5180 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005181 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005182 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005183 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5184 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005185 if (!PyErr_Occurred())
5186 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005187 sc.c_nlocals,
5188 sc.c_maxstacklevel,
5189 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005190 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005191 consts,
5192 names,
5193 varnames,
5194 freevars,
5195 cellvars,
5196 filename,
5197 name,
5198 sc.c_firstlineno,
5199 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005200 Py_XDECREF(consts);
5201 Py_XDECREF(names);
5202 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 Py_XDECREF(freevars);
5204 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005205 Py_XDECREF(filename);
5206 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005207 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005208 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005209 else if (!PyErr_Occurred()) {
5210 /* This could happen if someone called PyErr_Clear() after an
5211 error was reported above. That's not supposed to happen,
5212 but I just plugged one case and I'm not sure there can't be
5213 others. In that case, raise SystemError so that at least
5214 it gets reported instead dumping core. */
5215 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5216 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005217 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005218 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005219 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005220 sc.c_symtable = NULL;
5221 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005222 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005223 return co;
5224}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005225
5226int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005227PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005228{
5229 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005230 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005231 int line = co->co_firstlineno;
5232 int addr = 0;
5233 while (--size >= 0) {
5234 addr += *p++;
5235 if (addr > addrq)
5236 break;
5237 line += *p++;
5238 }
5239 return line;
5240}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005241
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005242/* The test for LOCAL must come before the test for FREE in order to
5243 handle classes where name is both local and free. The local var is
5244 a method and the free var is a free var referenced within a method.
5245*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005246
5247static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005248get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005249{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005250 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005251 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005252
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005253 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5254 return CELL;
5255 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5256 return LOCAL;
5257 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5258 return FREE;
5259 v = PyDict_GetItemString(c->c_globals, name);
5260 if (v) {
5261 if (v == Py_None)
5262 return GLOBAL_EXPLICIT;
5263 else {
5264 return GLOBAL_IMPLICIT;
5265 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005266 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005267 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005268 "unknown scope for %.100s in %.100s(%s) "
5269 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5270 name, c->c_name,
5271 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5272 c->c_filename,
5273 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5274 PyObject_REPR(c->c_locals),
5275 PyObject_REPR(c->c_globals)
5276 );
5277
5278 Py_FatalError(buf);
5279 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005280}
5281
Guido van Rossum207fda62001-03-02 03:30:41 +00005282/* Helper functions to issue warnings */
5283
5284static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005285issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005286{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005287 if (PyErr_Occurred()) {
5288 /* This can happen because symtable_node continues
5289 processing even after raising a SyntaxError.
5290 Calling PyErr_WarnExplicit now would clobber the
5291 pending exception; instead we fail and let that
5292 exception propagate.
5293 */
5294 return -1;
5295 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005296 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5297 lineno, NULL, NULL) < 0) {
5298 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5299 PyErr_SetString(PyExc_SyntaxError, msg);
5300 PyErr_SyntaxLocation(filename, lineno);
5301 }
5302 return -1;
5303 }
5304 return 0;
5305}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005306
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005307static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005308symtable_warn(struct symtable *st, char *msg)
5309{
Guido van Rossum207fda62001-03-02 03:30:41 +00005310 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005311 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005312 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005313 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005314 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005315}
5316
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005317/* Helper function for setting lineno and filename */
5318
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005319static struct symtable *
5320symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005322 struct symtable *st;
5323
5324 st = symtable_init();
5325 if (st == NULL)
5326 return NULL;
5327 st->st_future = ff;
5328 st->st_filename = filename;
5329 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5330 if (st->st_errors > 0)
5331 goto fail;
5332 symtable_node(st, n);
5333 if (st->st_errors > 0)
5334 goto fail;
5335 return st;
5336 fail:
5337 if (!PyErr_Occurred()) {
5338 /* This could happen because after a syntax error is
5339 detected, the symbol-table-building continues for
5340 a while, and PyErr_Clear() might erroneously be
5341 called during that process. One such case has been
5342 fixed, but there might be more (now or later).
5343 */
5344 PyErr_SetString(PyExc_SystemError, "lost exception");
5345 }
5346 st->st_future = NULL;
5347 st->st_filename = NULL;
5348 PySymtable_Free(st);
5349 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005350}
5351
5352static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005353symtable_init_compiling_symbols(struct compiling *c)
5354{
5355 PyObject *varnames;
5356
5357 varnames = c->c_symtable->st_cur->ste_varnames;
5358 if (varnames == NULL) {
5359 varnames = PyList_New(0);
5360 if (varnames == NULL)
5361 return -1;
5362 c->c_symtable->st_cur->ste_varnames = varnames;
5363 Py_INCREF(varnames);
5364 } else
5365 Py_INCREF(varnames);
5366 c->c_varnames = varnames;
5367
5368 c->c_globals = PyDict_New();
5369 if (c->c_globals == NULL)
5370 return -1;
5371 c->c_freevars = PyDict_New();
5372 if (c->c_freevars == NULL)
5373 return -1;
5374 c->c_cellvars = PyDict_New();
5375 if (c->c_cellvars == NULL)
5376 return -1;
5377 return 0;
5378}
5379
5380struct symbol_info {
5381 int si_nlocals;
5382 int si_ncells;
5383 int si_nfrees;
5384 int si_nimplicit;
5385};
5386
5387static void
5388symtable_init_info(struct symbol_info *si)
5389{
5390 si->si_nlocals = 0;
5391 si->si_ncells = 0;
5392 si->si_nfrees = 0;
5393 si->si_nimplicit = 0;
5394}
5395
5396static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005397symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005398 struct symbol_info *si)
5399{
5400 PyObject *dict, *v;
5401
5402 /* Seperate logic for DEF_FREE. If it occurs in a function,
5403 it indicates a local that we must allocate storage for (a
5404 cell var). If it occurs in a class, then the class has a
5405 method and a free variable with the same name.
5406 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005407 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005408 /* If it isn't declared locally, it can't be a cell. */
5409 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5410 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005411 v = PyInt_FromLong(si->si_ncells++);
5412 dict = c->c_cellvars;
5413 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005414 /* If it is free anyway, then there is no need to do
5415 anything here.
5416 */
5417 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005418 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005419 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005420 v = PyInt_FromLong(si->si_nfrees++);
5421 dict = c->c_freevars;
5422 }
5423 if (v == NULL)
5424 return -1;
5425 if (PyDict_SetItem(dict, name, v) < 0) {
5426 Py_DECREF(v);
5427 return -1;
5428 }
5429 Py_DECREF(v);
5430 return 0;
5431}
5432
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005433/* If a variable is a cell and an argument, make sure that appears in
5434 co_cellvars before any variable to its right in varnames.
5435*/
5436
5437
5438static int
5439symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5440 PyObject *varnames, int flags)
5441{
Tim Petersb39903b2003-03-24 17:22:24 +00005442 PyObject *v = NULL;
5443 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005444 int i, pos;
5445
5446 if (flags & CO_VARARGS)
5447 argcount++;
5448 if (flags & CO_VARKEYWORDS)
5449 argcount++;
5450 for (i = argcount; --i >= 0; ) {
5451 v = PyList_GET_ITEM(varnames, i);
5452 if (PyDict_GetItem(*cellvars, v)) {
5453 if (list == NULL) {
5454 list = PyList_New(1);
5455 if (list == NULL)
5456 return -1;
5457 PyList_SET_ITEM(list, 0, v);
5458 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005459 } else {
5460 if (PyList_Insert(list, 0, v) < 0) {
5461 Py_DECREF(list);
5462 return -1;
5463 }
5464 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005465 }
5466 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005467 if (list == NULL)
5468 return 0;
5469
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005470 /* There are cellvars that are also arguments. Create a dict
5471 to replace cellvars and put the args at the front.
5472 */
5473 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005474 if (d == NULL)
5475 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005476 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5477 v = PyInt_FromLong(i);
5478 if (v == NULL)
5479 goto fail;
5480 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5481 goto fail;
5482 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5483 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005484 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005485 }
5486 pos = 0;
5487 i = PyList_GET_SIZE(list);
5488 Py_DECREF(list);
5489 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5490 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005491 if (w == NULL)
5492 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005493 if (PyDict_SetItem(d, v, w) < 0) {
5494 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005495 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005496 goto fail;
5497 }
5498 Py_DECREF(w);
5499 }
5500 Py_DECREF(*cellvars);
5501 *cellvars = d;
5502 return 1;
5503 fail:
5504 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005505 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005506 return -1;
5507}
5508
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005509static int
5510symtable_freevar_offsets(PyObject *freevars, int offset)
5511{
5512 PyObject *name, *v;
5513 int pos;
5514
5515 /* The cell vars are the first elements of the closure,
5516 followed by the free vars. Update the offsets in
5517 c_freevars to account for number of cellvars. */
5518 pos = 0;
5519 while (PyDict_Next(freevars, &pos, &name, &v)) {
5520 int i = PyInt_AS_LONG(v) + offset;
5521 PyObject *o = PyInt_FromLong(i);
5522 if (o == NULL)
5523 return -1;
5524 if (PyDict_SetItem(freevars, name, o) < 0) {
5525 Py_DECREF(o);
5526 return -1;
5527 }
5528 Py_DECREF(o);
5529 }
5530 return 0;
5531}
5532
5533static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005534symtable_check_unoptimized(struct compiling *c,
5535 PySymtableEntryObject *ste,
5536 struct symbol_info *si)
5537{
5538 char buf[300];
5539
5540 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5541 || (ste->ste_nested && si->si_nimplicit)))
5542 return 0;
5543
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005544#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5545
5546#define ILLEGAL_IS "is a nested function"
5547
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005548#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005549"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005550
5551#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005552"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005553
5554#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005555"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005556"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005557
5558 /* XXX perhaps the linenos for these opt-breaking statements
5559 should be stored so the exception can point to them. */
5560
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005561 if (ste->ste_child_free) {
5562 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005563 PyOS_snprintf(buf, sizeof(buf),
5564 ILLEGAL_IMPORT_STAR,
5565 PyString_AS_STRING(ste->ste_name),
5566 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005567 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005568 PyOS_snprintf(buf, sizeof(buf),
5569 ILLEGAL_BARE_EXEC,
5570 PyString_AS_STRING(ste->ste_name),
5571 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005572 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005573 PyOS_snprintf(buf, sizeof(buf),
5574 ILLEGAL_EXEC_AND_IMPORT_STAR,
5575 PyString_AS_STRING(ste->ste_name),
5576 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005577 }
5578 } else {
5579 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005580 PyOS_snprintf(buf, sizeof(buf),
5581 ILLEGAL_IMPORT_STAR,
5582 PyString_AS_STRING(ste->ste_name),
5583 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005584 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005585 PyOS_snprintf(buf, sizeof(buf),
5586 ILLEGAL_BARE_EXEC,
5587 PyString_AS_STRING(ste->ste_name),
5588 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005589 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005590 PyOS_snprintf(buf, sizeof(buf),
5591 ILLEGAL_EXEC_AND_IMPORT_STAR,
5592 PyString_AS_STRING(ste->ste_name),
5593 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005594 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005595 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005596
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005597 PyErr_SetString(PyExc_SyntaxError, buf);
5598 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5599 ste->ste_opt_lineno);
5600 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005601}
5602
5603static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005604symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5605 struct symbol_info *si)
5606{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005607 if (c->c_future)
5608 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005609 if (ste->ste_generator)
5610 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005611 if (ste->ste_type != TYPE_MODULE)
5612 c->c_flags |= CO_NEWLOCALS;
5613 if (ste->ste_type == TYPE_FUNCTION) {
5614 c->c_nlocals = si->si_nlocals;
5615 if (ste->ste_optimized == 0)
5616 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005617 else if (ste->ste_optimized != OPT_EXEC)
5618 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005619 }
5620 return 0;
5621}
5622
5623static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005624symtable_error(struct symtable *st, int lineno)
5625{
5626 if (lineno == 0)
5627 lineno = st->st_cur->ste_lineno;
5628 PyErr_SyntaxLocation(st->st_filename, lineno);
5629 st->st_errors++;
5630 return -1;
5631}
5632
5633static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005634symtable_load_symbols(struct compiling *c)
5635{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005636 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005637 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005638 PyObject *name, *varnames, *v;
5639 int i, flags, pos;
5640 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005641
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005642 v = NULL;
5643
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005644 if (symtable_init_compiling_symbols(c) < 0)
5645 goto fail;
5646 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005647 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005648 si.si_nlocals = PyList_GET_SIZE(varnames);
5649 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005650
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005651 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005652 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005653 if (v == NULL)
5654 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005655 if (PyDict_SetItem(c->c_locals,
5656 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005657 goto fail;
5658 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005659 }
5660
5661 /* XXX The cases below define the rules for whether a name is
5662 local or global. The logic could probably be clearer. */
5663 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005664 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5665 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005667 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005668 /* undo the original DEF_FREE */
5669 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005670
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005671 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005672 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005673 2. Free variables in methods that are also class
5674 variables or declared global.
5675 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005676 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005677 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005680 c->c_argcount--;
5681 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005682 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005683 c->c_argcount--;
5684 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005685 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005687 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005688 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005689 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005690 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005691 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005692 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005694 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5695 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005696 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005697 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005698 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005699 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005700 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005701 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702 if (v == NULL)
5703 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005704 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005705 goto fail;
5706 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005707 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005709 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005710 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005711 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005712 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005713 if (v == NULL)
5714 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005715 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716 goto fail;
5717 Py_DECREF(v);
5718 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005719 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005720 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005721 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005722 goto fail;
5723 if (st->st_nscopes != 1) {
5724 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005725 if (v == NULL)
5726 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005727 if (PyDict_SetItem(st->st_global,
5728 name, v))
5729 goto fail;
5730 Py_DECREF(v);
5731 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733 }
5734 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005735 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5736
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005737 if (si.si_ncells > 1) { /* one cell is always in order */
5738 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5739 c->c_varnames, c->c_flags) < 0)
5740 return -1;
5741 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005742 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5743 return -1;
5744 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005745 fail:
5746 /* is this always the right thing to do? */
5747 Py_XDECREF(v);
5748 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005749}
5750
5751static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005752symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005753{
5754 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005756 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005757 if (st == NULL)
5758 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005759 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005760
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005761 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005762 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005763 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005764 goto fail;
5765 if ((st->st_symbols = PyDict_New()) == NULL)
5766 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005768 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 st->st_private = NULL;
5771 return st;
5772 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005773 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005774 return NULL;
5775}
5776
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005777void
5778PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005779{
5780 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005781 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005782 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005783 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005784}
5785
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005786/* When the compiler exits a scope, it must should update the scope's
5787 free variable information with the list of free variables in its
5788 children.
5789
5790 Variables that are free in children and defined in the current
5791 scope are cellvars.
5792
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005793 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005794 false), free variables in children that are not defined here are
5795 implicit globals.
5796
5797*/
5798
5799static int
5800symtable_update_free_vars(struct symtable *st)
5801{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005802 int i, j, def;
5803 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005804 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005805
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005806 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005807 def = DEF_FREE_CLASS;
5808 else
5809 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005810 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005811 int pos = 0;
5812
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005813 if (list && PyList_SetSlice(list, 0,
5814 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005815 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005816 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005817 PyList_GET_ITEM(ste->ste_children, i);
5818 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005819 int flags = PyInt_AS_LONG(o);
5820 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005821 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005822 if (list == NULL) {
5823 list = PyList_New(0);
5824 if (list == NULL)
5825 return -1;
5826 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005827 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005828 if (PyList_Append(list, name) < 0) {
5829 Py_DECREF(list);
5830 return -1;
5831 }
5832 }
5833 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005834 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005835 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005836 v = PyDict_GetItem(ste->ste_symbols, name);
5837 /* If a name N is declared global in scope A and
5838 referenced in scope B contained (perhaps
5839 indirectly) in A and there are no scopes
5840 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005841 is global in B. Unless A is a class scope,
5842 because class scopes are not considered for
5843 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005844 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005845 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005846 int flags = PyInt_AS_LONG(v);
5847 if (flags & DEF_GLOBAL) {
5848 symtable_undo_free(st, child->ste_id,
5849 name);
5850 continue;
5851 }
5852 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005853 if (ste->ste_nested) {
5854 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005855 name, def) < 0) {
5856 Py_DECREF(list);
5857 return -1;
5858 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005859 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005860 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005861 name) < 0) {
5862 Py_DECREF(list);
5863 return -1;
5864 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005865 }
5866 }
5867 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005868
5869 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005870 return 0;
5871}
5872
5873/* If the current scope is a non-nested class or if name is not
5874 defined in the current, non-nested scope, then it is an implicit
5875 global in all nested scopes.
5876*/
5877
5878static int
5879symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5880{
5881 PyObject *o;
5882 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005883 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005884
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005885 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005886 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005887 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005888 if (o == NULL)
5889 return symtable_undo_free(st, child, name);
5890 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005891
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005892 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005893 return symtable_undo_free(st, child, name);
5894 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005895 return symtable_add_def_o(st, ste->ste_symbols,
5896 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005897}
5898
5899static int
5900symtable_undo_free(struct symtable *st, PyObject *id,
5901 PyObject *name)
5902{
5903 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005904 PyObject *info;
5905 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005906
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005907 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5908 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005909 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005910
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005911 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005912 if (info == NULL)
5913 return 0;
5914 v = PyInt_AS_LONG(info);
5915 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005916 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005917 DEF_FREE_GLOBAL) < 0)
5918 return -1;
5919 } else
5920 /* If the name is defined here or declared global,
5921 then the recursion stops. */
5922 return 0;
5923
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005924 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5925 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005926 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005927 PyList_GET_ITEM(ste->ste_children, i);
5928 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005929 if (x < 0)
5930 return x;
5931 }
5932 return 0;
5933}
5934
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005935/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5936 This reference is released when the scope is exited, via the DECREF
5937 in symtable_exit_scope().
5938*/
5939
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005940static int
5941symtable_exit_scope(struct symtable *st)
5942{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005943 int end;
5944
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005945 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005946 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005947 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005948 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005949 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5950 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005951 if (PySequence_DelItem(st->st_stack, end) < 0)
5952 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005953 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005954}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005955
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005956static void
5957symtable_enter_scope(struct symtable *st, char *name, int type,
5958 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005959{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005960 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005961
5962 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005963 prev = st->st_cur;
5964 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005965 st->st_errors++;
5966 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005967 }
5968 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005969 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005970 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005971 if (st->st_cur == NULL) {
5972 st->st_errors++;
5973 return;
5974 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005975 if (strcmp(name, TOP) == 0)
5976 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005977 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005978 if (PyList_Append(prev->ste_children,
5979 (PyObject *)st->st_cur) < 0)
5980 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005981 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005982}
5983
5984static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005985symtable_lookup(struct symtable *st, char *name)
5986{
5987 char buffer[MANGLE_LEN];
5988 PyObject *v;
5989 int flags;
5990
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005991 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005992 name = buffer;
5993 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5994 if (v == NULL) {
5995 if (PyErr_Occurred())
5996 return -1;
5997 else
5998 return 0;
5999 }
6000
6001 flags = PyInt_AS_LONG(v);
6002 return flags;
6003}
6004
6005static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006006symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006007{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006008 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006009 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006010 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011
Guido van Rossumb7164622002-08-16 02:48:11 +00006012 /* Warn about None, except inside a tuple (where the assignment
6013 code already issues a warning). */
6014 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6015 *name == 'N' && strcmp(name, "None") == 0)
6016 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006017 PyErr_SetString(PyExc_SyntaxError,
6018 "Invalid syntax. Assignment to None.");
6019 symtable_error(st, 0);
6020 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006021 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006022 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023 name = buffer;
6024 if ((s = PyString_InternFromString(name)) == NULL)
6025 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006026 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6027 Py_DECREF(s);
6028 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006029}
6030
6031/* Must only be called with mangled names */
6032
6033static int
6034symtable_add_def_o(struct symtable *st, PyObject *dict,
6035 PyObject *name, int flag)
6036{
6037 PyObject *o;
6038 int val;
6039
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006040 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006041 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006042 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006043 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006044 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006045 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006046 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006047 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006048 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006049 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006051 if (o == NULL)
6052 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006053 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 Py_DECREF(o);
6055 return -1;
6056 }
6057 Py_DECREF(o);
6058
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006059 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006060 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006061 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006062 } else if (flag & DEF_GLOBAL) {
6063 /* XXX need to update DEF_GLOBAL for other flags too;
6064 perhaps only DEF_FREE_GLOBAL */
6065 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006067 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006068 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006069 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006070 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006071 if (o == NULL)
6072 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006073 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006074 Py_DECREF(o);
6075 return -1;
6076 }
6077 Py_DECREF(o);
6078 }
6079 return 0;
6080}
6081
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006082#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006083
Tim Peters08a898f2001-06-28 01:52:22 +00006084/* Look for a yield stmt under n. Return 1 if found, else 0.
6085 This hack is used to look inside "if 0:" blocks (which are normally
6086 ignored) in case those are the only places a yield occurs (so that this
6087 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006088static int
6089look_for_yield(node *n)
6090{
6091 int i;
6092
6093 for (i = 0; i < NCH(n); ++i) {
6094 node *kid = CHILD(n, i);
6095
6096 switch (TYPE(kid)) {
6097
6098 case classdef:
6099 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006100 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006101 /* Stuff in nested functions and classes can't make
6102 the parent a generator. */
6103 return 0;
6104
6105 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006106 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006107
6108 default:
6109 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006110 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006111 }
6112 }
6113 return 0;
6114}
6115
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006116static void
6117symtable_node(struct symtable *st, node *n)
6118{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006119 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006120
6121 loop:
6122 switch (TYPE(n)) {
6123 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006124 char *func_name;
6125 if (NCH(n) == 6)
6126 symtable_node(st, CHILD(n, 0));
6127 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006129 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006130 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006131 symtable_funcdef(st, n);
6132 symtable_exit_scope(st);
6133 break;
6134 }
6135 case lambdef:
6136 if (NCH(n) == 4)
6137 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006138 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006139 symtable_funcdef(st, n);
6140 symtable_exit_scope(st);
6141 break;
6142 case classdef: {
6143 char *tmp, *class_name = STR(CHILD(n, 1));
6144 symtable_add_def(st, class_name, DEF_LOCAL);
6145 if (TYPE(CHILD(n, 2)) == LPAR) {
6146 node *bases = CHILD(n, 3);
6147 int i;
6148 for (i = 0; i < NCH(bases); i += 2) {
6149 symtable_node(st, CHILD(bases, i));
6150 }
6151 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006152 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006153 tmp = st->st_private;
6154 st->st_private = class_name;
6155 symtable_node(st, CHILD(n, NCH(n) - 1));
6156 st->st_private = tmp;
6157 symtable_exit_scope(st);
6158 break;
6159 }
6160 case if_stmt:
6161 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006162 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6163 if (st->st_cur->ste_generator == 0)
6164 st->st_cur->ste_generator =
6165 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006166 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006167 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006168 symtable_node(st, CHILD(n, i + 1));
6169 symtable_node(st, CHILD(n, i + 3));
6170 }
6171 if (i + 2 < NCH(n))
6172 symtable_node(st, CHILD(n, i + 2));
6173 break;
6174 case global_stmt:
6175 symtable_global(st, n);
6176 break;
6177 case import_stmt:
6178 symtable_import(st, n);
6179 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006180 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006181 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006182 symtable_node(st, CHILD(n, 1));
6183 if (NCH(n) > 2)
6184 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006185 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006186 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006187 st->st_cur->ste_opt_lineno = n->n_lineno;
6188 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006189 if (NCH(n) > 4)
6190 symtable_node(st, CHILD(n, 5));
6191 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006192
6193 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006194 case assert_stmt:
6195 if (Py_OptimizeFlag)
6196 return;
6197 if (NCH(n) == 2) {
6198 n = CHILD(n, 1);
6199 goto loop;
6200 } else {
6201 symtable_node(st, CHILD(n, 1));
6202 n = CHILD(n, 3);
6203 goto loop;
6204 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006205 case except_clause:
6206 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006207 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006208 if (NCH(n) > 1) {
6209 n = CHILD(n, 1);
6210 goto loop;
6211 }
6212 break;
6213 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006214 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006215 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006216 case yield_stmt:
6217 st->st_cur->ste_generator = 1;
6218 n = CHILD(n, 1);
6219 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006220 case expr_stmt:
6221 if (NCH(n) == 1)
6222 n = CHILD(n, 0);
6223 else {
6224 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006225 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006226 symtable_node(st, CHILD(n, 2));
6227 break;
6228 } else {
6229 int i;
6230 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006231 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 n = CHILD(n, NCH(n) - 1);
6233 }
6234 }
6235 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006236 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006237 /* only occurs when there are multiple for loops
6238 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006239 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006240 if (TYPE(n) == list_for)
6241 symtable_list_for(st, n);
6242 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006243 REQ(n, list_if);
6244 symtable_node(st, CHILD(n, 1));
6245 if (NCH(n) == 3) {
6246 n = CHILD(n, 2);
6247 goto loop;
6248 }
6249 }
6250 break;
6251 case for_stmt:
6252 symtable_assign(st, CHILD(n, 1), 0);
6253 for (i = 3; i < NCH(n); ++i)
6254 if (TYPE(CHILD(n, i)) >= single_input)
6255 symtable_node(st, CHILD(n, i));
6256 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006257 case arglist:
6258 if (NCH(n) > 1)
6259 for (i = 0; i < NCH(n); ++i) {
6260 node *ch = CHILD(n, i);
6261 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6262 TYPE(CHILD(ch, 1)) == gen_for) {
6263 PyErr_SetString(PyExc_SyntaxError,
6264 "invalid syntax");
6265 symtable_error(st, n->n_lineno);
6266 return;
6267 }
6268 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006269 /* The remaining cases fall through to default except in
6270 special circumstances. This requires the individual cases
6271 to be coded with great care, even though they look like
6272 rather innocuous. Each case must double-check TYPE(n).
6273 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006274 case decorator:
6275 if (TYPE(n) == decorator) {
6276 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6277 node *name, *varname;
6278 name = CHILD(n, 1);
6279 REQ(name, dotted_name);
6280 varname = CHILD(name, 0);
6281 REQ(varname, NAME);
6282 symtable_add_use(st, STR(varname));
6283 }
6284 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006285 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006286 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006287 n = CHILD(n, 2);
6288 goto loop;
6289 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006290 else if (TYPE(n) == argument && NCH(n) == 2 &&
6291 TYPE(CHILD(n, 1)) == gen_for) {
6292 symtable_generator_expression(st, n);
6293 break;
6294 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006295 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006296 case listmaker:
6297 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006298 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006299 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006300 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006301 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006302 case testlist_gexp:
6303 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6304 symtable_generator_expression(st, n);
6305 break;
6306 }
6307 /* fall through */
6308
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006309 case atom:
6310 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6311 symtable_add_use(st, STR(CHILD(n, 0)));
6312 break;
6313 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006314 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006315 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006316 /* Walk over every non-token child with a special case
6317 for one child.
6318 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006319 if (NCH(n) == 1) {
6320 n = CHILD(n, 0);
6321 goto loop;
6322 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006323 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006324 if (TYPE(CHILD(n, i)) >= single_input)
6325 symtable_node(st, CHILD(n, i));
6326 }
6327}
6328
6329static void
6330symtable_funcdef(struct symtable *st, node *n)
6331{
6332 node *body;
6333
6334 if (TYPE(n) == lambdef) {
6335 if (NCH(n) == 4)
6336 symtable_params(st, CHILD(n, 1));
6337 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006338 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006339 body = CHILD(n, NCH(n) - 1);
6340 symtable_node(st, body);
6341}
6342
6343/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006344 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006345 which are references in the defining scope. symtable_params()
6346 parses the parameter names, which are defined in the function's
6347 body.
6348
6349 varargslist:
6350 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6351 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6352*/
6353
6354static void
6355symtable_default_args(struct symtable *st, node *n)
6356{
6357 node *c;
6358 int i;
6359
6360 if (TYPE(n) == parameters) {
6361 n = CHILD(n, 1);
6362 if (TYPE(n) == RPAR)
6363 return;
6364 }
6365 REQ(n, varargslist);
6366 for (i = 0; i < NCH(n); i += 2) {
6367 c = CHILD(n, i);
6368 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6369 break;
6370 }
6371 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6372 symtable_node(st, CHILD(n, i));
6373 }
6374}
6375
6376static void
6377symtable_params(struct symtable *st, node *n)
6378{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006379 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006380 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006381
6382 if (TYPE(n) == parameters) {
6383 n = CHILD(n, 1);
6384 if (TYPE(n) == RPAR)
6385 return;
6386 }
6387 REQ(n, varargslist);
6388 for (i = 0; i < NCH(n); i += 2) {
6389 c = CHILD(n, i);
6390 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6391 ext = 1;
6392 break;
6393 }
6394 if (TYPE(c) == test) {
6395 continue;
6396 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006397 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006398 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006399 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006400 char nbuf[30];
6401 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006402 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006403 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006404 }
6405 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006406 if (ext) {
6407 c = CHILD(n, i);
6408 if (TYPE(c) == STAR) {
6409 i++;
6410 symtable_add_def(st, STR(CHILD(n, i)),
6411 DEF_PARAM | DEF_STAR);
6412 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006413 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006414 c = NULL;
6415 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006416 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006417 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006418 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006419 i++;
6420 symtable_add_def(st, STR(CHILD(n, i)),
6421 DEF_PARAM | DEF_DOUBLESTAR);
6422 }
6423 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006424 if (complex >= 0) {
6425 int j;
6426 for (j = 0; j <= complex; j++) {
6427 c = CHILD(n, j);
6428 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006429 c = CHILD(n, ++j);
6430 else if (TYPE(c) == EQUAL)
6431 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006432 if (TYPE(CHILD(c, 0)) == LPAR)
6433 symtable_params_fplist(st, CHILD(c, 1));
6434 }
6435 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006436}
6437
6438static void
6439symtable_params_fplist(struct symtable *st, node *n)
6440{
6441 int i;
6442 node *c;
6443
6444 REQ(n, fplist);
6445 for (i = 0; i < NCH(n); i += 2) {
6446 c = CHILD(n, i);
6447 REQ(c, fpdef);
6448 if (NCH(c) == 1)
6449 symtable_add_def(st, STR(CHILD(c, 0)),
6450 DEF_PARAM | DEF_INTUPLE);
6451 else
6452 symtable_params_fplist(st, CHILD(c, 1));
6453 }
6454
6455}
6456
6457static void
6458symtable_global(struct symtable *st, node *n)
6459{
6460 int i;
6461
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006462 /* XXX It might be helpful to warn about module-level global
6463 statements, but it's hard to tell the difference between
6464 module-level and a string passed to exec.
6465 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006466
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006467 for (i = 1; i < NCH(n); i += 2) {
6468 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006469 int flags;
6470
6471 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006472 if (flags < 0)
6473 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006474 if (flags && flags != DEF_GLOBAL) {
6475 char buf[500];
6476 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006477 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006478 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006479 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006480 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006481 }
6482 else {
6483 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006484 PyOS_snprintf(buf, sizeof(buf),
6485 GLOBAL_AFTER_ASSIGN,
6486 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006487 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006488 PyOS_snprintf(buf, sizeof(buf),
6489 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006490 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006491 }
6492 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006493 symtable_add_def(st, name, DEF_GLOBAL);
6494 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006495}
6496
6497static void
6498symtable_list_comprehension(struct symtable *st, node *n)
6499{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006500 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006501 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006502
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006503 REQ(n, listmaker);
6504 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6505 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006506 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006507 symtable_list_for(st, CHILD(n, 1));
6508 symtable_node(st, CHILD(n, 0));
6509 --st->st_cur->ste_tmpname;
6510}
6511
6512static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006513symtable_generator_expression(struct symtable *st, node *n)
6514{
6515 /* testlist_gexp: test gen_for */
6516 REQ(CHILD(n, 0), test);
6517 REQ(CHILD(n, 1), gen_for);
6518
6519 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6520 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6521
6522 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6523
6524 symtable_gen_for(st, CHILD(n, 1), 1);
6525 symtable_node(st, CHILD(n, 0));
6526 symtable_exit_scope(st);
6527
6528 /* for outmost iterable precomputation */
6529 symtable_node(st, CHILD(CHILD(n, 1), 3));
6530}
6531
6532static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006533symtable_list_for(struct symtable *st, node *n)
6534{
6535 REQ(n, list_for);
6536 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006537 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006538 symtable_node(st, CHILD(n, 3));
6539 if (NCH(n) == 5)
6540 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006541}
6542
6543static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006544symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6545{
6546 REQ(n, gen_for);
6547
6548 /* gen_for: for v in test [gen_iter] */
6549 symtable_assign(st, CHILD(n, 1), 0);
6550 if (is_outmost)
6551 symtable_add_use(st, "[outmost-iterable]");
6552 else
6553 symtable_node(st, CHILD(n, 3));
6554
6555 if (NCH(n) == 5)
6556 symtable_gen_iter(st, CHILD(n, 4));
6557}
6558
6559static void
6560symtable_gen_iter(struct symtable *st, node *n)
6561{
6562 REQ(n, gen_iter);
6563
6564 n = CHILD(n, 0);
6565 if (TYPE(n) == gen_for)
6566 symtable_gen_for(st, n, 0);
6567 else {
6568 REQ(n, gen_if);
6569 symtable_node(st, CHILD(n, 1));
6570
6571 if (NCH(n) == 3)
6572 symtable_gen_iter(st, CHILD(n, 2));
6573 }
6574}
6575
6576static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006577symtable_import(struct symtable *st, node *n)
6578{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006579 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006580 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006581 /* import_stmt: import_name | import_from */
6582 n = CHILD(n, 0);
6583 if (TYPE(n) == import_from) {
6584 /* import_from: 'from' dotted_name 'import' ('*' |
6585 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006586 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006587 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006588 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6589 /* check for bogus imports */
6590 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6591 PyErr_SetString(PyExc_SyntaxError,
6592 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006593 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006594 return;
6595 }
6596 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006597 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6598 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006599 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006600 if (symtable_warn(st,
6601 "import * only allowed at module level") < 0)
6602 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006603 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006604 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006605 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006606 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006607 REQ(nn, import_as_names);
6608 for (i = 0; i < NCH(nn); i += 2) {
6609 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006610 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006611 symtable_assign(st, CHILD(c, 2),
6612 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006613 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006614 symtable_assign(st, CHILD(c, 0),
6615 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006616 }
6617 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006618 } else {
6619 /* 'import' dotted_as_names */
6620 nn = CHILD(n, 1);
6621 REQ(nn, dotted_as_names);
6622 for (i = 0; i < NCH(nn); i += 2)
6623 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006624 }
6625}
6626
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006627/* The third argument to symatble_assign() is a flag to be passed to
6628 symtable_add_def() if it is eventually called. The flag is useful
6629 to specify the particular type of assignment that should be
6630 recorded, e.g. an assignment caused by import.
6631 */
6632
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006633static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006634symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006635{
6636 node *tmp;
6637 int i;
6638
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006639 loop:
6640 switch (TYPE(n)) {
6641 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006642 /* invalid assignment, e.g. lambda x:x=2. The next
6643 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006644 return;
6645 case power:
6646 if (NCH(n) > 2) {
6647 for (i = 2; i < NCH(n); ++i)
6648 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6649 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006650 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006651 if (NCH(n) > 1) {
6652 symtable_node(st, CHILD(n, 0));
6653 symtable_node(st, CHILD(n, 1));
6654 } else {
6655 n = CHILD(n, 0);
6656 goto loop;
6657 }
6658 return;
6659 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006660 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6661 /* XXX This is an error, but the next pass
6662 will catch it. */
6663 return;
6664 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006665 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006666 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006667 }
6668 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006669 case testlist_gexp:
6670 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6671 /* XXX This is an error, but the next pass
6672 will catch it. */
6673 return;
6674 } else {
6675 for (i = 0; i < NCH(n); i += 2)
6676 symtable_assign(st, CHILD(n, i), def_flag);
6677 }
6678 return;
6679
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006680 case exprlist:
6681 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006682 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006683 if (NCH(n) == 1) {
6684 n = CHILD(n, 0);
6685 goto loop;
6686 }
6687 else {
6688 int i;
6689 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006690 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006691 return;
6692 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006693 case atom:
6694 tmp = CHILD(n, 0);
6695 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6696 n = CHILD(n, 1);
6697 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006698 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006699 if (strcmp(STR(tmp), "__debug__") == 0) {
6700 PyErr_SetString(PyExc_SyntaxError,
6701 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006702 symtable_error(st, n->n_lineno);
6703 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006704 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006705 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006706 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006707 return;
6708 case dotted_as_name:
6709 if (NCH(n) == 3)
6710 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006711 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006712 else
6713 symtable_add_def(st,
6714 STR(CHILD(CHILD(n,
6715 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006716 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006717 return;
6718 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006719 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006720 return;
6721 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006722 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006723 return;
6724 default:
6725 if (NCH(n) == 0)
6726 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006727 if (NCH(n) == 1) {
6728 n = CHILD(n, 0);
6729 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006730 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006731 /* Should only occur for errors like x + 1 = 1,
6732 which will be caught in the next pass. */
6733 for (i = 0; i < NCH(n); ++i)
6734 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006735 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006736 }
6737}