blob: dd58aa64280f288295475b744b26aee89e65f737 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000400 Bails out with no change if one or more of the LOAD_CONSTs is missing.
401 Also works for BUILD_LIST when followed by an "in" or "not in" test.
402*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000403static int
404tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
405{
406 PyObject *newconst, *constant;
407 int i, arg, len_consts;
408
409 /* Pre-conditions */
410 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000411 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000414 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000420 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421 for (i=0 ; i<n ; i++) {
422 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000423 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430 if (PyList_Append(consts, newconst)) {
431 Py_DECREF(newconst);
432 return 0;
433 }
434 Py_DECREF(newconst);
435
436 /* Write NOPs over old LOAD_CONSTS and
437 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
438 memset(codestr, NOP, n*3);
439 codestr[n*3] = LOAD_CONST;
440 SETARG(codestr, (n*3), len_consts);
441 return 1;
442}
443
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000444/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
445 with LOAD_CONST binop(c1,c2)
446 The consts table must still be in list form so that the
447 new constant can be appended.
448 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000449 Abandons the transformation if the folding fails (i.e. 1+'a').
450 If the new constant is a sequence, only folds when the size
451 is below a threshold value. That keeps pyc files from
452 becoming large in the presence of code like: (None,)*1000.
453*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454static int
455fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
456{
457 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000458 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459
460 /* Pre-conditions */
461 assert(PyList_CheckExact(consts));
462 assert(codestr[0] == LOAD_CONST);
463 assert(codestr[3] == LOAD_CONST);
464
465 /* Create new constant */
466 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
467 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
468 opcode = codestr[6];
469 switch (opcode) {
470 case BINARY_POWER:
471 newconst = PyNumber_Power(v, w, Py_None);
472 break;
473 case BINARY_MULTIPLY:
474 newconst = PyNumber_Multiply(v, w);
475 break;
476 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000477 /* Cannot fold this operation statically since
478 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000479 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000480 case BINARY_TRUE_DIVIDE:
481 newconst = PyNumber_TrueDivide(v, w);
482 break;
483 case BINARY_FLOOR_DIVIDE:
484 newconst = PyNumber_FloorDivide(v, w);
485 break;
486 case BINARY_MODULO:
487 newconst = PyNumber_Remainder(v, w);
488 break;
489 case BINARY_ADD:
490 newconst = PyNumber_Add(v, w);
491 break;
492 case BINARY_SUBTRACT:
493 newconst = PyNumber_Subtract(v, w);
494 break;
495 case BINARY_SUBSCR:
496 newconst = PyObject_GetItem(v, w);
497 break;
498 case BINARY_LSHIFT:
499 newconst = PyNumber_Lshift(v, w);
500 break;
501 case BINARY_RSHIFT:
502 newconst = PyNumber_Rshift(v, w);
503 break;
504 case BINARY_AND:
505 newconst = PyNumber_And(v, w);
506 break;
507 case BINARY_XOR:
508 newconst = PyNumber_Xor(v, w);
509 break;
510 case BINARY_OR:
511 newconst = PyNumber_Or(v, w);
512 break;
513 default:
514 /* Called with an unknown opcode */
515 assert(0);
516 return 0;
517 }
518 if (newconst == NULL) {
519 PyErr_Clear();
520 return 0;
521 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000522 size = PyObject_Size(newconst);
523 if (size == -1)
524 PyErr_Clear();
525 else if (size > 20) {
526 Py_DECREF(newconst);
527 return 0;
528 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000529
530 /* Append folded constant into consts table */
531 len_consts = PyList_GET_SIZE(consts);
532 if (PyList_Append(consts, newconst)) {
533 Py_DECREF(newconst);
534 return 0;
535 }
536 Py_DECREF(newconst);
537
538 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
539 memset(codestr, NOP, 4);
540 codestr[4] = LOAD_CONST;
541 SETARG(codestr, 4, len_consts);
542 return 1;
543}
544
Raymond Hettingera1645742005-02-06 22:05:42 +0000545/* Replace LOAD_CONST tuple with LOAD_CONST frozenset in the context
546 of a single-use constant for "in" and "not in" tests.
547*/
548int
549try_set_conversion(unsigned char *codestr, PyObject *consts)
550{
551 PyObject *newconst, *constant;
552 int arg, len_consts;
553
554 /* Pre-conditions */
555 assert(PyList_CheckExact(consts));
556 assert(codestr[0] == LOAD_CONST);
557 assert(codestr[3] == COMPARE_OP);
558 assert(GETARG(codestr, 3) == 6 || GETARG(codestr, 3) == 7);
559
560 /* Attempt to convert constant to a frozenset. Bail-out with no
561 changes if the tuple contains unhashable values. */
562 arg = GETARG(codestr, 0);
563 constant = PyList_GET_ITEM(consts, arg);
564 if (constant->ob_type != &PyTuple_Type)
565 return 0;
566 newconst = PyObject_CallFunctionObjArgs(
567 (PyObject *)&PyFrozenSet_Type, constant, NULL);
568 if (newconst == NULL) {
569 PyErr_Clear();
570 return 0;
571 }
572
573 /* Append new constant onto consts list.*/
574 len_consts = PyList_GET_SIZE(consts);
575 if (PyList_Append(consts, newconst)) {
576 Py_DECREF(newconst);
577 return 0;
578 }
579 Py_DECREF(newconst);
580
581 /* Write new LOAD_CONST newconst on top of LOAD_CONST oldconst */
582 SETARG(codestr, 0, len_consts);
583 return 1;
584}
585
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000586static unsigned int *
587markblocks(unsigned char *code, int len)
588{
589 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000590 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000591
592 if (blocks == NULL)
593 return NULL;
594 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000595
596 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000597 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
598 opcode = code[i];
599 switch (opcode) {
600 case FOR_ITER:
601 case JUMP_FORWARD:
602 case JUMP_IF_FALSE:
603 case JUMP_IF_TRUE:
604 case JUMP_ABSOLUTE:
605 case CONTINUE_LOOP:
606 case SETUP_LOOP:
607 case SETUP_EXCEPT:
608 case SETUP_FINALLY:
609 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000610 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000611 break;
612 }
613 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000614 /* Build block numbers in the second pass */
615 for (i=0 ; i<len ; i++) {
616 blockcnt += blocks[i]; /* increment blockcnt over labels */
617 blocks[i] = blockcnt;
618 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000619 return blocks;
620}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000621
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000622/* Perform basic peephole optimizations to components of a code object.
623 The consts object should still be in list form to allow new constants
624 to be appended.
625
626 To keep the optimizer simple, it bails out (does nothing) for code
627 containing extended arguments or that has a length over 32,700. That
628 allows us to avoid overflow and sign issues. Likewise, it bails when
629 the lineno table has complex encoding for gaps >= 255.
630
631 Optimizations are restricted to simple transformations occuring within a
632 single basic block. All transformations keep the code size the same or
633 smaller. For those that reduce size, the gaps are initially filled with
634 NOPs. Later those NOPs are removed and the jump addresses retargeted in
635 a single pass. Line numbering is adjusted accordingly. */
636
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000637static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000638optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000639{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000640 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000641 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000642 unsigned char *codestr = NULL;
643 unsigned char *lineno;
644 int *addrmap = NULL;
645 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000646 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000647 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000648 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000649
Raymond Hettingereffb3932004-10-30 08:55:08 +0000650 /* Bail out if an exception is set */
651 if (PyErr_Occurred())
652 goto exitUnchanged;
653
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000654 /* Bypass optimization when the lineno table is too complex */
655 assert(PyString_Check(lineno_obj));
656 lineno = PyString_AS_STRING(lineno_obj);
657 tabsiz = PyString_GET_SIZE(lineno_obj);
658 if (memchr(lineno, 255, tabsiz) != NULL)
659 goto exitUnchanged;
660
Raymond Hettingera12fa142004-08-24 04:34:16 +0000661 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000662 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000663 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000664 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000665 goto exitUnchanged;
666
667 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000668 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000669 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000670 goto exitUnchanged;
671 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000672
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000673 /* Mapping to new jump targets after NOPs are removed */
674 addrmap = PyMem_Malloc(codelen * sizeof(int));
675 if (addrmap == NULL)
676 goto exitUnchanged;
677
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000678 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000679 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000680 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000681 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000682
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000683 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000684 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000685
686 lastlc = cumlc;
687 cumlc = 0;
688
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000689 switch (opcode) {
690
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000691 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000692 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000693 case UNARY_NOT:
694 if (codestr[i+1] != JUMP_IF_FALSE ||
695 codestr[i+4] != POP_TOP ||
696 !ISBASICBLOCK(blocks,i,5))
697 continue;
698 tgt = GETJUMPTGT(codestr, (i+1));
699 if (codestr[tgt] != POP_TOP)
700 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000701 j = GETARG(codestr, i+1) + 1;
702 codestr[i] = JUMP_IF_TRUE;
703 SETARG(codestr, i, j);
704 codestr[i+3] = POP_TOP;
705 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000706 break;
707
708 /* not a is b --> a is not b
709 not a in b --> a not in b
710 not a is not b --> a is b
Raymond Hettingera1645742005-02-06 22:05:42 +0000711 not a not in b --> a in b
712
713 a in c --> a in frozenset(c)
714 where c is a constant tuple of hashable values
715 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000716 case COMPARE_OP:
717 j = GETARG(codestr, i);
Raymond Hettingera1645742005-02-06 22:05:42 +0000718 if (lastlc >= 1 && (j == 6 || j == 7) && ISBASICBLOCK(blocks,i-3,6))
719 try_set_conversion(&codestr[i-3], consts);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000720 if (j < 6 || j > 9 ||
721 codestr[i+3] != UNARY_NOT ||
722 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000723 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000724 SETARG(codestr, i, (j^1));
725 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000726 break;
727
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000728 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
729 case LOAD_NAME:
730 case LOAD_GLOBAL:
731 j = GETARG(codestr, i);
732 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
733 if (name == NULL || strcmp(name, "None") != 0)
734 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000735 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
736 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000737 codestr[i] = LOAD_CONST;
738 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000739 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000740 break;
741 }
742 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000743 break;
744
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000745 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000746 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000747 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000748 j = GETARG(codestr, i);
749 if (codestr[i+3] != JUMP_IF_FALSE ||
750 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000751 !ISBASICBLOCK(blocks,i,7) ||
752 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000753 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000754 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000755 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000756 break;
757
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000758 /* Try to fold tuples of constants (includes a case for lists
759 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000760 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000761 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
762 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000763 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000764 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000765 j = GETARG(codestr, i);
766 h = i - 3 * j;
767 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000768 j <= lastlc &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000769 (opcode == BUILD_TUPLE &&
770 ISBASICBLOCK(blocks, h, 3*(j+1)) ||
771 opcode == BUILD_LIST &&
772 codestr[i+3]==COMPARE_OP &&
773 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
774 (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000775 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000776 assert(codestr[i] == LOAD_CONST);
777 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000778 break;
779 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000780 if (codestr[i+3] != UNPACK_SEQUENCE ||
781 !ISBASICBLOCK(blocks,i,6) ||
782 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000783 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000784 if (j == 1) {
785 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000786 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000787 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000788 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000789 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000790 codestr[i] = ROT_THREE;
791 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000792 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000793 }
794 break;
795
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000796 /* Fold binary ops on constants.
797 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
798 case BINARY_POWER:
799 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000800 case BINARY_TRUE_DIVIDE:
801 case BINARY_FLOOR_DIVIDE:
802 case BINARY_MODULO:
803 case BINARY_ADD:
804 case BINARY_SUBTRACT:
805 case BINARY_SUBSCR:
806 case BINARY_LSHIFT:
807 case BINARY_RSHIFT:
808 case BINARY_AND:
809 case BINARY_XOR:
810 case BINARY_OR:
811 if (lastlc >= 2 &&
812 ISBASICBLOCK(blocks, i-6, 7) &&
813 fold_binops_on_constants(&codestr[i-6], consts)) {
814 i -= 2;
815 assert(codestr[i] == LOAD_CONST);
816 cumlc = 1;
817 }
818 break;
819
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000820 /* Simplify conditional jump to conditional jump where the
821 result of the first test implies the success of a similar
822 test or the failure of the opposite test.
823 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000824 "if a and b:"
825 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000826 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000827 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000828 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000829 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
830 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000831 */
832 case JUMP_IF_FALSE:
833 case JUMP_IF_TRUE:
834 tgt = GETJUMPTGT(codestr, i);
835 j = codestr[tgt];
836 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
837 if (j == opcode) {
838 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
839 SETARG(codestr, i, tgttgt);
840 } else {
841 tgt -= i;
842 SETARG(codestr, i, tgt);
843 }
844 break;
845 }
846 /* Intentional fallthrough */
847
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000848 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000849 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000850 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000851 case JUMP_ABSOLUTE:
852 case CONTINUE_LOOP:
853 case SETUP_LOOP:
854 case SETUP_EXCEPT:
855 case SETUP_FINALLY:
856 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000857 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000858 continue;
859 tgttgt = GETJUMPTGT(codestr, tgt);
860 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
861 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000862 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000863 tgttgt -= i + 3; /* Calc relative jump addr */
864 if (tgttgt < 0) /* No backward relative jumps */
865 continue;
866 codestr[i] = opcode;
867 SETARG(codestr, i, tgttgt);
868 break;
869
870 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000871 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000872
873 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
874 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000875 if (i+4 >= codelen ||
876 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000877 !ISBASICBLOCK(blocks,i,5))
878 continue;
879 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000880 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000881 }
882 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000883
884 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000885 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
886 addrmap[i] = i - nops;
887 if (codestr[i] == NOP)
888 nops++;
889 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000890 cum_orig_line = 0;
891 last_line = 0;
892 for (i=0 ; i < tabsiz ; i+=2) {
893 cum_orig_line += lineno[i];
894 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000895 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000896 lineno[i] =((unsigned char)(new_line - last_line));
897 last_line = new_line;
898 }
899
900 /* Remove NOPs and fixup jump targets */
901 for (i=0, h=0 ; i<codelen ; ) {
902 opcode = codestr[i];
903 switch (opcode) {
904 case NOP:
905 i++;
906 continue;
907
908 case JUMP_ABSOLUTE:
909 case CONTINUE_LOOP:
910 j = addrmap[GETARG(codestr, i)];
911 SETARG(codestr, i, j);
912 break;
913
914 case FOR_ITER:
915 case JUMP_FORWARD:
916 case JUMP_IF_FALSE:
917 case JUMP_IF_TRUE:
918 case SETUP_LOOP:
919 case SETUP_EXCEPT:
920 case SETUP_FINALLY:
921 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
922 SETARG(codestr, i, j);
923 break;
924 }
925 adj = CODESIZE(opcode);
926 while (adj--)
927 codestr[h++] = codestr[i++];
928 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000929 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000930
931 code = PyString_FromStringAndSize((char *)codestr, h);
932 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000933 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000934 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000935 return code;
936
937exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000938 if (blocks != NULL)
939 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000940 if (addrmap != NULL)
941 PyMem_Free(addrmap);
942 if (codestr != NULL)
943 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000944 Py_INCREF(code);
945 return code;
946}
947
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000948/* End: Peephole optimizations ----------------------------------------- */
949
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000951PyCode_New(int argcount, int nlocals, int stacksize, int flags,
952 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000953 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
954 PyObject *filename, PyObject *name, int firstlineno,
955 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000956{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000958 int i;
959 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000960 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000961 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 consts == NULL || !PyTuple_Check(consts) ||
963 names == NULL || !PyTuple_Check(names) ||
964 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000965 freevars == NULL || !PyTuple_Check(freevars) ||
966 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 name == NULL || !PyString_Check(name) ||
968 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000969 lnotab == NULL || !PyString_Check(lnotab) ||
970 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000971 PyErr_BadInternalCall();
972 return NULL;
973 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000974 intern_strings(names);
975 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000978 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 for (i = PyTuple_Size(consts); --i >= 0; ) {
980 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000982 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000983 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000984 continue;
985 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000988 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000989 co->co_argcount = argcount;
990 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000991 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000992 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000993 Py_INCREF(code);
994 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000995 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001000 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001001 Py_INCREF(freevars);
1002 co->co_freevars = freevars;
1003 Py_INCREF(cellvars);
1004 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001006 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001008 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001009 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001011 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001012 if (PyTuple_GET_SIZE(freevars) == 0 &&
1013 PyTuple_GET_SIZE(cellvars) == 0)
1014 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001015 }
1016 return co;
1017}
1018
1019
1020/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001021
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001022/* The compiler uses two passes to generate bytecodes. The first pass
1023 builds the symbol table. The second pass generates the bytecode.
1024
1025 The first pass uses a single symtable struct. The second pass uses
1026 a compiling struct for each code block. The compiling structs
1027 share a reference to the symtable.
1028
1029 The two passes communicate via symtable_load_symbols() and via
1030 is_local() and is_global(). The former initializes several slots
1031 in the compiling struct: c_varnames, c_locals, c_nlocals,
1032 c_argcount, c_globals, and c_flags.
1033*/
1034
Tim Peters2a7f3842001-06-09 09:26:21 +00001035/* All about c_lnotab.
1036
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001037c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1038version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1039mapped to source code line #s via c_lnotab instead.
1040
Tim Peters2a7f3842001-06-09 09:26:21 +00001041The array is conceptually a list of
1042 (bytecode offset increment, line number increment)
1043pairs. The details are important and delicate, best illustrated by example:
1044
1045 byte code offset source code line number
1046 0 1
1047 6 2
1048 50 7
1049 350 307
1050 361 308
1051
1052The first trick is that these numbers aren't stored, only the increments
1053from one row to the next (this doesn't really work, but it's a start):
1054
1055 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1056
1057The second trick is that an unsigned byte can't hold negative values, or
1058values larger than 255, so (a) there's a deep assumption that byte code
1059offsets and their corresponding line #s both increase monotonically, and (b)
1060if at least one column jumps by more than 255 from one row to the next, more
1061than one pair is written to the table. In case #b, there's no way to know
1062from looking at the table later how many were written. That's the delicate
1063part. A user of c_lnotab desiring to find the source line number
1064corresponding to a bytecode address A should do something like this
1065
1066 lineno = addr = 0
1067 for addr_incr, line_incr in c_lnotab:
1068 addr += addr_incr
1069 if addr > A:
1070 return lineno
1071 lineno += line_incr
1072
1073In order for this to work, when the addr field increments by more than 255,
1074the line # increment in each pair generated must be 0 until the remaining addr
1075increment is < 256. So, in the example above, com_set_lineno should not (as
1076was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1077255, 0, 45, 255, 0, 45.
1078*/
1079
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001080struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001081 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001083 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001085 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001086 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 PyObject *c_locals; /* dictionary (value=localID) */
1088 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001089 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001090 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001091 int c_nlocals; /* index of next local */
1092 int c_argcount; /* number of top-level arguments */
1093 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094 int c_nexti; /* index into c_code */
1095 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001097 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001098 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001099 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001100 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001101 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001102 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001103 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001104 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105 int c_stacklevel; /* Current stack level */
1106 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001107 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001109 int c_last_addr; /* last op addr seen and recorded in lnotab */
1110 int c_last_line; /* last line seen and recorded in lnotab */
1111 int c_lnotab_next; /* current length of lnotab */
1112 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001113 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001114 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001115 int c_nested; /* Is block nested funcdef or lamdef? */
1116 int c_closure; /* Is nested w/freevars? */
1117 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001118 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001119 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120};
1121
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001122static int
1123is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001124{
1125 if ((v & (USE | DEF_FREE))
1126 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1127 return 1;
1128 if (v & DEF_FREE_CLASS)
1129 return 1;
1130 return 0;
1131}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001132
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001134com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001135{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001136 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1137
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001138 if (c == NULL) {
1139 /* Error occurred via symtable call to
1140 is_constant_false */
1141 PyErr_SetString(exc, msg);
1142 return;
1143 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001144 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001145 if (c->c_lineno < 1 || c->c_interactive) {
1146 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001148 return;
1149 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001150 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001151 if (v == NULL)
1152 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001153
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001154 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001155 if (line == NULL) {
1156 Py_INCREF(Py_None);
1157 line = Py_None;
1158 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001159 if (exc == PyExc_SyntaxError) {
1160 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1161 Py_None, line);
1162 if (t == NULL)
1163 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001164 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001165 if (w == NULL)
1166 goto exit;
1167 PyErr_SetObject(exc, w);
1168 } else {
1169 /* Make sure additional exceptions are printed with
1170 file and line, also. */
1171 PyErr_SetObject(exc, v);
1172 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1173 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001174 exit:
1175 Py_XDECREF(t);
1176 Py_XDECREF(v);
1177 Py_XDECREF(w);
1178 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001179}
1180
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001181/* Interface to the block stack */
1182
1183static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001184block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001185{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001186 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 com_error(c, PyExc_SystemError,
1188 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001189 }
1190 else {
1191 c->c_block[c->c_nblocks++] = type;
1192 }
1193}
1194
1195static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001196block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001197{
1198 if (c->c_nblocks > 0)
1199 c->c_nblocks--;
1200 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001202 }
1203}
1204
Guido van Rossum681d79a1995-07-18 14:51:37 +00001205/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001206
Martin v. Löwis95292d62002-12-11 14:04:59 +00001207static int issue_warning(const char *, const char *, int);
1208static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001209static void com_free(struct compiling *);
1210static void com_push(struct compiling *, int);
1211static void com_pop(struct compiling *, int);
1212static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001213static void com_node(struct compiling *, node *);
1214static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001215static void com_addbyte(struct compiling *, int);
1216static void com_addint(struct compiling *, int);
1217static void com_addoparg(struct compiling *, int, int);
1218static void com_addfwref(struct compiling *, int, int *);
1219static void com_backpatch(struct compiling *, int);
1220static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1221static int com_addconst(struct compiling *, PyObject *);
1222static int com_addname(struct compiling *, PyObject *);
1223static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001224static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001225static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001226static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001227static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001228static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001229static void com_assign(struct compiling *, node *, int, node *);
1230static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001231static int com_make_closure(struct compiling *c, PyCodeObject *co);
1232
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001233static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001234static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001235 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001236static PyObject *parsestrplus(struct compiling*, node *);
1237static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001238static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001239
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001240static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001241
1242/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001243static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001244static struct symtable *symtable_build(node *, PyFutureFeatures *,
1245 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001246static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001247static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001248static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001249static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001250static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001251static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252
1253static void symtable_node(struct symtable *, node *);
1254static void symtable_funcdef(struct symtable *, node *);
1255static void symtable_default_args(struct symtable *, node *);
1256static void symtable_params(struct symtable *, node *);
1257static void symtable_params_fplist(struct symtable *, node *n);
1258static void symtable_global(struct symtable *, node *);
1259static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001260static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001261static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001262static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001263static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001264static void symtable_gen_for(struct symtable *, node *, int);
1265static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001266
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001267static int symtable_update_free_vars(struct symtable *);
1268static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1269static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1270
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001271/* helper */
1272static void
1273do_pad(int pad)
1274{
1275 int i;
1276 for (i = 0; i < pad; ++i)
1277 fprintf(stderr, " ");
1278}
1279
1280static void
1281dump(node *n, int pad, int depth)
1282{
1283 int i;
1284 if (depth == 0)
1285 return;
1286 do_pad(pad);
1287 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1288 if (depth > 0)
1289 depth--;
1290 for (i = 0; i < NCH(n); ++i)
1291 dump(CHILD(n, i), pad + 1, depth);
1292}
1293
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001294static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001295com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001296{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001297 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001298 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1299 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001300 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001302 goto fail;
1303 if ((c->c_const_dict = PyDict_New()) == NULL)
1304 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001306 goto fail;
1307 if ((c->c_name_dict = PyDict_New()) == NULL)
1308 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001310 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1312 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001313 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001314 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001315 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001316 c->c_freevars = NULL;
1317 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001318 c->c_nlocals = 0;
1319 c->c_argcount = 0;
1320 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001321 c->c_nexti = 0;
1322 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001323 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001324 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001325 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001326 c->c_begin = 0;
1327 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001328 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001329 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001330 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001331 c->c_stacklevel = 0;
1332 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001333 c->c_firstlineno = 0;
1334 c->c_last_addr = 0;
1335 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001336 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001337 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001338 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001339 c->c_nested = 0;
1340 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001342 return 1;
1343
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001344 fail:
1345 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346 return 0;
1347}
1348
1349static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001350com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001351{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 Py_XDECREF(c->c_code);
1353 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001354 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001356 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357 Py_XDECREF(c->c_globals);
1358 Py_XDECREF(c->c_locals);
1359 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001360 Py_XDECREF(c->c_freevars);
1361 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001363 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001364 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001365}
1366
1367static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001368com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001369{
1370 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001371 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001372 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001373 /*
1374 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1375 c->c_filename, c->c_name, c->c_lineno,
1376 c->c_nexti, c->c_stacklevel, n);
1377 */
1378 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001379}
1380
1381static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001382com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001383{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001384 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001385 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001386 else
1387 c->c_stacklevel -= n;
1388}
1389
1390static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001391com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001392{
1393 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001395 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001397}
1398
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001399static int
1400com_check_size(PyObject **s, int offset)
1401{
1402 int len = PyString_GET_SIZE(*s);
1403 if (offset >= len)
1404 return _PyString_Resize(s, len * 2);
1405 return 0;
1406}
1407
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001408static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001409com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001410{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001411 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001412 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001413 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001414 if (com_check_size(&c->c_code, c->c_nexti)) {
1415 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001417 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001418 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001419}
1420
1421static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001422com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001424 com_addbyte(c, x & 0xff);
1425 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001426}
1427
1428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001429com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001430{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001431 char *p;
1432 if (c->c_lnotab == NULL)
1433 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001434 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1435 c->c_errors++;
1436 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001437 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001438 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001439 *p++ = addr;
1440 *p++ = line;
1441 c->c_lnotab_next += 2;
1442}
1443
1444static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001445com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001446{
1447 c->c_lineno = lineno;
1448 if (c->c_firstlineno == 0) {
1449 c->c_firstlineno = c->c_last_line = lineno;
1450 }
1451 else {
1452 int incr_addr = c->c_nexti - c->c_last_addr;
1453 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001454 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001455 while (incr_addr > 255) {
1456 com_add_lnotab(c, 255, 0);
1457 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001458 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001459 while (incr_line > 255) {
1460 com_add_lnotab(c, incr_addr, 255);
1461 incr_line -=255;
1462 incr_addr = 0;
1463 }
1464 if (incr_addr > 0 || incr_line > 0)
1465 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001466 c->c_last_addr = c->c_nexti;
1467 c->c_last_line = lineno;
1468 }
1469}
1470
1471static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001472com_strip_lnotab(struct compiling *c)
1473{
1474 /* strip the last lnotab entry if no opcode were emitted.
1475 * This prevents a line number to be generated on a final
1476 * pass, like in the following example:
1477 *
1478 * if a:
1479 * print 5
1480 * else:
1481 * pass
1482 *
1483 * Without the fix, a line trace event would be generated
1484 * on the pass even if a is true (because of the implicit
1485 * return).
1486 */
1487 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1488 c->c_lnotab_next = c->c_lnotab_last;
1489 }
1490}
1491
1492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001493com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001494{
Fred Drakeef8ace32000-08-24 00:32:09 +00001495 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001496 if (extended_arg){
1497 com_addbyte(c, EXTENDED_ARG);
1498 com_addint(c, extended_arg);
1499 arg &= 0xffff;
1500 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001501 com_addbyte(c, op);
1502 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001503}
1504
1505static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001506com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001507{
1508 /* Compile a forward reference for backpatching */
1509 int here;
1510 int anchor;
1511 com_addbyte(c, op);
1512 here = c->c_nexti;
1513 anchor = *p_anchor;
1514 *p_anchor = here;
1515 com_addint(c, anchor == 0 ? 0 : here - anchor);
1516}
1517
1518static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001519com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001521 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001523 int dist;
1524 int prev;
1525 for (;;) {
1526 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001527 prev = code[anchor] + (code[anchor+1] << 8);
1528 dist = target - (anchor+2);
1529 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001530 dist >>= 8;
1531 code[anchor+1] = dist;
1532 dist >>= 8;
1533 if (dist) {
1534 com_error(c, PyExc_SystemError,
1535 "com_backpatch: offset too large");
1536 break;
1537 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001538 if (!prev)
1539 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001540 anchor -= prev;
1541 }
1542}
1543
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001544/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545
1546static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001547com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001549 PyObject *w, *t, *np=NULL;
1550 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001551
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001552 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001553 if (t == NULL)
1554 goto fail;
1555 w = PyDict_GetItem(dict, t);
1556 if (w != NULL) {
1557 n = PyInt_AsLong(w);
1558 } else {
1559 n = PyList_Size(list);
1560 np = PyInt_FromLong(n);
1561 if (np == NULL)
1562 goto fail;
1563 if (PyList_Append(list, v) != 0)
1564 goto fail;
1565 if (PyDict_SetItem(dict, t, np) != 0)
1566 goto fail;
1567 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001568 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001569 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001570 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001571 fail:
1572 Py_XDECREF(np);
1573 Py_XDECREF(t);
1574 c->c_errors++;
1575 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001576}
1577
1578static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001579com_addconst(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_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582}
1583
1584static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001585com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001587 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588}
1589
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001590int
1591_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001592{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001593 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001594 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001595 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001596 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1597 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001598 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001599 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001600 return 0; /* Don't mangle __extremely_long_names */
1601 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1602 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001603 /* Strip leading underscores from class name */
1604 while (*p == '_')
1605 p++;
1606 if (*p == '\0')
1607 return 0; /* Don't mangle if class is just underscores */
1608 plen = strlen(p);
1609 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001610 plen = maxlen-nlen-2; /* Truncate class name if too long */
1611 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001612 buffer[0] = '_';
1613 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001614 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001615 return 1;
1616}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001617
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001619com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001622 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001624
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001625 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001626 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001627 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 c->c_errors++;
1629 i = 255;
1630 }
1631 else {
1632 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001635 com_addoparg(c, op, i);
1636}
1637
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001638#define NAME_LOCAL 0
1639#define NAME_GLOBAL 1
1640#define NAME_DEFAULT 2
1641#define NAME_CLOSURE 3
1642
1643static int
1644com_lookup_arg(PyObject *dict, PyObject *name)
1645{
1646 PyObject *v = PyDict_GetItem(dict, name);
1647 if (v == NULL)
1648 return -1;
1649 else
1650 return PyInt_AS_LONG(v);
1651}
1652
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001653static int
1654none_assignment_check(struct compiling *c, char *name, int assigning)
1655{
1656 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1657 char *msg;
1658 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001659 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001660 else
1661 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001662 com_error(c, PyExc_SyntaxError, msg);
1663 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001664 }
1665 return 0;
1666}
1667
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001668static void
1669com_addop_varname(struct compiling *c, int kind, char *name)
1670{
1671 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001672 int i, reftype;
1673 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001674 int op = STOP_CODE;
1675 char buffer[MANGLE_LEN];
1676
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001677 if (kind != VAR_LOAD &&
1678 none_assignment_check(c, name, kind == VAR_STORE))
1679 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001680 i = 255;
1681 goto done;
1682 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001683 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001684 name = buffer;
1685 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1686 c->c_errors++;
1687 i = 255;
1688 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001689 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001690
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001691 reftype = get_ref_type(c, name);
1692 switch (reftype) {
1693 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001694 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001695 scope = NAME_LOCAL;
1696 break;
1697 case GLOBAL_EXPLICIT:
1698 scope = NAME_GLOBAL;
1699 break;
1700 case GLOBAL_IMPLICIT:
1701 if (c->c_flags & CO_OPTIMIZED)
1702 scope = NAME_GLOBAL;
1703 break;
1704 case FREE:
1705 case CELL:
1706 scope = NAME_CLOSURE;
1707 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001708 }
1709
1710 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001711 if (scope == NAME_LOCAL)
1712 i = com_lookup_arg(c->c_locals, v);
1713 else if (reftype == FREE)
1714 i = com_lookup_arg(c->c_freevars, v);
1715 else if (reftype == CELL)
1716 i = com_lookup_arg(c->c_cellvars, v);
1717 if (i == -1) {
1718 c->c_errors++; /* XXX no exception set */
1719 i = 255;
1720 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001721 }
1722 Py_DECREF(v);
1723
1724 switch (kind) {
1725 case VAR_LOAD:
1726 switch (scope) {
1727 case NAME_LOCAL:
1728 op = LOAD_FAST;
1729 break;
1730 case NAME_GLOBAL:
1731 op = LOAD_GLOBAL;
1732 break;
1733 case NAME_DEFAULT:
1734 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001735 break;
1736 case NAME_CLOSURE:
1737 op = LOAD_DEREF;
1738 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001739 }
1740 break;
1741 case VAR_STORE:
1742 switch (scope) {
1743 case NAME_LOCAL:
1744 op = STORE_FAST;
1745 break;
1746 case NAME_GLOBAL:
1747 op = STORE_GLOBAL;
1748 break;
1749 case NAME_DEFAULT:
1750 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001751 break;
1752 case NAME_CLOSURE:
1753 op = STORE_DEREF;
1754 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001755 }
1756 break;
1757 case VAR_DELETE:
1758 switch (scope) {
1759 case NAME_LOCAL:
1760 op = DELETE_FAST;
1761 break;
1762 case NAME_GLOBAL:
1763 op = DELETE_GLOBAL;
1764 break;
1765 case NAME_DEFAULT:
1766 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001767 break;
1768 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001769 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001770 PyOS_snprintf(buf, sizeof(buf),
1771 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001772 com_error(c, PyExc_SyntaxError, buf);
1773 i = 255;
1774 break;
1775 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001776 }
1777 break;
1778 }
1779done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001780 com_addoparg(c, op, i);
1781}
1782
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001784com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001785{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001786 char *name;
1787 char buffer[1000];
1788 /* XXX it is possible to write this code without the 1000
1789 chars on the total length of dotted names, I just can't be
1790 bothered right now */
1791 if (TYPE(n) == STAR)
1792 name = "*";
1793 else if (TYPE(n) == dotted_name) {
1794 char *p = buffer;
1795 int i;
1796 name = buffer;
1797 for (i = 0; i < NCH(n); i += 2) {
1798 char *s = STR(CHILD(n, i));
1799 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001801 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001802 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001803 break;
1804 }
1805 if (p != buffer)
1806 *p++ = '.';
1807 strcpy(p, s);
1808 p = strchr(p, '\0');
1809 }
1810 }
1811 else {
1812 REQ(n, NAME);
1813 name = STR(n);
1814 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001815 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001816}
1817
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001819parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001820{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001821 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001822 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001823 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001824#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001825 int imflag;
1826#endif
1827
Guido van Rossum282914b1991-04-04 10:42:56 +00001828 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001829 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001830#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001831 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001832#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001833 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001835 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001837 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001838 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001839 }
1840 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001841 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001843 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001844 if (errno != 0)
1845 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001847 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001848 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001849#ifndef WITHOUT_COMPLEX
1850 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001851 Py_complex z;
1852 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001853 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001854 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001855 PyFPE_END_PROTECT(z)
1856 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001857 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001858 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001859#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001860 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001861 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001862 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001863 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001865 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001866}
1867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001869decode_utf8(char **sPtr, char *end, char* encoding)
1870{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001871#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001872 Py_FatalError("decode_utf8 should not be called in this build.");
1873 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001874#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001875 PyObject *u, *v;
1876 char *s, *t;
1877 t = s = *sPtr;
1878 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1879 while (s < end && (*s & 0x80)) s++;
1880 *sPtr = s;
1881 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1882 if (u == NULL)
1883 return NULL;
1884 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1885 Py_DECREF(u);
1886 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001887#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001888}
1889
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001890/* compiler.transformer.Transformer.decode_literal depends on what
1891 might seem like minor details of this function -- changes here
1892 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001893static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001894parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001895{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001897 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001898 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001899 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001900 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001901 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001902 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001903
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001904 if (isalpha(quote) || quote == '_') {
1905 if (quote == 'u' || quote == 'U') {
1906 quote = *++s;
1907 unicode = 1;
1908 }
1909 if (quote == 'r' || quote == 'R') {
1910 quote = *++s;
1911 rawmode = 1;
1912 }
1913 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001914 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001916 return NULL;
1917 }
1918 s++;
1919 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001920 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001921 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001922 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001923 return NULL;
1924 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001925 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001927 return NULL;
1928 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001929 if (len >= 4 && s[0] == quote && s[1] == quote) {
1930 s += 2;
1931 len -= 2;
1932 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001934 return NULL;
1935 }
1936 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001937#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001938 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001939 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001940 char *buf;
1941 char *p;
1942 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001943 if (encoding == NULL) {
1944 buf = s;
1945 u = NULL;
1946 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1947 buf = s;
1948 u = NULL;
1949 } else {
1950 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1951 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1952 if (u == NULL)
1953 return NULL;
1954 p = buf = PyString_AsString(u);
1955 end = s + len;
1956 while (s < end) {
1957 if (*s == '\\') {
1958 *p++ = *s++;
1959 if (*s & 0x80) {
1960 strcpy(p, "u005c");
1961 p += 5;
1962 }
1963 }
1964 if (*s & 0x80) { /* XXX inefficient */
1965 char *r;
1966 int rn, i;
1967 w = decode_utf8(&s, end, "utf-16-be");
1968 if (w == NULL) {
1969 Py_DECREF(u);
1970 return NULL;
1971 }
1972 r = PyString_AsString(w);
1973 rn = PyString_Size(w);
1974 assert(rn % 2 == 0);
1975 for (i = 0; i < rn; i += 2) {
1976 sprintf(p, "\\u%02x%02x",
1977 r[i + 0] & 0xFF,
1978 r[i + 1] & 0xFF);
1979 p += 6;
1980 }
1981 Py_DECREF(w);
1982 } else {
1983 *p++ = *s++;
1984 }
1985 }
1986 len = p - buf;
1987 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001988 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001989 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001990 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001991 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1992 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001993 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001994 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001995 return v;
1996
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001997 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001998#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001999 need_encoding = (encoding != NULL &&
2000 strcmp(encoding, "utf-8") != 0 &&
2001 strcmp(encoding, "iso-8859-1") != 0);
2002 if (rawmode || strchr(s, '\\') == NULL) {
2003 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002004#ifndef Py_USING_UNICODE
2005 /* This should not happen - we never see any other
2006 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002007 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002008#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002009 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2010 if (u == NULL)
2011 return NULL;
2012 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2013 Py_DECREF(u);
2014 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002015#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002016 } else {
2017 return PyString_FromStringAndSize(s, len);
2018 }
2019 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002020
2021 v = PyString_DecodeEscape(s, len, NULL, unicode,
2022 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002023 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002024 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002025 return v;
2026}
2027
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002029parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002030{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002032 int i;
2033 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002034 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002035 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002036 for (i = 1; i < NCH(n); i++) {
2037 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002038 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002039 if (s == NULL)
2040 goto onError;
2041 if (PyString_Check(v) && PyString_Check(s)) {
2042 PyString_ConcatAndDel(&v, s);
2043 if (v == NULL)
2044 goto onError;
2045 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002046#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002047 else {
2048 PyObject *temp;
2049 temp = PyUnicode_Concat(v, s);
2050 Py_DECREF(s);
2051 if (temp == NULL)
2052 goto onError;
2053 Py_DECREF(v);
2054 v = temp;
2055 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002056#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002057 }
2058 }
2059 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002060
2061 onError:
2062 Py_XDECREF(v);
2063 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002064}
2065
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002067com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002068{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002069 int anchor = 0;
2070 int save_begin = c->c_begin;
2071
Raymond Hettinger354433a2004-05-19 08:20:33 +00002072 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002073 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002074 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002075 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002076 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002077 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002078 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002079 c->c_loops++;
2080 com_list_iter(c, n, e, t);
2081 c->c_loops--;
2082 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2083 c->c_begin = save_begin;
2084 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002085 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002086}
2087
2088static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002089com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2090{
2091 int break_anchor = 0;
2092 int anchor = 0;
2093 int save_begin = c->c_begin;
2094
2095 REQ(n, gen_for);
2096 /* gen_for: for v in test [gen_iter] */
2097
2098 com_addfwref(c, SETUP_LOOP, &break_anchor);
2099 block_push(c, SETUP_LOOP);
2100
2101 if (is_outmost) {
2102 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2103 com_push(c, 1);
2104 }
2105 else {
2106 com_node(c, CHILD(n, 3));
2107 com_addbyte(c, GET_ITER);
2108 }
2109
2110 c->c_begin = c->c_nexti;
2111 com_set_lineno(c, c->c_last_line);
2112 com_addfwref(c, FOR_ITER, &anchor);
2113 com_push(c, 1);
2114 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2115
2116 if (NCH(n) == 5)
2117 com_gen_iter(c, CHILD(n, 4), t);
2118 else {
2119 com_test(c, t);
2120 com_addbyte(c, YIELD_VALUE);
2121 com_pop(c, 1);
2122 }
2123
2124 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2125 c->c_begin = save_begin;
2126
2127 com_backpatch(c, anchor);
2128 com_pop(c, 1); /* FOR_ITER has popped this */
2129 com_addbyte(c, POP_BLOCK);
2130 block_pop(c, SETUP_LOOP);
2131 com_backpatch(c, break_anchor);
2132}
2133
2134static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002135com_list_if(struct compiling *c, node *n, node *e, char *t)
2136{
2137 int anchor = 0;
2138 int a = 0;
2139 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002140 com_node(c, CHILD(n, 1));
2141 com_addfwref(c, JUMP_IF_FALSE, &a);
2142 com_addbyte(c, POP_TOP);
2143 com_pop(c, 1);
2144 com_list_iter(c, n, e, t);
2145 com_addfwref(c, JUMP_FORWARD, &anchor);
2146 com_backpatch(c, a);
2147 /* We jump here with an extra entry which we now pop */
2148 com_addbyte(c, POP_TOP);
2149 com_backpatch(c, anchor);
2150}
2151
2152static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002153com_gen_if(struct compiling *c, node *n, node *t)
2154{
2155 /* gen_if: 'if' test [gen_iter] */
2156 int anchor = 0;
2157 int a=0;
2158
2159 com_node(c, CHILD(n, 1));
2160 com_addfwref(c, JUMP_IF_FALSE, &a);
2161 com_addbyte(c, POP_TOP);
2162 com_pop(c, 1);
2163
2164 if (NCH(n) == 3)
2165 com_gen_iter(c, CHILD(n, 2), t);
2166 else {
2167 com_test(c, t);
2168 com_addbyte(c, YIELD_VALUE);
2169 com_pop(c, 1);
2170 }
2171 com_addfwref(c, JUMP_FORWARD, &anchor);
2172 com_backpatch(c, a);
2173 /* We jump here with an extra entry which we now pop */
2174 com_addbyte(c, POP_TOP);
2175 com_backpatch(c, anchor);
2176}
2177
2178static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002179com_list_iter(struct compiling *c,
2180 node *p, /* parent of list_iter node */
2181 node *e, /* element expression node */
2182 char *t /* name of result list temp local */)
2183{
2184 /* list_iter is the last child in a listmaker, list_for, or list_if */
2185 node *n = CHILD(p, NCH(p)-1);
2186 if (TYPE(n) == list_iter) {
2187 n = CHILD(n, 0);
2188 switch (TYPE(n)) {
2189 case list_for:
2190 com_list_for(c, n, e, t);
2191 break;
2192 case list_if:
2193 com_list_if(c, n, e, t);
2194 break;
2195 default:
2196 com_error(c, PyExc_SystemError,
2197 "invalid list_iter node type");
2198 }
2199 }
2200 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002201 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002202 com_push(c, 1);
2203 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002204 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002205 com_pop(c, 2);
2206 }
2207}
2208
2209static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002210com_gen_iter(struct compiling *c, node *n, node *t)
2211{
2212 /* gen_iter: gen_for | gen_if */
2213 node *ch;
2214 REQ(n, gen_iter);
2215
2216 ch = CHILD(n, 0);
2217
2218 switch (TYPE(ch)) {
2219 case gen_for:
2220 com_gen_for(c, ch, t, 0);
2221 break;
2222 case gen_if:
2223 com_gen_if(c, ch, t);
2224 break;
2225 default:
2226 com_error(c, PyExc_SystemError,
2227 "invalid gen_iter node type");
2228 }
2229}
2230
2231static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002232com_list_comprehension(struct compiling *c, node *n)
2233{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002234 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002235 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002236
2237 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002238 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002239 com_addoparg(c, BUILD_LIST, 0);
2240 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2241 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002242 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002243 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002244 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002245 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002246 --c->c_tmpname;
2247}
2248
2249static void
2250com_listmaker(struct compiling *c, node *n)
2251{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002252 /* listmaker: test ( list_for | (',' test)* [','] ) */
2253 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002254 com_list_comprehension(c, n);
2255 else {
2256 int len = 0;
2257 int i;
2258 for (i = 0; i < NCH(n); i += 2, len++)
2259 com_node(c, CHILD(n, i));
2260 com_addoparg(c, BUILD_LIST, len);
2261 com_pop(c, len-1);
2262 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263}
2264
2265static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002266com_generator_expression(struct compiling *c, node *n)
2267{
2268 /* testlist_gexp: test gen_for */
2269 /* argument: test gen_for */
2270 PyCodeObject *co;
2271
2272 REQ(CHILD(n, 0), test);
2273 REQ(CHILD(n, 1), gen_for);
2274
2275 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2276 n->n_lineno);
2277 co = icompile(n, c);
2278 symtable_exit_scope(c->c_symtable);
2279
2280 if (co == NULL)
2281 c->c_errors++;
2282 else {
2283 int closure = com_make_closure(c, co);
2284 int i = com_addconst(c, (PyObject *)co);
2285
2286 com_addoparg(c, LOAD_CONST, i);
2287 com_push(c, 1);
2288 if (closure)
2289 com_addoparg(c, MAKE_CLOSURE, 0);
2290 else
2291 com_addoparg(c, MAKE_FUNCTION, 0);
2292
2293 com_test(c, CHILD(CHILD(n, 1), 3));
2294 com_addbyte(c, GET_ITER);
2295 com_addoparg(c, CALL_FUNCTION, 1);
2296 com_pop(c, 1);
2297
2298 Py_DECREF(co);
2299 }
2300}
2301
2302static void
2303com_testlist_gexp(struct compiling *c, node *n)
2304{
2305 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2306 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2307 com_generator_expression(c, n);
2308 else com_list(c, n, 0);
2309}
2310
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002311
Raymond Hettinger354433a2004-05-19 08:20:33 +00002312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002313com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002314{
2315 int i;
2316 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2317 for (i = 0; i+2 < NCH(n); i += 4) {
2318 /* We must arrange things just right for STORE_SUBSCR.
2319 It wants the stack to look like (value) (dict) (key) */
2320 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002321 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002322 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002323 com_node(c, CHILD(n, i+2)); /* value */
2324 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002325 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002326 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002327 }
2328}
2329
2330static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002331com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002332{
2333 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002335 int i;
2336 REQ(n, atom);
2337 ch = CHILD(n, 0);
2338 switch (TYPE(ch)) {
2339 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002340 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002342 com_push(c, 1);
2343 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002344 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002345 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002346 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002347 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002349 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_push(c, 1);
2351 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002353 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002354 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002355 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002356 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002357 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002358 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002359 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 break;
2361 case BACKQUOTE:
2362 com_node(c, CHILD(n, 1));
2363 com_addbyte(c, UNARY_CONVERT);
2364 break;
2365 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002366 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 i = 255;
2368 }
2369 else {
2370 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 }
2373 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 break;
2376 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002377 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002378 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002379 c->c_errors++;
2380 i = 255;
2381 }
2382 else {
2383 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002384 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 }
2386 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002387 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002388 break;
2389 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002390 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002391 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002392 break;
2393 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002394 com_error(c, PyExc_SystemError,
2395 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002396 }
2397}
2398
2399static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002400com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401{
2402 if (NCH(n) == 1) {
2403 com_addbyte(c, op);
2404 }
2405 else if (NCH(n) == 2) {
2406 if (TYPE(CHILD(n, 0)) != COLON) {
2407 com_node(c, CHILD(n, 0));
2408 com_addbyte(c, op+1);
2409 }
2410 else {
2411 com_node(c, CHILD(n, 1));
2412 com_addbyte(c, op+2);
2413 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002415 }
2416 else {
2417 com_node(c, CHILD(n, 0));
2418 com_node(c, CHILD(n, 2));
2419 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002420 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 }
2422}
2423
Guido van Rossum635abd21997-01-06 22:56:52 +00002424static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002425com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2426{
2427 if (NCH(n) == 1) {
2428 com_addbyte(c, DUP_TOP);
2429 com_push(c, 1);
2430 com_addbyte(c, SLICE);
2431 com_node(c, augn);
2432 com_addbyte(c, opcode);
2433 com_pop(c, 1);
2434 com_addbyte(c, ROT_TWO);
2435 com_addbyte(c, STORE_SLICE);
2436 com_pop(c, 2);
2437 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2438 com_node(c, CHILD(n, 0));
2439 com_addoparg(c, DUP_TOPX, 2);
2440 com_push(c, 2);
2441 com_addbyte(c, SLICE+1);
2442 com_pop(c, 1);
2443 com_node(c, augn);
2444 com_addbyte(c, opcode);
2445 com_pop(c, 1);
2446 com_addbyte(c, ROT_THREE);
2447 com_addbyte(c, STORE_SLICE+1);
2448 com_pop(c, 3);
2449 } else if (NCH(n) == 2) {
2450 com_node(c, CHILD(n, 1));
2451 com_addoparg(c, DUP_TOPX, 2);
2452 com_push(c, 2);
2453 com_addbyte(c, SLICE+2);
2454 com_pop(c, 1);
2455 com_node(c, augn);
2456 com_addbyte(c, opcode);
2457 com_pop(c, 1);
2458 com_addbyte(c, ROT_THREE);
2459 com_addbyte(c, STORE_SLICE+2);
2460 com_pop(c, 3);
2461 } else {
2462 com_node(c, CHILD(n, 0));
2463 com_node(c, CHILD(n, 2));
2464 com_addoparg(c, DUP_TOPX, 3);
2465 com_push(c, 3);
2466 com_addbyte(c, SLICE+3);
2467 com_pop(c, 2);
2468 com_node(c, augn);
2469 com_addbyte(c, opcode);
2470 com_pop(c, 1);
2471 com_addbyte(c, ROT_FOUR);
2472 com_addbyte(c, STORE_SLICE+3);
2473 com_pop(c, 4);
2474 }
2475}
2476
2477static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002478com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002479{
2480 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002481 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002482 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002483 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002485 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002486 }
2487 else {
2488 com_node(c, CHILD(n, 0));
2489 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002490 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002491 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002492 if (NCH(n) == 2) {
2493 com_generator_expression(c, n);
2494 return;
2495 }
2496
Guido van Rossumf10570b1995-07-07 22:53:21 +00002497 m = n;
2498 do {
2499 m = CHILD(m, 0);
2500 } while (NCH(m) == 1);
2501 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002502 /* f(lambda x: x[0] = 3) ends up getting parsed with
2503 * LHS test = lambda x: x[0], and RHS test = 3.
2504 * SF bug 132313 points out that complaining about a keyword
2505 * then is very confusing.
2506 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002507 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002508 TYPE(m) == lambdef ?
2509 "lambda cannot contain assignment" :
2510 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002511 }
2512 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002513 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002514 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002515 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002516 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002517 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002518 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002519 else if (*pkeywords == NULL) {
2520 c->c_errors++;
2521 Py_DECREF(v);
2522 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002523 if (PyDict_GetItem(*pkeywords, v) != NULL)
2524 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002525 "duplicate keyword argument");
2526 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002527 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002528 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002529 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002530 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002531 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002532 }
2533 }
2534 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002535}
2536
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002538com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002539{
2540 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002541 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002542 }
2543 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002544 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002545 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002546 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002547 int star_flag = 0;
2548 int starstar_flag = 0;
2549 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002550 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002551 na = 0;
2552 nk = 0;
2553 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002554 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002555 if (TYPE(ch) == STAR ||
2556 TYPE(ch) == DOUBLESTAR)
2557 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002558 if (ch->n_lineno != lineno) {
2559 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002560 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002561 }
2562 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002563 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002564 na++;
2565 else
2566 nk++;
2567 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002568 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002569 while (i < NCH(n)) {
2570 node *tok = CHILD(n, i);
2571 node *ch = CHILD(n, i+1);
2572 i += 3;
2573 switch (TYPE(tok)) {
2574 case STAR: star_flag = 1; break;
2575 case DOUBLESTAR: starstar_flag = 1; break;
2576 }
2577 com_node(c, ch);
2578 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002579 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002580 com_error(c, PyExc_SyntaxError,
2581 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002582 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002583 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002584 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002585 star_flag + (starstar_flag << 1);
2586 else
2587 opcode = CALL_FUNCTION;
2588 com_addoparg(c, opcode, na | (nk << 8));
2589 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002590 }
2591}
2592
2593static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002594com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595{
2596 com_addopname(c, LOAD_ATTR, n);
2597}
2598
2599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002600com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002601{
2602 int i=0;
2603 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002604 node *ch;
2605
2606 /* first argument */
2607 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002608 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002609 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002610 i++;
2611 }
2612 else {
2613 com_node(c, CHILD(n,i));
2614 i++;
2615 REQ(CHILD(n,i),COLON);
2616 i++;
2617 }
2618 /* second argument */
2619 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2620 com_node(c, CHILD(n,i));
2621 i++;
2622 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002623 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002624 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002625 com_push(c, 1);
2626 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002627 /* remaining arguments */
2628 for (; i < NCH(n); i++) {
2629 ns++;
2630 ch=CHILD(n,i);
2631 REQ(ch, sliceop);
2632 if (NCH(ch) == 1) {
2633 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002634 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002635 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002636 }
2637 else
2638 com_node(c, CHILD(ch,1));
2639 }
2640 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002642}
2643
2644static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002645com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002646{
2647 node *ch;
2648 REQ(n, subscript);
2649 ch = CHILD(n,0);
2650 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002652 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002653 com_push(c, 1);
2654 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002655 else {
2656 /* check for slice */
2657 if ((TYPE(ch) == COLON || NCH(n) > 1))
2658 com_sliceobj(c, n);
2659 else {
2660 REQ(ch, test);
2661 com_node(c, ch);
2662 }
2663 }
2664}
2665
2666static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002667com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002668{
2669 int i, op;
2670 REQ(n, subscriptlist);
2671 /* Check to make backward compatible slice behavior for '[i:j]' */
2672 if (NCH(n) == 1) {
2673 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002674 /* 'Basic' slice, should have exactly one colon. */
2675 if ((TYPE(CHILD(sub, 0)) == COLON
2676 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2677 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2678 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002679 switch (assigning) {
2680 case OP_DELETE:
2681 op = DELETE_SLICE;
2682 break;
2683 case OP_ASSIGN:
2684 op = STORE_SLICE;
2685 break;
2686 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002687 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002688 break;
2689 default:
2690 com_augassign_slice(c, sub, assigning, augn);
2691 return;
2692 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002693 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002694 if (op == STORE_SLICE)
2695 com_pop(c, 2);
2696 else if (op == DELETE_SLICE)
2697 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002698 return;
2699 }
2700 }
2701 /* Else normal subscriptlist. Compile each subscript. */
2702 for (i = 0; i < NCH(n); i += 2)
2703 com_subscript(c, CHILD(n, i));
2704 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 if (NCH(n) > 1) {
2706 i = (NCH(n)+1) / 2;
2707 com_addoparg(c, BUILD_TUPLE, i);
2708 com_pop(c, i-1);
2709 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002710 switch (assigning) {
2711 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002712 op = DELETE_SUBSCR;
2713 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002714 break;
2715 default:
2716 case OP_ASSIGN:
2717 op = STORE_SUBSCR;
2718 i = 3;
2719 break;
2720 case OP_APPLY:
2721 op = BINARY_SUBSCR;
2722 i = 1;
2723 break;
2724 }
2725 if (assigning > OP_APPLY) {
2726 com_addoparg(c, DUP_TOPX, 2);
2727 com_push(c, 2);
2728 com_addbyte(c, BINARY_SUBSCR);
2729 com_pop(c, 1);
2730 com_node(c, augn);
2731 com_addbyte(c, assigning);
2732 com_pop(c, 1);
2733 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002734 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002735 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002736 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002737}
2738
2739static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002740com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002741{
2742 REQ(n, trailer);
2743 switch (TYPE(CHILD(n, 0))) {
2744 case LPAR:
2745 com_call_function(c, CHILD(n, 1));
2746 break;
2747 case DOT:
2748 com_select_member(c, CHILD(n, 1));
2749 break;
2750 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002751 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 break;
2753 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002754 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002755 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 }
2757}
2758
2759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002761{
2762 int i;
2763 REQ(n, power);
2764 com_atom(c, CHILD(n, 0));
2765 for (i = 1; i < NCH(n); i++) {
2766 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2767 com_factor(c, CHILD(n, i+1));
2768 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002769 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002770 break;
2771 }
2772 else
2773 com_apply_trailer(c, CHILD(n, i));
2774 }
2775}
2776
2777static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002778com_invert_constant(struct compiling *c, node *n)
2779{
2780 /* Compute the inverse of int and longs and use them directly,
2781 but be prepared to generate code for all other
2782 possibilities (invalid numbers, floats, complex).
2783 */
2784 PyObject *num, *inv = NULL;
2785 int i;
2786
2787 REQ(n, NUMBER);
2788 num = parsenumber(c, STR(n));
2789 if (num == NULL)
2790 i = 255;
2791 else {
2792 inv = PyNumber_Invert(num);
2793 if (inv == NULL) {
2794 PyErr_Clear();
2795 i = com_addconst(c, num);
2796 } else {
2797 i = com_addconst(c, inv);
2798 Py_DECREF(inv);
2799 }
2800 Py_DECREF(num);
2801 }
2802 com_addoparg(c, LOAD_CONST, i);
2803 com_push(c, 1);
2804 if (num != NULL && inv == NULL)
2805 com_addbyte(c, UNARY_INVERT);
2806}
2807
Tim Peters51e26512001-09-07 08:45:55 +00002808static int
2809is_float_zero(const char *p)
2810{
2811 int found_radix_point = 0;
2812 int ch;
2813 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2814 switch (ch) {
2815 case '0':
2816 /* no reason to believe it's not 0 -- continue */
2817 break;
2818
2819 case 'e': case 'E': case 'j': case 'J':
2820 /* If this was a hex constant, we already would have
2821 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2822 must be an exponent marker, and we haven't yet
2823 seen a non-zero digit, and it doesn't matter what
2824 the exponent is then. For 'j' or 'J' similarly,
2825 except that this is an imaginary 0 then. */
2826 return 1;
2827
2828 case '.':
2829 found_radix_point = 1;
2830 break;
2831
2832 default:
2833 return 0;
2834 }
2835 }
2836 return found_radix_point;
2837}
2838
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002839static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002840com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002841{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002842 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002843 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002844 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002845 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002846 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002847 approriate value as a constant. If the value is negative,
2848 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002849 negative in the 0th position -- unless we're doing unary minus
2850 of a floating zero! In that case the sign is significant, but
2851 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002852 */
2853 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002854 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002855 && TYPE((pfactor = CHILD(n, 1))) == factor
2856 && NCH(pfactor) == 1
2857 && TYPE((ppower = CHILD(pfactor, 0))) == power
2858 && NCH(ppower) == 1
2859 && TYPE((patom = CHILD(ppower, 0))) == atom
2860 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002861 && !(childtype == MINUS &&
2862 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002863 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002864 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002865 return;
2866 }
2867 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002868 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002869 if (s == NULL) {
2870 com_error(c, PyExc_MemoryError, "");
2871 com_addbyte(c, 255);
2872 return;
2873 }
2874 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002875 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002876 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002877 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002878 }
Tim Peters51e26512001-09-07 08:45:55 +00002879 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002880 }
2881 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002882 com_factor(c, CHILD(n, 1));
2883 com_addbyte(c, UNARY_POSITIVE);
2884 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002885 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886 com_factor(c, CHILD(n, 1));
2887 com_addbyte(c, UNARY_NEGATIVE);
2888 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002889 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002890 com_factor(c, CHILD(n, 1));
2891 com_addbyte(c, UNARY_INVERT);
2892 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002893 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002894 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002895 }
2896}
2897
2898static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002899com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002900{
2901 int i;
2902 int op;
2903 REQ(n, term);
2904 com_factor(c, CHILD(n, 0));
2905 for (i = 2; i < NCH(n); i += 2) {
2906 com_factor(c, CHILD(n, i));
2907 switch (TYPE(CHILD(n, i-1))) {
2908 case STAR:
2909 op = BINARY_MULTIPLY;
2910 break;
2911 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002912 if (c->c_flags & CO_FUTURE_DIVISION)
2913 op = BINARY_TRUE_DIVIDE;
2914 else
2915 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 break;
2917 case PERCENT:
2918 op = BINARY_MODULO;
2919 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002920 case DOUBLESLASH:
2921 op = BINARY_FLOOR_DIVIDE;
2922 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002923 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002924 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002925 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002926 op = 255;
2927 }
2928 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002929 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002930 }
2931}
2932
2933static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002934com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002935{
2936 int i;
2937 int op;
2938 REQ(n, arith_expr);
2939 com_term(c, CHILD(n, 0));
2940 for (i = 2; i < NCH(n); i += 2) {
2941 com_term(c, CHILD(n, i));
2942 switch (TYPE(CHILD(n, i-1))) {
2943 case PLUS:
2944 op = BINARY_ADD;
2945 break;
2946 case MINUS:
2947 op = BINARY_SUBTRACT;
2948 break;
2949 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002951 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002952 op = 255;
2953 }
2954 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002955 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002956 }
2957}
2958
2959static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002960com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002961{
2962 int i;
2963 int op;
2964 REQ(n, shift_expr);
2965 com_arith_expr(c, CHILD(n, 0));
2966 for (i = 2; i < NCH(n); i += 2) {
2967 com_arith_expr(c, CHILD(n, i));
2968 switch (TYPE(CHILD(n, i-1))) {
2969 case LEFTSHIFT:
2970 op = BINARY_LSHIFT;
2971 break;
2972 case RIGHTSHIFT:
2973 op = BINARY_RSHIFT;
2974 break;
2975 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002976 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002977 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002978 op = 255;
2979 }
2980 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002981 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002982 }
2983}
2984
2985static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002986com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002987{
2988 int i;
2989 int op;
2990 REQ(n, and_expr);
2991 com_shift_expr(c, CHILD(n, 0));
2992 for (i = 2; i < NCH(n); i += 2) {
2993 com_shift_expr(c, CHILD(n, i));
2994 if (TYPE(CHILD(n, i-1)) == AMPER) {
2995 op = BINARY_AND;
2996 }
2997 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002998 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002999 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003000 op = 255;
3001 }
3002 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003003 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003004 }
3005}
3006
3007static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003008com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003009{
3010 int i;
3011 int op;
3012 REQ(n, xor_expr);
3013 com_and_expr(c, CHILD(n, 0));
3014 for (i = 2; i < NCH(n); i += 2) {
3015 com_and_expr(c, CHILD(n, i));
3016 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3017 op = BINARY_XOR;
3018 }
3019 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003020 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003021 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003022 op = 255;
3023 }
3024 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003025 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 }
3027}
3028
3029static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003030com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003031{
3032 int i;
3033 int op;
3034 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003035 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003037 com_xor_expr(c, CHILD(n, i));
3038 if (TYPE(CHILD(n, i-1)) == VBAR) {
3039 op = BINARY_OR;
3040 }
3041 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003042 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003043 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044 op = 255;
3045 }
3046 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003047 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 }
3049}
3050
3051static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003052cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053{
3054 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003055 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3057 if (NCH(n) == 1) {
3058 n = CHILD(n, 0);
3059 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003060 case LESS: return PyCmp_LT;
3061 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003062 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003063 case LESSEQUAL: return PyCmp_LE;
3064 case GREATEREQUAL: return PyCmp_GE;
3065 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3066 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3067 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068 }
3069 }
3070 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003073 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003075 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076 }
3077 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003078 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079}
3080
3081static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003082com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003083{
3084 int i;
3085 enum cmp_op op;
3086 int anchor;
3087 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3088 com_expr(c, CHILD(n, 0));
3089 if (NCH(n) == 1)
3090 return;
3091
3092 /****************************************************************
3093 The following code is generated for all but the last
3094 comparison in a chain:
3095
3096 label: on stack: opcode: jump to:
3097
3098 a <code to load b>
3099 a, b DUP_TOP
3100 a, b, b ROT_THREE
3101 b, a, b COMPARE_OP
3102 b, 0-or-1 JUMP_IF_FALSE L1
3103 b, 1 POP_TOP
3104 b
3105
3106 We are now ready to repeat this sequence for the next
3107 comparison in the chain.
3108
3109 For the last we generate:
3110
3111 b <code to load c>
3112 b, c COMPARE_OP
3113 0-or-1
3114
3115 If there were any jumps to L1 (i.e., there was more than one
3116 comparison), we generate:
3117
3118 0-or-1 JUMP_FORWARD L2
3119 L1: b, 0 ROT_TWO
3120 0, b POP_TOP
3121 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003122 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003123 ****************************************************************/
3124
3125 anchor = 0;
3126
3127 for (i = 2; i < NCH(n); i += 2) {
3128 com_expr(c, CHILD(n, i));
3129 if (i+2 < NCH(n)) {
3130 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003131 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003132 com_addbyte(c, ROT_THREE);
3133 }
3134 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003135 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003136 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003137 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 }
3139 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 if (i+2 < NCH(n)) {
3142 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3143 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003144 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003145 }
3146 }
3147
3148 if (anchor) {
3149 int anchor2 = 0;
3150 com_addfwref(c, JUMP_FORWARD, &anchor2);
3151 com_backpatch(c, anchor);
3152 com_addbyte(c, ROT_TWO);
3153 com_addbyte(c, POP_TOP);
3154 com_backpatch(c, anchor2);
3155 }
3156}
3157
3158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003159com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003160{
3161 REQ(n, not_test); /* 'not' not_test | comparison */
3162 if (NCH(n) == 1) {
3163 com_comparison(c, CHILD(n, 0));
3164 }
3165 else {
3166 com_not_test(c, CHILD(n, 1));
3167 com_addbyte(c, UNARY_NOT);
3168 }
3169}
3170
3171static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003172com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173{
3174 int i;
3175 int anchor;
3176 REQ(n, and_test); /* not_test ('and' not_test)* */
3177 anchor = 0;
3178 i = 0;
3179 for (;;) {
3180 com_not_test(c, CHILD(n, i));
3181 if ((i += 2) >= NCH(n))
3182 break;
3183 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3184 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003185 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186 }
3187 if (anchor)
3188 com_backpatch(c, anchor);
3189}
3190
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003191static int
3192com_make_closure(struct compiling *c, PyCodeObject *co)
3193{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003194 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003195 if (free == 0)
3196 return 0;
3197 for (i = 0; i < free; ++i) {
3198 /* Bypass com_addop_varname because it will generate
3199 LOAD_DEREF but LOAD_CLOSURE is needed.
3200 */
3201 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3202 int arg, reftype;
3203
3204 /* Special case: If a class contains a method with a
3205 free variable that has the same name as a method,
3206 the name will be considered free *and* local in the
3207 class. It should be handled by the closure, as
3208 well as by the normal name loookup logic.
3209 */
3210 reftype = get_ref_type(c, PyString_AS_STRING(name));
3211 if (reftype == CELL)
3212 arg = com_lookup_arg(c->c_cellvars, name);
3213 else /* (reftype == FREE) */
3214 arg = com_lookup_arg(c->c_freevars, name);
3215 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003216 fprintf(stderr, "lookup %s in %s %d %d\n"
3217 "freevars of %s: %s\n",
3218 PyObject_REPR(name),
3219 c->c_name,
3220 reftype, arg,
3221 PyString_AS_STRING(co->co_name),
3222 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003223 Py_FatalError("com_make_closure()");
3224 }
3225 com_addoparg(c, LOAD_CLOSURE, arg);
3226
3227 }
3228 com_push(c, free);
3229 return 1;
3230}
3231
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003232static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003233com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003235 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003236 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003237 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003238 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003239 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003240 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3241 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003242 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003243 if (co == NULL) {
3244 c->c_errors++;
3245 return;
3246 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003247 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003248 i = com_addconst(c, (PyObject *)co);
3249 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003250 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003251 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003252 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003253 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003254 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003255 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003256 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003257 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003258 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003259 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003260 else {
3261 int anchor = 0;
3262 int i = 0;
3263 for (;;) {
3264 com_and_test(c, CHILD(n, i));
3265 if ((i += 2) >= NCH(n))
3266 break;
3267 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3268 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003269 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003270 }
3271 if (anchor)
3272 com_backpatch(c, anchor);
3273 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274}
3275
3276static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003277com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003278{
3279 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003280 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281 com_node(c, CHILD(n, 0));
3282 }
3283 else {
3284 int i;
3285 int len;
3286 len = (NCH(n) + 1) / 2;
3287 for (i = 0; i < NCH(n); i += 2)
3288 com_node(c, CHILD(n, i));
3289 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003291 }
3292}
3293
3294
3295/* Begin of assignment compilation */
3296
Thomas Wouters434d0822000-08-24 20:11:32 +00003297
3298static void
3299com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3300{
3301 com_addbyte(c, DUP_TOP);
3302 com_push(c, 1);
3303 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003304 com_node(c, augn);
3305 com_addbyte(c, opcode);
3306 com_pop(c, 1);
3307 com_addbyte(c, ROT_TWO);
3308 com_addopname(c, STORE_ATTR, n);
3309 com_pop(c, 2);
3310}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003311
3312static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003313com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003315 if (none_assignment_check(c, STR(n), assigning))
3316 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003318 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003319}
3320
3321static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003322com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003324 REQ(n, trailer);
3325 switch (TYPE(CHILD(n, 0))) {
3326 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003327 if (assigning == OP_DELETE)
3328 com_error(c, PyExc_SyntaxError,
3329 "can't delete function call");
3330 else
3331 com_error(c, PyExc_SyntaxError,
3332 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003333 break;
3334 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003335 if (assigning > OP_APPLY)
3336 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3337 else
3338 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003340 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003341 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003342 break;
3343 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003344 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 }
3346}
3347
3348static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003349com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350{
3351 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003352 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3353 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003354 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003355 if (assigning) {
3356 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003357 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003358 com_push(c, i-1);
3359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003361 com_assign(c, CHILD(n, i), assigning, NULL);
3362}
3363
3364static void
3365com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3366{
3367 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003368 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003369 com_push(c, 1);
3370 com_node(c, augn);
3371 com_addbyte(c, opcode);
3372 com_pop(c, 1);
3373 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003374}
3375
3376static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003377com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003378{
3379 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003380 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 if (assigning)
3382 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003383}
3384
3385static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003386com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003387{
3388 /* Loop to avoid trivial recursion */
3389 for (;;) {
3390 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003391
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003392 case exprlist:
3393 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003394 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003395 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003396 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003397 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003398 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003399 "assign to generator expression not possible");
3400 return;
3401 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003402 if (assigning > OP_APPLY) {
3403 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003404 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003405 return;
3406 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003407 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408 return;
3409 }
3410 n = CHILD(n, 0);
3411 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003412
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413 case test:
3414 case and_test:
3415 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003416 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003417 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003418 case xor_expr:
3419 case and_expr:
3420 case shift_expr:
3421 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003423 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003424 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003425 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003426 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003427 return;
3428 }
3429 n = CHILD(n, 0);
3430 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003431
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003432 case power: /* atom trailer* ('**' power)*
3433 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003434 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003435 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003436 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003437 return;
3438 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003439 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003440 int i;
3441 com_node(c, CHILD(n, 0));
3442 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003443 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003444 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003445 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003446 return;
3447 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 com_apply_trailer(c, CHILD(n, i));
3449 } /* NB i is still alive */
3450 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003451 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003452 return;
3453 }
3454 n = CHILD(n, 0);
3455 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003456
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003457 case atom:
3458 switch (TYPE(CHILD(n, 0))) {
3459 case LPAR:
3460 n = CHILD(n, 1);
3461 if (TYPE(n) == RPAR) {
3462 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003463 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003464 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003465 return;
3466 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003467 if (assigning > OP_APPLY) {
3468 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003469 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003470 return;
3471 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472 break;
3473 case LSQB:
3474 n = CHILD(n, 1);
3475 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003476 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003477 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 return;
3479 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003480 if (assigning > OP_APPLY) {
3481 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003482 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003483 return;
3484 }
3485 if (NCH(n) > 1
3486 && TYPE(CHILD(n, 1)) == list_for) {
3487 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003488 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003489 return;
3490 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003491 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 return;
3493 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003494 if (assigning > OP_APPLY)
3495 com_augassign_name(c, CHILD(n, 0),
3496 assigning, augn);
3497 else
3498 com_assign_name(c, CHILD(n, 0),
3499 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003500 return;
3501 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003502 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003503 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 return;
3505 }
3506 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003507
3508 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003509 com_error(c, PyExc_SyntaxError,
3510 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003511 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003512
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003513 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003514 com_error(c, PyExc_SystemError,
3515 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003516 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003517
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 }
3519 }
3520}
Guido van Rossum7c531111997-03-11 18:42:21 +00003521
Thomas Wouters434d0822000-08-24 20:11:32 +00003522static void
3523com_augassign(struct compiling *c, node *n)
3524{
3525 int opcode;
3526
3527 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3528 case '+': opcode = INPLACE_ADD; break;
3529 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003530 case '/':
3531 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3532 opcode = INPLACE_FLOOR_DIVIDE;
3533 else if (c->c_flags & CO_FUTURE_DIVISION)
3534 opcode = INPLACE_TRUE_DIVIDE;
3535 else
3536 opcode = INPLACE_DIVIDE;
3537 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003538 case '%': opcode = INPLACE_MODULO; break;
3539 case '<': opcode = INPLACE_LSHIFT; break;
3540 case '>': opcode = INPLACE_RSHIFT; break;
3541 case '&': opcode = INPLACE_AND; break;
3542 case '^': opcode = INPLACE_XOR; break;
3543 case '|': opcode = INPLACE_OR; break;
3544 case '*':
3545 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3546 opcode = INPLACE_POWER;
3547 else
3548 opcode = INPLACE_MULTIPLY;
3549 break;
3550 default:
3551 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3552 return;
3553 }
3554 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3555}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003556
3557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003558com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003559{
Thomas Wouters434d0822000-08-24 20:11:32 +00003560 REQ(n, expr_stmt);
3561 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003562 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003563 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003565 if (NCH(n) == 1) {
3566 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003567 if (c->c_interactive)
3568 com_addbyte(c, PRINT_EXPR);
3569 else
3570 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003571 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003572 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003573 else if (TYPE(CHILD(n,1)) == augassign)
3574 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003575 else {
3576 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003577 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003578 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003579 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003580 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003581 com_push(c, 1);
3582 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003583 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003584 }
3585 }
3586}
3587
3588static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003589com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003590{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003591 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003592 int i;
3593 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003594 if (Py_OptimizeFlag)
3595 return;
3596 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003597
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003598 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003599 raise AssertionError [, <message>]
3600
3601 where <message> is the second test, if present.
3602 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003603 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003604 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003605 com_addbyte(c, POP_TOP);
3606 com_pop(c, 1);
3607 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003608 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003609 com_push(c, 1);
3610 i = NCH(n)/2; /* Either 2 or 4 */
3611 if (i > 1)
3612 com_node(c, CHILD(n, 3));
3613 com_addoparg(c, RAISE_VARARGS, i);
3614 com_pop(c, i);
3615 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003616 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003617 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003618 com_addbyte(c, POP_TOP);
3619}
3620
3621static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003622com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003623{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003624 int i = 1;
3625 node* stream = NULL;
3626
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003627 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003628
3629 /* are we using the extended print form? */
3630 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3631 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003632 com_node(c, stream);
3633 /* stack: [...] => [... stream] */
3634 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003635 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3636 i = 4;
3637 else
3638 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003639 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003640 for (; i < NCH(n); i += 2) {
3641 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003642 com_addbyte(c, DUP_TOP);
3643 /* stack: [stream] => [stream stream] */
3644 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003645 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003646 /* stack: [stream stream] => [stream stream obj] */
3647 com_addbyte(c, ROT_TWO);
3648 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003649 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003650 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003651 com_pop(c, 2);
3652 }
3653 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003654 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003655 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003656 com_addbyte(c, PRINT_ITEM);
3657 com_pop(c, 1);
3658 }
3659 }
3660 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003661 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003662 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003663 /* must pop the extra stream object off the stack */
3664 com_addbyte(c, POP_TOP);
3665 /* stack: [... stream] => [...] */
3666 com_pop(c, 1);
3667 }
3668 }
3669 else {
3670 if (stream != NULL) {
3671 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003672 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003673 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003674 com_pop(c, 1);
3675 }
3676 else
3677 com_addbyte(c, PRINT_NEWLINE);
3678 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003679}
3680
3681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003682com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003683{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003684 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003685 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003686 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003687 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003688 if (c->c_flags & CO_GENERATOR) {
3689 if (NCH(n) > 1) {
3690 com_error(c, PyExc_SyntaxError,
3691 "'return' with argument inside generator");
3692 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003693 }
3694 if (NCH(n) < 2) {
3695 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003696 com_push(c, 1);
3697 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003698 else
3699 com_node(c, CHILD(n, 1));
3700 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003701 com_pop(c, 1);
3702}
3703
3704static void
3705com_yield_stmt(struct compiling *c, node *n)
3706{
Tim Peters95c80f82001-06-23 02:07:08 +00003707 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003708 REQ(n, yield_stmt); /* 'yield' testlist */
3709 if (!c->c_infunction) {
3710 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3711 }
Tim Peters95c80f82001-06-23 02:07:08 +00003712
3713 for (i = 0; i < c->c_nblocks; ++i) {
3714 if (c->c_block[i] == SETUP_FINALLY) {
3715 com_error(c, PyExc_SyntaxError,
3716 "'yield' not allowed in a 'try' block "
3717 "with a 'finally' clause");
3718 return;
3719 }
3720 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003721 com_node(c, CHILD(n, 1));
3722 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003723 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724}
3725
3726static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003727com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003728{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003730 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3731 if (NCH(n) > 1) {
3732 com_node(c, CHILD(n, 1));
3733 if (NCH(n) > 3) {
3734 com_node(c, CHILD(n, 3));
3735 if (NCH(n) > 5)
3736 com_node(c, CHILD(n, 5));
3737 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003738 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 i = NCH(n)/2;
3740 com_addoparg(c, RAISE_VARARGS, i);
3741 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742}
3743
3744static void
Thomas Wouters52152252000-08-17 22:55:00 +00003745com_from_import(struct compiling *c, node *n)
3746{
3747 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3748 com_push(c, 1);
3749 if (NCH(n) > 1) {
3750 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3751 com_error(c, PyExc_SyntaxError, "invalid syntax");
3752 return;
3753 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003754 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003755 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003756 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003757 com_pop(c, 1);
3758}
3759
3760static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003761com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003763 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 int i;
3765 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003766 n = CHILD(n, 0);
3767 /* import_stmt: import_name | import_from */
3768 if (TYPE(n) == import_from) {
3769 /* 'from' dotted_name 'import' ('*' |
3770 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003771 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003772 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003773 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3774 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003775 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003776 else {
3777 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3778 TYPE(CHILD(n, 3)) != LPAR) {
3779 com_error(c, PyExc_SyntaxError,
3780 "trailing comma not allowed "
3781 "without surrounding parentheses");
3782 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003783 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003784 REQ(nn, import_as_names);
3785 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003786 for (i = 0; i < NCH(nn); i += 2) {
3787 PyObject *s = PyString_FromString(
3788 STR(CHILD(CHILD(nn, i), 0)));
3789 if (s == NULL) {
3790 Py_CLEAR(tup);
3791 break;
3792 } else
3793 PyTuple_SET_ITEM(tup, i / 2, s);
3794 }
3795 if (tup == NULL) {
3796 /* Assume that failue above was MemoryError */
3797 com_error(c, PyExc_MemoryError, "");
3798 return;
3799 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003800 }
3801 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003802 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003803 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003804 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003805 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003806 com_addbyte(c, IMPORT_STAR);
3807 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003808 for (i = 0; i < NCH(nn); i += 2)
3809 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003810 com_addbyte(c, POP_TOP);
3811 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003812 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813 }
3814 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003815 /* 'import' dotted_as_names */
3816 nn = CHILD(n, 1);
3817 REQ(nn, dotted_as_names);
3818 for (i = 0; i < NCH(nn); i += 2) {
3819 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003820 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003821 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003822 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003823 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003824 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003825 int j;
3826 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003827 com_error(c, PyExc_SyntaxError,
3828 "invalid syntax");
3829 return;
3830 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003831 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3832 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003833 CHILD(CHILD(subn, 0),
3834 j));
3835 com_addop_varname(c, VAR_STORE,
3836 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003837 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003838 com_addop_varname(c, VAR_STORE,
3839 STR(CHILD(CHILD(subn, 0),
3840 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003841 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003842 }
3843 }
3844}
3845
3846static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003847com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003848{
3849 REQ(n, exec_stmt);
3850 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3851 com_node(c, CHILD(n, 1));
3852 if (NCH(n) >= 4)
3853 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003854 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003855 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003856 com_push(c, 1);
3857 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003858 if (NCH(n) >= 6)
3859 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003860 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003861 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003862 com_push(c, 1);
3863 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003864 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003865 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003866}
3867
Guido van Rossum7c531111997-03-11 18:42:21 +00003868static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003869is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003870{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003871 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003872 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003873 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003874
3875 /* Label to avoid tail recursion */
3876 next:
3877 switch (TYPE(n)) {
3878
3879 case suite:
3880 if (NCH(n) == 1) {
3881 n = CHILD(n, 0);
3882 goto next;
3883 }
3884 /* Fall through */
3885 case file_input:
3886 for (i = 0; i < NCH(n); i++) {
3887 node *ch = CHILD(n, i);
3888 if (TYPE(ch) == stmt) {
3889 n = ch;
3890 goto next;
3891 }
3892 }
3893 break;
3894
3895 case stmt:
3896 case simple_stmt:
3897 case small_stmt:
3898 n = CHILD(n, 0);
3899 goto next;
3900
3901 case expr_stmt:
3902 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003903 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003904 case test:
3905 case and_test:
3906 case not_test:
3907 case comparison:
3908 case expr:
3909 case xor_expr:
3910 case and_expr:
3911 case shift_expr:
3912 case arith_expr:
3913 case term:
3914 case factor:
3915 case power:
3916 case atom:
3917 if (NCH(n) == 1) {
3918 n = CHILD(n, 0);
3919 goto next;
3920 }
3921 break;
3922
3923 case NAME:
3924 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3925 return 1;
3926 break;
3927
3928 case NUMBER:
3929 v = parsenumber(c, STR(n));
3930 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003931 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003932 break;
3933 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003934 i = PyObject_IsTrue(v);
3935 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003936 return i == 0;
3937
3938 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003939 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003940 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003941 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003942 break;
3943 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003944 i = PyObject_IsTrue(v);
3945 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003946 return i == 0;
3947
3948 }
3949 return 0;
3950}
3951
Tim Peters08a898f2001-06-28 01:52:22 +00003952
3953/* Look under n for a return stmt with an expression.
3954 * This hack is used to find illegal returns under "if 0:" blocks in
3955 * functions already known to be generators (as determined by the symtable
3956 * pass).
3957 * Return the offending return node if found, else NULL.
3958 */
3959static node *
3960look_for_offending_return(node *n)
3961{
3962 int i;
3963
3964 for (i = 0; i < NCH(n); ++i) {
3965 node *kid = CHILD(n, i);
3966
3967 switch (TYPE(kid)) {
3968 case classdef:
3969 case funcdef:
3970 case lambdef:
3971 /* Stuff in nested functions & classes doesn't
3972 affect the code block we started in. */
3973 return NULL;
3974
3975 case return_stmt:
3976 if (NCH(kid) > 1)
3977 return kid;
3978 break;
3979
3980 default: {
3981 node *bad = look_for_offending_return(kid);
3982 if (bad != NULL)
3983 return bad;
3984 }
3985 }
3986 }
3987
3988 return NULL;
3989}
3990
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003992com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003993{
3994 int i;
3995 int anchor = 0;
3996 REQ(n, if_stmt);
3997 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3998 for (i = 0; i+3 < NCH(n); i+=4) {
3999 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004000 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004001 if (is_constant_false(c, ch)) {
4002 /* We're going to skip this block. However, if this
4003 is a generator, we have to check the dead code
4004 anyway to make sure there aren't any return stmts
4005 with expressions, in the same scope. */
4006 if (c->c_flags & CO_GENERATOR) {
4007 node *p = look_for_offending_return(n);
4008 if (p != NULL) {
4009 int savelineno = c->c_lineno;
4010 c->c_lineno = p->n_lineno;
4011 com_error(c, PyExc_SyntaxError,
4012 "'return' with argument "
4013 "inside generator");
4014 c->c_lineno = savelineno;
4015 }
4016 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004017 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004018 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004019 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004020 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004021 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004022 com_addfwref(c, JUMP_IF_FALSE, &a);
4023 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004024 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004025 com_node(c, CHILD(n, i+3));
4026 com_addfwref(c, JUMP_FORWARD, &anchor);
4027 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004028 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004029 com_addbyte(c, POP_TOP);
4030 }
4031 if (i+2 < NCH(n))
4032 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004033 if (anchor)
4034 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035}
4036
4037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004038com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004039{
4040 int break_anchor = 0;
4041 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004042 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004043 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4044 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004045 block_push(c, SETUP_LOOP);
4046 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004047 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048 com_node(c, CHILD(n, 1));
4049 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4050 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004051 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004052 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004053 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004054 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004055 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4056 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004057 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004058 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059 com_addbyte(c, POP_TOP);
4060 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004061 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004062 if (NCH(n) > 4)
4063 com_node(c, CHILD(n, 6));
4064 com_backpatch(c, break_anchor);
4065}
4066
4067static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004068com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004070 int break_anchor = 0;
4071 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004072 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073 REQ(n, for_stmt);
4074 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4075 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004076 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004077 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004078 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004079 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004080 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004081 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004082 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004083 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004084 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004086 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004087 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4088 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004089 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004090 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004092 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004093 if (NCH(n) > 8)
4094 com_node(c, CHILD(n, 8));
4095 com_backpatch(c, break_anchor);
4096}
4097
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004098/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004099
4100 SETUP_FINALLY L
4101 <code for S>
4102 POP_BLOCK
4103 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004104 L: <code for Sf>
4105 END_FINALLY
4106
4107 The special instructions use the block stack. Each block
4108 stack entry contains the instruction that created it (here
4109 SETUP_FINALLY), the level of the value stack at the time the
4110 block stack entry was created, and a label (here L).
4111
4112 SETUP_FINALLY:
4113 Pushes the current value stack level and the label
4114 onto the block stack.
4115 POP_BLOCK:
4116 Pops en entry from the block stack, and pops the value
4117 stack until its level is the same as indicated on the
4118 block stack. (The label is ignored.)
4119 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004120 Pops a variable number of entries from the *value* stack
4121 and re-raises the exception they specify. The number of
4122 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004123
4124 The block stack is unwound when an exception is raised:
4125 when a SETUP_FINALLY entry is found, the exception is pushed
4126 onto the value stack (and the exception condition is cleared),
4127 and the interpreter jumps to the label gotten from the block
4128 stack.
4129
4130 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004131 (The contents of the value stack is shown in [], with the top
4132 at the right; 'tb' is trace-back info, 'val' the exception's
4133 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004134
4135 Value stack Label Instruction Argument
4136 [] SETUP_EXCEPT L1
4137 [] <code for S>
4138 [] POP_BLOCK
4139 [] JUMP_FORWARD L0
4140
Guido van Rossum3f5da241990-12-20 15:06:42 +00004141 [tb, val, exc] L1: DUP )
4142 [tb, val, exc, exc] <evaluate E1> )
4143 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4144 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4145 [tb, val, exc, 1] POP )
4146 [tb, val, exc] POP
4147 [tb, val] <assign to V1> (or POP if no V1)
4148 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004149 [] <code for S1>
4150 JUMP_FORWARD L0
4151
Guido van Rossum3f5da241990-12-20 15:06:42 +00004152 [tb, val, exc, 0] L2: POP
4153 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004154 .............................etc.......................
4155
Guido van Rossum3f5da241990-12-20 15:06:42 +00004156 [tb, val, exc, 0] Ln+1: POP
4157 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004158
4159 [] L0: <next statement>
4160
4161 Of course, parts are not generated if Vi or Ei is not present.
4162*/
4163
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004165com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004166{
4167 int except_anchor = 0;
4168 int end_anchor = 0;
4169 int else_anchor = 0;
4170 int i;
4171 node *ch;
4172
4173 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4174 block_push(c, SETUP_EXCEPT);
4175 com_node(c, CHILD(n, 2));
4176 com_addbyte(c, POP_BLOCK);
4177 block_pop(c, SETUP_EXCEPT);
4178 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4179 com_backpatch(c, except_anchor);
4180 for (i = 3;
4181 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4182 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004183 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004184 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004185 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004186 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004187 break;
4188 }
4189 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004190 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004191 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004192 if (NCH(ch) > 1) {
4193 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004194 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004195 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004196 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004197 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004198 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4199 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004200 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004201 }
4202 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004203 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004204 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004205 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004206 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004207 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004208 com_pop(c, 1);
4209 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004210 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004211 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004212 com_node(c, CHILD(n, i+2));
4213 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4214 if (except_anchor) {
4215 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004216 /* We come in with [tb, val, exc, 0] on the
4217 stack; one pop and it's the same as
4218 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004219 com_addbyte(c, POP_TOP);
4220 }
4221 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 /* We actually come in here with [tb, val, exc] but the
4223 END_FINALLY will zap those and jump around.
4224 The c_stacklevel does not reflect them so we need not pop
4225 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004226 com_addbyte(c, END_FINALLY);
4227 com_backpatch(c, else_anchor);
4228 if (i < NCH(n))
4229 com_node(c, CHILD(n, i+2));
4230 com_backpatch(c, end_anchor);
4231}
4232
4233static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004234com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004235{
4236 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004237 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004238
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004239 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4240 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004241 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004242 com_addbyte(c, POP_BLOCK);
4243 block_pop(c, SETUP_FINALLY);
4244 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004245 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004246 /* While the generated code pushes only one item,
4247 the try-finally handling can enter here with
4248 up to three items. OK, here are the details:
4249 3 for an exception, 2 for RETURN, 1 for BREAK. */
4250 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004251 com_backpatch(c, finally_anchor);
4252 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004253 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004254 com_node(c, ch);
4255 com_addbyte(c, END_FINALLY);
4256 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004257 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004258}
4259
4260static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004261com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004262{
4263 REQ(n, try_stmt);
4264 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4265 | 'try' ':' suite 'finally' ':' suite */
4266 if (TYPE(CHILD(n, 3)) != except_clause)
4267 com_try_finally(c, n);
4268 else
4269 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004270}
4271
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004273get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004274{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004275 int i;
4276
Guido van Rossum8b993a91997-01-17 21:04:03 +00004277 /* Label to avoid tail recursion */
4278 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004279 switch (TYPE(n)) {
4280
4281 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004282 if (NCH(n) == 1) {
4283 n = CHILD(n, 0);
4284 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004285 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004286 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004287 case file_input:
4288 for (i = 0; i < NCH(n); i++) {
4289 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004290 if (TYPE(ch) == stmt) {
4291 n = ch;
4292 goto next;
4293 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004294 }
4295 break;
4296
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004297 case stmt:
4298 case simple_stmt:
4299 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004300 n = CHILD(n, 0);
4301 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004302
4303 case expr_stmt:
4304 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004305 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004306 case test:
4307 case and_test:
4308 case not_test:
4309 case comparison:
4310 case expr:
4311 case xor_expr:
4312 case and_expr:
4313 case shift_expr:
4314 case arith_expr:
4315 case term:
4316 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004317 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004318 if (NCH(n) == 1) {
4319 n = CHILD(n, 0);
4320 goto next;
4321 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004322 break;
4323
4324 case atom:
4325 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004326 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004327 break;
4328
4329 }
4330 return NULL;
4331}
4332
Guido van Rossum79f25d91997-04-29 20:08:16 +00004333static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004334get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004335{
Guido van Rossum541563e1999-01-28 15:08:09 +00004336 /* Don't generate doc-strings if run with -OO */
4337 if (Py_OptimizeFlag > 1)
4338 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004339 n = get_rawdocstring(n);
4340 if (n == NULL)
4341 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004342 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004343}
4344
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004345static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004346com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004347{
4348 REQ(n, suite);
4349 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4350 if (NCH(n) == 1) {
4351 com_node(c, CHILD(n, 0));
4352 }
4353 else {
4354 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004355 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356 node *ch = CHILD(n, i);
4357 if (TYPE(ch) == stmt)
4358 com_node(c, ch);
4359 }
4360 }
4361}
4362
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004363/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004364static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004365com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004366{
4367 int i = c->c_nblocks;
4368 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4369 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4370 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004371 else if (i <= 0) {
4372 /* at the outer level */
4373 com_error(c, PyExc_SyntaxError,
4374 "'continue' not properly in loop");
4375 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004376 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004377 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004378 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004379 if (c->c_block[j] == SETUP_LOOP)
4380 break;
4381 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004382 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004383 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004384 for (; i > j; --i) {
4385 if (c->c_block[i] == SETUP_EXCEPT ||
4386 c->c_block[i] == SETUP_FINALLY) {
4387 com_addoparg(c, CONTINUE_LOOP,
4388 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004389 return;
4390 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004391 if (c->c_block[i] == END_FINALLY) {
4392 com_error(c, PyExc_SyntaxError,
4393 "'continue' not supported inside 'finally' clause");
4394 return;
4395 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004396 }
4397 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004398 com_error(c, PyExc_SyntaxError,
4399 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004400 }
4401 /* XXX Could allow it inside a 'finally' clause
4402 XXX if we could pop the exception still on the stack */
4403}
4404
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004405/* Return the number of default values in the argument list.
4406
4407 If a non-default argument follows a default argument, set an
4408 exception and return -1.
4409*/
4410
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004411static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004412com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004413{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004414 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004415 if (TYPE(n) == lambdef) {
4416 /* lambdef: 'lambda' [varargslist] ':' test */
4417 n = CHILD(n, 1);
4418 }
4419 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004420 REQ(n, funcdef);
4421 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4422 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004423 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4424 n = CHILD(n, 1);
4425 }
4426 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004427 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004428 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004429 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004430 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4431 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004432 ndefs = 0;
4433 for (i = 0; i < nch; i++) {
4434 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004435 if (TYPE(CHILD(n, i)) == STAR ||
4436 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004437 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004438 i++;
4439 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004440 t = RPAR; /* Anything except EQUAL or COMMA */
4441 else
4442 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004443 if (t == EQUAL) {
4444 i++;
4445 ndefs++;
4446 com_node(c, CHILD(n, i));
4447 i++;
4448 if (i >= nch)
4449 break;
4450 t = TYPE(CHILD(n, i));
4451 }
4452 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004453 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004454 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004455 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004456 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004457 return -1;
4458 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004459 }
4460 if (t != COMMA)
4461 break;
4462 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004463 return ndefs;
4464}
4465
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004466static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004467com_decorator_name(struct compiling *c, node *n)
4468{
4469 /* dotted_name: NAME ('.' NAME)* */
4470
4471 int i, nch;
4472 node *varname;
4473
4474 REQ(n, dotted_name);
4475 nch = NCH(n);
4476 assert(nch >= 1 && nch % 2 == 1);
4477
4478 varname = CHILD(n, 0);
4479 REQ(varname, NAME);
4480 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004481 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004482
4483 for (i = 1; i < nch; i += 2) {
4484 node *attrname;
4485
4486 REQ(CHILD(n, i), DOT);
4487
4488 attrname = CHILD(n, i + 1);
4489 REQ(attrname, NAME);
4490 com_addop_name(c, LOAD_ATTR, STR(attrname));
4491 }
4492}
4493
4494static void
4495com_decorator(struct compiling *c, node *n)
4496{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004497 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004498 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004499 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004500 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004501 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004502 com_decorator_name(c, CHILD(n, 1));
4503
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004504 if (nch > 3) {
4505 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004506 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004507 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004508 com_call_function(c, CHILD(n, 3));
4509 }
4510}
4511
4512static int
4513com_decorators(struct compiling *c, node *n)
4514{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004515 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004516
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004517 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004518 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004519 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004520
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004521 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004522 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004523 REQ(ch, decorator);
4524
4525 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004526 }
4527
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004528 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004529}
4530
4531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004532com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004533{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004534 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004535 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004536
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004537 REQ(n, funcdef);
4538 /* -6 -5 -4 -3 -2 -1
4539 funcdef: [decorators] 'def' NAME parameters ':' suite */
4540
4541 if (NCH(n) == 6)
4542 ndecorators = com_decorators(c, CHILD(n, 0));
4543 else
4544 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004545
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004546 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004547 if (ndefs < 0)
4548 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004549 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004550 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004551 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004552 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004553 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004554 c->c_errors++;
4555 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004556 int closure = com_make_closure(c, (PyCodeObject *)co);
4557 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004558 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004559 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560 if (closure)
4561 com_addoparg(c, MAKE_CLOSURE, ndefs);
4562 else
4563 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004564 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004565
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004566 while (ndecorators > 0) {
4567 com_addoparg(c, CALL_FUNCTION, 1);
4568 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004569 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004570 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004571
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004572 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004573 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004574 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004575 }
4576}
4577
4578static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004579com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004580{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004581 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004582 REQ(n, testlist);
4583 /* testlist: test (',' test)* [','] */
4584 for (i = 0; i < NCH(n); i += 2)
4585 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004586 i = (NCH(n)+1) / 2;
4587 com_addoparg(c, BUILD_TUPLE, i);
4588 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004589}
4590
4591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004592com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004593{
Guido van Rossum25831651993-05-19 14:50:45 +00004594 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004595 PyObject *v;
4596 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004597 char *name;
4598
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004599 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004600 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004601 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004602 c->c_errors++;
4603 return;
4604 }
4605 /* Push the class name on the stack */
4606 i = com_addconst(c, v);
4607 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004608 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004609 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004610 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004611 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004612 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004613 com_push(c, 1);
4614 }
Guido van Rossum25831651993-05-19 14:50:45 +00004615 else
4616 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004617 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004618 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004619 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004620 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004621 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004622 c->c_errors++;
4623 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004624 int closure = com_make_closure(c, co);
4625 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004626 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004627 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004628 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004629 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004630 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004631 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004632 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004633 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004634 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004635 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004636 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004637 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004639 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004640}
4641
4642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004643com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004644{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004645 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004646 if (c->c_errors)
4647 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648 switch (TYPE(n)) {
4649
4650 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004651
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004652 case funcdef:
4653 com_funcdef(c, n);
4654 break;
4655 case classdef:
4656 com_classdef(c, n);
4657 break;
4658
4659 /* Trivial parse tree nodes */
4660
4661 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004662 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004663 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004664 n = CHILD(n, 0);
4665 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004666
4667 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004668 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004669 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004670 {
4671 int i;
4672 for (i = 0; i < NCH(n)-1; i += 2)
4673 com_node(c, CHILD(n, i));
4674 }
4675 break;
4676
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004677 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004678 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004679 n = CHILD(n, 0);
4680 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004681
4682 /* Statement nodes */
4683
4684 case expr_stmt:
4685 com_expr_stmt(c, n);
4686 break;
4687 case print_stmt:
4688 com_print_stmt(c, n);
4689 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004690 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004691 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004692 break;
4693 case pass_stmt:
4694 break;
4695 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004696 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004697 com_error(c, PyExc_SyntaxError,
4698 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004699 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004700 com_addbyte(c, BREAK_LOOP);
4701 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004702 case continue_stmt:
4703 com_continue_stmt(c, n);
4704 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004705 case return_stmt:
4706 com_return_stmt(c, n);
4707 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004708 case yield_stmt:
4709 com_yield_stmt(c, n);
4710 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004711 case raise_stmt:
4712 com_raise_stmt(c, n);
4713 break;
4714 case import_stmt:
4715 com_import_stmt(c, n);
4716 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004717 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004718 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004719 case exec_stmt:
4720 com_exec_stmt(c, n);
4721 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004722 case assert_stmt:
4723 com_assert_stmt(c, n);
4724 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004725 case if_stmt:
4726 com_if_stmt(c, n);
4727 break;
4728 case while_stmt:
4729 com_while_stmt(c, n);
4730 break;
4731 case for_stmt:
4732 com_for_stmt(c, n);
4733 break;
4734 case try_stmt:
4735 com_try_stmt(c, n);
4736 break;
4737 case suite:
4738 com_suite(c, n);
4739 break;
4740
4741 /* Expression nodes */
4742
4743 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004744 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004745 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004746 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004747 break;
4748 case test:
4749 com_test(c, n);
4750 break;
4751 case and_test:
4752 com_and_test(c, n);
4753 break;
4754 case not_test:
4755 com_not_test(c, n);
4756 break;
4757 case comparison:
4758 com_comparison(c, n);
4759 break;
4760 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004761 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004762 break;
4763 case expr:
4764 com_expr(c, n);
4765 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004766 case xor_expr:
4767 com_xor_expr(c, n);
4768 break;
4769 case and_expr:
4770 com_and_expr(c, n);
4771 break;
4772 case shift_expr:
4773 com_shift_expr(c, n);
4774 break;
4775 case arith_expr:
4776 com_arith_expr(c, n);
4777 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004778 case term:
4779 com_term(c, n);
4780 break;
4781 case factor:
4782 com_factor(c, n);
4783 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004784 case power:
4785 com_power(c, n);
4786 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004787 case atom:
4788 com_atom(c, n);
4789 break;
4790
4791 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004792 com_error(c, PyExc_SystemError,
4793 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004794 }
4795}
4796
Tim Petersdbd9ba62000-07-09 03:09:57 +00004797static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004798
4799static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004800com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004801{
4802 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4803 if (TYPE(CHILD(n, 0)) == LPAR)
4804 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004805 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004806 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004807 com_pop(c, 1);
4808 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004809}
4810
4811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004812com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004813{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004814 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004815 if (NCH(n) == 1) {
4816 com_fpdef(c, CHILD(n, 0));
4817 }
4818 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004819 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004820 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004821 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004822 for (i = 0; i < NCH(n); i += 2)
4823 com_fpdef(c, CHILD(n, i));
4824 }
4825}
4826
4827static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004828com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004829{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004830 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004831 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004832 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004833 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004834 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004835 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004836 nch = NCH(n);
4837 /* Enter all arguments in table of locals */
4838 for (i = 0, narg = 0; i < nch; i++) {
4839 node *ch = CHILD(n, i);
4840 node *fp;
4841 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004842 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004843 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4844 fp = CHILD(ch, 0);
4845 if (TYPE(fp) != NAME) {
4846 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4847 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004848 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004849 narg++;
4850 /* all name updates handled by symtable */
4851 if (++i >= nch)
4852 break;
4853 ch = CHILD(n, i);
4854 if (TYPE(ch) == EQUAL)
4855 i += 2;
4856 else
4857 REQ(ch, COMMA);
4858 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004859 if (complex) {
4860 /* Generate code for complex arguments only after
4861 having counted the simple arguments */
4862 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004863 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004864 node *ch = CHILD(n, i);
4865 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004866 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004867 break;
4868 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4869 fp = CHILD(ch, 0);
4870 if (TYPE(fp) != NAME) {
4871 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004872 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004873 com_fpdef(c, ch);
4874 }
4875 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004876 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004877 break;
4878 ch = CHILD(n, i);
4879 if (TYPE(ch) == EQUAL)
4880 i += 2;
4881 else
4882 REQ(ch, COMMA);
4883 }
4884 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004885}
4886
4887static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004888com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004889{
4890 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004891 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004892 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004893 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004894 if (doc != NULL) {
4895 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004896 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004897 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004898 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004899 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004900 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004901 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004902 for (i = 0; i < NCH(n); i++) {
4903 node *ch = CHILD(n, i);
4904 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4905 com_node(c, ch);
4906 }
4907}
4908
4909/* Top-level compile-node interface */
4910
4911static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004912compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004913{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004914 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004915 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004916 REQ(n, funcdef);
4917 /* -6 -5 -4 -3 -2 -1
4918 funcdef: [decorators] 'def' NAME parameters ':' suite */
4919 c->c_name = STR(RCHILD(n, -4));
4920 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004921 if (doc != NULL) {
4922 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004923 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004924 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004925 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004926 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004927 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004928 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004929 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004930 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004931 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004932 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004933 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004934 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004935 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4936 com_push(c, 1);
4937 com_addbyte(c, RETURN_VALUE);
4938 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004939}
4940
4941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004942compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004943{
Guido van Rossum590baa41993-11-30 13:40:46 +00004944 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004945 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004946 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004947
4948 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004949 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004950 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004951 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004952 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004953 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004954 else
4955 ch = CHILD(n, 2);
4956 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004957 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004958 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004959}
4960
4961static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004962compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004963{
4964 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004965 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004966 REQ(n, classdef);
4967 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4968 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004969 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004970 /* Initialize local __module__ from global __name__ */
4971 com_addop_name(c, LOAD_GLOBAL, "__name__");
4972 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004973 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004974 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004975 if (doc != NULL) {
4976 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004977 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004978 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004979 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004980 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004981 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004982 }
4983 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004984 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004985 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004986 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004987 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004988 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004989 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004990 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004991}
4992
4993static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004994compile_generator_expression(struct compiling *c, node *n)
4995{
4996 /* testlist_gexp: test gen_for */
4997 /* argument: test gen_for */
4998 REQ(CHILD(n, 0), test);
4999 REQ(CHILD(n, 1), gen_for);
5000
5001 c->c_name = "<generator expression>";
5002 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5003
5004 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5005 com_push(c, 1);
5006 com_addbyte(c, RETURN_VALUE);
5007 com_pop(c, 1);
5008}
5009
5010static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005011compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005012{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005013 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005014
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005015 switch (TYPE(n)) {
5016
Guido van Rossum4c417781991-01-21 16:09:22 +00005017 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005018 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005019 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005020 n = CHILD(n, 0);
5021 if (TYPE(n) != NEWLINE)
5022 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005023 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005024 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5025 com_push(c, 1);
5026 com_addbyte(c, RETURN_VALUE);
5027 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005028 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005029 break;
5030
Guido van Rossum4c417781991-01-21 16:09:22 +00005031 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005032 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005033 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005034 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5035 com_push(c, 1);
5036 com_addbyte(c, RETURN_VALUE);
5037 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005038 break;
5039
Guido van Rossum590baa41993-11-30 13:40:46 +00005040 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005041 com_node(c, CHILD(n, 0));
5042 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005043 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005044 break;
5045
Guido van Rossum590baa41993-11-30 13:40:46 +00005046 case lambdef: /* anonymous function definition */
5047 compile_lambdef(c, n);
5048 break;
5049
Guido van Rossum4c417781991-01-21 16:09:22 +00005050 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005051 compile_funcdef(c, n);
5052 break;
5053
Guido van Rossum4c417781991-01-21 16:09:22 +00005054 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005055 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005056 break;
5057
Raymond Hettinger354433a2004-05-19 08:20:33 +00005058 case testlist_gexp: /* A generator expression */
5059 case argument: /* A generator expression */
5060 compile_generator_expression(c, n);
5061 break;
5062
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005063 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005064 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005065 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005066 }
5067}
5068
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005069static PyObject *
5070dict_keys_inorder(PyObject *dict, int offset)
5071{
5072 PyObject *tuple, *k, *v;
5073 int i, pos = 0, size = PyDict_Size(dict);
5074
5075 tuple = PyTuple_New(size);
5076 if (tuple == NULL)
5077 return NULL;
5078 while (PyDict_Next(dict, &pos, &k, &v)) {
5079 i = PyInt_AS_LONG(v);
5080 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005081 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005082 PyTuple_SET_ITEM(tuple, i - offset, k);
5083 }
5084 return tuple;
5085}
5086
Guido van Rossum79f25d91997-04-29 20:08:16 +00005087PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005088PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005089{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005090 return PyNode_CompileFlags(n, filename, NULL);
5091}
5092
5093PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005094PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005095{
5096 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005097}
5098
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005099struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005100PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005101{
5102 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005103 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005104
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005105 ff = PyNode_Future(n, filename);
5106 if (ff == NULL)
5107 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005108 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005109 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005110 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005111 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005112 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005113 return st;
5114}
5115
Guido van Rossum79f25d91997-04-29 20:08:16 +00005116static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005117icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005118{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005119 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005120}
5121
Guido van Rossum79f25d91997-04-29 20:08:16 +00005122static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005123jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005124 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005125{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005126 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005127 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005128 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005129 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005130 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5131 sc.c_encoding = "utf-8";
5132 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005133 sc.c_encoding = STR(n);
5134 n = CHILD(n, 0);
5135 } else {
5136 sc.c_encoding = NULL;
5137 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005138 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005139 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005140 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005141 /* c_symtable still points to parent's symbols */
5142 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005143 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005144 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005145 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005146 if (base->c_encoding != NULL) {
5147 assert(sc.c_encoding == NULL);
5148 sc.c_encoding = base->c_encoding;
5149 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005150 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005151 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005152 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005153 if (sc.c_future == NULL) {
5154 com_free(&sc);
5155 return NULL;
5156 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005157 if (flags) {
5158 int merged = sc.c_future->ff_features |
5159 flags->cf_flags;
5160 sc.c_future->ff_features = merged;
5161 flags->cf_flags = merged;
5162 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005163 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5164 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005165 com_free(&sc);
5166 return NULL;
5167 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005168 /* reset symbol table for second pass */
5169 sc.c_symtable->st_nscopes = 1;
5170 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171 }
5172 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005173 if (symtable_load_symbols(&sc) < 0) {
5174 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005175 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005176 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005177 compile_node(&sc, n);
5178 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005179 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005180 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005181 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005182 names = PyList_AsTuple(sc.c_names);
5183 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005184 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5185 freevars = dict_keys_inorder(sc.c_freevars,
5186 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005187 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005188 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005189 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5190 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005191 if (!PyErr_Occurred())
5192 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005193 sc.c_nlocals,
5194 sc.c_maxstacklevel,
5195 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005196 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005197 consts,
5198 names,
5199 varnames,
5200 freevars,
5201 cellvars,
5202 filename,
5203 name,
5204 sc.c_firstlineno,
5205 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005206 Py_XDECREF(consts);
5207 Py_XDECREF(names);
5208 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005209 Py_XDECREF(freevars);
5210 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005211 Py_XDECREF(filename);
5212 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005213 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005214 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005215 else if (!PyErr_Occurred()) {
5216 /* This could happen if someone called PyErr_Clear() after an
5217 error was reported above. That's not supposed to happen,
5218 but I just plugged one case and I'm not sure there can't be
5219 others. In that case, raise SystemError so that at least
5220 it gets reported instead dumping core. */
5221 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5222 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005223 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005224 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005225 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005226 sc.c_symtable = NULL;
5227 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005228 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005229 return co;
5230}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005231
5232int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005233PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005234{
5235 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005236 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005237 int line = co->co_firstlineno;
5238 int addr = 0;
5239 while (--size >= 0) {
5240 addr += *p++;
5241 if (addr > addrq)
5242 break;
5243 line += *p++;
5244 }
5245 return line;
5246}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005247
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005248/* The test for LOCAL must come before the test for FREE in order to
5249 handle classes where name is both local and free. The local var is
5250 a method and the free var is a free var referenced within a method.
5251*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005252
5253static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005255{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005256 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005257 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005258
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005259 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5260 return CELL;
5261 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5262 return LOCAL;
5263 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5264 return FREE;
5265 v = PyDict_GetItemString(c->c_globals, name);
5266 if (v) {
5267 if (v == Py_None)
5268 return GLOBAL_EXPLICIT;
5269 else {
5270 return GLOBAL_IMPLICIT;
5271 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005272 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005273 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005274 "unknown scope for %.100s in %.100s(%s) "
5275 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5276 name, c->c_name,
5277 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5278 c->c_filename,
5279 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5280 PyObject_REPR(c->c_locals),
5281 PyObject_REPR(c->c_globals)
5282 );
5283
5284 Py_FatalError(buf);
5285 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005286}
5287
Guido van Rossum207fda62001-03-02 03:30:41 +00005288/* Helper functions to issue warnings */
5289
5290static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005291issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005292{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005293 if (PyErr_Occurred()) {
5294 /* This can happen because symtable_node continues
5295 processing even after raising a SyntaxError.
5296 Calling PyErr_WarnExplicit now would clobber the
5297 pending exception; instead we fail and let that
5298 exception propagate.
5299 */
5300 return -1;
5301 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005302 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5303 lineno, NULL, NULL) < 0) {
5304 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5305 PyErr_SetString(PyExc_SyntaxError, msg);
5306 PyErr_SyntaxLocation(filename, lineno);
5307 }
5308 return -1;
5309 }
5310 return 0;
5311}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005312
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005313static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005314symtable_warn(struct symtable *st, char *msg)
5315{
Guido van Rossum207fda62001-03-02 03:30:41 +00005316 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005317 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005318 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005319 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005320 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005321}
5322
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005323/* Helper function for setting lineno and filename */
5324
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005325static struct symtable *
5326symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005327{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005328 struct symtable *st;
5329
5330 st = symtable_init();
5331 if (st == NULL)
5332 return NULL;
5333 st->st_future = ff;
5334 st->st_filename = filename;
5335 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5336 if (st->st_errors > 0)
5337 goto fail;
5338 symtable_node(st, n);
5339 if (st->st_errors > 0)
5340 goto fail;
5341 return st;
5342 fail:
5343 if (!PyErr_Occurred()) {
5344 /* This could happen because after a syntax error is
5345 detected, the symbol-table-building continues for
5346 a while, and PyErr_Clear() might erroneously be
5347 called during that process. One such case has been
5348 fixed, but there might be more (now or later).
5349 */
5350 PyErr_SetString(PyExc_SystemError, "lost exception");
5351 }
5352 st->st_future = NULL;
5353 st->st_filename = NULL;
5354 PySymtable_Free(st);
5355 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356}
5357
5358static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005359symtable_init_compiling_symbols(struct compiling *c)
5360{
5361 PyObject *varnames;
5362
5363 varnames = c->c_symtable->st_cur->ste_varnames;
5364 if (varnames == NULL) {
5365 varnames = PyList_New(0);
5366 if (varnames == NULL)
5367 return -1;
5368 c->c_symtable->st_cur->ste_varnames = varnames;
5369 Py_INCREF(varnames);
5370 } else
5371 Py_INCREF(varnames);
5372 c->c_varnames = varnames;
5373
5374 c->c_globals = PyDict_New();
5375 if (c->c_globals == NULL)
5376 return -1;
5377 c->c_freevars = PyDict_New();
5378 if (c->c_freevars == NULL)
5379 return -1;
5380 c->c_cellvars = PyDict_New();
5381 if (c->c_cellvars == NULL)
5382 return -1;
5383 return 0;
5384}
5385
5386struct symbol_info {
5387 int si_nlocals;
5388 int si_ncells;
5389 int si_nfrees;
5390 int si_nimplicit;
5391};
5392
5393static void
5394symtable_init_info(struct symbol_info *si)
5395{
5396 si->si_nlocals = 0;
5397 si->si_ncells = 0;
5398 si->si_nfrees = 0;
5399 si->si_nimplicit = 0;
5400}
5401
5402static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005403symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005404 struct symbol_info *si)
5405{
5406 PyObject *dict, *v;
5407
5408 /* Seperate logic for DEF_FREE. If it occurs in a function,
5409 it indicates a local that we must allocate storage for (a
5410 cell var). If it occurs in a class, then the class has a
5411 method and a free variable with the same name.
5412 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005413 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005414 /* If it isn't declared locally, it can't be a cell. */
5415 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5416 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005417 v = PyInt_FromLong(si->si_ncells++);
5418 dict = c->c_cellvars;
5419 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005420 /* If it is free anyway, then there is no need to do
5421 anything here.
5422 */
5423 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005424 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005425 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005426 v = PyInt_FromLong(si->si_nfrees++);
5427 dict = c->c_freevars;
5428 }
5429 if (v == NULL)
5430 return -1;
5431 if (PyDict_SetItem(dict, name, v) < 0) {
5432 Py_DECREF(v);
5433 return -1;
5434 }
5435 Py_DECREF(v);
5436 return 0;
5437}
5438
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005439/* If a variable is a cell and an argument, make sure that appears in
5440 co_cellvars before any variable to its right in varnames.
5441*/
5442
5443
5444static int
5445symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5446 PyObject *varnames, int flags)
5447{
Tim Petersb39903b2003-03-24 17:22:24 +00005448 PyObject *v = NULL;
5449 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005450 int i, pos;
5451
5452 if (flags & CO_VARARGS)
5453 argcount++;
5454 if (flags & CO_VARKEYWORDS)
5455 argcount++;
5456 for (i = argcount; --i >= 0; ) {
5457 v = PyList_GET_ITEM(varnames, i);
5458 if (PyDict_GetItem(*cellvars, v)) {
5459 if (list == NULL) {
5460 list = PyList_New(1);
5461 if (list == NULL)
5462 return -1;
5463 PyList_SET_ITEM(list, 0, v);
5464 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005465 } else {
5466 if (PyList_Insert(list, 0, v) < 0) {
5467 Py_DECREF(list);
5468 return -1;
5469 }
5470 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005471 }
5472 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005473 if (list == NULL)
5474 return 0;
5475
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005476 /* There are cellvars that are also arguments. Create a dict
5477 to replace cellvars and put the args at the front.
5478 */
5479 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005480 if (d == NULL)
5481 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005482 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5483 v = PyInt_FromLong(i);
5484 if (v == NULL)
5485 goto fail;
5486 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5487 goto fail;
5488 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5489 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005490 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005491 }
5492 pos = 0;
5493 i = PyList_GET_SIZE(list);
5494 Py_DECREF(list);
5495 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5496 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005497 if (w == NULL)
5498 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005499 if (PyDict_SetItem(d, v, w) < 0) {
5500 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005501 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005502 goto fail;
5503 }
5504 Py_DECREF(w);
5505 }
5506 Py_DECREF(*cellvars);
5507 *cellvars = d;
5508 return 1;
5509 fail:
5510 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005511 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005512 return -1;
5513}
5514
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005515static int
5516symtable_freevar_offsets(PyObject *freevars, int offset)
5517{
5518 PyObject *name, *v;
5519 int pos;
5520
5521 /* The cell vars are the first elements of the closure,
5522 followed by the free vars. Update the offsets in
5523 c_freevars to account for number of cellvars. */
5524 pos = 0;
5525 while (PyDict_Next(freevars, &pos, &name, &v)) {
5526 int i = PyInt_AS_LONG(v) + offset;
5527 PyObject *o = PyInt_FromLong(i);
5528 if (o == NULL)
5529 return -1;
5530 if (PyDict_SetItem(freevars, name, o) < 0) {
5531 Py_DECREF(o);
5532 return -1;
5533 }
5534 Py_DECREF(o);
5535 }
5536 return 0;
5537}
5538
5539static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005540symtable_check_unoptimized(struct compiling *c,
5541 PySymtableEntryObject *ste,
5542 struct symbol_info *si)
5543{
5544 char buf[300];
5545
5546 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5547 || (ste->ste_nested && si->si_nimplicit)))
5548 return 0;
5549
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005550#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5551
5552#define ILLEGAL_IS "is a nested function"
5553
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005554#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005555"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005556
5557#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005558"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005559
5560#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005561"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005562"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005563
5564 /* XXX perhaps the linenos for these opt-breaking statements
5565 should be stored so the exception can point to them. */
5566
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005567 if (ste->ste_child_free) {
5568 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005569 PyOS_snprintf(buf, sizeof(buf),
5570 ILLEGAL_IMPORT_STAR,
5571 PyString_AS_STRING(ste->ste_name),
5572 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005573 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005574 PyOS_snprintf(buf, sizeof(buf),
5575 ILLEGAL_BARE_EXEC,
5576 PyString_AS_STRING(ste->ste_name),
5577 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005578 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005579 PyOS_snprintf(buf, sizeof(buf),
5580 ILLEGAL_EXEC_AND_IMPORT_STAR,
5581 PyString_AS_STRING(ste->ste_name),
5582 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005583 }
5584 } else {
5585 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005586 PyOS_snprintf(buf, sizeof(buf),
5587 ILLEGAL_IMPORT_STAR,
5588 PyString_AS_STRING(ste->ste_name),
5589 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005590 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005591 PyOS_snprintf(buf, sizeof(buf),
5592 ILLEGAL_BARE_EXEC,
5593 PyString_AS_STRING(ste->ste_name),
5594 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005595 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005596 PyOS_snprintf(buf, sizeof(buf),
5597 ILLEGAL_EXEC_AND_IMPORT_STAR,
5598 PyString_AS_STRING(ste->ste_name),
5599 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005600 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005601 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005602
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005603 PyErr_SetString(PyExc_SyntaxError, buf);
5604 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5605 ste->ste_opt_lineno);
5606 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005607}
5608
5609static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005610symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5611 struct symbol_info *si)
5612{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005613 if (c->c_future)
5614 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005615 if (ste->ste_generator)
5616 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005617 if (ste->ste_type != TYPE_MODULE)
5618 c->c_flags |= CO_NEWLOCALS;
5619 if (ste->ste_type == TYPE_FUNCTION) {
5620 c->c_nlocals = si->si_nlocals;
5621 if (ste->ste_optimized == 0)
5622 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005623 else if (ste->ste_optimized != OPT_EXEC)
5624 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005625 }
5626 return 0;
5627}
5628
5629static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005630symtable_error(struct symtable *st, int lineno)
5631{
5632 if (lineno == 0)
5633 lineno = st->st_cur->ste_lineno;
5634 PyErr_SyntaxLocation(st->st_filename, lineno);
5635 st->st_errors++;
5636 return -1;
5637}
5638
5639static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005640symtable_load_symbols(struct compiling *c)
5641{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005642 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005643 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005644 PyObject *name, *varnames, *v;
5645 int i, flags, pos;
5646 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005647
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648 v = NULL;
5649
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005650 if (symtable_init_compiling_symbols(c) < 0)
5651 goto fail;
5652 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005653 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005654 si.si_nlocals = PyList_GET_SIZE(varnames);
5655 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005656
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005657 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005658 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005659 if (v == NULL)
5660 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005661 if (PyDict_SetItem(c->c_locals,
5662 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 goto fail;
5664 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005665 }
5666
5667 /* XXX The cases below define the rules for whether a name is
5668 local or global. The logic could probably be clearer. */
5669 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005670 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5671 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005673 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005674 /* undo the original DEF_FREE */
5675 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005677 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005678 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005679 2. Free variables in methods that are also class
5680 variables or declared global.
5681 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005682 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005683 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005684
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005685 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005686 c->c_argcount--;
5687 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005688 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005689 c->c_argcount--;
5690 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005691 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005693 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005694 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005695 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005696 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005697 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005698 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005699 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005700 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5701 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005702 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005703 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005704 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005705 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005706 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005707 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005708 if (v == NULL)
5709 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711 goto fail;
5712 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005713 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005714 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005715 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005716 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005717 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005718 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005719 if (v == NULL)
5720 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005721 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005722 goto fail;
5723 Py_DECREF(v);
5724 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005725 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005726 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005727 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005728 goto fail;
5729 if (st->st_nscopes != 1) {
5730 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005731 if (v == NULL)
5732 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005733 if (PyDict_SetItem(st->st_global,
5734 name, v))
5735 goto fail;
5736 Py_DECREF(v);
5737 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005738 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005739 }
5740 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005741 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5742
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005743 if (si.si_ncells > 1) { /* one cell is always in order */
5744 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5745 c->c_varnames, c->c_flags) < 0)
5746 return -1;
5747 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005748 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5749 return -1;
5750 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005751 fail:
5752 /* is this always the right thing to do? */
5753 Py_XDECREF(v);
5754 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755}
5756
5757static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005758symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005759{
5760 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005762 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005763 if (st == NULL)
5764 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005765 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005766
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005767 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005768 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770 goto fail;
5771 if ((st->st_symbols = PyDict_New()) == NULL)
5772 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005773 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005774 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005775 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 st->st_private = NULL;
5777 return st;
5778 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005779 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005780 return NULL;
5781}
5782
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005783void
5784PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785{
5786 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005787 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005788 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005789 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005790}
5791
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005792/* When the compiler exits a scope, it must should update the scope's
5793 free variable information with the list of free variables in its
5794 children.
5795
5796 Variables that are free in children and defined in the current
5797 scope are cellvars.
5798
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005799 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005800 false), free variables in children that are not defined here are
5801 implicit globals.
5802
5803*/
5804
5805static int
5806symtable_update_free_vars(struct symtable *st)
5807{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005808 int i, j, def;
5809 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005810 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005811
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005812 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005813 def = DEF_FREE_CLASS;
5814 else
5815 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005816 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005817 int pos = 0;
5818
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005819 if (list && PyList_SetSlice(list, 0,
5820 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005821 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005822 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005823 PyList_GET_ITEM(ste->ste_children, i);
5824 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005825 int flags = PyInt_AS_LONG(o);
5826 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005827 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005828 if (list == NULL) {
5829 list = PyList_New(0);
5830 if (list == NULL)
5831 return -1;
5832 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005833 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005834 if (PyList_Append(list, name) < 0) {
5835 Py_DECREF(list);
5836 return -1;
5837 }
5838 }
5839 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005840 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005841 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005842 v = PyDict_GetItem(ste->ste_symbols, name);
5843 /* If a name N is declared global in scope A and
5844 referenced in scope B contained (perhaps
5845 indirectly) in A and there are no scopes
5846 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005847 is global in B. Unless A is a class scope,
5848 because class scopes are not considered for
5849 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005850 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005851 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005852 int flags = PyInt_AS_LONG(v);
5853 if (flags & DEF_GLOBAL) {
5854 symtable_undo_free(st, child->ste_id,
5855 name);
5856 continue;
5857 }
5858 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005859 if (ste->ste_nested) {
5860 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005861 name, def) < 0) {
5862 Py_DECREF(list);
5863 return -1;
5864 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005865 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005866 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005867 name) < 0) {
5868 Py_DECREF(list);
5869 return -1;
5870 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005871 }
5872 }
5873 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005874
5875 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005876 return 0;
5877}
5878
5879/* If the current scope is a non-nested class or if name is not
5880 defined in the current, non-nested scope, then it is an implicit
5881 global in all nested scopes.
5882*/
5883
5884static int
5885symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5886{
5887 PyObject *o;
5888 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005889 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005890
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005891 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005892 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005893 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005894 if (o == NULL)
5895 return symtable_undo_free(st, child, name);
5896 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005897
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005898 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005899 return symtable_undo_free(st, child, name);
5900 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005901 return symtable_add_def_o(st, ste->ste_symbols,
5902 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005903}
5904
5905static int
5906symtable_undo_free(struct symtable *st, PyObject *id,
5907 PyObject *name)
5908{
5909 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005910 PyObject *info;
5911 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005912
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005913 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5914 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005915 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005916
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005917 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005918 if (info == NULL)
5919 return 0;
5920 v = PyInt_AS_LONG(info);
5921 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005922 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005923 DEF_FREE_GLOBAL) < 0)
5924 return -1;
5925 } else
5926 /* If the name is defined here or declared global,
5927 then the recursion stops. */
5928 return 0;
5929
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005930 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5931 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005932 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005933 PyList_GET_ITEM(ste->ste_children, i);
5934 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005935 if (x < 0)
5936 return x;
5937 }
5938 return 0;
5939}
5940
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005941/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5942 This reference is released when the scope is exited, via the DECREF
5943 in symtable_exit_scope().
5944*/
5945
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005946static int
5947symtable_exit_scope(struct symtable *st)
5948{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005949 int end;
5950
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005951 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005952 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005953 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005954 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005955 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5956 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005957 if (PySequence_DelItem(st->st_stack, end) < 0)
5958 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005959 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005960}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005961
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005962static void
5963symtable_enter_scope(struct symtable *st, char *name, int type,
5964 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005965{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005966 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005967
5968 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005969 prev = st->st_cur;
5970 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005971 st->st_errors++;
5972 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005973 }
5974 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005975 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005976 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005977 if (st->st_cur == NULL) {
5978 st->st_errors++;
5979 return;
5980 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005981 if (strcmp(name, TOP) == 0)
5982 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005983 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005984 if (PyList_Append(prev->ste_children,
5985 (PyObject *)st->st_cur) < 0)
5986 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005987 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005988}
5989
5990static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005991symtable_lookup(struct symtable *st, char *name)
5992{
5993 char buffer[MANGLE_LEN];
5994 PyObject *v;
5995 int flags;
5996
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005997 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005998 name = buffer;
5999 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6000 if (v == NULL) {
6001 if (PyErr_Occurred())
6002 return -1;
6003 else
6004 return 0;
6005 }
6006
6007 flags = PyInt_AS_LONG(v);
6008 return flags;
6009}
6010
6011static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006012symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006013{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006014 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006015 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006016 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006017
Guido van Rossumb7164622002-08-16 02:48:11 +00006018 /* Warn about None, except inside a tuple (where the assignment
6019 code already issues a warning). */
6020 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6021 *name == 'N' && strcmp(name, "None") == 0)
6022 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006023 PyErr_SetString(PyExc_SyntaxError,
6024 "Invalid syntax. Assignment to None.");
6025 symtable_error(st, 0);
6026 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006027 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006028 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029 name = buffer;
6030 if ((s = PyString_InternFromString(name)) == NULL)
6031 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006032 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6033 Py_DECREF(s);
6034 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006035}
6036
6037/* Must only be called with mangled names */
6038
6039static int
6040symtable_add_def_o(struct symtable *st, PyObject *dict,
6041 PyObject *name, int flag)
6042{
6043 PyObject *o;
6044 int val;
6045
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006046 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006047 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006048 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006049 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006050 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006051 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006052 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006053 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006055 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006057 if (o == NULL)
6058 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006059 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006060 Py_DECREF(o);
6061 return -1;
6062 }
6063 Py_DECREF(o);
6064
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006065 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006066 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006067 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006068 } else if (flag & DEF_GLOBAL) {
6069 /* XXX need to update DEF_GLOBAL for other flags too;
6070 perhaps only DEF_FREE_GLOBAL */
6071 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006072 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006073 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006074 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006075 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006076 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006077 if (o == NULL)
6078 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006079 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006080 Py_DECREF(o);
6081 return -1;
6082 }
6083 Py_DECREF(o);
6084 }
6085 return 0;
6086}
6087
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006088#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006089
Tim Peters08a898f2001-06-28 01:52:22 +00006090/* Look for a yield stmt under n. Return 1 if found, else 0.
6091 This hack is used to look inside "if 0:" blocks (which are normally
6092 ignored) in case those are the only places a yield occurs (so that this
6093 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006094static int
6095look_for_yield(node *n)
6096{
6097 int i;
6098
6099 for (i = 0; i < NCH(n); ++i) {
6100 node *kid = CHILD(n, i);
6101
6102 switch (TYPE(kid)) {
6103
6104 case classdef:
6105 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006106 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006107 /* Stuff in nested functions and classes can't make
6108 the parent a generator. */
6109 return 0;
6110
6111 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006112 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006113
6114 default:
6115 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006116 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006117 }
6118 }
6119 return 0;
6120}
6121
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006122static void
6123symtable_node(struct symtable *st, node *n)
6124{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006125 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006126
6127 loop:
6128 switch (TYPE(n)) {
6129 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006130 char *func_name;
6131 if (NCH(n) == 6)
6132 symtable_node(st, CHILD(n, 0));
6133 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006135 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006136 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006137 symtable_funcdef(st, n);
6138 symtable_exit_scope(st);
6139 break;
6140 }
6141 case lambdef:
6142 if (NCH(n) == 4)
6143 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006144 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006145 symtable_funcdef(st, n);
6146 symtable_exit_scope(st);
6147 break;
6148 case classdef: {
6149 char *tmp, *class_name = STR(CHILD(n, 1));
6150 symtable_add_def(st, class_name, DEF_LOCAL);
6151 if (TYPE(CHILD(n, 2)) == LPAR) {
6152 node *bases = CHILD(n, 3);
6153 int i;
6154 for (i = 0; i < NCH(bases); i += 2) {
6155 symtable_node(st, CHILD(bases, i));
6156 }
6157 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006158 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006159 tmp = st->st_private;
6160 st->st_private = class_name;
6161 symtable_node(st, CHILD(n, NCH(n) - 1));
6162 st->st_private = tmp;
6163 symtable_exit_scope(st);
6164 break;
6165 }
6166 case if_stmt:
6167 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006168 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6169 if (st->st_cur->ste_generator == 0)
6170 st->st_cur->ste_generator =
6171 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006172 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006173 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006174 symtable_node(st, CHILD(n, i + 1));
6175 symtable_node(st, CHILD(n, i + 3));
6176 }
6177 if (i + 2 < NCH(n))
6178 symtable_node(st, CHILD(n, i + 2));
6179 break;
6180 case global_stmt:
6181 symtable_global(st, n);
6182 break;
6183 case import_stmt:
6184 symtable_import(st, n);
6185 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006186 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006187 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006188 symtable_node(st, CHILD(n, 1));
6189 if (NCH(n) > 2)
6190 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006191 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006192 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006193 st->st_cur->ste_opt_lineno = n->n_lineno;
6194 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006195 if (NCH(n) > 4)
6196 symtable_node(st, CHILD(n, 5));
6197 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006198
6199 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006200 case assert_stmt:
6201 if (Py_OptimizeFlag)
6202 return;
6203 if (NCH(n) == 2) {
6204 n = CHILD(n, 1);
6205 goto loop;
6206 } else {
6207 symtable_node(st, CHILD(n, 1));
6208 n = CHILD(n, 3);
6209 goto loop;
6210 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006211 case except_clause:
6212 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006213 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006214 if (NCH(n) > 1) {
6215 n = CHILD(n, 1);
6216 goto loop;
6217 }
6218 break;
6219 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006220 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006222 case yield_stmt:
6223 st->st_cur->ste_generator = 1;
6224 n = CHILD(n, 1);
6225 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006226 case expr_stmt:
6227 if (NCH(n) == 1)
6228 n = CHILD(n, 0);
6229 else {
6230 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006231 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 symtable_node(st, CHILD(n, 2));
6233 break;
6234 } else {
6235 int i;
6236 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006237 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006238 n = CHILD(n, NCH(n) - 1);
6239 }
6240 }
6241 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006242 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006243 /* only occurs when there are multiple for loops
6244 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006245 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006246 if (TYPE(n) == list_for)
6247 symtable_list_for(st, n);
6248 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006249 REQ(n, list_if);
6250 symtable_node(st, CHILD(n, 1));
6251 if (NCH(n) == 3) {
6252 n = CHILD(n, 2);
6253 goto loop;
6254 }
6255 }
6256 break;
6257 case for_stmt:
6258 symtable_assign(st, CHILD(n, 1), 0);
6259 for (i = 3; i < NCH(n); ++i)
6260 if (TYPE(CHILD(n, i)) >= single_input)
6261 symtable_node(st, CHILD(n, i));
6262 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006263 case arglist:
6264 if (NCH(n) > 1)
6265 for (i = 0; i < NCH(n); ++i) {
6266 node *ch = CHILD(n, i);
6267 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6268 TYPE(CHILD(ch, 1)) == gen_for) {
6269 PyErr_SetString(PyExc_SyntaxError,
6270 "invalid syntax");
6271 symtable_error(st, n->n_lineno);
6272 return;
6273 }
6274 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006275 /* The remaining cases fall through to default except in
6276 special circumstances. This requires the individual cases
6277 to be coded with great care, even though they look like
6278 rather innocuous. Each case must double-check TYPE(n).
6279 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006280 case decorator:
6281 if (TYPE(n) == decorator) {
6282 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6283 node *name, *varname;
6284 name = CHILD(n, 1);
6285 REQ(name, dotted_name);
6286 varname = CHILD(name, 0);
6287 REQ(varname, NAME);
6288 symtable_add_use(st, STR(varname));
6289 }
6290 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006291 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006292 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006293 n = CHILD(n, 2);
6294 goto loop;
6295 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006296 else if (TYPE(n) == argument && NCH(n) == 2 &&
6297 TYPE(CHILD(n, 1)) == gen_for) {
6298 symtable_generator_expression(st, n);
6299 break;
6300 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006301 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006302 case listmaker:
6303 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006304 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006305 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006306 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006307 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006308 case testlist_gexp:
6309 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6310 symtable_generator_expression(st, n);
6311 break;
6312 }
6313 /* fall through */
6314
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006315 case atom:
6316 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6317 symtable_add_use(st, STR(CHILD(n, 0)));
6318 break;
6319 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006320 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006321 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006322 /* Walk over every non-token child with a special case
6323 for one child.
6324 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006325 if (NCH(n) == 1) {
6326 n = CHILD(n, 0);
6327 goto loop;
6328 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006329 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006330 if (TYPE(CHILD(n, i)) >= single_input)
6331 symtable_node(st, CHILD(n, i));
6332 }
6333}
6334
6335static void
6336symtable_funcdef(struct symtable *st, node *n)
6337{
6338 node *body;
6339
6340 if (TYPE(n) == lambdef) {
6341 if (NCH(n) == 4)
6342 symtable_params(st, CHILD(n, 1));
6343 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006344 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006345 body = CHILD(n, NCH(n) - 1);
6346 symtable_node(st, body);
6347}
6348
6349/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006350 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006351 which are references in the defining scope. symtable_params()
6352 parses the parameter names, which are defined in the function's
6353 body.
6354
6355 varargslist:
6356 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6357 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6358*/
6359
6360static void
6361symtable_default_args(struct symtable *st, node *n)
6362{
6363 node *c;
6364 int i;
6365
6366 if (TYPE(n) == parameters) {
6367 n = CHILD(n, 1);
6368 if (TYPE(n) == RPAR)
6369 return;
6370 }
6371 REQ(n, varargslist);
6372 for (i = 0; i < NCH(n); i += 2) {
6373 c = CHILD(n, i);
6374 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6375 break;
6376 }
6377 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6378 symtable_node(st, CHILD(n, i));
6379 }
6380}
6381
6382static void
6383symtable_params(struct symtable *st, node *n)
6384{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006385 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006386 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006387
6388 if (TYPE(n) == parameters) {
6389 n = CHILD(n, 1);
6390 if (TYPE(n) == RPAR)
6391 return;
6392 }
6393 REQ(n, varargslist);
6394 for (i = 0; i < NCH(n); i += 2) {
6395 c = CHILD(n, i);
6396 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6397 ext = 1;
6398 break;
6399 }
6400 if (TYPE(c) == test) {
6401 continue;
6402 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006403 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006404 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006405 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006406 char nbuf[30];
6407 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006408 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006409 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006410 }
6411 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006412 if (ext) {
6413 c = CHILD(n, i);
6414 if (TYPE(c) == STAR) {
6415 i++;
6416 symtable_add_def(st, STR(CHILD(n, i)),
6417 DEF_PARAM | DEF_STAR);
6418 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006419 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006420 c = NULL;
6421 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006422 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006423 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006424 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006425 i++;
6426 symtable_add_def(st, STR(CHILD(n, i)),
6427 DEF_PARAM | DEF_DOUBLESTAR);
6428 }
6429 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006430 if (complex >= 0) {
6431 int j;
6432 for (j = 0; j <= complex; j++) {
6433 c = CHILD(n, j);
6434 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006435 c = CHILD(n, ++j);
6436 else if (TYPE(c) == EQUAL)
6437 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006438 if (TYPE(CHILD(c, 0)) == LPAR)
6439 symtable_params_fplist(st, CHILD(c, 1));
6440 }
6441 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006442}
6443
6444static void
6445symtable_params_fplist(struct symtable *st, node *n)
6446{
6447 int i;
6448 node *c;
6449
6450 REQ(n, fplist);
6451 for (i = 0; i < NCH(n); i += 2) {
6452 c = CHILD(n, i);
6453 REQ(c, fpdef);
6454 if (NCH(c) == 1)
6455 symtable_add_def(st, STR(CHILD(c, 0)),
6456 DEF_PARAM | DEF_INTUPLE);
6457 else
6458 symtable_params_fplist(st, CHILD(c, 1));
6459 }
6460
6461}
6462
6463static void
6464symtable_global(struct symtable *st, node *n)
6465{
6466 int i;
6467
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006468 /* XXX It might be helpful to warn about module-level global
6469 statements, but it's hard to tell the difference between
6470 module-level and a string passed to exec.
6471 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006472
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006473 for (i = 1; i < NCH(n); i += 2) {
6474 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006475 int flags;
6476
6477 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006478 if (flags < 0)
6479 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006480 if (flags && flags != DEF_GLOBAL) {
6481 char buf[500];
6482 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006483 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006484 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006485 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006486 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006487 }
6488 else {
6489 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006490 PyOS_snprintf(buf, sizeof(buf),
6491 GLOBAL_AFTER_ASSIGN,
6492 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006493 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006494 PyOS_snprintf(buf, sizeof(buf),
6495 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006496 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006497 }
6498 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006499 symtable_add_def(st, name, DEF_GLOBAL);
6500 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006501}
6502
6503static void
6504symtable_list_comprehension(struct symtable *st, node *n)
6505{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006506 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006507 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006508
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006509 REQ(n, listmaker);
6510 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6511 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006512 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006513 symtable_list_for(st, CHILD(n, 1));
6514 symtable_node(st, CHILD(n, 0));
6515 --st->st_cur->ste_tmpname;
6516}
6517
6518static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006519symtable_generator_expression(struct symtable *st, node *n)
6520{
6521 /* testlist_gexp: test gen_for */
6522 REQ(CHILD(n, 0), test);
6523 REQ(CHILD(n, 1), gen_for);
6524
6525 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6526 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6527
6528 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6529
6530 symtable_gen_for(st, CHILD(n, 1), 1);
6531 symtable_node(st, CHILD(n, 0));
6532 symtable_exit_scope(st);
6533
6534 /* for outmost iterable precomputation */
6535 symtable_node(st, CHILD(CHILD(n, 1), 3));
6536}
6537
6538static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006539symtable_list_for(struct symtable *st, node *n)
6540{
6541 REQ(n, list_for);
6542 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006543 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006544 symtable_node(st, CHILD(n, 3));
6545 if (NCH(n) == 5)
6546 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006547}
6548
6549static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006550symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6551{
6552 REQ(n, gen_for);
6553
6554 /* gen_for: for v in test [gen_iter] */
6555 symtable_assign(st, CHILD(n, 1), 0);
6556 if (is_outmost)
6557 symtable_add_use(st, "[outmost-iterable]");
6558 else
6559 symtable_node(st, CHILD(n, 3));
6560
6561 if (NCH(n) == 5)
6562 symtable_gen_iter(st, CHILD(n, 4));
6563}
6564
6565static void
6566symtable_gen_iter(struct symtable *st, node *n)
6567{
6568 REQ(n, gen_iter);
6569
6570 n = CHILD(n, 0);
6571 if (TYPE(n) == gen_for)
6572 symtable_gen_for(st, n, 0);
6573 else {
6574 REQ(n, gen_if);
6575 symtable_node(st, CHILD(n, 1));
6576
6577 if (NCH(n) == 3)
6578 symtable_gen_iter(st, CHILD(n, 2));
6579 }
6580}
6581
6582static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006583symtable_import(struct symtable *st, node *n)
6584{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006585 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006586 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006587 /* import_stmt: import_name | import_from */
6588 n = CHILD(n, 0);
6589 if (TYPE(n) == import_from) {
6590 /* import_from: 'from' dotted_name 'import' ('*' |
6591 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006592 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006593 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006594 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6595 /* check for bogus imports */
6596 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6597 PyErr_SetString(PyExc_SyntaxError,
6598 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006599 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006600 return;
6601 }
6602 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006603 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6604 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006605 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006606 if (symtable_warn(st,
6607 "import * only allowed at module level") < 0)
6608 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006609 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006610 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006611 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006612 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006613 REQ(nn, import_as_names);
6614 for (i = 0; i < NCH(nn); i += 2) {
6615 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006616 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006617 symtable_assign(st, CHILD(c, 2),
6618 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006619 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006620 symtable_assign(st, CHILD(c, 0),
6621 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006622 }
6623 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006624 } else {
6625 /* 'import' dotted_as_names */
6626 nn = CHILD(n, 1);
6627 REQ(nn, dotted_as_names);
6628 for (i = 0; i < NCH(nn); i += 2)
6629 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006630 }
6631}
6632
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006633/* The third argument to symatble_assign() is a flag to be passed to
6634 symtable_add_def() if it is eventually called. The flag is useful
6635 to specify the particular type of assignment that should be
6636 recorded, e.g. an assignment caused by import.
6637 */
6638
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006639static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006640symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006641{
6642 node *tmp;
6643 int i;
6644
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006645 loop:
6646 switch (TYPE(n)) {
6647 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006648 /* invalid assignment, e.g. lambda x:x=2. The next
6649 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006650 return;
6651 case power:
6652 if (NCH(n) > 2) {
6653 for (i = 2; i < NCH(n); ++i)
6654 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6655 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006656 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006657 if (NCH(n) > 1) {
6658 symtable_node(st, CHILD(n, 0));
6659 symtable_node(st, CHILD(n, 1));
6660 } else {
6661 n = CHILD(n, 0);
6662 goto loop;
6663 }
6664 return;
6665 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006666 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6667 /* XXX This is an error, but the next pass
6668 will catch it. */
6669 return;
6670 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006671 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006672 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006673 }
6674 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006675 case testlist_gexp:
6676 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6677 /* XXX This is an error, but the next pass
6678 will catch it. */
6679 return;
6680 } else {
6681 for (i = 0; i < NCH(n); i += 2)
6682 symtable_assign(st, CHILD(n, i), def_flag);
6683 }
6684 return;
6685
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006686 case exprlist:
6687 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006688 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006689 if (NCH(n) == 1) {
6690 n = CHILD(n, 0);
6691 goto loop;
6692 }
6693 else {
6694 int i;
6695 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006696 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006697 return;
6698 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006699 case atom:
6700 tmp = CHILD(n, 0);
6701 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6702 n = CHILD(n, 1);
6703 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006704 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006705 if (strcmp(STR(tmp), "__debug__") == 0) {
6706 PyErr_SetString(PyExc_SyntaxError,
6707 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006708 symtable_error(st, n->n_lineno);
6709 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006710 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006711 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006712 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006713 return;
6714 case dotted_as_name:
6715 if (NCH(n) == 3)
6716 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006717 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006718 else
6719 symtable_add_def(st,
6720 STR(CHILD(CHILD(n,
6721 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006722 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006723 return;
6724 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006725 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006726 return;
6727 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006728 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006729 return;
6730 default:
6731 if (NCH(n) == 0)
6732 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006733 if (NCH(n) == 1) {
6734 n = CHILD(n, 0);
6735 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006736 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006737 /* Should only occur for errors like x + 1 = 1,
6738 which will be caught in the next pass. */
6739 for (i = 0; i < NCH(n); ++i)
6740 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006741 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006742 }
6743}