blob: 71e90f7e21d5eabc8b75ccc29638ed30c0faec86 [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 Hettinger80121492005-02-20 12:41:32 +0000545static int
546fold_unaryops_on_constants(unsigned char *codestr, PyObject *consts)
547{
Raymond Hettingere63a0782005-02-23 13:37:55 +0000548 PyObject *newconst=NULL, *v;
Raymond Hettinger80121492005-02-20 12:41:32 +0000549 int len_consts, opcode;
550
551 /* Pre-conditions */
552 assert(PyList_CheckExact(consts));
553 assert(codestr[0] == LOAD_CONST);
554
555 /* Create new constant */
556 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
557 opcode = codestr[3];
558 switch (opcode) {
559 case UNARY_NEGATIVE:
Raymond Hettingere63a0782005-02-23 13:37:55 +0000560 /* Preserve the sign of -0.0 */
561 if (PyObject_IsTrue(v) == 1)
562 newconst = PyNumber_Negative(v);
Raymond Hettinger80121492005-02-20 12:41:32 +0000563 break;
564 case UNARY_CONVERT:
565 newconst = PyObject_Repr(v);
566 break;
567 case UNARY_INVERT:
568 newconst = PyNumber_Invert(v);
569 break;
570 default:
571 /* Called with an unknown opcode */
572 assert(0);
573 return 0;
574 }
575 if (newconst == NULL) {
576 PyErr_Clear();
577 return 0;
578 }
579
580 /* Append folded constant into consts table */
581 len_consts = PyList_GET_SIZE(consts);
582 if (PyList_Append(consts, newconst)) {
583 Py_DECREF(newconst);
584 return 0;
585 }
586 Py_DECREF(newconst);
587
588 /* Write NOP LOAD_CONST newconst */
589 codestr[0] = NOP;
590 codestr[1] = LOAD_CONST;
591 SETARG(codestr, 1, len_consts);
592 return 1;
593}
594
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595static unsigned int *
596markblocks(unsigned char *code, int len)
597{
598 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000599 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000600
601 if (blocks == NULL)
602 return NULL;
603 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000604
605 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000606 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
607 opcode = code[i];
608 switch (opcode) {
609 case FOR_ITER:
610 case JUMP_FORWARD:
611 case JUMP_IF_FALSE:
612 case JUMP_IF_TRUE:
613 case JUMP_ABSOLUTE:
614 case CONTINUE_LOOP:
615 case SETUP_LOOP:
616 case SETUP_EXCEPT:
617 case SETUP_FINALLY:
618 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000619 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000620 break;
621 }
622 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000623 /* Build block numbers in the second pass */
624 for (i=0 ; i<len ; i++) {
625 blockcnt += blocks[i]; /* increment blockcnt over labels */
626 blocks[i] = blockcnt;
627 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000628 return blocks;
629}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000630
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000631/* Perform basic peephole optimizations to components of a code object.
632 The consts object should still be in list form to allow new constants
633 to be appended.
634
635 To keep the optimizer simple, it bails out (does nothing) for code
636 containing extended arguments or that has a length over 32,700. That
637 allows us to avoid overflow and sign issues. Likewise, it bails when
638 the lineno table has complex encoding for gaps >= 255.
639
640 Optimizations are restricted to simple transformations occuring within a
641 single basic block. All transformations keep the code size the same or
642 smaller. For those that reduce size, the gaps are initially filled with
643 NOPs. Later those NOPs are removed and the jump addresses retargeted in
644 a single pass. Line numbering is adjusted accordingly. */
645
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000646static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000647optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000649 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000650 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000651 unsigned char *codestr = NULL;
652 unsigned char *lineno;
653 int *addrmap = NULL;
654 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000655 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000656 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000657 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000658
Raymond Hettingereffb3932004-10-30 08:55:08 +0000659 /* Bail out if an exception is set */
660 if (PyErr_Occurred())
661 goto exitUnchanged;
662
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000663 /* Bypass optimization when the lineno table is too complex */
664 assert(PyString_Check(lineno_obj));
665 lineno = PyString_AS_STRING(lineno_obj);
666 tabsiz = PyString_GET_SIZE(lineno_obj);
667 if (memchr(lineno, 255, tabsiz) != NULL)
668 goto exitUnchanged;
669
Raymond Hettingera12fa142004-08-24 04:34:16 +0000670 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000671 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000673 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000674 goto exitUnchanged;
675
676 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000677 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000678 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000679 goto exitUnchanged;
680 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000681
Raymond Hettinger07359a72005-02-21 20:03:14 +0000682 /* Verify that RETURN_VALUE terminates the codestring. This allows
683 the various transformation patterns to look ahead several
684 instructions without additional checks to make sure they are not
685 looking beyond the end of the code string.
686 */
687 if (codestr[codelen-1] != RETURN_VALUE)
688 goto exitUnchanged;
689
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000690 /* Mapping to new jump targets after NOPs are removed */
691 addrmap = PyMem_Malloc(codelen * sizeof(int));
692 if (addrmap == NULL)
693 goto exitUnchanged;
694
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000695 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000696 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000697 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000698 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000699
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000700 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000701 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000702
703 lastlc = cumlc;
704 cumlc = 0;
705
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000706 switch (opcode) {
707
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000708 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000709 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000710 case UNARY_NOT:
711 if (codestr[i+1] != JUMP_IF_FALSE ||
712 codestr[i+4] != POP_TOP ||
713 !ISBASICBLOCK(blocks,i,5))
714 continue;
715 tgt = GETJUMPTGT(codestr, (i+1));
716 if (codestr[tgt] != POP_TOP)
717 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000718 j = GETARG(codestr, i+1) + 1;
719 codestr[i] = JUMP_IF_TRUE;
720 SETARG(codestr, i, j);
721 codestr[i+3] = POP_TOP;
722 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000723 break;
724
725 /* not a is b --> a is not b
726 not a in b --> a not in b
727 not a is not b --> a is b
Raymond Hettingerb615bf02005-02-10 01:42:32 +0000728 not a not in b --> a in b
Raymond Hettingera1645742005-02-06 22:05:42 +0000729 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000730 case COMPARE_OP:
731 j = GETARG(codestr, i);
732 if (j < 6 || j > 9 ||
733 codestr[i+3] != UNARY_NOT ||
734 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000735 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000736 SETARG(codestr, i, (j^1));
737 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000738 break;
739
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000740 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
741 case LOAD_NAME:
742 case LOAD_GLOBAL:
743 j = GETARG(codestr, i);
744 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
745 if (name == NULL || strcmp(name, "None") != 0)
746 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000747 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
748 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000749 codestr[i] = LOAD_CONST;
750 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000751 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000752 break;
753 }
754 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000755 break;
756
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000757 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000758 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000759 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000760 j = GETARG(codestr, i);
761 if (codestr[i+3] != JUMP_IF_FALSE ||
762 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000763 !ISBASICBLOCK(blocks,i,7) ||
764 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000765 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000766 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000767 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000768 break;
769
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000770 /* Try to fold tuples of constants (includes a case for lists
771 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000772 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000773 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
774 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000775 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000776 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000777 j = GETARG(codestr, i);
778 h = i - 3 * j;
779 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000780 j <= lastlc &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000781 (opcode == BUILD_TUPLE &&
782 ISBASICBLOCK(blocks, h, 3*(j+1)) ||
783 opcode == BUILD_LIST &&
784 codestr[i+3]==COMPARE_OP &&
785 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
786 (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000787 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000788 assert(codestr[i] == LOAD_CONST);
789 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000790 break;
791 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000792 if (codestr[i+3] != UNPACK_SEQUENCE ||
793 !ISBASICBLOCK(blocks,i,6) ||
794 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000795 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000796 if (j == 1) {
797 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000798 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000799 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000800 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000801 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000802 codestr[i] = ROT_THREE;
803 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000804 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000805 }
806 break;
807
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000808 /* Fold binary ops on constants.
809 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
810 case BINARY_POWER:
811 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000812 case BINARY_TRUE_DIVIDE:
813 case BINARY_FLOOR_DIVIDE:
814 case BINARY_MODULO:
815 case BINARY_ADD:
816 case BINARY_SUBTRACT:
817 case BINARY_SUBSCR:
818 case BINARY_LSHIFT:
819 case BINARY_RSHIFT:
820 case BINARY_AND:
821 case BINARY_XOR:
822 case BINARY_OR:
823 if (lastlc >= 2 &&
824 ISBASICBLOCK(blocks, i-6, 7) &&
825 fold_binops_on_constants(&codestr[i-6], consts)) {
826 i -= 2;
827 assert(codestr[i] == LOAD_CONST);
828 cumlc = 1;
829 }
830 break;
831
Raymond Hettinger80121492005-02-20 12:41:32 +0000832 /* Fold unary ops on constants.
833 LOAD_CONST c1 UNARY_OP --> LOAD_CONST unary_op(c) */
834 case UNARY_NEGATIVE:
835 case UNARY_CONVERT:
836 case UNARY_INVERT:
837 if (lastlc >= 1 &&
838 ISBASICBLOCK(blocks, i-3, 4) &&
839 fold_unaryops_on_constants(&codestr[i-3], consts)) {
840 i -= 2;
841 assert(codestr[i] == LOAD_CONST);
842 cumlc = 1;
843 }
844 break;
845
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000846 /* Simplify conditional jump to conditional jump where the
847 result of the first test implies the success of a similar
848 test or the failure of the opposite test.
849 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000850 "if a and b:"
851 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000852 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000853 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000854 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000855 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
856 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000857 */
858 case JUMP_IF_FALSE:
859 case JUMP_IF_TRUE:
860 tgt = GETJUMPTGT(codestr, i);
861 j = codestr[tgt];
862 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
863 if (j == opcode) {
864 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
865 SETARG(codestr, i, tgttgt);
866 } else {
867 tgt -= i;
868 SETARG(codestr, i, tgt);
869 }
870 break;
871 }
872 /* Intentional fallthrough */
873
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000874 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000875 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000876 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000877 case JUMP_ABSOLUTE:
878 case CONTINUE_LOOP:
879 case SETUP_LOOP:
880 case SETUP_EXCEPT:
881 case SETUP_FINALLY:
882 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000883 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000884 continue;
885 tgttgt = GETJUMPTGT(codestr, tgt);
886 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
887 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000888 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000889 tgttgt -= i + 3; /* Calc relative jump addr */
890 if (tgttgt < 0) /* No backward relative jumps */
891 continue;
892 codestr[i] = opcode;
893 SETARG(codestr, i, tgttgt);
894 break;
895
896 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000897 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000898
899 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
900 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000901 if (i+4 >= codelen ||
902 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000903 !ISBASICBLOCK(blocks,i,5))
904 continue;
905 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000906 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000907 }
908 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000909
910 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000911 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
912 addrmap[i] = i - nops;
913 if (codestr[i] == NOP)
914 nops++;
915 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000916 cum_orig_line = 0;
917 last_line = 0;
918 for (i=0 ; i < tabsiz ; i+=2) {
919 cum_orig_line += lineno[i];
920 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000921 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000922 lineno[i] =((unsigned char)(new_line - last_line));
923 last_line = new_line;
924 }
925
926 /* Remove NOPs and fixup jump targets */
927 for (i=0, h=0 ; i<codelen ; ) {
928 opcode = codestr[i];
929 switch (opcode) {
930 case NOP:
931 i++;
932 continue;
933
934 case JUMP_ABSOLUTE:
935 case CONTINUE_LOOP:
936 j = addrmap[GETARG(codestr, i)];
937 SETARG(codestr, i, j);
938 break;
939
940 case FOR_ITER:
941 case JUMP_FORWARD:
942 case JUMP_IF_FALSE:
943 case JUMP_IF_TRUE:
944 case SETUP_LOOP:
945 case SETUP_EXCEPT:
946 case SETUP_FINALLY:
947 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
948 SETARG(codestr, i, j);
949 break;
950 }
951 adj = CODESIZE(opcode);
952 while (adj--)
953 codestr[h++] = codestr[i++];
954 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000955 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000956
957 code = PyString_FromStringAndSize((char *)codestr, h);
958 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000959 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000960 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000961 return code;
962
963exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000964 if (blocks != NULL)
965 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000966 if (addrmap != NULL)
967 PyMem_Free(addrmap);
968 if (codestr != NULL)
969 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000970 Py_INCREF(code);
971 return code;
972}
973
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000974/* End: Peephole optimizations ----------------------------------------- */
975
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000977PyCode_New(int argcount, int nlocals, int stacksize, int flags,
978 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000979 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
980 PyObject *filename, PyObject *name, int firstlineno,
981 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000982{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000984 int i;
985 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000986 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000987 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 consts == NULL || !PyTuple_Check(consts) ||
989 names == NULL || !PyTuple_Check(names) ||
990 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000991 freevars == NULL || !PyTuple_Check(freevars) ||
992 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 name == NULL || !PyString_Check(name) ||
994 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000995 lnotab == NULL || !PyString_Check(lnotab) ||
996 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000997 PyErr_BadInternalCall();
998 return NULL;
999 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001000 intern_strings(names);
1001 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001002 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001003 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001004 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 for (i = PyTuple_Size(consts); --i >= 0; ) {
1006 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001008 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001009 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001010 continue;
1011 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001012 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001014 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00001015 co->co_argcount = argcount;
1016 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001017 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001018 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +00001019 Py_INCREF(code);
1020 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001026 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001027 Py_INCREF(freevars);
1028 co->co_freevars = freevars;
1029 Py_INCREF(cellvars);
1030 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001032 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001034 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001035 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001037 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001038 if (PyTuple_GET_SIZE(freevars) == 0 &&
1039 PyTuple_GET_SIZE(cellvars) == 0)
1040 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001041 }
1042 return co;
1043}
1044
1045
1046/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001047
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001048/* The compiler uses two passes to generate bytecodes. The first pass
1049 builds the symbol table. The second pass generates the bytecode.
1050
1051 The first pass uses a single symtable struct. The second pass uses
1052 a compiling struct for each code block. The compiling structs
1053 share a reference to the symtable.
1054
1055 The two passes communicate via symtable_load_symbols() and via
1056 is_local() and is_global(). The former initializes several slots
1057 in the compiling struct: c_varnames, c_locals, c_nlocals,
1058 c_argcount, c_globals, and c_flags.
1059*/
1060
Tim Peters2a7f3842001-06-09 09:26:21 +00001061/* All about c_lnotab.
1062
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001063c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1064version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1065mapped to source code line #s via c_lnotab instead.
1066
Tim Peters2a7f3842001-06-09 09:26:21 +00001067The array is conceptually a list of
1068 (bytecode offset increment, line number increment)
1069pairs. The details are important and delicate, best illustrated by example:
1070
1071 byte code offset source code line number
1072 0 1
1073 6 2
1074 50 7
1075 350 307
1076 361 308
1077
1078The first trick is that these numbers aren't stored, only the increments
1079from one row to the next (this doesn't really work, but it's a start):
1080
1081 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1082
1083The second trick is that an unsigned byte can't hold negative values, or
1084values larger than 255, so (a) there's a deep assumption that byte code
1085offsets and their corresponding line #s both increase monotonically, and (b)
1086if at least one column jumps by more than 255 from one row to the next, more
1087than one pair is written to the table. In case #b, there's no way to know
1088from looking at the table later how many were written. That's the delicate
1089part. A user of c_lnotab desiring to find the source line number
1090corresponding to a bytecode address A should do something like this
1091
1092 lineno = addr = 0
1093 for addr_incr, line_incr in c_lnotab:
1094 addr += addr_incr
1095 if addr > A:
1096 return lineno
1097 lineno += line_incr
1098
1099In order for this to work, when the addr field increments by more than 255,
1100the line # increment in each pair generated must be 0 until the remaining addr
1101increment is < 256. So, in the example above, com_set_lineno should not (as
1102was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1103255, 0, 45, 255, 0, 45.
1104*/
1105
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001106struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001107 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001109 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001111 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001112 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 PyObject *c_locals; /* dictionary (value=localID) */
1114 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001115 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001116 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001117 int c_nlocals; /* index of next local */
1118 int c_argcount; /* number of top-level arguments */
1119 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001120 int c_nexti; /* index into c_code */
1121 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001122 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001123 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001124 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001125 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001126 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001127 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001128 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001129 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001130 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001131 int c_stacklevel; /* Current stack level */
1132 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001133 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001135 int c_last_addr; /* last op addr seen and recorded in lnotab */
1136 int c_last_line; /* last line seen and recorded in lnotab */
1137 int c_lnotab_next; /* current length of lnotab */
1138 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001139 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001140 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001141 int c_nested; /* Is block nested funcdef or lamdef? */
1142 int c_closure; /* Is nested w/freevars? */
1143 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001144 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001145 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146};
1147
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001148static int
1149is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001150{
1151 if ((v & (USE | DEF_FREE))
1152 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1153 return 1;
1154 if (v & DEF_FREE_CLASS)
1155 return 1;
1156 return 0;
1157}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001158
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001159static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001160com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001161{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001162 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1163
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001164 if (c == NULL) {
1165 /* Error occurred via symtable call to
1166 is_constant_false */
1167 PyErr_SetString(exc, msg);
1168 return;
1169 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001170 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001171 if (c->c_lineno < 1 || c->c_interactive) {
1172 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001174 return;
1175 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001176 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001177 if (v == NULL)
1178 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001179
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001180 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001181 if (line == NULL) {
1182 Py_INCREF(Py_None);
1183 line = Py_None;
1184 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001185 if (exc == PyExc_SyntaxError) {
1186 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1187 Py_None, line);
1188 if (t == NULL)
1189 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001190 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001191 if (w == NULL)
1192 goto exit;
1193 PyErr_SetObject(exc, w);
1194 } else {
1195 /* Make sure additional exceptions are printed with
1196 file and line, also. */
1197 PyErr_SetObject(exc, v);
1198 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1199 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001200 exit:
1201 Py_XDECREF(t);
1202 Py_XDECREF(v);
1203 Py_XDECREF(w);
1204 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001205}
1206
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001207/* Interface to the block stack */
1208
1209static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001210block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001211{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001212 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 com_error(c, PyExc_SystemError,
1214 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001215 }
1216 else {
1217 c->c_block[c->c_nblocks++] = type;
1218 }
1219}
1220
1221static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001222block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001223{
1224 if (c->c_nblocks > 0)
1225 c->c_nblocks--;
1226 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001228 }
1229}
1230
Guido van Rossum681d79a1995-07-18 14:51:37 +00001231/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001232
Martin v. Löwis95292d62002-12-11 14:04:59 +00001233static int issue_warning(const char *, const char *, int);
1234static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001235static void com_free(struct compiling *);
1236static void com_push(struct compiling *, int);
1237static void com_pop(struct compiling *, int);
1238static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001239static void com_node(struct compiling *, node *);
1240static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001241static void com_addbyte(struct compiling *, int);
1242static void com_addint(struct compiling *, int);
1243static void com_addoparg(struct compiling *, int, int);
1244static void com_addfwref(struct compiling *, int, int *);
1245static void com_backpatch(struct compiling *, int);
1246static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1247static int com_addconst(struct compiling *, PyObject *);
1248static int com_addname(struct compiling *, PyObject *);
1249static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001250static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001251static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001252static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001253static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001254static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001255static void com_assign(struct compiling *, node *, int, node *);
1256static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001257static int com_make_closure(struct compiling *c, PyCodeObject *co);
1258
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001259static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001260static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001261 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001262static PyObject *parsestrplus(struct compiling*, node *);
1263static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001264static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001266static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001267
1268/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001269static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001270static struct symtable *symtable_build(node *, PyFutureFeatures *,
1271 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001272static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001273static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001274static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001275static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001277static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001278
1279static void symtable_node(struct symtable *, node *);
1280static void symtable_funcdef(struct symtable *, node *);
1281static void symtable_default_args(struct symtable *, node *);
1282static void symtable_params(struct symtable *, node *);
1283static void symtable_params_fplist(struct symtable *, node *n);
1284static void symtable_global(struct symtable *, node *);
1285static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001286static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001287static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001288static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001289static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001290static void symtable_gen_for(struct symtable *, node *, int);
1291static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001292
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001293static int symtable_update_free_vars(struct symtable *);
1294static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1295static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1296
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001297/* helper */
1298static void
1299do_pad(int pad)
1300{
1301 int i;
1302 for (i = 0; i < pad; ++i)
1303 fprintf(stderr, " ");
1304}
1305
1306static void
1307dump(node *n, int pad, int depth)
1308{
1309 int i;
1310 if (depth == 0)
1311 return;
1312 do_pad(pad);
1313 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1314 if (depth > 0)
1315 depth--;
1316 for (i = 0; i < NCH(n); ++i)
1317 dump(CHILD(n, i), pad + 1, depth);
1318}
1319
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001321com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001323 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1325 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001326 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001328 goto fail;
1329 if ((c->c_const_dict = PyDict_New()) == NULL)
1330 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001332 goto fail;
1333 if ((c->c_name_dict = PyDict_New()) == NULL)
1334 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001336 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1338 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001339 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001340 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001341 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001342 c->c_freevars = NULL;
1343 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001344 c->c_nlocals = 0;
1345 c->c_argcount = 0;
1346 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 c->c_nexti = 0;
1348 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001349 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001350 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001351 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001352 c->c_begin = 0;
1353 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001354 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001355 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001356 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001357 c->c_stacklevel = 0;
1358 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001359 c->c_firstlineno = 0;
1360 c->c_last_addr = 0;
1361 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001362 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001363 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001364 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001365 c->c_nested = 0;
1366 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001367 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001368 return 1;
1369
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001370 fail:
1371 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001372 return 0;
1373}
1374
1375static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001376com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001377{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 Py_XDECREF(c->c_code);
1379 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001380 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001382 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 Py_XDECREF(c->c_globals);
1384 Py_XDECREF(c->c_locals);
1385 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001386 Py_XDECREF(c->c_freevars);
1387 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001389 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001390 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001391}
1392
1393static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001394com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001395{
1396 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001397 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001398 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001399 /*
1400 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1401 c->c_filename, c->c_name, c->c_lineno,
1402 c->c_nexti, c->c_stacklevel, n);
1403 */
1404 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001405}
1406
1407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001408com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001409{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001410 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001411 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001412 else
1413 c->c_stacklevel -= n;
1414}
1415
1416static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001417com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001418{
1419 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001421 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423}
1424
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001425static int
1426com_check_size(PyObject **s, int offset)
1427{
1428 int len = PyString_GET_SIZE(*s);
1429 if (offset >= len)
1430 return _PyString_Resize(s, len * 2);
1431 return 0;
1432}
1433
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001436{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001437 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001438 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001439 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001440 if (com_check_size(&c->c_code, c->c_nexti)) {
1441 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001442 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001443 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001444 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001445}
1446
1447static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001448com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001449{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001450 com_addbyte(c, x & 0xff);
1451 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001452}
1453
1454static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001455com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001456{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001457 char *p;
1458 if (c->c_lnotab == NULL)
1459 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001460 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1461 c->c_errors++;
1462 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001463 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001464 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001465 *p++ = addr;
1466 *p++ = line;
1467 c->c_lnotab_next += 2;
1468}
1469
1470static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001471com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001472{
1473 c->c_lineno = lineno;
1474 if (c->c_firstlineno == 0) {
1475 c->c_firstlineno = c->c_last_line = lineno;
1476 }
1477 else {
1478 int incr_addr = c->c_nexti - c->c_last_addr;
1479 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001480 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001481 while (incr_addr > 255) {
1482 com_add_lnotab(c, 255, 0);
1483 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001484 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001485 while (incr_line > 255) {
1486 com_add_lnotab(c, incr_addr, 255);
1487 incr_line -=255;
1488 incr_addr = 0;
1489 }
1490 if (incr_addr > 0 || incr_line > 0)
1491 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001492 c->c_last_addr = c->c_nexti;
1493 c->c_last_line = lineno;
1494 }
1495}
1496
1497static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001498com_strip_lnotab(struct compiling *c)
1499{
1500 /* strip the last lnotab entry if no opcode were emitted.
1501 * This prevents a line number to be generated on a final
1502 * pass, like in the following example:
1503 *
1504 * if a:
1505 * print 5
1506 * else:
1507 * pass
1508 *
1509 * Without the fix, a line trace event would be generated
1510 * on the pass even if a is true (because of the implicit
1511 * return).
1512 */
1513 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1514 c->c_lnotab_next = c->c_lnotab_last;
1515 }
1516}
1517
1518static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001519com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001520{
Fred Drakeef8ace32000-08-24 00:32:09 +00001521 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001522 if (extended_arg){
1523 com_addbyte(c, EXTENDED_ARG);
1524 com_addint(c, extended_arg);
1525 arg &= 0xffff;
1526 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001527 com_addbyte(c, op);
1528 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529}
1530
1531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001532com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001533{
1534 /* Compile a forward reference for backpatching */
1535 int here;
1536 int anchor;
1537 com_addbyte(c, op);
1538 here = c->c_nexti;
1539 anchor = *p_anchor;
1540 *p_anchor = here;
1541 com_addint(c, anchor == 0 ? 0 : here - anchor);
1542}
1543
1544static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001545com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001547 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001549 int dist;
1550 int prev;
1551 for (;;) {
1552 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001553 prev = code[anchor] + (code[anchor+1] << 8);
1554 dist = target - (anchor+2);
1555 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001556 dist >>= 8;
1557 code[anchor+1] = dist;
1558 dist >>= 8;
1559 if (dist) {
1560 com_error(c, PyExc_SystemError,
1561 "com_backpatch: offset too large");
1562 break;
1563 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001564 if (!prev)
1565 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001566 anchor -= prev;
1567 }
1568}
1569
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001570/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001571
1572static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001573com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001574{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001575 PyObject *w, *t, *np=NULL;
1576 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001577
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001578 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001579 if (t == NULL)
1580 goto fail;
1581 w = PyDict_GetItem(dict, t);
1582 if (w != NULL) {
1583 n = PyInt_AsLong(w);
1584 } else {
1585 n = PyList_Size(list);
1586 np = PyInt_FromLong(n);
1587 if (np == NULL)
1588 goto fail;
1589 if (PyList_Append(list, v) != 0)
1590 goto fail;
1591 if (PyDict_SetItem(dict, t, np) != 0)
1592 goto fail;
1593 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001594 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001595 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001596 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001597 fail:
1598 Py_XDECREF(np);
1599 Py_XDECREF(t);
1600 c->c_errors++;
1601 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001602}
1603
1604static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001605com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001606{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001607 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001608}
1609
1610static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001611com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001612{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001613 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001614}
1615
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001616int
1617_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001618{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001619 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001620 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001621 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001622 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1623 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001624 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001625 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001626 return 0; /* Don't mangle __extremely_long_names */
1627 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1628 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001629 /* Strip leading underscores from class name */
1630 while (*p == '_')
1631 p++;
1632 if (*p == '\0')
1633 return 0; /* Don't mangle if class is just underscores */
1634 plen = strlen(p);
1635 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001636 plen = maxlen-nlen-2; /* Truncate class name if too long */
1637 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001638 buffer[0] = '_';
1639 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001640 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001641 return 1;
1642}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001643
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001644static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001645com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001647 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001648 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001649 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001650
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001651 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001652 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001653 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001654 c->c_errors++;
1655 i = 255;
1656 }
1657 else {
1658 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001660 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001661 com_addoparg(c, op, i);
1662}
1663
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001664#define NAME_LOCAL 0
1665#define NAME_GLOBAL 1
1666#define NAME_DEFAULT 2
1667#define NAME_CLOSURE 3
1668
1669static int
1670com_lookup_arg(PyObject *dict, PyObject *name)
1671{
1672 PyObject *v = PyDict_GetItem(dict, name);
1673 if (v == NULL)
1674 return -1;
1675 else
1676 return PyInt_AS_LONG(v);
1677}
1678
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001679static int
1680none_assignment_check(struct compiling *c, char *name, int assigning)
1681{
1682 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1683 char *msg;
1684 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001685 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001686 else
1687 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001688 com_error(c, PyExc_SyntaxError, msg);
1689 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001690 }
1691 return 0;
1692}
1693
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001694static void
1695com_addop_varname(struct compiling *c, int kind, char *name)
1696{
1697 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001698 int i, reftype;
1699 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001700 int op = STOP_CODE;
1701 char buffer[MANGLE_LEN];
1702
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001703 if (kind != VAR_LOAD &&
1704 none_assignment_check(c, name, kind == VAR_STORE))
1705 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001706 i = 255;
1707 goto done;
1708 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001709 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001710 name = buffer;
1711 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1712 c->c_errors++;
1713 i = 255;
1714 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001715 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001716
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 reftype = get_ref_type(c, name);
1718 switch (reftype) {
1719 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001720 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001721 scope = NAME_LOCAL;
1722 break;
1723 case GLOBAL_EXPLICIT:
1724 scope = NAME_GLOBAL;
1725 break;
1726 case GLOBAL_IMPLICIT:
1727 if (c->c_flags & CO_OPTIMIZED)
1728 scope = NAME_GLOBAL;
1729 break;
1730 case FREE:
1731 case CELL:
1732 scope = NAME_CLOSURE;
1733 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001734 }
1735
1736 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001737 if (scope == NAME_LOCAL)
1738 i = com_lookup_arg(c->c_locals, v);
1739 else if (reftype == FREE)
1740 i = com_lookup_arg(c->c_freevars, v);
1741 else if (reftype == CELL)
1742 i = com_lookup_arg(c->c_cellvars, v);
1743 if (i == -1) {
1744 c->c_errors++; /* XXX no exception set */
1745 i = 255;
1746 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001747 }
1748 Py_DECREF(v);
1749
1750 switch (kind) {
1751 case VAR_LOAD:
1752 switch (scope) {
1753 case NAME_LOCAL:
1754 op = LOAD_FAST;
1755 break;
1756 case NAME_GLOBAL:
1757 op = LOAD_GLOBAL;
1758 break;
1759 case NAME_DEFAULT:
1760 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001761 break;
1762 case NAME_CLOSURE:
1763 op = LOAD_DEREF;
1764 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001765 }
1766 break;
1767 case VAR_STORE:
1768 switch (scope) {
1769 case NAME_LOCAL:
1770 op = STORE_FAST;
1771 break;
1772 case NAME_GLOBAL:
1773 op = STORE_GLOBAL;
1774 break;
1775 case NAME_DEFAULT:
1776 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001777 break;
1778 case NAME_CLOSURE:
1779 op = STORE_DEREF;
1780 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001781 }
1782 break;
1783 case VAR_DELETE:
1784 switch (scope) {
1785 case NAME_LOCAL:
1786 op = DELETE_FAST;
1787 break;
1788 case NAME_GLOBAL:
1789 op = DELETE_GLOBAL;
1790 break;
1791 case NAME_DEFAULT:
1792 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001793 break;
1794 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001795 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001796 PyOS_snprintf(buf, sizeof(buf),
1797 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001798 com_error(c, PyExc_SyntaxError, buf);
1799 i = 255;
1800 break;
1801 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001802 }
1803 break;
1804 }
1805done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001806 com_addoparg(c, op, i);
1807}
1808
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001809static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001810com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001811{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001812 char *name;
1813 char buffer[1000];
1814 /* XXX it is possible to write this code without the 1000
1815 chars on the total length of dotted names, I just can't be
1816 bothered right now */
1817 if (TYPE(n) == STAR)
1818 name = "*";
1819 else if (TYPE(n) == dotted_name) {
1820 char *p = buffer;
1821 int i;
1822 name = buffer;
1823 for (i = 0; i < NCH(n); i += 2) {
1824 char *s = STR(CHILD(n, i));
1825 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001827 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001828 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001829 break;
1830 }
1831 if (p != buffer)
1832 *p++ = '.';
1833 strcpy(p, s);
1834 p = strchr(p, '\0');
1835 }
1836 }
1837 else {
1838 REQ(n, NAME);
1839 name = STR(n);
1840 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001841 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001842}
1843
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001845parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001846{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001847 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001848 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001849 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001850#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001851 int imflag;
1852#endif
1853
Guido van Rossum282914b1991-04-04 10:42:56 +00001854 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001855 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001856#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001857 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001858#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001859 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001861 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001863 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001864 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001865 }
1866 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001867 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001869 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001870 if (errno != 0)
1871 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001873 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001874 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001875#ifndef WITHOUT_COMPLEX
1876 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001877 Py_complex z;
1878 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001879 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001880 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001881 PyFPE_END_PROTECT(z)
1882 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001883 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001884 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001885#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001886 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001887 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001888 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001889 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001891 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001892}
1893
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001895decode_utf8(char **sPtr, char *end, char* encoding)
1896{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001897#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001898 Py_FatalError("decode_utf8 should not be called in this build.");
1899 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001900#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001901 PyObject *u, *v;
1902 char *s, *t;
1903 t = s = *sPtr;
1904 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1905 while (s < end && (*s & 0x80)) s++;
1906 *sPtr = s;
1907 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1908 if (u == NULL)
1909 return NULL;
1910 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1911 Py_DECREF(u);
1912 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001913#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001914}
1915
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001916/* compiler.transformer.Transformer.decode_literal depends on what
1917 might seem like minor details of this function -- changes here
1918 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001919static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001920parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001921{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001922 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001923 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001924 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001925 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001926 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001927 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001928 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001929
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001930 if (isalpha(quote) || quote == '_') {
1931 if (quote == 'u' || quote == 'U') {
1932 quote = *++s;
1933 unicode = 1;
1934 }
1935 if (quote == 'r' || quote == 'R') {
1936 quote = *++s;
1937 rawmode = 1;
1938 }
1939 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001940 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001942 return NULL;
1943 }
1944 s++;
1945 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001946 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001947 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001948 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001949 return NULL;
1950 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001951 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001953 return NULL;
1954 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001955 if (len >= 4 && s[0] == quote && s[1] == quote) {
1956 s += 2;
1957 len -= 2;
1958 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001960 return NULL;
1961 }
1962 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001963#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001964 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001965 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001966 char *buf;
1967 char *p;
1968 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001969 if (encoding == NULL) {
1970 buf = s;
1971 u = NULL;
1972 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1973 buf = s;
1974 u = NULL;
1975 } else {
1976 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1977 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1978 if (u == NULL)
1979 return NULL;
1980 p = buf = PyString_AsString(u);
1981 end = s + len;
1982 while (s < end) {
1983 if (*s == '\\') {
1984 *p++ = *s++;
1985 if (*s & 0x80) {
1986 strcpy(p, "u005c");
1987 p += 5;
1988 }
1989 }
1990 if (*s & 0x80) { /* XXX inefficient */
1991 char *r;
1992 int rn, i;
1993 w = decode_utf8(&s, end, "utf-16-be");
1994 if (w == NULL) {
1995 Py_DECREF(u);
1996 return NULL;
1997 }
1998 r = PyString_AsString(w);
1999 rn = PyString_Size(w);
2000 assert(rn % 2 == 0);
2001 for (i = 0; i < rn; i += 2) {
2002 sprintf(p, "\\u%02x%02x",
2003 r[i + 0] & 0xFF,
2004 r[i + 1] & 0xFF);
2005 p += 6;
2006 }
2007 Py_DECREF(w);
2008 } else {
2009 *p++ = *s++;
2010 }
2011 }
2012 len = p - buf;
2013 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002014 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002015 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002016 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002017 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
2018 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002019 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002020 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002021 return v;
2022
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002023 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002024#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002025 need_encoding = (encoding != NULL &&
2026 strcmp(encoding, "utf-8") != 0 &&
2027 strcmp(encoding, "iso-8859-1") != 0);
2028 if (rawmode || strchr(s, '\\') == NULL) {
2029 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002030#ifndef Py_USING_UNICODE
2031 /* This should not happen - we never see any other
2032 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002033 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002034#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002035 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2036 if (u == NULL)
2037 return NULL;
2038 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2039 Py_DECREF(u);
2040 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002041#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002042 } else {
2043 return PyString_FromStringAndSize(s, len);
2044 }
2045 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002046
2047 v = PyString_DecodeEscape(s, len, NULL, unicode,
2048 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002049 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002050 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 return v;
2052}
2053
Guido van Rossum79f25d91997-04-29 20:08:16 +00002054static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002055parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002056{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002058 int i;
2059 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002060 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002061 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002062 for (i = 1; i < NCH(n); i++) {
2063 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002064 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002065 if (s == NULL)
2066 goto onError;
2067 if (PyString_Check(v) && PyString_Check(s)) {
2068 PyString_ConcatAndDel(&v, s);
2069 if (v == NULL)
2070 goto onError;
2071 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002072#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002073 else {
2074 PyObject *temp;
2075 temp = PyUnicode_Concat(v, s);
2076 Py_DECREF(s);
2077 if (temp == NULL)
2078 goto onError;
2079 Py_DECREF(v);
2080 v = temp;
2081 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002082#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002083 }
2084 }
2085 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002086
2087 onError:
2088 Py_XDECREF(v);
2089 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002090}
2091
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002093com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002095 int anchor = 0;
2096 int save_begin = c->c_begin;
2097
Raymond Hettinger354433a2004-05-19 08:20:33 +00002098 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002099 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002100 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002101 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002102 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002103 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002104 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002105 c->c_loops++;
2106 com_list_iter(c, n, e, t);
2107 c->c_loops--;
2108 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2109 c->c_begin = save_begin;
2110 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002111 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002112}
2113
2114static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002115com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2116{
2117 int break_anchor = 0;
2118 int anchor = 0;
2119 int save_begin = c->c_begin;
2120
2121 REQ(n, gen_for);
2122 /* gen_for: for v in test [gen_iter] */
2123
2124 com_addfwref(c, SETUP_LOOP, &break_anchor);
2125 block_push(c, SETUP_LOOP);
2126
2127 if (is_outmost) {
2128 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2129 com_push(c, 1);
2130 }
2131 else {
2132 com_node(c, CHILD(n, 3));
2133 com_addbyte(c, GET_ITER);
2134 }
2135
2136 c->c_begin = c->c_nexti;
2137 com_set_lineno(c, c->c_last_line);
2138 com_addfwref(c, FOR_ITER, &anchor);
2139 com_push(c, 1);
2140 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2141
2142 if (NCH(n) == 5)
2143 com_gen_iter(c, CHILD(n, 4), t);
2144 else {
2145 com_test(c, t);
2146 com_addbyte(c, YIELD_VALUE);
2147 com_pop(c, 1);
2148 }
2149
2150 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2151 c->c_begin = save_begin;
2152
2153 com_backpatch(c, anchor);
2154 com_pop(c, 1); /* FOR_ITER has popped this */
2155 com_addbyte(c, POP_BLOCK);
2156 block_pop(c, SETUP_LOOP);
2157 com_backpatch(c, break_anchor);
2158}
2159
2160static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002161com_list_if(struct compiling *c, node *n, node *e, char *t)
2162{
2163 int anchor = 0;
2164 int a = 0;
2165 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002166 com_node(c, CHILD(n, 1));
2167 com_addfwref(c, JUMP_IF_FALSE, &a);
2168 com_addbyte(c, POP_TOP);
2169 com_pop(c, 1);
2170 com_list_iter(c, n, e, t);
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
Raymond Hettinger354433a2004-05-19 08:20:33 +00002179com_gen_if(struct compiling *c, node *n, node *t)
2180{
2181 /* gen_if: 'if' test [gen_iter] */
2182 int anchor = 0;
2183 int a=0;
2184
2185 com_node(c, CHILD(n, 1));
2186 com_addfwref(c, JUMP_IF_FALSE, &a);
2187 com_addbyte(c, POP_TOP);
2188 com_pop(c, 1);
2189
2190 if (NCH(n) == 3)
2191 com_gen_iter(c, CHILD(n, 2), t);
2192 else {
2193 com_test(c, t);
2194 com_addbyte(c, YIELD_VALUE);
2195 com_pop(c, 1);
2196 }
2197 com_addfwref(c, JUMP_FORWARD, &anchor);
2198 com_backpatch(c, a);
2199 /* We jump here with an extra entry which we now pop */
2200 com_addbyte(c, POP_TOP);
2201 com_backpatch(c, anchor);
2202}
2203
2204static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002205com_list_iter(struct compiling *c,
2206 node *p, /* parent of list_iter node */
2207 node *e, /* element expression node */
2208 char *t /* name of result list temp local */)
2209{
2210 /* list_iter is the last child in a listmaker, list_for, or list_if */
2211 node *n = CHILD(p, NCH(p)-1);
2212 if (TYPE(n) == list_iter) {
2213 n = CHILD(n, 0);
2214 switch (TYPE(n)) {
2215 case list_for:
2216 com_list_for(c, n, e, t);
2217 break;
2218 case list_if:
2219 com_list_if(c, n, e, t);
2220 break;
2221 default:
2222 com_error(c, PyExc_SystemError,
2223 "invalid list_iter node type");
2224 }
2225 }
2226 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002227 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002228 com_push(c, 1);
2229 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002230 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002231 com_pop(c, 2);
2232 }
2233}
2234
2235static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002236com_gen_iter(struct compiling *c, node *n, node *t)
2237{
2238 /* gen_iter: gen_for | gen_if */
2239 node *ch;
2240 REQ(n, gen_iter);
2241
2242 ch = CHILD(n, 0);
2243
2244 switch (TYPE(ch)) {
2245 case gen_for:
2246 com_gen_for(c, ch, t, 0);
2247 break;
2248 case gen_if:
2249 com_gen_if(c, ch, t);
2250 break;
2251 default:
2252 com_error(c, PyExc_SystemError,
2253 "invalid gen_iter node type");
2254 }
2255}
2256
2257static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002258com_list_comprehension(struct compiling *c, node *n)
2259{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002260 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002261 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002262
2263 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002264 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002265 com_addoparg(c, BUILD_LIST, 0);
2266 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2267 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002268 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002269 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002270 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002271 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002272 --c->c_tmpname;
2273}
2274
2275static void
2276com_listmaker(struct compiling *c, node *n)
2277{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002278 /* listmaker: test ( list_for | (',' test)* [','] ) */
2279 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002280 com_list_comprehension(c, n);
2281 else {
2282 int len = 0;
2283 int i;
2284 for (i = 0; i < NCH(n); i += 2, len++)
2285 com_node(c, CHILD(n, i));
2286 com_addoparg(c, BUILD_LIST, len);
2287 com_pop(c, len-1);
2288 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002289}
2290
2291static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002292com_generator_expression(struct compiling *c, node *n)
2293{
2294 /* testlist_gexp: test gen_for */
2295 /* argument: test gen_for */
2296 PyCodeObject *co;
2297
2298 REQ(CHILD(n, 0), test);
2299 REQ(CHILD(n, 1), gen_for);
2300
2301 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2302 n->n_lineno);
2303 co = icompile(n, c);
2304 symtable_exit_scope(c->c_symtable);
2305
2306 if (co == NULL)
2307 c->c_errors++;
2308 else {
2309 int closure = com_make_closure(c, co);
2310 int i = com_addconst(c, (PyObject *)co);
2311
2312 com_addoparg(c, LOAD_CONST, i);
2313 com_push(c, 1);
2314 if (closure)
2315 com_addoparg(c, MAKE_CLOSURE, 0);
2316 else
2317 com_addoparg(c, MAKE_FUNCTION, 0);
2318
2319 com_test(c, CHILD(CHILD(n, 1), 3));
2320 com_addbyte(c, GET_ITER);
2321 com_addoparg(c, CALL_FUNCTION, 1);
2322 com_pop(c, 1);
2323
2324 Py_DECREF(co);
2325 }
2326}
2327
2328static void
2329com_testlist_gexp(struct compiling *c, node *n)
2330{
2331 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2332 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2333 com_generator_expression(c, n);
2334 else com_list(c, n, 0);
2335}
2336
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002337
Raymond Hettinger354433a2004-05-19 08:20:33 +00002338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002339com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002340{
2341 int i;
2342 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2343 for (i = 0; i+2 < NCH(n); i += 4) {
2344 /* We must arrange things just right for STORE_SUBSCR.
2345 It wants the stack to look like (value) (dict) (key) */
2346 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002347 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002348 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002349 com_node(c, CHILD(n, i+2)); /* value */
2350 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002351 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002352 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002353 }
2354}
2355
2356static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002357com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358{
2359 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002361 int i;
2362 REQ(n, atom);
2363 ch = CHILD(n, 0);
2364 switch (TYPE(ch)) {
2365 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002367 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002368 com_push(c, 1);
2369 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002370 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002371 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002372 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002373 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002374 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002375 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002376 com_push(c, 1);
2377 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002379 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002380 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002381 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002382 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002384 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002385 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002386 break;
2387 case BACKQUOTE:
2388 com_node(c, CHILD(n, 1));
2389 com_addbyte(c, UNARY_CONVERT);
2390 break;
2391 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002392 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002393 i = 255;
2394 }
2395 else {
2396 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002397 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 }
2399 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002400 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002401 break;
2402 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002403 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002404 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002405 c->c_errors++;
2406 i = 255;
2407 }
2408 else {
2409 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002410 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002411 }
2412 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002413 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002414 break;
2415 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002416 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002417 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002418 break;
2419 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002420 com_error(c, PyExc_SystemError,
2421 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002422 }
2423}
2424
2425static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002426com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427{
2428 if (NCH(n) == 1) {
2429 com_addbyte(c, op);
2430 }
2431 else if (NCH(n) == 2) {
2432 if (TYPE(CHILD(n, 0)) != COLON) {
2433 com_node(c, CHILD(n, 0));
2434 com_addbyte(c, op+1);
2435 }
2436 else {
2437 com_node(c, CHILD(n, 1));
2438 com_addbyte(c, op+2);
2439 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002440 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002441 }
2442 else {
2443 com_node(c, CHILD(n, 0));
2444 com_node(c, CHILD(n, 2));
2445 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002446 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002447 }
2448}
2449
Guido van Rossum635abd21997-01-06 22:56:52 +00002450static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002451com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2452{
2453 if (NCH(n) == 1) {
2454 com_addbyte(c, DUP_TOP);
2455 com_push(c, 1);
2456 com_addbyte(c, SLICE);
2457 com_node(c, augn);
2458 com_addbyte(c, opcode);
2459 com_pop(c, 1);
2460 com_addbyte(c, ROT_TWO);
2461 com_addbyte(c, STORE_SLICE);
2462 com_pop(c, 2);
2463 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2464 com_node(c, CHILD(n, 0));
2465 com_addoparg(c, DUP_TOPX, 2);
2466 com_push(c, 2);
2467 com_addbyte(c, SLICE+1);
2468 com_pop(c, 1);
2469 com_node(c, augn);
2470 com_addbyte(c, opcode);
2471 com_pop(c, 1);
2472 com_addbyte(c, ROT_THREE);
2473 com_addbyte(c, STORE_SLICE+1);
2474 com_pop(c, 3);
2475 } else if (NCH(n) == 2) {
2476 com_node(c, CHILD(n, 1));
2477 com_addoparg(c, DUP_TOPX, 2);
2478 com_push(c, 2);
2479 com_addbyte(c, SLICE+2);
2480 com_pop(c, 1);
2481 com_node(c, augn);
2482 com_addbyte(c, opcode);
2483 com_pop(c, 1);
2484 com_addbyte(c, ROT_THREE);
2485 com_addbyte(c, STORE_SLICE+2);
2486 com_pop(c, 3);
2487 } else {
2488 com_node(c, CHILD(n, 0));
2489 com_node(c, CHILD(n, 2));
2490 com_addoparg(c, DUP_TOPX, 3);
2491 com_push(c, 3);
2492 com_addbyte(c, SLICE+3);
2493 com_pop(c, 2);
2494 com_node(c, augn);
2495 com_addbyte(c, opcode);
2496 com_pop(c, 1);
2497 com_addbyte(c, ROT_FOUR);
2498 com_addbyte(c, STORE_SLICE+3);
2499 com_pop(c, 4);
2500 }
2501}
2502
2503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002504com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002505{
2506 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002507 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002508 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002509 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002510 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002511 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002512 }
2513 else {
2514 com_node(c, CHILD(n, 0));
2515 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002516 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002517 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002518 if (NCH(n) == 2) {
2519 com_generator_expression(c, n);
2520 return;
2521 }
2522
Guido van Rossumf10570b1995-07-07 22:53:21 +00002523 m = n;
2524 do {
2525 m = CHILD(m, 0);
2526 } while (NCH(m) == 1);
2527 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002528 /* f(lambda x: x[0] = 3) ends up getting parsed with
2529 * LHS test = lambda x: x[0], and RHS test = 3.
2530 * SF bug 132313 points out that complaining about a keyword
2531 * then is very confusing.
2532 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002533 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002534 TYPE(m) == lambdef ?
2535 "lambda cannot contain assignment" :
2536 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002537 }
2538 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002539 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002540 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002541 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002542 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002543 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002544 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002545 else if (*pkeywords == NULL) {
2546 c->c_errors++;
2547 Py_DECREF(v);
2548 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002549 if (PyDict_GetItem(*pkeywords, v) != NULL)
2550 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002551 "duplicate keyword argument");
2552 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002553 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002554 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002555 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002556 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002557 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002558 }
2559 }
2560 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002561}
2562
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002564com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002565{
2566 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002567 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002568 }
2569 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002570 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002571 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002572 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002573 int star_flag = 0;
2574 int starstar_flag = 0;
2575 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002576 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002577 na = 0;
2578 nk = 0;
2579 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002580 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002581 if (TYPE(ch) == STAR ||
2582 TYPE(ch) == DOUBLESTAR)
2583 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002584 if (ch->n_lineno != lineno) {
2585 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002586 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002587 }
2588 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002589 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002590 na++;
2591 else
2592 nk++;
2593 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002594 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002595 while (i < NCH(n)) {
2596 node *tok = CHILD(n, i);
2597 node *ch = CHILD(n, i+1);
2598 i += 3;
2599 switch (TYPE(tok)) {
2600 case STAR: star_flag = 1; break;
2601 case DOUBLESTAR: starstar_flag = 1; break;
2602 }
2603 com_node(c, ch);
2604 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002605 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002606 com_error(c, PyExc_SyntaxError,
2607 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002608 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002609 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002610 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002611 star_flag + (starstar_flag << 1);
2612 else
2613 opcode = CALL_FUNCTION;
2614 com_addoparg(c, opcode, na | (nk << 8));
2615 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 }
2617}
2618
2619static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002620com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621{
2622 com_addopname(c, LOAD_ATTR, n);
2623}
2624
2625static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002626com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002627{
2628 int i=0;
2629 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002630 node *ch;
2631
2632 /* first argument */
2633 if (TYPE(CHILD(n,i)) == COLON) {
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 i++;
2637 }
2638 else {
2639 com_node(c, CHILD(n,i));
2640 i++;
2641 REQ(CHILD(n,i),COLON);
2642 i++;
2643 }
2644 /* second argument */
2645 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2646 com_node(c, CHILD(n,i));
2647 i++;
2648 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002649 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002650 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002651 com_push(c, 1);
2652 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002653 /* remaining arguments */
2654 for (; i < NCH(n); i++) {
2655 ns++;
2656 ch=CHILD(n,i);
2657 REQ(ch, sliceop);
2658 if (NCH(ch) == 1) {
2659 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002660 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002661 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002662 }
2663 else
2664 com_node(c, CHILD(ch,1));
2665 }
2666 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002667 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002668}
2669
2670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002671com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002672{
2673 node *ch;
2674 REQ(n, subscript);
2675 ch = CHILD(n,0);
2676 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002677 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002678 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002679 com_push(c, 1);
2680 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002681 else {
2682 /* check for slice */
2683 if ((TYPE(ch) == COLON || NCH(n) > 1))
2684 com_sliceobj(c, n);
2685 else {
2686 REQ(ch, test);
2687 com_node(c, ch);
2688 }
2689 }
2690}
2691
2692static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002693com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002694{
2695 int i, op;
2696 REQ(n, subscriptlist);
2697 /* Check to make backward compatible slice behavior for '[i:j]' */
2698 if (NCH(n) == 1) {
2699 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002700 /* 'Basic' slice, should have exactly one colon. */
2701 if ((TYPE(CHILD(sub, 0)) == COLON
2702 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2703 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2704 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002705 switch (assigning) {
2706 case OP_DELETE:
2707 op = DELETE_SLICE;
2708 break;
2709 case OP_ASSIGN:
2710 op = STORE_SLICE;
2711 break;
2712 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002713 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002714 break;
2715 default:
2716 com_augassign_slice(c, sub, assigning, augn);
2717 return;
2718 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002719 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002720 if (op == STORE_SLICE)
2721 com_pop(c, 2);
2722 else if (op == DELETE_SLICE)
2723 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002724 return;
2725 }
2726 }
2727 /* Else normal subscriptlist. Compile each subscript. */
2728 for (i = 0; i < NCH(n); i += 2)
2729 com_subscript(c, CHILD(n, i));
2730 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002731 if (NCH(n) > 1) {
2732 i = (NCH(n)+1) / 2;
2733 com_addoparg(c, BUILD_TUPLE, i);
2734 com_pop(c, i-1);
2735 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002736 switch (assigning) {
2737 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002738 op = DELETE_SUBSCR;
2739 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002740 break;
2741 default:
2742 case OP_ASSIGN:
2743 op = STORE_SUBSCR;
2744 i = 3;
2745 break;
2746 case OP_APPLY:
2747 op = BINARY_SUBSCR;
2748 i = 1;
2749 break;
2750 }
2751 if (assigning > OP_APPLY) {
2752 com_addoparg(c, DUP_TOPX, 2);
2753 com_push(c, 2);
2754 com_addbyte(c, BINARY_SUBSCR);
2755 com_pop(c, 1);
2756 com_node(c, augn);
2757 com_addbyte(c, assigning);
2758 com_pop(c, 1);
2759 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002760 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002761 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002762 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002763}
2764
2765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002766com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002767{
2768 REQ(n, trailer);
2769 switch (TYPE(CHILD(n, 0))) {
2770 case LPAR:
2771 com_call_function(c, CHILD(n, 1));
2772 break;
2773 case DOT:
2774 com_select_member(c, CHILD(n, 1));
2775 break;
2776 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002777 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 break;
2779 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002780 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002781 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 }
2783}
2784
2785static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002786com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002787{
2788 int i;
2789 REQ(n, power);
2790 com_atom(c, CHILD(n, 0));
2791 for (i = 1; i < NCH(n); i++) {
2792 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2793 com_factor(c, CHILD(n, i+1));
2794 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002795 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002796 break;
2797 }
2798 else
2799 com_apply_trailer(c, CHILD(n, i));
2800 }
2801}
2802
2803static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002804com_invert_constant(struct compiling *c, node *n)
2805{
2806 /* Compute the inverse of int and longs and use them directly,
2807 but be prepared to generate code for all other
2808 possibilities (invalid numbers, floats, complex).
2809 */
2810 PyObject *num, *inv = NULL;
2811 int i;
2812
2813 REQ(n, NUMBER);
2814 num = parsenumber(c, STR(n));
2815 if (num == NULL)
2816 i = 255;
2817 else {
2818 inv = PyNumber_Invert(num);
2819 if (inv == NULL) {
2820 PyErr_Clear();
2821 i = com_addconst(c, num);
2822 } else {
2823 i = com_addconst(c, inv);
2824 Py_DECREF(inv);
2825 }
2826 Py_DECREF(num);
2827 }
2828 com_addoparg(c, LOAD_CONST, i);
2829 com_push(c, 1);
2830 if (num != NULL && inv == NULL)
2831 com_addbyte(c, UNARY_INVERT);
2832}
2833
Tim Peters51e26512001-09-07 08:45:55 +00002834static int
2835is_float_zero(const char *p)
2836{
2837 int found_radix_point = 0;
2838 int ch;
2839 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2840 switch (ch) {
2841 case '0':
2842 /* no reason to believe it's not 0 -- continue */
2843 break;
2844
2845 case 'e': case 'E': case 'j': case 'J':
2846 /* If this was a hex constant, we already would have
2847 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2848 must be an exponent marker, and we haven't yet
2849 seen a non-zero digit, and it doesn't matter what
2850 the exponent is then. For 'j' or 'J' similarly,
2851 except that this is an imaginary 0 then. */
2852 return 1;
2853
2854 case '.':
2855 found_radix_point = 1;
2856 break;
2857
2858 default:
2859 return 0;
2860 }
2861 }
2862 return found_radix_point;
2863}
2864
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002865static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002866com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002868 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002869 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002871 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002872 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002873 approriate value as a constant. If the value is negative,
2874 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002875 negative in the 0th position -- unless we're doing unary minus
2876 of a floating zero! In that case the sign is significant, but
2877 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002878 */
2879 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002880 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002881 && TYPE((pfactor = CHILD(n, 1))) == factor
2882 && NCH(pfactor) == 1
2883 && TYPE((ppower = CHILD(pfactor, 0))) == power
2884 && NCH(ppower) == 1
2885 && TYPE((patom = CHILD(ppower, 0))) == atom
2886 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002887 && !(childtype == MINUS &&
2888 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002889 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002890 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002891 return;
2892 }
2893 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002894 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002895 if (s == NULL) {
2896 com_error(c, PyExc_MemoryError, "");
2897 com_addbyte(c, 255);
2898 return;
2899 }
2900 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002901 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002902 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002903 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002904 }
Tim Peters51e26512001-09-07 08:45:55 +00002905 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002906 }
2907 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002908 com_factor(c, CHILD(n, 1));
2909 com_addbyte(c, UNARY_POSITIVE);
2910 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002911 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 com_factor(c, CHILD(n, 1));
2913 com_addbyte(c, UNARY_NEGATIVE);
2914 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002915 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002916 com_factor(c, CHILD(n, 1));
2917 com_addbyte(c, UNARY_INVERT);
2918 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002919 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002920 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002921 }
2922}
2923
2924static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002925com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002926{
2927 int i;
2928 int op;
2929 REQ(n, term);
2930 com_factor(c, CHILD(n, 0));
2931 for (i = 2; i < NCH(n); i += 2) {
2932 com_factor(c, CHILD(n, i));
2933 switch (TYPE(CHILD(n, i-1))) {
2934 case STAR:
2935 op = BINARY_MULTIPLY;
2936 break;
2937 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002938 if (c->c_flags & CO_FUTURE_DIVISION)
2939 op = BINARY_TRUE_DIVIDE;
2940 else
2941 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002942 break;
2943 case PERCENT:
2944 op = BINARY_MODULO;
2945 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002946 case DOUBLESLASH:
2947 op = BINARY_FLOOR_DIVIDE;
2948 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002949 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002950 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002951 "com_term: 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_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002961{
2962 int i;
2963 int op;
2964 REQ(n, arith_expr);
2965 com_term(c, CHILD(n, 0));
2966 for (i = 2; i < NCH(n); i += 2) {
2967 com_term(c, CHILD(n, i));
2968 switch (TYPE(CHILD(n, i-1))) {
2969 case PLUS:
2970 op = BINARY_ADD;
2971 break;
2972 case MINUS:
2973 op = BINARY_SUBTRACT;
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_arith_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_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002987{
2988 int i;
2989 int op;
2990 REQ(n, shift_expr);
2991 com_arith_expr(c, CHILD(n, 0));
2992 for (i = 2; i < NCH(n); i += 2) {
2993 com_arith_expr(c, CHILD(n, i));
2994 switch (TYPE(CHILD(n, i-1))) {
2995 case LEFTSHIFT:
2996 op = BINARY_LSHIFT;
2997 break;
2998 case RIGHTSHIFT:
2999 op = BINARY_RSHIFT;
3000 break;
3001 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003002 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003003 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003004 op = 255;
3005 }
3006 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003007 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003008 }
3009}
3010
3011static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003012com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003013{
3014 int i;
3015 int op;
3016 REQ(n, and_expr);
3017 com_shift_expr(c, CHILD(n, 0));
3018 for (i = 2; i < NCH(n); i += 2) {
3019 com_shift_expr(c, CHILD(n, i));
3020 if (TYPE(CHILD(n, i-1)) == AMPER) {
3021 op = BINARY_AND;
3022 }
3023 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003024 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003025 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003026 op = 255;
3027 }
3028 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003029 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003030 }
3031}
3032
3033static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003034com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003035{
3036 int i;
3037 int op;
3038 REQ(n, xor_expr);
3039 com_and_expr(c, CHILD(n, 0));
3040 for (i = 2; i < NCH(n); i += 2) {
3041 com_and_expr(c, CHILD(n, i));
3042 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3043 op = BINARY_XOR;
3044 }
3045 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003047 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048 op = 255;
3049 }
3050 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003051 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052 }
3053}
3054
3055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003056com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003057{
3058 int i;
3059 int op;
3060 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003061 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003063 com_xor_expr(c, CHILD(n, i));
3064 if (TYPE(CHILD(n, i-1)) == VBAR) {
3065 op = BINARY_OR;
3066 }
3067 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003068 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003069 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 op = 255;
3071 }
3072 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003073 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 }
3075}
3076
3077static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003078cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079{
3080 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003081 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3083 if (NCH(n) == 1) {
3084 n = CHILD(n, 0);
3085 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003086 case LESS: return PyCmp_LT;
3087 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003088 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003089 case LESSEQUAL: return PyCmp_LE;
3090 case GREATEREQUAL: return PyCmp_GE;
3091 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3092 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3093 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 }
3095 }
3096 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003097 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003099 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003101 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003102 }
3103 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003104 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003105}
3106
3107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003108com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109{
3110 int i;
3111 enum cmp_op op;
3112 int anchor;
3113 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3114 com_expr(c, CHILD(n, 0));
3115 if (NCH(n) == 1)
3116 return;
3117
3118 /****************************************************************
3119 The following code is generated for all but the last
3120 comparison in a chain:
3121
3122 label: on stack: opcode: jump to:
3123
3124 a <code to load b>
3125 a, b DUP_TOP
3126 a, b, b ROT_THREE
3127 b, a, b COMPARE_OP
3128 b, 0-or-1 JUMP_IF_FALSE L1
3129 b, 1 POP_TOP
3130 b
3131
3132 We are now ready to repeat this sequence for the next
3133 comparison in the chain.
3134
3135 For the last we generate:
3136
3137 b <code to load c>
3138 b, c COMPARE_OP
3139 0-or-1
3140
3141 If there were any jumps to L1 (i.e., there was more than one
3142 comparison), we generate:
3143
3144 0-or-1 JUMP_FORWARD L2
3145 L1: b, 0 ROT_TWO
3146 0, b POP_TOP
3147 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003148 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 ****************************************************************/
3150
3151 anchor = 0;
3152
3153 for (i = 2; i < NCH(n); i += 2) {
3154 com_expr(c, CHILD(n, i));
3155 if (i+2 < NCH(n)) {
3156 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003157 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003158 com_addbyte(c, ROT_THREE);
3159 }
3160 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003161 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003162 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003163 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003164 }
3165 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003166 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 if (i+2 < NCH(n)) {
3168 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3169 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003170 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003171 }
3172 }
3173
3174 if (anchor) {
3175 int anchor2 = 0;
3176 com_addfwref(c, JUMP_FORWARD, &anchor2);
3177 com_backpatch(c, anchor);
3178 com_addbyte(c, ROT_TWO);
3179 com_addbyte(c, POP_TOP);
3180 com_backpatch(c, anchor2);
3181 }
3182}
3183
3184static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003185com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003186{
3187 REQ(n, not_test); /* 'not' not_test | comparison */
3188 if (NCH(n) == 1) {
3189 com_comparison(c, CHILD(n, 0));
3190 }
3191 else {
3192 com_not_test(c, CHILD(n, 1));
3193 com_addbyte(c, UNARY_NOT);
3194 }
3195}
3196
3197static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003198com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003199{
3200 int i;
3201 int anchor;
3202 REQ(n, and_test); /* not_test ('and' not_test)* */
3203 anchor = 0;
3204 i = 0;
3205 for (;;) {
3206 com_not_test(c, CHILD(n, i));
3207 if ((i += 2) >= NCH(n))
3208 break;
3209 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3210 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003211 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003212 }
3213 if (anchor)
3214 com_backpatch(c, anchor);
3215}
3216
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003217static int
3218com_make_closure(struct compiling *c, PyCodeObject *co)
3219{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003220 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003221 if (free == 0)
3222 return 0;
3223 for (i = 0; i < free; ++i) {
3224 /* Bypass com_addop_varname because it will generate
3225 LOAD_DEREF but LOAD_CLOSURE is needed.
3226 */
3227 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3228 int arg, reftype;
3229
3230 /* Special case: If a class contains a method with a
3231 free variable that has the same name as a method,
3232 the name will be considered free *and* local in the
3233 class. It should be handled by the closure, as
3234 well as by the normal name loookup logic.
3235 */
3236 reftype = get_ref_type(c, PyString_AS_STRING(name));
3237 if (reftype == CELL)
3238 arg = com_lookup_arg(c->c_cellvars, name);
3239 else /* (reftype == FREE) */
3240 arg = com_lookup_arg(c->c_freevars, name);
3241 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003242 fprintf(stderr, "lookup %s in %s %d %d\n"
3243 "freevars of %s: %s\n",
3244 PyObject_REPR(name),
3245 c->c_name,
3246 reftype, arg,
3247 PyString_AS_STRING(co->co_name),
3248 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003249 Py_FatalError("com_make_closure()");
3250 }
3251 com_addoparg(c, LOAD_CLOSURE, arg);
3252
3253 }
3254 com_push(c, free);
3255 return 1;
3256}
3257
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003259com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003260{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003261 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003262 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003263 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003264 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003265 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003266 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3267 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003268 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003269 if (co == NULL) {
3270 c->c_errors++;
3271 return;
3272 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003273 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003274 i = com_addconst(c, (PyObject *)co);
3275 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003276 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003277 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003278 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003279 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003280 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003281 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003282 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003283 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003284 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003286 else {
3287 int anchor = 0;
3288 int i = 0;
3289 for (;;) {
3290 com_and_test(c, CHILD(n, i));
3291 if ((i += 2) >= NCH(n))
3292 break;
3293 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3294 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003295 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003296 }
3297 if (anchor)
3298 com_backpatch(c, anchor);
3299 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300}
3301
3302static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003303com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003304{
3305 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003306 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003307 com_node(c, CHILD(n, 0));
3308 }
3309 else {
3310 int i;
3311 int len;
3312 len = (NCH(n) + 1) / 2;
3313 for (i = 0; i < NCH(n); i += 2)
3314 com_node(c, CHILD(n, i));
3315 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003316 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317 }
3318}
3319
3320
3321/* Begin of assignment compilation */
3322
Thomas Wouters434d0822000-08-24 20:11:32 +00003323
3324static void
3325com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3326{
3327 com_addbyte(c, DUP_TOP);
3328 com_push(c, 1);
3329 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003330 com_node(c, augn);
3331 com_addbyte(c, opcode);
3332 com_pop(c, 1);
3333 com_addbyte(c, ROT_TWO);
3334 com_addopname(c, STORE_ATTR, n);
3335 com_pop(c, 2);
3336}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003337
3338static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003339com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003340{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003341 if (none_assignment_check(c, STR(n), assigning))
3342 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003343 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003344 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345}
3346
3347static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003348com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003350 REQ(n, trailer);
3351 switch (TYPE(CHILD(n, 0))) {
3352 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003353 if (assigning == OP_DELETE)
3354 com_error(c, PyExc_SyntaxError,
3355 "can't delete function call");
3356 else
3357 com_error(c, PyExc_SyntaxError,
3358 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003359 break;
3360 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003361 if (assigning > OP_APPLY)
3362 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3363 else
3364 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003366 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003367 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003368 break;
3369 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003370 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003371 }
3372}
3373
3374static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003375com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003376{
3377 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003378 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3379 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003381 if (assigning) {
3382 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003383 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003384 com_push(c, i-1);
3385 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003386 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003387 com_assign(c, CHILD(n, i), assigning, NULL);
3388}
3389
3390static void
3391com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3392{
3393 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003394 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003395 com_push(c, 1);
3396 com_node(c, augn);
3397 com_addbyte(c, opcode);
3398 com_pop(c, 1);
3399 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003400}
3401
3402static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003403com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003404{
3405 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003406 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003407 if (assigning)
3408 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
3410
3411static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003412com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413{
3414 /* Loop to avoid trivial recursion */
3415 for (;;) {
3416 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003417
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003418 case exprlist:
3419 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003420 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003421 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003423 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003424 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003425 "assign to generator expression not possible");
3426 return;
3427 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003428 if (assigning > OP_APPLY) {
3429 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003430 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003431 return;
3432 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003433 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003434 return;
3435 }
3436 n = CHILD(n, 0);
3437 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003438
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003439 case test:
3440 case and_test:
3441 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003442 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003444 case xor_expr:
3445 case and_expr:
3446 case shift_expr:
3447 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003448 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003449 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003451 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003452 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453 return;
3454 }
3455 n = CHILD(n, 0);
3456 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003457
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003458 case power: /* atom trailer* ('**' power)*
3459 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003460 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003461 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003462 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 return;
3464 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003465 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003466 int i;
3467 com_node(c, CHILD(n, 0));
3468 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003469 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003470 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003471 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003472 return;
3473 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003474 com_apply_trailer(c, CHILD(n, i));
3475 } /* NB i is still alive */
3476 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003477 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 return;
3479 }
3480 n = CHILD(n, 0);
3481 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003482
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003483 case atom:
3484 switch (TYPE(CHILD(n, 0))) {
3485 case LPAR:
3486 n = CHILD(n, 1);
3487 if (TYPE(n) == RPAR) {
3488 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003489 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003490 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003491 return;
3492 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003493 if (assigning > OP_APPLY) {
3494 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003495 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003496 return;
3497 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 break;
3499 case LSQB:
3500 n = CHILD(n, 1);
3501 if (TYPE(n) == RSQB) {
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 []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003504 return;
3505 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003506 if (assigning > OP_APPLY) {
3507 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003508 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003509 return;
3510 }
3511 if (NCH(n) > 1
3512 && TYPE(CHILD(n, 1)) == list_for) {
3513 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003514 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003515 return;
3516 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003517 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003518 return;
3519 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003520 if (assigning > OP_APPLY)
3521 com_augassign_name(c, CHILD(n, 0),
3522 assigning, augn);
3523 else
3524 com_assign_name(c, CHILD(n, 0),
3525 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003526 return;
3527 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003528 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003529 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003530 return;
3531 }
3532 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003533
3534 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003535 com_error(c, PyExc_SyntaxError,
3536 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003537 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003538
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003539 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003540 com_error(c, PyExc_SystemError,
3541 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003542 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003543
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003544 }
3545 }
3546}
Guido van Rossum7c531111997-03-11 18:42:21 +00003547
Thomas Wouters434d0822000-08-24 20:11:32 +00003548static void
3549com_augassign(struct compiling *c, node *n)
3550{
3551 int opcode;
3552
3553 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3554 case '+': opcode = INPLACE_ADD; break;
3555 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003556 case '/':
3557 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3558 opcode = INPLACE_FLOOR_DIVIDE;
3559 else if (c->c_flags & CO_FUTURE_DIVISION)
3560 opcode = INPLACE_TRUE_DIVIDE;
3561 else
3562 opcode = INPLACE_DIVIDE;
3563 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003564 case '%': opcode = INPLACE_MODULO; break;
3565 case '<': opcode = INPLACE_LSHIFT; break;
3566 case '>': opcode = INPLACE_RSHIFT; break;
3567 case '&': opcode = INPLACE_AND; break;
3568 case '^': opcode = INPLACE_XOR; break;
3569 case '|': opcode = INPLACE_OR; break;
3570 case '*':
3571 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3572 opcode = INPLACE_POWER;
3573 else
3574 opcode = INPLACE_MULTIPLY;
3575 break;
3576 default:
3577 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3578 return;
3579 }
3580 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3581}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003582
3583static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003584com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003585{
Thomas Wouters434d0822000-08-24 20:11:32 +00003586 REQ(n, expr_stmt);
3587 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003588 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003589 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003590 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003591 if (NCH(n) == 1) {
3592 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003593 if (c->c_interactive)
3594 com_addbyte(c, PRINT_EXPR);
3595 else
3596 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003597 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003598 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003599 else if (TYPE(CHILD(n,1)) == augassign)
3600 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003601 else {
3602 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003603 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003604 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003605 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003606 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003607 com_push(c, 1);
3608 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003609 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003610 }
3611 }
3612}
3613
3614static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003615com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003616{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003617 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003618 int i;
3619 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003620 if (Py_OptimizeFlag)
3621 return;
3622 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003623
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003624 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003625 raise AssertionError [, <message>]
3626
3627 where <message> is the second test, if present.
3628 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003629 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003630 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003631 com_addbyte(c, POP_TOP);
3632 com_pop(c, 1);
3633 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003634 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003635 com_push(c, 1);
3636 i = NCH(n)/2; /* Either 2 or 4 */
3637 if (i > 1)
3638 com_node(c, CHILD(n, 3));
3639 com_addoparg(c, RAISE_VARARGS, i);
3640 com_pop(c, i);
3641 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003642 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003643 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003644 com_addbyte(c, POP_TOP);
3645}
3646
3647static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003648com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003649{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003650 int i = 1;
3651 node* stream = NULL;
3652
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003653 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003654
3655 /* are we using the extended print form? */
3656 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3657 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003658 com_node(c, stream);
3659 /* stack: [...] => [... stream] */
3660 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003661 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3662 i = 4;
3663 else
3664 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003665 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003666 for (; i < NCH(n); i += 2) {
3667 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003668 com_addbyte(c, DUP_TOP);
3669 /* stack: [stream] => [stream stream] */
3670 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003671 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003672 /* stack: [stream stream] => [stream stream obj] */
3673 com_addbyte(c, ROT_TWO);
3674 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003675 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003676 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003677 com_pop(c, 2);
3678 }
3679 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003680 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003681 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003682 com_addbyte(c, PRINT_ITEM);
3683 com_pop(c, 1);
3684 }
3685 }
3686 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003687 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003688 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003689 /* must pop the extra stream object off the stack */
3690 com_addbyte(c, POP_TOP);
3691 /* stack: [... stream] => [...] */
3692 com_pop(c, 1);
3693 }
3694 }
3695 else {
3696 if (stream != NULL) {
3697 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003698 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003699 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003700 com_pop(c, 1);
3701 }
3702 else
3703 com_addbyte(c, PRINT_NEWLINE);
3704 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003705}
3706
3707static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003708com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003709{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003710 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003711 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003712 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003713 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003714 if (c->c_flags & CO_GENERATOR) {
3715 if (NCH(n) > 1) {
3716 com_error(c, PyExc_SyntaxError,
3717 "'return' with argument inside generator");
3718 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003719 }
3720 if (NCH(n) < 2) {
3721 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003722 com_push(c, 1);
3723 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003724 else
3725 com_node(c, CHILD(n, 1));
3726 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003727 com_pop(c, 1);
3728}
3729
3730static void
3731com_yield_stmt(struct compiling *c, node *n)
3732{
Tim Peters95c80f82001-06-23 02:07:08 +00003733 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003734 REQ(n, yield_stmt); /* 'yield' testlist */
3735 if (!c->c_infunction) {
3736 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3737 }
Tim Peters95c80f82001-06-23 02:07:08 +00003738
3739 for (i = 0; i < c->c_nblocks; ++i) {
3740 if (c->c_block[i] == SETUP_FINALLY) {
3741 com_error(c, PyExc_SyntaxError,
3742 "'yield' not allowed in a 'try' block "
3743 "with a 'finally' clause");
3744 return;
3745 }
3746 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003747 com_node(c, CHILD(n, 1));
3748 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003749 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750}
3751
3752static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003753com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003756 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3757 if (NCH(n) > 1) {
3758 com_node(c, CHILD(n, 1));
3759 if (NCH(n) > 3) {
3760 com_node(c, CHILD(n, 3));
3761 if (NCH(n) > 5)
3762 com_node(c, CHILD(n, 5));
3763 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003764 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003765 i = NCH(n)/2;
3766 com_addoparg(c, RAISE_VARARGS, i);
3767 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768}
3769
3770static void
Thomas Wouters52152252000-08-17 22:55:00 +00003771com_from_import(struct compiling *c, node *n)
3772{
3773 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3774 com_push(c, 1);
3775 if (NCH(n) > 1) {
3776 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3777 com_error(c, PyExc_SyntaxError, "invalid syntax");
3778 return;
3779 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003780 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003781 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003782 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003783 com_pop(c, 1);
3784}
3785
3786static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003787com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003788{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003789 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 int i;
3791 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003792 n = CHILD(n, 0);
3793 /* import_stmt: import_name | import_from */
3794 if (TYPE(n) == import_from) {
3795 /* 'from' dotted_name 'import' ('*' |
3796 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003797 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003798 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003799 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3800 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003801 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003802 else {
3803 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3804 TYPE(CHILD(n, 3)) != LPAR) {
3805 com_error(c, PyExc_SyntaxError,
3806 "trailing comma not allowed "
3807 "without surrounding parentheses");
3808 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003809 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003810 REQ(nn, import_as_names);
3811 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003812 for (i = 0; i < NCH(nn); i += 2) {
3813 PyObject *s = PyString_FromString(
3814 STR(CHILD(CHILD(nn, i), 0)));
3815 if (s == NULL) {
3816 Py_CLEAR(tup);
3817 break;
3818 } else
3819 PyTuple_SET_ITEM(tup, i / 2, s);
3820 }
3821 if (tup == NULL) {
3822 /* Assume that failue above was MemoryError */
3823 com_error(c, PyExc_MemoryError, "");
3824 return;
3825 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003826 }
3827 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003828 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003829 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003830 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003831 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003832 com_addbyte(c, IMPORT_STAR);
3833 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003834 for (i = 0; i < NCH(nn); i += 2)
3835 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003836 com_addbyte(c, POP_TOP);
3837 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003838 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003839 }
3840 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003841 /* 'import' dotted_as_names */
3842 nn = CHILD(n, 1);
3843 REQ(nn, dotted_as_names);
3844 for (i = 0; i < NCH(nn); i += 2) {
3845 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003846 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003847 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003848 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003849 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003850 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003851 int j;
3852 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003853 com_error(c, PyExc_SyntaxError,
3854 "invalid syntax");
3855 return;
3856 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003857 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3858 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003859 CHILD(CHILD(subn, 0),
3860 j));
3861 com_addop_varname(c, VAR_STORE,
3862 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003863 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003864 com_addop_varname(c, VAR_STORE,
3865 STR(CHILD(CHILD(subn, 0),
3866 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003867 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868 }
3869 }
3870}
3871
3872static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003873com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003874{
3875 REQ(n, exec_stmt);
3876 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3877 com_node(c, CHILD(n, 1));
3878 if (NCH(n) >= 4)
3879 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003880 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003881 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003882 com_push(c, 1);
3883 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003884 if (NCH(n) >= 6)
3885 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003886 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003887 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003888 com_push(c, 1);
3889 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003890 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003891 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003892}
3893
Guido van Rossum7c531111997-03-11 18:42:21 +00003894static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003895is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003896{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003897 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003898 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003899 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003900
3901 /* Label to avoid tail recursion */
3902 next:
3903 switch (TYPE(n)) {
3904
3905 case suite:
3906 if (NCH(n) == 1) {
3907 n = CHILD(n, 0);
3908 goto next;
3909 }
3910 /* Fall through */
3911 case file_input:
3912 for (i = 0; i < NCH(n); i++) {
3913 node *ch = CHILD(n, i);
3914 if (TYPE(ch) == stmt) {
3915 n = ch;
3916 goto next;
3917 }
3918 }
3919 break;
3920
3921 case stmt:
3922 case simple_stmt:
3923 case small_stmt:
3924 n = CHILD(n, 0);
3925 goto next;
3926
3927 case expr_stmt:
3928 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003929 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003930 case test:
3931 case and_test:
3932 case not_test:
3933 case comparison:
3934 case expr:
3935 case xor_expr:
3936 case and_expr:
3937 case shift_expr:
3938 case arith_expr:
3939 case term:
3940 case factor:
3941 case power:
3942 case atom:
3943 if (NCH(n) == 1) {
3944 n = CHILD(n, 0);
3945 goto next;
3946 }
3947 break;
3948
3949 case NAME:
3950 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3951 return 1;
3952 break;
3953
3954 case NUMBER:
3955 v = parsenumber(c, STR(n));
3956 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003957 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003958 break;
3959 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003960 i = PyObject_IsTrue(v);
3961 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003962 return i == 0;
3963
3964 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003965 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003966 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003967 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003968 break;
3969 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003970 i = PyObject_IsTrue(v);
3971 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003972 return i == 0;
3973
3974 }
3975 return 0;
3976}
3977
Tim Peters08a898f2001-06-28 01:52:22 +00003978
3979/* Look under n for a return stmt with an expression.
3980 * This hack is used to find illegal returns under "if 0:" blocks in
3981 * functions already known to be generators (as determined by the symtable
3982 * pass).
3983 * Return the offending return node if found, else NULL.
3984 */
3985static node *
3986look_for_offending_return(node *n)
3987{
3988 int i;
3989
3990 for (i = 0; i < NCH(n); ++i) {
3991 node *kid = CHILD(n, i);
3992
3993 switch (TYPE(kid)) {
3994 case classdef:
3995 case funcdef:
3996 case lambdef:
3997 /* Stuff in nested functions & classes doesn't
3998 affect the code block we started in. */
3999 return NULL;
4000
4001 case return_stmt:
4002 if (NCH(kid) > 1)
4003 return kid;
4004 break;
4005
4006 default: {
4007 node *bad = look_for_offending_return(kid);
4008 if (bad != NULL)
4009 return bad;
4010 }
4011 }
4012 }
4013
4014 return NULL;
4015}
4016
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004017static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004018com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004019{
4020 int i;
4021 int anchor = 0;
4022 REQ(n, if_stmt);
4023 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
4024 for (i = 0; i+3 < NCH(n); i+=4) {
4025 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004026 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004027 if (is_constant_false(c, ch)) {
4028 /* We're going to skip this block. However, if this
4029 is a generator, we have to check the dead code
4030 anyway to make sure there aren't any return stmts
4031 with expressions, in the same scope. */
4032 if (c->c_flags & CO_GENERATOR) {
4033 node *p = look_for_offending_return(n);
4034 if (p != NULL) {
4035 int savelineno = c->c_lineno;
4036 c->c_lineno = p->n_lineno;
4037 com_error(c, PyExc_SyntaxError,
4038 "'return' with argument "
4039 "inside generator");
4040 c->c_lineno = savelineno;
4041 }
4042 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004043 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004044 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004045 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004046 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004047 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004048 com_addfwref(c, JUMP_IF_FALSE, &a);
4049 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004050 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051 com_node(c, CHILD(n, i+3));
4052 com_addfwref(c, JUMP_FORWARD, &anchor);
4053 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004054 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004055 com_addbyte(c, POP_TOP);
4056 }
4057 if (i+2 < NCH(n))
4058 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004059 if (anchor)
4060 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004061}
4062
4063static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004064com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065{
4066 int break_anchor = 0;
4067 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004068 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4070 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004071 block_push(c, SETUP_LOOP);
4072 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004073 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004074 com_node(c, CHILD(n, 1));
4075 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4076 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004077 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004078 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004080 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004081 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4082 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004084 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004085 com_addbyte(c, POP_TOP);
4086 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004087 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004088 if (NCH(n) > 4)
4089 com_node(c, CHILD(n, 6));
4090 com_backpatch(c, break_anchor);
4091}
4092
4093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004094com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004095{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004096 int break_anchor = 0;
4097 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004098 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099 REQ(n, for_stmt);
4100 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4101 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004102 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004103 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004104 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004105 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004106 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004107 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004108 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004109 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004110 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004111 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004112 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004113 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4114 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004115 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004116 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004117 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004118 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004119 if (NCH(n) > 8)
4120 com_node(c, CHILD(n, 8));
4121 com_backpatch(c, break_anchor);
4122}
4123
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004124/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004125
4126 SETUP_FINALLY L
4127 <code for S>
4128 POP_BLOCK
4129 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004130 L: <code for Sf>
4131 END_FINALLY
4132
4133 The special instructions use the block stack. Each block
4134 stack entry contains the instruction that created it (here
4135 SETUP_FINALLY), the level of the value stack at the time the
4136 block stack entry was created, and a label (here L).
4137
4138 SETUP_FINALLY:
4139 Pushes the current value stack level and the label
4140 onto the block stack.
4141 POP_BLOCK:
4142 Pops en entry from the block stack, and pops the value
4143 stack until its level is the same as indicated on the
4144 block stack. (The label is ignored.)
4145 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004146 Pops a variable number of entries from the *value* stack
4147 and re-raises the exception they specify. The number of
4148 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004149
4150 The block stack is unwound when an exception is raised:
4151 when a SETUP_FINALLY entry is found, the exception is pushed
4152 onto the value stack (and the exception condition is cleared),
4153 and the interpreter jumps to the label gotten from the block
4154 stack.
4155
4156 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004157 (The contents of the value stack is shown in [], with the top
4158 at the right; 'tb' is trace-back info, 'val' the exception's
4159 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004160
4161 Value stack Label Instruction Argument
4162 [] SETUP_EXCEPT L1
4163 [] <code for S>
4164 [] POP_BLOCK
4165 [] JUMP_FORWARD L0
4166
Guido van Rossum3f5da241990-12-20 15:06:42 +00004167 [tb, val, exc] L1: DUP )
4168 [tb, val, exc, exc] <evaluate E1> )
4169 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4170 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4171 [tb, val, exc, 1] POP )
4172 [tb, val, exc] POP
4173 [tb, val] <assign to V1> (or POP if no V1)
4174 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004175 [] <code for S1>
4176 JUMP_FORWARD L0
4177
Guido van Rossum3f5da241990-12-20 15:06:42 +00004178 [tb, val, exc, 0] L2: POP
4179 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004180 .............................etc.......................
4181
Guido van Rossum3f5da241990-12-20 15:06:42 +00004182 [tb, val, exc, 0] Ln+1: POP
4183 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004184
4185 [] L0: <next statement>
4186
4187 Of course, parts are not generated if Vi or Ei is not present.
4188*/
4189
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004190static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004191com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004192{
4193 int except_anchor = 0;
4194 int end_anchor = 0;
4195 int else_anchor = 0;
4196 int i;
4197 node *ch;
4198
4199 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4200 block_push(c, SETUP_EXCEPT);
4201 com_node(c, CHILD(n, 2));
4202 com_addbyte(c, POP_BLOCK);
4203 block_pop(c, SETUP_EXCEPT);
4204 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4205 com_backpatch(c, except_anchor);
4206 for (i = 3;
4207 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4208 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004209 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004210 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004211 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004212 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004213 break;
4214 }
4215 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004216 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004217 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004218 if (NCH(ch) > 1) {
4219 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004220 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004221 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004222 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004223 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004224 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4225 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004226 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004227 }
4228 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004229 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004230 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004231 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004232 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004233 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004234 com_pop(c, 1);
4235 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004236 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004237 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004238 com_node(c, CHILD(n, i+2));
4239 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4240 if (except_anchor) {
4241 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004242 /* We come in with [tb, val, exc, 0] on the
4243 stack; one pop and it's the same as
4244 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004245 com_addbyte(c, POP_TOP);
4246 }
4247 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004248 /* We actually come in here with [tb, val, exc] but the
4249 END_FINALLY will zap those and jump around.
4250 The c_stacklevel does not reflect them so we need not pop
4251 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004252 com_addbyte(c, END_FINALLY);
4253 com_backpatch(c, else_anchor);
4254 if (i < NCH(n))
4255 com_node(c, CHILD(n, i+2));
4256 com_backpatch(c, end_anchor);
4257}
4258
4259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004260com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004261{
4262 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004263 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004264
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004265 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4266 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004268 com_addbyte(c, POP_BLOCK);
4269 block_pop(c, SETUP_FINALLY);
4270 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004271 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004272 /* While the generated code pushes only one item,
4273 the try-finally handling can enter here with
4274 up to three items. OK, here are the details:
4275 3 for an exception, 2 for RETURN, 1 for BREAK. */
4276 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004277 com_backpatch(c, finally_anchor);
4278 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004279 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004280 com_node(c, ch);
4281 com_addbyte(c, END_FINALLY);
4282 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004283 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004284}
4285
4286static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004287com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004288{
4289 REQ(n, try_stmt);
4290 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4291 | 'try' ':' suite 'finally' ':' suite */
4292 if (TYPE(CHILD(n, 3)) != except_clause)
4293 com_try_finally(c, n);
4294 else
4295 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004296}
4297
Guido van Rossum8b993a91997-01-17 21:04:03 +00004298static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004299get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004300{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004301 int i;
4302
Guido van Rossum8b993a91997-01-17 21:04:03 +00004303 /* Label to avoid tail recursion */
4304 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004305 switch (TYPE(n)) {
4306
4307 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004308 if (NCH(n) == 1) {
4309 n = CHILD(n, 0);
4310 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004311 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004312 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004313 case file_input:
4314 for (i = 0; i < NCH(n); i++) {
4315 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004316 if (TYPE(ch) == stmt) {
4317 n = ch;
4318 goto next;
4319 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004320 }
4321 break;
4322
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004323 case stmt:
4324 case simple_stmt:
4325 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004326 n = CHILD(n, 0);
4327 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004328
4329 case expr_stmt:
4330 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004331 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004332 case test:
4333 case and_test:
4334 case not_test:
4335 case comparison:
4336 case expr:
4337 case xor_expr:
4338 case and_expr:
4339 case shift_expr:
4340 case arith_expr:
4341 case term:
4342 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004343 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004344 if (NCH(n) == 1) {
4345 n = CHILD(n, 0);
4346 goto next;
4347 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004348 break;
4349
4350 case atom:
4351 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004352 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004353 break;
4354
4355 }
4356 return NULL;
4357}
4358
Guido van Rossum79f25d91997-04-29 20:08:16 +00004359static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004360get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004361{
Guido van Rossum541563e1999-01-28 15:08:09 +00004362 /* Don't generate doc-strings if run with -OO */
4363 if (Py_OptimizeFlag > 1)
4364 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004365 n = get_rawdocstring(n);
4366 if (n == NULL)
4367 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004368 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004369}
4370
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004371static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004372com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004373{
4374 REQ(n, suite);
4375 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4376 if (NCH(n) == 1) {
4377 com_node(c, CHILD(n, 0));
4378 }
4379 else {
4380 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004381 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004382 node *ch = CHILD(n, i);
4383 if (TYPE(ch) == stmt)
4384 com_node(c, ch);
4385 }
4386 }
4387}
4388
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004389/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004390static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004391com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004392{
4393 int i = c->c_nblocks;
4394 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4395 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4396 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004397 else if (i <= 0) {
4398 /* at the outer level */
4399 com_error(c, PyExc_SyntaxError,
4400 "'continue' not properly in loop");
4401 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004402 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004403 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004404 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004405 if (c->c_block[j] == SETUP_LOOP)
4406 break;
4407 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004408 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004409 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004410 for (; i > j; --i) {
4411 if (c->c_block[i] == SETUP_EXCEPT ||
4412 c->c_block[i] == SETUP_FINALLY) {
4413 com_addoparg(c, CONTINUE_LOOP,
4414 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004415 return;
4416 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004417 if (c->c_block[i] == END_FINALLY) {
4418 com_error(c, PyExc_SyntaxError,
4419 "'continue' not supported inside 'finally' clause");
4420 return;
4421 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004422 }
4423 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004424 com_error(c, PyExc_SyntaxError,
4425 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004426 }
4427 /* XXX Could allow it inside a 'finally' clause
4428 XXX if we could pop the exception still on the stack */
4429}
4430
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004431/* Return the number of default values in the argument list.
4432
4433 If a non-default argument follows a default argument, set an
4434 exception and return -1.
4435*/
4436
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004437static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004438com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004439{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004440 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004441 if (TYPE(n) == lambdef) {
4442 /* lambdef: 'lambda' [varargslist] ':' test */
4443 n = CHILD(n, 1);
4444 }
4445 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004446 REQ(n, funcdef);
4447 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4448 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004449 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4450 n = CHILD(n, 1);
4451 }
4452 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004453 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004454 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004455 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004456 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4457 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004458 ndefs = 0;
4459 for (i = 0; i < nch; i++) {
4460 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004461 if (TYPE(CHILD(n, i)) == STAR ||
4462 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004463 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004464 i++;
4465 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004466 t = RPAR; /* Anything except EQUAL or COMMA */
4467 else
4468 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004469 if (t == EQUAL) {
4470 i++;
4471 ndefs++;
4472 com_node(c, CHILD(n, i));
4473 i++;
4474 if (i >= nch)
4475 break;
4476 t = TYPE(CHILD(n, i));
4477 }
4478 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004479 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004480 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004481 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004482 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004483 return -1;
4484 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004485 }
4486 if (t != COMMA)
4487 break;
4488 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004489 return ndefs;
4490}
4491
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004492static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004493com_decorator_name(struct compiling *c, node *n)
4494{
4495 /* dotted_name: NAME ('.' NAME)* */
4496
4497 int i, nch;
4498 node *varname;
4499
4500 REQ(n, dotted_name);
4501 nch = NCH(n);
4502 assert(nch >= 1 && nch % 2 == 1);
4503
4504 varname = CHILD(n, 0);
4505 REQ(varname, NAME);
4506 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004507 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004508
4509 for (i = 1; i < nch; i += 2) {
4510 node *attrname;
4511
4512 REQ(CHILD(n, i), DOT);
4513
4514 attrname = CHILD(n, i + 1);
4515 REQ(attrname, NAME);
4516 com_addop_name(c, LOAD_ATTR, STR(attrname));
4517 }
4518}
4519
4520static void
4521com_decorator(struct compiling *c, node *n)
4522{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004523 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004524 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004525 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004526 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004527 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004528 com_decorator_name(c, CHILD(n, 1));
4529
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004530 if (nch > 3) {
4531 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004532 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004533 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004534 com_call_function(c, CHILD(n, 3));
4535 }
4536}
4537
4538static int
4539com_decorators(struct compiling *c, node *n)
4540{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004541 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004542
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004543 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004544 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004545 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004546
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004547 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004548 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004549 REQ(ch, decorator);
4550
4551 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004552 }
4553
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004554 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004555}
4556
4557static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004558com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004559{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004560 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004561 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004562
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004563 REQ(n, funcdef);
4564 /* -6 -5 -4 -3 -2 -1
4565 funcdef: [decorators] 'def' NAME parameters ':' suite */
4566
4567 if (NCH(n) == 6)
4568 ndecorators = com_decorators(c, CHILD(n, 0));
4569 else
4570 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004571
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004572 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004573 if (ndefs < 0)
4574 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004575 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004576 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004577 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004578 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004579 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004580 c->c_errors++;
4581 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004582 int closure = com_make_closure(c, (PyCodeObject *)co);
4583 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004584 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004585 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004586 if (closure)
4587 com_addoparg(c, MAKE_CLOSURE, ndefs);
4588 else
4589 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004590 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004591
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004592 while (ndecorators > 0) {
4593 com_addoparg(c, CALL_FUNCTION, 1);
4594 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004595 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004596 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004597
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004598 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004599 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004600 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004601 }
4602}
4603
4604static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004605com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004606{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004607 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004608 REQ(n, testlist);
4609 /* testlist: test (',' test)* [','] */
4610 for (i = 0; i < NCH(n); i += 2)
4611 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004612 i = (NCH(n)+1) / 2;
4613 com_addoparg(c, BUILD_TUPLE, i);
4614 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004615}
4616
4617static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004618com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004619{
Guido van Rossum25831651993-05-19 14:50:45 +00004620 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004621 PyObject *v;
4622 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 char *name;
4624
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004625 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004626 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004627 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004628 c->c_errors++;
4629 return;
4630 }
4631 /* Push the class name on the stack */
4632 i = com_addconst(c, v);
4633 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004634 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004635 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004636 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004637 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004638 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004639 com_push(c, 1);
4640 }
Guido van Rossum25831651993-05-19 14:50:45 +00004641 else
4642 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004643 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004644 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004645 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004646 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004647 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004648 c->c_errors++;
4649 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004650 int closure = com_make_closure(c, co);
4651 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004652 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004653 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004654 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004655 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004656 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004657 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004658 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004659 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004660 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004661 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004662 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004663 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004664 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004665 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004666}
4667
4668static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004669com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004670{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004671 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004672 if (c->c_errors)
4673 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004674 switch (TYPE(n)) {
4675
4676 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004677
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004678 case funcdef:
4679 com_funcdef(c, n);
4680 break;
4681 case classdef:
4682 com_classdef(c, n);
4683 break;
4684
4685 /* Trivial parse tree nodes */
4686
4687 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004688 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004689 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004690 n = CHILD(n, 0);
4691 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004692
4693 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004694 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004695 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004696 {
4697 int i;
4698 for (i = 0; i < NCH(n)-1; i += 2)
4699 com_node(c, CHILD(n, i));
4700 }
4701 break;
4702
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004703 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004704 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004705 n = CHILD(n, 0);
4706 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004707
4708 /* Statement nodes */
4709
4710 case expr_stmt:
4711 com_expr_stmt(c, n);
4712 break;
4713 case print_stmt:
4714 com_print_stmt(c, n);
4715 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004716 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004717 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004718 break;
4719 case pass_stmt:
4720 break;
4721 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004722 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004723 com_error(c, PyExc_SyntaxError,
4724 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004725 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004726 com_addbyte(c, BREAK_LOOP);
4727 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004728 case continue_stmt:
4729 com_continue_stmt(c, n);
4730 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004731 case return_stmt:
4732 com_return_stmt(c, n);
4733 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004734 case yield_stmt:
4735 com_yield_stmt(c, n);
4736 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004737 case raise_stmt:
4738 com_raise_stmt(c, n);
4739 break;
4740 case import_stmt:
4741 com_import_stmt(c, n);
4742 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004743 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004744 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004745 case exec_stmt:
4746 com_exec_stmt(c, n);
4747 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004748 case assert_stmt:
4749 com_assert_stmt(c, n);
4750 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004751 case if_stmt:
4752 com_if_stmt(c, n);
4753 break;
4754 case while_stmt:
4755 com_while_stmt(c, n);
4756 break;
4757 case for_stmt:
4758 com_for_stmt(c, n);
4759 break;
4760 case try_stmt:
4761 com_try_stmt(c, n);
4762 break;
4763 case suite:
4764 com_suite(c, n);
4765 break;
4766
4767 /* Expression nodes */
4768
4769 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004770 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004771 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004772 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004773 break;
4774 case test:
4775 com_test(c, n);
4776 break;
4777 case and_test:
4778 com_and_test(c, n);
4779 break;
4780 case not_test:
4781 com_not_test(c, n);
4782 break;
4783 case comparison:
4784 com_comparison(c, n);
4785 break;
4786 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004787 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004788 break;
4789 case expr:
4790 com_expr(c, n);
4791 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004792 case xor_expr:
4793 com_xor_expr(c, n);
4794 break;
4795 case and_expr:
4796 com_and_expr(c, n);
4797 break;
4798 case shift_expr:
4799 com_shift_expr(c, n);
4800 break;
4801 case arith_expr:
4802 com_arith_expr(c, n);
4803 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004804 case term:
4805 com_term(c, n);
4806 break;
4807 case factor:
4808 com_factor(c, n);
4809 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004810 case power:
4811 com_power(c, n);
4812 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004813 case atom:
4814 com_atom(c, n);
4815 break;
4816
4817 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004818 com_error(c, PyExc_SystemError,
4819 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004820 }
4821}
4822
Tim Petersdbd9ba62000-07-09 03:09:57 +00004823static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004824
4825static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004826com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004827{
4828 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4829 if (TYPE(CHILD(n, 0)) == LPAR)
4830 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004831 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004832 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004833 com_pop(c, 1);
4834 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004835}
4836
4837static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004838com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004839{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004840 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004841 if (NCH(n) == 1) {
4842 com_fpdef(c, CHILD(n, 0));
4843 }
4844 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004845 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004846 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004847 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004848 for (i = 0; i < NCH(n); i += 2)
4849 com_fpdef(c, CHILD(n, i));
4850 }
4851}
4852
4853static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004854com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004855{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004856 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004857 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004858 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004859 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004860 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004861 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004862 nch = NCH(n);
4863 /* Enter all arguments in table of locals */
4864 for (i = 0, narg = 0; i < nch; i++) {
4865 node *ch = CHILD(n, i);
4866 node *fp;
4867 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004868 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004869 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4870 fp = CHILD(ch, 0);
4871 if (TYPE(fp) != NAME) {
4872 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4873 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004874 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004875 narg++;
4876 /* all name updates handled by symtable */
4877 if (++i >= nch)
4878 break;
4879 ch = CHILD(n, i);
4880 if (TYPE(ch) == EQUAL)
4881 i += 2;
4882 else
4883 REQ(ch, COMMA);
4884 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004885 if (complex) {
4886 /* Generate code for complex arguments only after
4887 having counted the simple arguments */
4888 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004889 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004890 node *ch = CHILD(n, i);
4891 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004892 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004893 break;
4894 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4895 fp = CHILD(ch, 0);
4896 if (TYPE(fp) != NAME) {
4897 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004898 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004899 com_fpdef(c, ch);
4900 }
4901 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004902 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004903 break;
4904 ch = CHILD(n, i);
4905 if (TYPE(ch) == EQUAL)
4906 i += 2;
4907 else
4908 REQ(ch, COMMA);
4909 }
4910 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004911}
4912
4913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004914com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004915{
4916 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004917 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004918 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004919 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004920 if (doc != NULL) {
4921 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004922 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004923 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004924 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004925 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004926 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004927 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004928 for (i = 0; i < NCH(n); i++) {
4929 node *ch = CHILD(n, i);
4930 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4931 com_node(c, ch);
4932 }
4933}
4934
4935/* Top-level compile-node interface */
4936
4937static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004938compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004939{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004940 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004941 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004942 REQ(n, funcdef);
4943 /* -6 -5 -4 -3 -2 -1
4944 funcdef: [decorators] 'def' NAME parameters ':' suite */
4945 c->c_name = STR(RCHILD(n, -4));
4946 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004947 if (doc != NULL) {
4948 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004949 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004950 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004951 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004952 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004953 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004954 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004955 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004956 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004957 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004958 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004959 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004960 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004961 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4962 com_push(c, 1);
4963 com_addbyte(c, RETURN_VALUE);
4964 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004965}
4966
4967static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004968compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004969{
Guido van Rossum590baa41993-11-30 13:40:46 +00004970 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004971 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004972 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004973
4974 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004975 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004976 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004977 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004978 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004979 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004980 else
4981 ch = CHILD(n, 2);
4982 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004983 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004984 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004985}
4986
4987static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004988compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004989{
4990 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004991 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004992 REQ(n, classdef);
4993 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4994 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004995 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004996 /* Initialize local __module__ from global __name__ */
4997 com_addop_name(c, LOAD_GLOBAL, "__name__");
4998 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004999 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00005000 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005001 if (doc != NULL) {
5002 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005003 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005004 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005005 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00005007 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005008 }
5009 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00005010 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005011 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00005012 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005013 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005014 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005015 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005016 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005017}
5018
5019static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005020compile_generator_expression(struct compiling *c, node *n)
5021{
5022 /* testlist_gexp: test gen_for */
5023 /* argument: test gen_for */
5024 REQ(CHILD(n, 0), test);
5025 REQ(CHILD(n, 1), gen_for);
5026
5027 c->c_name = "<generator expression>";
5028 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5029
5030 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5031 com_push(c, 1);
5032 com_addbyte(c, RETURN_VALUE);
5033 com_pop(c, 1);
5034}
5035
5036static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005037compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005038{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005039 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005040
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005041 switch (TYPE(n)) {
5042
Guido van Rossum4c417781991-01-21 16:09:22 +00005043 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005044 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005045 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005046 n = CHILD(n, 0);
5047 if (TYPE(n) != NEWLINE)
5048 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005049 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005050 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5051 com_push(c, 1);
5052 com_addbyte(c, RETURN_VALUE);
5053 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005054 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005055 break;
5056
Guido van Rossum4c417781991-01-21 16:09:22 +00005057 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005058 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005059 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005060 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5061 com_push(c, 1);
5062 com_addbyte(c, RETURN_VALUE);
5063 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005064 break;
5065
Guido van Rossum590baa41993-11-30 13:40:46 +00005066 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005067 com_node(c, CHILD(n, 0));
5068 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005069 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005070 break;
5071
Guido van Rossum590baa41993-11-30 13:40:46 +00005072 case lambdef: /* anonymous function definition */
5073 compile_lambdef(c, n);
5074 break;
5075
Guido van Rossum4c417781991-01-21 16:09:22 +00005076 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005077 compile_funcdef(c, n);
5078 break;
5079
Guido van Rossum4c417781991-01-21 16:09:22 +00005080 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005081 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005082 break;
5083
Raymond Hettinger354433a2004-05-19 08:20:33 +00005084 case testlist_gexp: /* A generator expression */
5085 case argument: /* A generator expression */
5086 compile_generator_expression(c, n);
5087 break;
5088
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005089 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005090 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005091 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005092 }
5093}
5094
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005095static PyObject *
5096dict_keys_inorder(PyObject *dict, int offset)
5097{
5098 PyObject *tuple, *k, *v;
5099 int i, pos = 0, size = PyDict_Size(dict);
5100
5101 tuple = PyTuple_New(size);
5102 if (tuple == NULL)
5103 return NULL;
5104 while (PyDict_Next(dict, &pos, &k, &v)) {
5105 i = PyInt_AS_LONG(v);
5106 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005107 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005108 PyTuple_SET_ITEM(tuple, i - offset, k);
5109 }
5110 return tuple;
5111}
5112
Guido van Rossum79f25d91997-04-29 20:08:16 +00005113PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005114PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005115{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005116 return PyNode_CompileFlags(n, filename, NULL);
5117}
5118
5119PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005120PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005121{
5122 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005123}
5124
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005125struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005126PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005127{
5128 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005129 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005130
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005131 ff = PyNode_Future(n, filename);
5132 if (ff == NULL)
5133 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005134 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005135 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005136 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005137 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005138 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005139 return st;
5140}
5141
Guido van Rossum79f25d91997-04-29 20:08:16 +00005142static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005143icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005144{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005145 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005146}
5147
Guido van Rossum79f25d91997-04-29 20:08:16 +00005148static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005149jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005150 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005151{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005152 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005153 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005154 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005155 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005156 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5157 sc.c_encoding = "utf-8";
5158 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005159 sc.c_encoding = STR(n);
5160 n = CHILD(n, 0);
5161 } else {
5162 sc.c_encoding = NULL;
5163 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005164 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005165 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005166 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005167 /* c_symtable still points to parent's symbols */
5168 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005169 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005170 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005171 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005172 if (base->c_encoding != NULL) {
5173 assert(sc.c_encoding == NULL);
5174 sc.c_encoding = base->c_encoding;
5175 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005176 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005177 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005178 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005179 if (sc.c_future == NULL) {
5180 com_free(&sc);
5181 return NULL;
5182 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005183 if (flags) {
5184 int merged = sc.c_future->ff_features |
5185 flags->cf_flags;
5186 sc.c_future->ff_features = merged;
5187 flags->cf_flags = merged;
5188 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005189 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5190 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005191 com_free(&sc);
5192 return NULL;
5193 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005194 /* reset symbol table for second pass */
5195 sc.c_symtable->st_nscopes = 1;
5196 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005197 }
5198 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005199 if (symtable_load_symbols(&sc) < 0) {
5200 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005201 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005202 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005203 compile_node(&sc, n);
5204 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005205 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005206 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005207 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005208 names = PyList_AsTuple(sc.c_names);
5209 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005210 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5211 freevars = dict_keys_inorder(sc.c_freevars,
5212 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005213 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005214 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005215 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5216 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005217 if (!PyErr_Occurred())
5218 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005219 sc.c_nlocals,
5220 sc.c_maxstacklevel,
5221 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005222 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005223 consts,
5224 names,
5225 varnames,
5226 freevars,
5227 cellvars,
5228 filename,
5229 name,
5230 sc.c_firstlineno,
5231 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005232 Py_XDECREF(consts);
5233 Py_XDECREF(names);
5234 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005235 Py_XDECREF(freevars);
5236 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005237 Py_XDECREF(filename);
5238 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005239 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005240 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005241 else if (!PyErr_Occurred()) {
5242 /* This could happen if someone called PyErr_Clear() after an
5243 error was reported above. That's not supposed to happen,
5244 but I just plugged one case and I'm not sure there can't be
5245 others. In that case, raise SystemError so that at least
5246 it gets reported instead dumping core. */
5247 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5248 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005249 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005250 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005251 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005252 sc.c_symtable = NULL;
5253 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005254 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005255 return co;
5256}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005257
5258int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005259PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005260{
5261 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005262 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005263 int line = co->co_firstlineno;
5264 int addr = 0;
5265 while (--size >= 0) {
5266 addr += *p++;
5267 if (addr > addrq)
5268 break;
5269 line += *p++;
5270 }
5271 return line;
5272}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005273
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005274/* The test for LOCAL must come before the test for FREE in order to
5275 handle classes where name is both local and free. The local var is
5276 a method and the free var is a free var referenced within a method.
5277*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005278
5279static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005280get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005281{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005282 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005283 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005284
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005285 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5286 return CELL;
5287 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5288 return LOCAL;
5289 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5290 return FREE;
5291 v = PyDict_GetItemString(c->c_globals, name);
5292 if (v) {
5293 if (v == Py_None)
5294 return GLOBAL_EXPLICIT;
5295 else {
5296 return GLOBAL_IMPLICIT;
5297 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005298 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005299 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005300 "unknown scope for %.100s in %.100s(%s) "
5301 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5302 name, c->c_name,
5303 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5304 c->c_filename,
5305 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5306 PyObject_REPR(c->c_locals),
5307 PyObject_REPR(c->c_globals)
5308 );
5309
5310 Py_FatalError(buf);
5311 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005312}
5313
Guido van Rossum207fda62001-03-02 03:30:41 +00005314/* Helper functions to issue warnings */
5315
5316static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005317issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005318{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005319 if (PyErr_Occurred()) {
5320 /* This can happen because symtable_node continues
5321 processing even after raising a SyntaxError.
5322 Calling PyErr_WarnExplicit now would clobber the
5323 pending exception; instead we fail and let that
5324 exception propagate.
5325 */
5326 return -1;
5327 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005328 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5329 lineno, NULL, NULL) < 0) {
5330 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5331 PyErr_SetString(PyExc_SyntaxError, msg);
5332 PyErr_SyntaxLocation(filename, lineno);
5333 }
5334 return -1;
5335 }
5336 return 0;
5337}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005338
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005339static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005340symtable_warn(struct symtable *st, char *msg)
5341{
Guido van Rossum207fda62001-03-02 03:30:41 +00005342 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005343 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005344 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005345 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005346 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005347}
5348
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005349/* Helper function for setting lineno and filename */
5350
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005351static struct symtable *
5352symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005353{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005354 struct symtable *st;
5355
5356 st = symtable_init();
5357 if (st == NULL)
5358 return NULL;
5359 st->st_future = ff;
5360 st->st_filename = filename;
5361 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5362 if (st->st_errors > 0)
5363 goto fail;
5364 symtable_node(st, n);
5365 if (st->st_errors > 0)
5366 goto fail;
5367 return st;
5368 fail:
5369 if (!PyErr_Occurred()) {
5370 /* This could happen because after a syntax error is
5371 detected, the symbol-table-building continues for
5372 a while, and PyErr_Clear() might erroneously be
5373 called during that process. One such case has been
5374 fixed, but there might be more (now or later).
5375 */
5376 PyErr_SetString(PyExc_SystemError, "lost exception");
5377 }
5378 st->st_future = NULL;
5379 st->st_filename = NULL;
5380 PySymtable_Free(st);
5381 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005382}
5383
5384static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005385symtable_init_compiling_symbols(struct compiling *c)
5386{
5387 PyObject *varnames;
5388
5389 varnames = c->c_symtable->st_cur->ste_varnames;
5390 if (varnames == NULL) {
5391 varnames = PyList_New(0);
5392 if (varnames == NULL)
5393 return -1;
5394 c->c_symtable->st_cur->ste_varnames = varnames;
5395 Py_INCREF(varnames);
5396 } else
5397 Py_INCREF(varnames);
5398 c->c_varnames = varnames;
5399
5400 c->c_globals = PyDict_New();
5401 if (c->c_globals == NULL)
5402 return -1;
5403 c->c_freevars = PyDict_New();
5404 if (c->c_freevars == NULL)
5405 return -1;
5406 c->c_cellvars = PyDict_New();
5407 if (c->c_cellvars == NULL)
5408 return -1;
5409 return 0;
5410}
5411
5412struct symbol_info {
5413 int si_nlocals;
5414 int si_ncells;
5415 int si_nfrees;
5416 int si_nimplicit;
5417};
5418
5419static void
5420symtable_init_info(struct symbol_info *si)
5421{
5422 si->si_nlocals = 0;
5423 si->si_ncells = 0;
5424 si->si_nfrees = 0;
5425 si->si_nimplicit = 0;
5426}
5427
5428static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005429symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005430 struct symbol_info *si)
5431{
5432 PyObject *dict, *v;
5433
5434 /* Seperate logic for DEF_FREE. If it occurs in a function,
5435 it indicates a local that we must allocate storage for (a
5436 cell var). If it occurs in a class, then the class has a
5437 method and a free variable with the same name.
5438 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005439 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005440 /* If it isn't declared locally, it can't be a cell. */
5441 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5442 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005443 v = PyInt_FromLong(si->si_ncells++);
5444 dict = c->c_cellvars;
5445 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005446 /* If it is free anyway, then there is no need to do
5447 anything here.
5448 */
5449 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005450 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005451 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452 v = PyInt_FromLong(si->si_nfrees++);
5453 dict = c->c_freevars;
5454 }
5455 if (v == NULL)
5456 return -1;
5457 if (PyDict_SetItem(dict, name, v) < 0) {
5458 Py_DECREF(v);
5459 return -1;
5460 }
5461 Py_DECREF(v);
5462 return 0;
5463}
5464
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005465/* If a variable is a cell and an argument, make sure that appears in
5466 co_cellvars before any variable to its right in varnames.
5467*/
5468
5469
5470static int
5471symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5472 PyObject *varnames, int flags)
5473{
Tim Petersb39903b2003-03-24 17:22:24 +00005474 PyObject *v = NULL;
5475 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005476 int i, pos;
5477
5478 if (flags & CO_VARARGS)
5479 argcount++;
5480 if (flags & CO_VARKEYWORDS)
5481 argcount++;
5482 for (i = argcount; --i >= 0; ) {
5483 v = PyList_GET_ITEM(varnames, i);
5484 if (PyDict_GetItem(*cellvars, v)) {
5485 if (list == NULL) {
5486 list = PyList_New(1);
5487 if (list == NULL)
5488 return -1;
5489 PyList_SET_ITEM(list, 0, v);
5490 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005491 } else {
5492 if (PyList_Insert(list, 0, v) < 0) {
5493 Py_DECREF(list);
5494 return -1;
5495 }
5496 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005497 }
5498 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005499 if (list == NULL)
5500 return 0;
5501
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005502 /* There are cellvars that are also arguments. Create a dict
5503 to replace cellvars and put the args at the front.
5504 */
5505 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005506 if (d == NULL)
5507 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005508 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5509 v = PyInt_FromLong(i);
5510 if (v == NULL)
5511 goto fail;
5512 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5513 goto fail;
5514 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5515 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005516 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005517 }
5518 pos = 0;
5519 i = PyList_GET_SIZE(list);
5520 Py_DECREF(list);
5521 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5522 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005523 if (w == NULL)
5524 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005525 if (PyDict_SetItem(d, v, w) < 0) {
5526 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005527 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005528 goto fail;
5529 }
5530 Py_DECREF(w);
5531 }
5532 Py_DECREF(*cellvars);
5533 *cellvars = d;
5534 return 1;
5535 fail:
5536 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005537 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005538 return -1;
5539}
5540
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005541static int
5542symtable_freevar_offsets(PyObject *freevars, int offset)
5543{
5544 PyObject *name, *v;
5545 int pos;
5546
5547 /* The cell vars are the first elements of the closure,
5548 followed by the free vars. Update the offsets in
5549 c_freevars to account for number of cellvars. */
5550 pos = 0;
5551 while (PyDict_Next(freevars, &pos, &name, &v)) {
5552 int i = PyInt_AS_LONG(v) + offset;
5553 PyObject *o = PyInt_FromLong(i);
5554 if (o == NULL)
5555 return -1;
5556 if (PyDict_SetItem(freevars, name, o) < 0) {
5557 Py_DECREF(o);
5558 return -1;
5559 }
5560 Py_DECREF(o);
5561 }
5562 return 0;
5563}
5564
5565static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005566symtable_check_unoptimized(struct compiling *c,
5567 PySymtableEntryObject *ste,
5568 struct symbol_info *si)
5569{
5570 char buf[300];
5571
5572 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5573 || (ste->ste_nested && si->si_nimplicit)))
5574 return 0;
5575
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005576#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5577
5578#define ILLEGAL_IS "is a nested function"
5579
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005580#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005581"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005582
5583#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005584"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005585
5586#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005587"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005588"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005589
5590 /* XXX perhaps the linenos for these opt-breaking statements
5591 should be stored so the exception can point to them. */
5592
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005593 if (ste->ste_child_free) {
5594 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005595 PyOS_snprintf(buf, sizeof(buf),
5596 ILLEGAL_IMPORT_STAR,
5597 PyString_AS_STRING(ste->ste_name),
5598 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005599 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005600 PyOS_snprintf(buf, sizeof(buf),
5601 ILLEGAL_BARE_EXEC,
5602 PyString_AS_STRING(ste->ste_name),
5603 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005604 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005605 PyOS_snprintf(buf, sizeof(buf),
5606 ILLEGAL_EXEC_AND_IMPORT_STAR,
5607 PyString_AS_STRING(ste->ste_name),
5608 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005609 }
5610 } else {
5611 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005612 PyOS_snprintf(buf, sizeof(buf),
5613 ILLEGAL_IMPORT_STAR,
5614 PyString_AS_STRING(ste->ste_name),
5615 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005616 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005617 PyOS_snprintf(buf, sizeof(buf),
5618 ILLEGAL_BARE_EXEC,
5619 PyString_AS_STRING(ste->ste_name),
5620 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005621 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005622 PyOS_snprintf(buf, sizeof(buf),
5623 ILLEGAL_EXEC_AND_IMPORT_STAR,
5624 PyString_AS_STRING(ste->ste_name),
5625 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005626 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005627 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005628
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005629 PyErr_SetString(PyExc_SyntaxError, buf);
5630 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5631 ste->ste_opt_lineno);
5632 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005633}
5634
5635static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005636symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5637 struct symbol_info *si)
5638{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005639 if (c->c_future)
5640 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005641 if (ste->ste_generator)
5642 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005643 if (ste->ste_type != TYPE_MODULE)
5644 c->c_flags |= CO_NEWLOCALS;
5645 if (ste->ste_type == TYPE_FUNCTION) {
5646 c->c_nlocals = si->si_nlocals;
5647 if (ste->ste_optimized == 0)
5648 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005649 else if (ste->ste_optimized != OPT_EXEC)
5650 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005651 }
5652 return 0;
5653}
5654
5655static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005656symtable_error(struct symtable *st, int lineno)
5657{
5658 if (lineno == 0)
5659 lineno = st->st_cur->ste_lineno;
5660 PyErr_SyntaxLocation(st->st_filename, lineno);
5661 st->st_errors++;
5662 return -1;
5663}
5664
5665static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666symtable_load_symbols(struct compiling *c)
5667{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005668 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005669 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005670 PyObject *name, *varnames, *v;
5671 int i, flags, pos;
5672 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005673
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005674 v = NULL;
5675
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005676 if (symtable_init_compiling_symbols(c) < 0)
5677 goto fail;
5678 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005680 si.si_nlocals = PyList_GET_SIZE(varnames);
5681 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005682
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005683 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005684 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005685 if (v == NULL)
5686 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005687 if (PyDict_SetItem(c->c_locals,
5688 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005689 goto fail;
5690 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005691 }
5692
5693 /* XXX The cases below define the rules for whether a name is
5694 local or global. The logic could probably be clearer. */
5695 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005696 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5697 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005698
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005699 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005700 /* undo the original DEF_FREE */
5701 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005702
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005703 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005704 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005705 2. Free variables in methods that are also class
5706 variables or declared global.
5707 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005708 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005709 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005710
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005711 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005712 c->c_argcount--;
5713 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005714 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005715 c->c_argcount--;
5716 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005717 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005718 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005719 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005720 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005721 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005722 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005723 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005724 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005725 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005726 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5727 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005728 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005729 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005730 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005731 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005732 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005733 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 if (v == NULL)
5735 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005736 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005737 goto fail;
5738 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005739 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005740 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005741 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005742 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005743 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005744 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005745 if (v == NULL)
5746 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005747 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005748 goto fail;
5749 Py_DECREF(v);
5750 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005751 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005752 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005753 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005754 goto fail;
5755 if (st->st_nscopes != 1) {
5756 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005757 if (v == NULL)
5758 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005759 if (PyDict_SetItem(st->st_global,
5760 name, v))
5761 goto fail;
5762 Py_DECREF(v);
5763 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 }
5766 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005767 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5768
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005769 if (si.si_ncells > 1) { /* one cell is always in order */
5770 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5771 c->c_varnames, c->c_flags) < 0)
5772 return -1;
5773 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005774 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5775 return -1;
5776 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 fail:
5778 /* is this always the right thing to do? */
5779 Py_XDECREF(v);
5780 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781}
5782
5783static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005784symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785{
5786 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005787
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005788 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005789 if (st == NULL)
5790 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005791 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005792
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005793 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005794 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005795 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796 goto fail;
5797 if ((st->st_symbols = PyDict_New()) == NULL)
5798 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005799 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005800 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005801 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005802 st->st_private = NULL;
5803 return st;
5804 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005805 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005806 return NULL;
5807}
5808
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005809void
5810PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005811{
5812 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005813 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005814 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005815 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005816}
5817
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005818/* When the compiler exits a scope, it must should update the scope's
5819 free variable information with the list of free variables in its
5820 children.
5821
5822 Variables that are free in children and defined in the current
5823 scope are cellvars.
5824
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005825 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005826 false), free variables in children that are not defined here are
5827 implicit globals.
5828
5829*/
5830
5831static int
5832symtable_update_free_vars(struct symtable *st)
5833{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005834 int i, j, def;
5835 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005836 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005837
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005838 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005839 def = DEF_FREE_CLASS;
5840 else
5841 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005842 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005843 int pos = 0;
5844
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005845 if (list && PyList_SetSlice(list, 0,
5846 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005847 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005848 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005849 PyList_GET_ITEM(ste->ste_children, i);
5850 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005851 int flags = PyInt_AS_LONG(o);
5852 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005853 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005854 if (list == NULL) {
5855 list = PyList_New(0);
5856 if (list == NULL)
5857 return -1;
5858 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005859 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005860 if (PyList_Append(list, name) < 0) {
5861 Py_DECREF(list);
5862 return -1;
5863 }
5864 }
5865 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005866 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005867 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005868 v = PyDict_GetItem(ste->ste_symbols, name);
5869 /* If a name N is declared global in scope A and
5870 referenced in scope B contained (perhaps
5871 indirectly) in A and there are no scopes
5872 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005873 is global in B. Unless A is a class scope,
5874 because class scopes are not considered for
5875 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005876 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005877 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005878 int flags = PyInt_AS_LONG(v);
5879 if (flags & DEF_GLOBAL) {
5880 symtable_undo_free(st, child->ste_id,
5881 name);
5882 continue;
5883 }
5884 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005885 if (ste->ste_nested) {
5886 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005887 name, def) < 0) {
5888 Py_DECREF(list);
5889 return -1;
5890 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005891 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005892 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005893 name) < 0) {
5894 Py_DECREF(list);
5895 return -1;
5896 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005897 }
5898 }
5899 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005900
5901 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005902 return 0;
5903}
5904
5905/* If the current scope is a non-nested class or if name is not
5906 defined in the current, non-nested scope, then it is an implicit
5907 global in all nested scopes.
5908*/
5909
5910static int
5911symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5912{
5913 PyObject *o;
5914 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005915 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005916
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005917 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005918 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005919 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005920 if (o == NULL)
5921 return symtable_undo_free(st, child, name);
5922 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005923
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005924 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005925 return symtable_undo_free(st, child, name);
5926 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005927 return symtable_add_def_o(st, ste->ste_symbols,
5928 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005929}
5930
5931static int
5932symtable_undo_free(struct symtable *st, PyObject *id,
5933 PyObject *name)
5934{
5935 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005936 PyObject *info;
5937 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005938
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005939 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5940 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005941 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005942
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005943 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005944 if (info == NULL)
5945 return 0;
5946 v = PyInt_AS_LONG(info);
5947 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005948 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005949 DEF_FREE_GLOBAL) < 0)
5950 return -1;
5951 } else
5952 /* If the name is defined here or declared global,
5953 then the recursion stops. */
5954 return 0;
5955
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005956 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5957 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005958 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005959 PyList_GET_ITEM(ste->ste_children, i);
5960 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005961 if (x < 0)
5962 return x;
5963 }
5964 return 0;
5965}
5966
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005967/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5968 This reference is released when the scope is exited, via the DECREF
5969 in symtable_exit_scope().
5970*/
5971
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005972static int
5973symtable_exit_scope(struct symtable *st)
5974{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005975 int end;
5976
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005977 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005978 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005979 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005980 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005981 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5982 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005983 if (PySequence_DelItem(st->st_stack, end) < 0)
5984 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005985 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005986}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005987
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005988static void
5989symtable_enter_scope(struct symtable *st, char *name, int type,
5990 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005991{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005992 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005993
5994 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005995 prev = st->st_cur;
5996 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005997 st->st_errors++;
5998 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005999 }
6000 }
Barry Warsaw0372af72001-02-23 18:22:59 +00006001 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006002 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006003 if (st->st_cur == NULL) {
6004 st->st_errors++;
6005 return;
6006 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006007 if (strcmp(name, TOP) == 0)
6008 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006009 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006010 if (PyList_Append(prev->ste_children,
6011 (PyObject *)st->st_cur) < 0)
6012 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00006013 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006014}
6015
6016static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006017symtable_lookup(struct symtable *st, char *name)
6018{
6019 char buffer[MANGLE_LEN];
6020 PyObject *v;
6021 int flags;
6022
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006023 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006024 name = buffer;
6025 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6026 if (v == NULL) {
6027 if (PyErr_Occurred())
6028 return -1;
6029 else
6030 return 0;
6031 }
6032
6033 flags = PyInt_AS_LONG(v);
6034 return flags;
6035}
6036
6037static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006038symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006039{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006040 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006041 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006042 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006043
Guido van Rossumb7164622002-08-16 02:48:11 +00006044 /* Warn about None, except inside a tuple (where the assignment
6045 code already issues a warning). */
6046 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6047 *name == 'N' && strcmp(name, "None") == 0)
6048 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006049 PyErr_SetString(PyExc_SyntaxError,
6050 "Invalid syntax. Assignment to None.");
6051 symtable_error(st, 0);
6052 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006053 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006054 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 name = buffer;
6056 if ((s = PyString_InternFromString(name)) == NULL)
6057 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006058 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6059 Py_DECREF(s);
6060 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006061}
6062
6063/* Must only be called with mangled names */
6064
6065static int
6066symtable_add_def_o(struct symtable *st, PyObject *dict,
6067 PyObject *name, int flag)
6068{
6069 PyObject *o;
6070 int val;
6071
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006072 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006073 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006074 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006075 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006076 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006077 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006078 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006079 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006080 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006081 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006082 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006083 if (o == NULL)
6084 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006085 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006086 Py_DECREF(o);
6087 return -1;
6088 }
6089 Py_DECREF(o);
6090
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006091 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006092 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006093 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006094 } else if (flag & DEF_GLOBAL) {
6095 /* XXX need to update DEF_GLOBAL for other flags too;
6096 perhaps only DEF_FREE_GLOBAL */
6097 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006098 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006099 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006100 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006101 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006102 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006103 if (o == NULL)
6104 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006105 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006106 Py_DECREF(o);
6107 return -1;
6108 }
6109 Py_DECREF(o);
6110 }
6111 return 0;
6112}
6113
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006114#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006115
Tim Peters08a898f2001-06-28 01:52:22 +00006116/* Look for a yield stmt under n. Return 1 if found, else 0.
6117 This hack is used to look inside "if 0:" blocks (which are normally
6118 ignored) in case those are the only places a yield occurs (so that this
6119 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006120static int
6121look_for_yield(node *n)
6122{
6123 int i;
6124
6125 for (i = 0; i < NCH(n); ++i) {
6126 node *kid = CHILD(n, i);
6127
6128 switch (TYPE(kid)) {
6129
6130 case classdef:
6131 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006132 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006133 /* Stuff in nested functions and classes can't make
6134 the parent a generator. */
6135 return 0;
6136
6137 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006138 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006139
6140 default:
6141 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006142 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006143 }
6144 }
6145 return 0;
6146}
6147
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006148static void
6149symtable_node(struct symtable *st, node *n)
6150{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006151 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006152
6153 loop:
6154 switch (TYPE(n)) {
6155 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006156 char *func_name;
6157 if (NCH(n) == 6)
6158 symtable_node(st, CHILD(n, 0));
6159 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006160 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006161 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006162 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006163 symtable_funcdef(st, n);
6164 symtable_exit_scope(st);
6165 break;
6166 }
6167 case lambdef:
6168 if (NCH(n) == 4)
6169 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006170 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006171 symtable_funcdef(st, n);
6172 symtable_exit_scope(st);
6173 break;
6174 case classdef: {
6175 char *tmp, *class_name = STR(CHILD(n, 1));
6176 symtable_add_def(st, class_name, DEF_LOCAL);
6177 if (TYPE(CHILD(n, 2)) == LPAR) {
6178 node *bases = CHILD(n, 3);
6179 int i;
6180 for (i = 0; i < NCH(bases); i += 2) {
6181 symtable_node(st, CHILD(bases, i));
6182 }
6183 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006184 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006185 tmp = st->st_private;
6186 st->st_private = class_name;
6187 symtable_node(st, CHILD(n, NCH(n) - 1));
6188 st->st_private = tmp;
6189 symtable_exit_scope(st);
6190 break;
6191 }
6192 case if_stmt:
6193 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006194 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6195 if (st->st_cur->ste_generator == 0)
6196 st->st_cur->ste_generator =
6197 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006198 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006199 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006200 symtable_node(st, CHILD(n, i + 1));
6201 symtable_node(st, CHILD(n, i + 3));
6202 }
6203 if (i + 2 < NCH(n))
6204 symtable_node(st, CHILD(n, i + 2));
6205 break;
6206 case global_stmt:
6207 symtable_global(st, n);
6208 break;
6209 case import_stmt:
6210 symtable_import(st, n);
6211 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006212 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006213 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006214 symtable_node(st, CHILD(n, 1));
6215 if (NCH(n) > 2)
6216 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006217 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006218 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006219 st->st_cur->ste_opt_lineno = n->n_lineno;
6220 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 if (NCH(n) > 4)
6222 symtable_node(st, CHILD(n, 5));
6223 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006224
6225 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006226 case assert_stmt:
6227 if (Py_OptimizeFlag)
6228 return;
6229 if (NCH(n) == 2) {
6230 n = CHILD(n, 1);
6231 goto loop;
6232 } else {
6233 symtable_node(st, CHILD(n, 1));
6234 n = CHILD(n, 3);
6235 goto loop;
6236 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006237 case except_clause:
6238 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006239 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006240 if (NCH(n) > 1) {
6241 n = CHILD(n, 1);
6242 goto loop;
6243 }
6244 break;
6245 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006246 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006247 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006248 case yield_stmt:
6249 st->st_cur->ste_generator = 1;
6250 n = CHILD(n, 1);
6251 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006252 case expr_stmt:
6253 if (NCH(n) == 1)
6254 n = CHILD(n, 0);
6255 else {
6256 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006257 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006258 symtable_node(st, CHILD(n, 2));
6259 break;
6260 } else {
6261 int i;
6262 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006263 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006264 n = CHILD(n, NCH(n) - 1);
6265 }
6266 }
6267 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006268 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006269 /* only occurs when there are multiple for loops
6270 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006271 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006272 if (TYPE(n) == list_for)
6273 symtable_list_for(st, n);
6274 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006275 REQ(n, list_if);
6276 symtable_node(st, CHILD(n, 1));
6277 if (NCH(n) == 3) {
6278 n = CHILD(n, 2);
6279 goto loop;
6280 }
6281 }
6282 break;
6283 case for_stmt:
6284 symtable_assign(st, CHILD(n, 1), 0);
6285 for (i = 3; i < NCH(n); ++i)
6286 if (TYPE(CHILD(n, i)) >= single_input)
6287 symtable_node(st, CHILD(n, i));
6288 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006289 case arglist:
6290 if (NCH(n) > 1)
6291 for (i = 0; i < NCH(n); ++i) {
6292 node *ch = CHILD(n, i);
6293 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6294 TYPE(CHILD(ch, 1)) == gen_for) {
6295 PyErr_SetString(PyExc_SyntaxError,
6296 "invalid syntax");
6297 symtable_error(st, n->n_lineno);
6298 return;
6299 }
6300 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006301 /* The remaining cases fall through to default except in
6302 special circumstances. This requires the individual cases
6303 to be coded with great care, even though they look like
6304 rather innocuous. Each case must double-check TYPE(n).
6305 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006306 case decorator:
6307 if (TYPE(n) == decorator) {
6308 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6309 node *name, *varname;
6310 name = CHILD(n, 1);
6311 REQ(name, dotted_name);
6312 varname = CHILD(name, 0);
6313 REQ(varname, NAME);
6314 symtable_add_use(st, STR(varname));
6315 }
6316 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006317 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006318 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006319 n = CHILD(n, 2);
6320 goto loop;
6321 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006322 else if (TYPE(n) == argument && NCH(n) == 2 &&
6323 TYPE(CHILD(n, 1)) == gen_for) {
6324 symtable_generator_expression(st, n);
6325 break;
6326 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006327 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006328 case listmaker:
6329 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006330 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006331 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006332 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006333 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006334 case testlist_gexp:
6335 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6336 symtable_generator_expression(st, n);
6337 break;
6338 }
6339 /* fall through */
6340
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006341 case atom:
6342 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6343 symtable_add_use(st, STR(CHILD(n, 0)));
6344 break;
6345 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006346 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006347 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006348 /* Walk over every non-token child with a special case
6349 for one child.
6350 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006351 if (NCH(n) == 1) {
6352 n = CHILD(n, 0);
6353 goto loop;
6354 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006355 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006356 if (TYPE(CHILD(n, i)) >= single_input)
6357 symtable_node(st, CHILD(n, i));
6358 }
6359}
6360
6361static void
6362symtable_funcdef(struct symtable *st, node *n)
6363{
6364 node *body;
6365
6366 if (TYPE(n) == lambdef) {
6367 if (NCH(n) == 4)
6368 symtable_params(st, CHILD(n, 1));
6369 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006370 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006371 body = CHILD(n, NCH(n) - 1);
6372 symtable_node(st, body);
6373}
6374
6375/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006376 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006377 which are references in the defining scope. symtable_params()
6378 parses the parameter names, which are defined in the function's
6379 body.
6380
6381 varargslist:
6382 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6383 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6384*/
6385
6386static void
6387symtable_default_args(struct symtable *st, node *n)
6388{
6389 node *c;
6390 int i;
6391
6392 if (TYPE(n) == parameters) {
6393 n = CHILD(n, 1);
6394 if (TYPE(n) == RPAR)
6395 return;
6396 }
6397 REQ(n, varargslist);
6398 for (i = 0; i < NCH(n); i += 2) {
6399 c = CHILD(n, i);
6400 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6401 break;
6402 }
6403 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6404 symtable_node(st, CHILD(n, i));
6405 }
6406}
6407
6408static void
6409symtable_params(struct symtable *st, node *n)
6410{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006411 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006412 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006413
6414 if (TYPE(n) == parameters) {
6415 n = CHILD(n, 1);
6416 if (TYPE(n) == RPAR)
6417 return;
6418 }
6419 REQ(n, varargslist);
6420 for (i = 0; i < NCH(n); i += 2) {
6421 c = CHILD(n, i);
6422 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6423 ext = 1;
6424 break;
6425 }
6426 if (TYPE(c) == test) {
6427 continue;
6428 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006429 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006430 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006431 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006432 char nbuf[30];
6433 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006434 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006435 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006436 }
6437 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006438 if (ext) {
6439 c = CHILD(n, i);
6440 if (TYPE(c) == STAR) {
6441 i++;
6442 symtable_add_def(st, STR(CHILD(n, i)),
6443 DEF_PARAM | DEF_STAR);
6444 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006445 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006446 c = NULL;
6447 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006448 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006449 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006450 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006451 i++;
6452 symtable_add_def(st, STR(CHILD(n, i)),
6453 DEF_PARAM | DEF_DOUBLESTAR);
6454 }
6455 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006456 if (complex >= 0) {
6457 int j;
6458 for (j = 0; j <= complex; j++) {
6459 c = CHILD(n, j);
6460 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006461 c = CHILD(n, ++j);
6462 else if (TYPE(c) == EQUAL)
6463 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006464 if (TYPE(CHILD(c, 0)) == LPAR)
6465 symtable_params_fplist(st, CHILD(c, 1));
6466 }
6467 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006468}
6469
6470static void
6471symtable_params_fplist(struct symtable *st, node *n)
6472{
6473 int i;
6474 node *c;
6475
6476 REQ(n, fplist);
6477 for (i = 0; i < NCH(n); i += 2) {
6478 c = CHILD(n, i);
6479 REQ(c, fpdef);
6480 if (NCH(c) == 1)
6481 symtable_add_def(st, STR(CHILD(c, 0)),
6482 DEF_PARAM | DEF_INTUPLE);
6483 else
6484 symtable_params_fplist(st, CHILD(c, 1));
6485 }
6486
6487}
6488
6489static void
6490symtable_global(struct symtable *st, node *n)
6491{
6492 int i;
6493
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006494 /* XXX It might be helpful to warn about module-level global
6495 statements, but it's hard to tell the difference between
6496 module-level and a string passed to exec.
6497 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006498
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006499 for (i = 1; i < NCH(n); i += 2) {
6500 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006501 int flags;
6502
6503 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006504 if (flags < 0)
6505 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006506 if (flags && flags != DEF_GLOBAL) {
6507 char buf[500];
6508 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006509 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006510 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006511 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006512 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006513 }
6514 else {
6515 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006516 PyOS_snprintf(buf, sizeof(buf),
6517 GLOBAL_AFTER_ASSIGN,
6518 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006519 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006520 PyOS_snprintf(buf, sizeof(buf),
6521 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006522 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006523 }
6524 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006525 symtable_add_def(st, name, DEF_GLOBAL);
6526 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006527}
6528
6529static void
6530symtable_list_comprehension(struct symtable *st, node *n)
6531{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006532 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006533 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006534
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006535 REQ(n, listmaker);
6536 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6537 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006538 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006539 symtable_list_for(st, CHILD(n, 1));
6540 symtable_node(st, CHILD(n, 0));
6541 --st->st_cur->ste_tmpname;
6542}
6543
6544static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006545symtable_generator_expression(struct symtable *st, node *n)
6546{
6547 /* testlist_gexp: test gen_for */
6548 REQ(CHILD(n, 0), test);
6549 REQ(CHILD(n, 1), gen_for);
6550
6551 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6552 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6553
6554 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6555
6556 symtable_gen_for(st, CHILD(n, 1), 1);
6557 symtable_node(st, CHILD(n, 0));
6558 symtable_exit_scope(st);
6559
6560 /* for outmost iterable precomputation */
6561 symtable_node(st, CHILD(CHILD(n, 1), 3));
6562}
6563
6564static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006565symtable_list_for(struct symtable *st, node *n)
6566{
6567 REQ(n, list_for);
6568 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006569 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006570 symtable_node(st, CHILD(n, 3));
6571 if (NCH(n) == 5)
6572 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006573}
6574
6575static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006576symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6577{
6578 REQ(n, gen_for);
6579
6580 /* gen_for: for v in test [gen_iter] */
6581 symtable_assign(st, CHILD(n, 1), 0);
6582 if (is_outmost)
6583 symtable_add_use(st, "[outmost-iterable]");
6584 else
6585 symtable_node(st, CHILD(n, 3));
6586
6587 if (NCH(n) == 5)
6588 symtable_gen_iter(st, CHILD(n, 4));
6589}
6590
6591static void
6592symtable_gen_iter(struct symtable *st, node *n)
6593{
6594 REQ(n, gen_iter);
6595
6596 n = CHILD(n, 0);
6597 if (TYPE(n) == gen_for)
6598 symtable_gen_for(st, n, 0);
6599 else {
6600 REQ(n, gen_if);
6601 symtable_node(st, CHILD(n, 1));
6602
6603 if (NCH(n) == 3)
6604 symtable_gen_iter(st, CHILD(n, 2));
6605 }
6606}
6607
6608static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006609symtable_import(struct symtable *st, node *n)
6610{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006611 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006612 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006613 /* import_stmt: import_name | import_from */
6614 n = CHILD(n, 0);
6615 if (TYPE(n) == import_from) {
6616 /* import_from: 'from' dotted_name 'import' ('*' |
6617 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006618 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006619 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006620 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6621 /* check for bogus imports */
6622 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6623 PyErr_SetString(PyExc_SyntaxError,
6624 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006625 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006626 return;
6627 }
6628 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006629 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6630 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006631 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006632 if (symtable_warn(st,
6633 "import * only allowed at module level") < 0)
6634 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006635 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006636 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006637 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006638 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006639 REQ(nn, import_as_names);
6640 for (i = 0; i < NCH(nn); i += 2) {
6641 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006642 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006643 symtable_assign(st, CHILD(c, 2),
6644 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006645 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006646 symtable_assign(st, CHILD(c, 0),
6647 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006648 }
6649 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006650 } else {
6651 /* 'import' dotted_as_names */
6652 nn = CHILD(n, 1);
6653 REQ(nn, dotted_as_names);
6654 for (i = 0; i < NCH(nn); i += 2)
6655 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006656 }
6657}
6658
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006659/* The third argument to symatble_assign() is a flag to be passed to
6660 symtable_add_def() if it is eventually called. The flag is useful
6661 to specify the particular type of assignment that should be
6662 recorded, e.g. an assignment caused by import.
6663 */
6664
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006665static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006666symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006667{
6668 node *tmp;
6669 int i;
6670
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006671 loop:
6672 switch (TYPE(n)) {
6673 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006674 /* invalid assignment, e.g. lambda x:x=2. The next
6675 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006676 return;
6677 case power:
6678 if (NCH(n) > 2) {
6679 for (i = 2; i < NCH(n); ++i)
6680 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6681 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006682 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006683 if (NCH(n) > 1) {
6684 symtable_node(st, CHILD(n, 0));
6685 symtable_node(st, CHILD(n, 1));
6686 } else {
6687 n = CHILD(n, 0);
6688 goto loop;
6689 }
6690 return;
6691 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006692 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6693 /* XXX This is an error, but the next pass
6694 will catch it. */
6695 return;
6696 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006697 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006698 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006699 }
6700 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006701 case testlist_gexp:
6702 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6703 /* XXX This is an error, but the next pass
6704 will catch it. */
6705 return;
6706 } else {
6707 for (i = 0; i < NCH(n); i += 2)
6708 symtable_assign(st, CHILD(n, i), def_flag);
6709 }
6710 return;
6711
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006712 case exprlist:
6713 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006714 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006715 if (NCH(n) == 1) {
6716 n = CHILD(n, 0);
6717 goto loop;
6718 }
6719 else {
6720 int i;
6721 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006722 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006723 return;
6724 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006725 case atom:
6726 tmp = CHILD(n, 0);
6727 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6728 n = CHILD(n, 1);
6729 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006730 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006731 if (strcmp(STR(tmp), "__debug__") == 0) {
6732 PyErr_SetString(PyExc_SyntaxError,
6733 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006734 symtable_error(st, n->n_lineno);
6735 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006736 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006737 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006738 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006739 return;
6740 case dotted_as_name:
6741 if (NCH(n) == 3)
6742 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006743 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006744 else
6745 symtable_add_def(st,
6746 STR(CHILD(CHILD(n,
6747 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006748 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006749 return;
6750 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006751 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006752 return;
6753 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006754 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006755 return;
6756 default:
6757 if (NCH(n) == 0)
6758 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006759 if (NCH(n) == 1) {
6760 n = CHILD(n, 0);
6761 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006762 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006763 /* Should only occur for errors like x + 1 = 1,
6764 which will be caught in the next pass. */
6765 for (i = 0; i < NCH(n); ++i)
6766 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006767 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006768 }
6769}