blob: f90f82c878dc51280911aa6afd777dc4fc04b0fe [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Raymond Hettinger9047c8f2004-10-24 00:10:06 +0000264 cmp = co->co_firstlineno - cp->co_firstlineno;
265 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000266 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000271 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
275 if (cmp) return cmp;
276 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000277 return cmp;
278}
279
280static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000282{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000283 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000284 h0 = PyObject_Hash(co->co_name);
285 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000286 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000291 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000293 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000294 h5 = PyObject_Hash(co->co_freevars);
295 if (h5 == -1) return -1;
296 h6 = PyObject_Hash(co->co_cellvars);
297 if (h6 == -1) return -1;
298 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000299 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000300 if (h == -1) h = -2;
301 return h;
302}
303
Jeremy Hylton78891072001-03-01 06:09:34 +0000304/* XXX code objects need to participate in GC? */
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306PyTypeObject PyCode_Type = {
307 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000308 0,
309 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000310 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000311 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000312 (destructor)code_dealloc, /* tp_dealloc */
313 0, /* tp_print */
314 0, /* tp_getattr */
315 0, /* tp_setattr */
316 (cmpfunc)code_compare, /* tp_compare */
317 (reprfunc)code_repr, /* tp_repr */
318 0, /* tp_as_number */
319 0, /* tp_as_sequence */
320 0, /* tp_as_mapping */
321 (hashfunc)code_hash, /* tp_hash */
322 0, /* tp_call */
323 0, /* tp_str */
324 PyObject_GenericGetAttr, /* tp_getattro */
325 0, /* tp_setattro */
326 0, /* tp_as_buffer */
327 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000328 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000329 0, /* tp_traverse */
330 0, /* tp_clear */
331 0, /* tp_richcompare */
332 0, /* tp_weaklistoffset */
333 0, /* tp_iter */
334 0, /* tp_iternext */
335 0, /* tp_methods */
336 code_memberlist, /* tp_members */
337 0, /* tp_getset */
338 0, /* tp_base */
339 0, /* tp_dict */
340 0, /* tp_descr_get */
341 0, /* tp_descr_set */
342 0, /* tp_dictoffset */
343 0, /* tp_init */
344 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000345 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000346};
347
Guido van Rossum644a12b1997-04-09 19:24:53 +0000348#define NAME_CHARS \
349 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
350
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000351/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
352
353static int
354all_name_chars(unsigned char *s)
355{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000356 static char ok_name_char[256];
357 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000358
Guido van Rossumcd90c202001-02-09 15:06:42 +0000359 if (ok_name_char[*name_chars] == 0) {
360 unsigned char *p;
361 for (p = name_chars; *p; p++)
362 ok_name_char[*p] = 1;
363 }
364 while (*s) {
365 if (ok_name_char[*s++] == 0)
366 return 0;
367 }
368 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000369}
370
Michael W. Hudson60934622004-08-12 17:56:29 +0000371static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000372intern_strings(PyObject *tuple)
373{
374 int i;
375
376 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
377 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000378 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000379 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000380 }
381 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
382 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000383}
384
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000385/* Begin: Peephole optimizations ----------------------------------------- */
386
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
388#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000389#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
390#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000391#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000392#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
393#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
394
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000395/* Replace LOAD_CONST c1. LOAD_CONST c2 ... LOAD_CONST cn BUILD_TUPLE n
396 with LOAD_CONST (c1, c2, ... cn).
397 The consts table must still be in list form so that the
398 new constant (c1, c2, ... cn) can be appended.
399 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000400 Bails out with no change if one or more of the LOAD_CONSTs is missing.
401 Also works for BUILD_LIST when followed by an "in" or "not in" test.
402*/
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000403static int
404tuple_of_constants(unsigned char *codestr, int n, PyObject *consts)
405{
406 PyObject *newconst, *constant;
407 int i, arg, len_consts;
408
409 /* Pre-conditions */
410 assert(PyList_CheckExact(consts));
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000411 assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000412 assert(GETARG(codestr, (n*3)) == n);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000413 for (i=0 ; i<n ; i++)
Raymond Hettingereffb3932004-10-30 08:55:08 +0000414 assert(codestr[i*3] == LOAD_CONST);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000415
416 /* Buildup new tuple of constants */
417 newconst = PyTuple_New(n);
418 if (newconst == NULL)
419 return 0;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000420 len_consts = PyList_GET_SIZE(consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000421 for (i=0 ; i<n ; i++) {
422 arg = GETARG(codestr, (i*3));
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000423 assert(arg < len_consts);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000424 constant = PyList_GET_ITEM(consts, arg);
425 Py_INCREF(constant);
426 PyTuple_SET_ITEM(newconst, i, constant);
427 }
428
429 /* Append folded constant onto consts */
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000430 if (PyList_Append(consts, newconst)) {
431 Py_DECREF(newconst);
432 return 0;
433 }
434 Py_DECREF(newconst);
435
436 /* Write NOPs over old LOAD_CONSTS and
437 add a new LOAD_CONST newconst on top of the BUILD_TUPLE n */
438 memset(codestr, NOP, n*3);
439 codestr[n*3] = LOAD_CONST;
440 SETARG(codestr, (n*3), len_consts);
441 return 1;
442}
443
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000444/* Replace LOAD_CONST c1. LOAD_CONST c2 BINOP
445 with LOAD_CONST binop(c1,c2)
446 The consts table must still be in list form so that the
447 new constant can be appended.
448 Called with codestr pointing to the first LOAD_CONST.
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000449 Abandons the transformation if the folding fails (i.e. 1+'a').
450 If the new constant is a sequence, only folds when the size
451 is below a threshold value. That keeps pyc files from
452 becoming large in the presence of code like: (None,)*1000.
453*/
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000454static int
455fold_binops_on_constants(unsigned char *codestr, PyObject *consts)
456{
457 PyObject *newconst, *v, *w;
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000458 int len_consts, opcode, size;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000459
460 /* Pre-conditions */
461 assert(PyList_CheckExact(consts));
462 assert(codestr[0] == LOAD_CONST);
463 assert(codestr[3] == LOAD_CONST);
464
465 /* Create new constant */
466 v = PyList_GET_ITEM(consts, GETARG(codestr, 0));
467 w = PyList_GET_ITEM(consts, GETARG(codestr, 3));
468 opcode = codestr[6];
469 switch (opcode) {
470 case BINARY_POWER:
471 newconst = PyNumber_Power(v, w, Py_None);
472 break;
473 case BINARY_MULTIPLY:
474 newconst = PyNumber_Multiply(v, w);
475 break;
476 case BINARY_DIVIDE:
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000477 /* Cannot fold this operation statically since
478 the result can depend on the run-time presence of the -Qnew flag */
Armin Rigo664b43b2005-01-07 18:10:51 +0000479 return 0;
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000480 case BINARY_TRUE_DIVIDE:
481 newconst = PyNumber_TrueDivide(v, w);
482 break;
483 case BINARY_FLOOR_DIVIDE:
484 newconst = PyNumber_FloorDivide(v, w);
485 break;
486 case BINARY_MODULO:
487 newconst = PyNumber_Remainder(v, w);
488 break;
489 case BINARY_ADD:
490 newconst = PyNumber_Add(v, w);
491 break;
492 case BINARY_SUBTRACT:
493 newconst = PyNumber_Subtract(v, w);
494 break;
495 case BINARY_SUBSCR:
496 newconst = PyObject_GetItem(v, w);
497 break;
498 case BINARY_LSHIFT:
499 newconst = PyNumber_Lshift(v, w);
500 break;
501 case BINARY_RSHIFT:
502 newconst = PyNumber_Rshift(v, w);
503 break;
504 case BINARY_AND:
505 newconst = PyNumber_And(v, w);
506 break;
507 case BINARY_XOR:
508 newconst = PyNumber_Xor(v, w);
509 break;
510 case BINARY_OR:
511 newconst = PyNumber_Or(v, w);
512 break;
513 default:
514 /* Called with an unknown opcode */
515 assert(0);
516 return 0;
517 }
518 if (newconst == NULL) {
519 PyErr_Clear();
520 return 0;
521 }
Raymond Hettinger9feb2672005-01-26 12:50:05 +0000522 size = PyObject_Size(newconst);
523 if (size == -1)
524 PyErr_Clear();
525 else if (size > 20) {
526 Py_DECREF(newconst);
527 return 0;
528 }
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000529
530 /* Append folded constant into consts table */
531 len_consts = PyList_GET_SIZE(consts);
532 if (PyList_Append(consts, newconst)) {
533 Py_DECREF(newconst);
534 return 0;
535 }
536 Py_DECREF(newconst);
537
538 /* Write NOP NOP NOP NOP LOAD_CONST newconst */
539 memset(codestr, NOP, 4);
540 codestr[4] = LOAD_CONST;
541 SETARG(codestr, 4, len_consts);
542 return 1;
543}
544
Raymond Hettingera1645742005-02-06 22:05:42 +0000545/* Replace LOAD_CONST tuple with LOAD_CONST frozenset in the context
546 of a single-use constant for "in" and "not in" tests.
547*/
548int
549try_set_conversion(unsigned char *codestr, PyObject *consts)
550{
551 PyObject *newconst, *constant;
552 int arg, len_consts;
553
554 /* Pre-conditions */
555 assert(PyList_CheckExact(consts));
556 assert(codestr[0] == LOAD_CONST);
557 assert(codestr[3] == COMPARE_OP);
558 assert(GETARG(codestr, 3) == 6 || GETARG(codestr, 3) == 7);
559
560 /* Attempt to convert constant to a frozenset. Bail-out with no
561 changes if the tuple contains unhashable values. */
562 arg = GETARG(codestr, 0);
563 constant = PyList_GET_ITEM(consts, arg);
564 if (constant->ob_type != &PyTuple_Type)
565 return 0;
566 newconst = PyObject_CallFunctionObjArgs(
567 (PyObject *)&PyFrozenSet_Type, constant, NULL);
568 if (newconst == NULL) {
569 PyErr_Clear();
570 return 0;
571 }
572
Raymond Hettinger5e547962005-02-09 21:24:51 +0000573 /* Append new constant onto consts list or replace existing constant
574 if there are no other references to it.*/
575 if (constant->ob_refcnt == 1) {
576 PyList_SET_ITEM(consts, arg, newconst);
577 Py_DECREF(constant);
578 return 1;
579 }
Raymond Hettingera1645742005-02-06 22:05:42 +0000580 len_consts = PyList_GET_SIZE(consts);
581 if (PyList_Append(consts, newconst)) {
582 Py_DECREF(newconst);
583 return 0;
584 }
585 Py_DECREF(newconst);
586
587 /* Write new LOAD_CONST newconst on top of LOAD_CONST oldconst */
588 SETARG(codestr, 0, len_consts);
589 return 1;
590}
591
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000592static unsigned int *
593markblocks(unsigned char *code, int len)
594{
595 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000596 int i,j, opcode, blockcnt = 0;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000597
598 if (blocks == NULL)
599 return NULL;
600 memset(blocks, 0, len*sizeof(int));
Raymond Hettingereffb3932004-10-30 08:55:08 +0000601
602 /* Mark labels in the first pass */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000603 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
604 opcode = code[i];
605 switch (opcode) {
606 case FOR_ITER:
607 case JUMP_FORWARD:
608 case JUMP_IF_FALSE:
609 case JUMP_IF_TRUE:
610 case JUMP_ABSOLUTE:
611 case CONTINUE_LOOP:
612 case SETUP_LOOP:
613 case SETUP_EXCEPT:
614 case SETUP_FINALLY:
615 j = GETJUMPTGT(code, i);
Raymond Hettingereffb3932004-10-30 08:55:08 +0000616 blocks[j] = 1;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000617 break;
618 }
619 }
Raymond Hettingereffb3932004-10-30 08:55:08 +0000620 /* Build block numbers in the second pass */
621 for (i=0 ; i<len ; i++) {
622 blockcnt += blocks[i]; /* increment blockcnt over labels */
623 blocks[i] = blockcnt;
624 }
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000625 return blocks;
626}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000627
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000628/* Perform basic peephole optimizations to components of a code object.
629 The consts object should still be in list form to allow new constants
630 to be appended.
631
632 To keep the optimizer simple, it bails out (does nothing) for code
633 containing extended arguments or that has a length over 32,700. That
634 allows us to avoid overflow and sign issues. Likewise, it bails when
635 the lineno table has complex encoding for gaps >= 255.
636
637 Optimizations are restricted to simple transformations occuring within a
638 single basic block. All transformations keep the code size the same or
639 smaller. For those that reduce size, the gaps are initially filled with
640 NOPs. Later those NOPs are removed and the jump addresses retargeted in
641 a single pass. Line numbering is adjusted accordingly. */
642
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000643static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000644optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000645{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000646 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000647 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000648 unsigned char *codestr = NULL;
649 unsigned char *lineno;
650 int *addrmap = NULL;
651 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000652 int cumlc=0, lastlc=0; /* Count runs of consecutive LOAD_CONST codes */
Raymond Hettingereffb3932004-10-30 08:55:08 +0000653 unsigned int *blocks = NULL;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000654 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000655
Raymond Hettingereffb3932004-10-30 08:55:08 +0000656 /* Bail out if an exception is set */
657 if (PyErr_Occurred())
658 goto exitUnchanged;
659
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000660 /* Bypass optimization when the lineno table is too complex */
661 assert(PyString_Check(lineno_obj));
662 lineno = PyString_AS_STRING(lineno_obj);
663 tabsiz = PyString_GET_SIZE(lineno_obj);
664 if (memchr(lineno, 255, tabsiz) != NULL)
665 goto exitUnchanged;
666
Raymond Hettingera12fa142004-08-24 04:34:16 +0000667 /* Avoid situations where jump retargeting could overflow */
Raymond Hettinger06cc9732004-09-28 17:22:12 +0000668 assert(PyString_Check(code));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000669 codelen = PyString_Size(code);
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000670 if (codelen > 32700)
Raymond Hettingera12fa142004-08-24 04:34:16 +0000671 goto exitUnchanged;
672
673 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000674 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000675 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000676 goto exitUnchanged;
677 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000678
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000679 /* Mapping to new jump targets after NOPs are removed */
680 addrmap = PyMem_Malloc(codelen * sizeof(int));
681 if (addrmap == NULL)
682 goto exitUnchanged;
683
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000684 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000685 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000686 goto exitUnchanged;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000687 assert(PyList_Check(consts));
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000688
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000689 for (i=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000690 opcode = codestr[i];
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000691
692 lastlc = cumlc;
693 cumlc = 0;
694
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000695 switch (opcode) {
696
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000697 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000698 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000699 case UNARY_NOT:
700 if (codestr[i+1] != JUMP_IF_FALSE ||
701 codestr[i+4] != POP_TOP ||
702 !ISBASICBLOCK(blocks,i,5))
703 continue;
704 tgt = GETJUMPTGT(codestr, (i+1));
705 if (codestr[tgt] != POP_TOP)
706 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000707 j = GETARG(codestr, i+1) + 1;
708 codestr[i] = JUMP_IF_TRUE;
709 SETARG(codestr, i, j);
710 codestr[i+3] = POP_TOP;
711 codestr[i+4] = NOP;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000712 break;
713
714 /* not a is b --> a is not b
715 not a in b --> a not in b
716 not a is not b --> a is b
Raymond Hettingera1645742005-02-06 22:05:42 +0000717 not a not in b --> a in b
718
719 a in c --> a in frozenset(c)
720 where c is a constant tuple of hashable values
721 */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000722 case COMPARE_OP:
723 j = GETARG(codestr, i);
Raymond Hettingera1645742005-02-06 22:05:42 +0000724 if (lastlc >= 1 && (j == 6 || j == 7) && ISBASICBLOCK(blocks,i-3,6))
725 try_set_conversion(&codestr[i-3], consts);
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000726 if (j < 6 || j > 9 ||
727 codestr[i+3] != UNARY_NOT ||
728 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000729 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000730 SETARG(codestr, i, (j^1));
731 codestr[i+3] = NOP;
Tim Petersdb5860b2004-07-17 05:00:52 +0000732 break;
733
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000734 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
735 case LOAD_NAME:
736 case LOAD_GLOBAL:
737 j = GETARG(codestr, i);
738 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
739 if (name == NULL || strcmp(name, "None") != 0)
740 continue;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000741 for (j=0 ; j < PyList_GET_SIZE(consts) ; j++) {
742 if (PyList_GET_ITEM(consts, j) == Py_None) {
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000743 codestr[i] = LOAD_CONST;
744 SETARG(codestr, i, j);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000745 cumlc = lastlc + 1;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000746 break;
747 }
748 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000749 break;
750
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000751 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000752 case LOAD_CONST:
Raymond Hettinger23109ef2004-10-26 08:59:14 +0000753 cumlc = lastlc + 1;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000754 j = GETARG(codestr, i);
755 if (codestr[i+3] != JUMP_IF_FALSE ||
756 codestr[i+6] != POP_TOP ||
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000757 !ISBASICBLOCK(blocks,i,7) ||
758 !PyObject_IsTrue(PyList_GET_ITEM(consts, j)))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000759 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000760 memset(codestr+i, NOP, 7);
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000761 cumlc = 0;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000762 break;
763
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000764 /* Try to fold tuples of constants (includes a case for lists
765 which are only used for "in" and "not in" tests).
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000766 Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000767 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
768 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000769 case BUILD_TUPLE:
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000770 case BUILD_LIST:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000771 j = GETARG(codestr, i);
772 h = i - 3 * j;
773 if (h >= 0 &&
Raymond Hettingereffb3932004-10-30 08:55:08 +0000774 j <= lastlc &&
Raymond Hettinger7fcb7862005-02-07 19:32:38 +0000775 (opcode == BUILD_TUPLE &&
776 ISBASICBLOCK(blocks, h, 3*(j+1)) ||
777 opcode == BUILD_LIST &&
778 codestr[i+3]==COMPARE_OP &&
779 ISBASICBLOCK(blocks, h, 3*(j+2)) &&
780 (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) &&
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000781 tuple_of_constants(&codestr[h], j, consts)) {
Raymond Hettinger5dec0962004-11-02 04:20:10 +0000782 assert(codestr[i] == LOAD_CONST);
783 cumlc = 1;
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000784 break;
785 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000786 if (codestr[i+3] != UNPACK_SEQUENCE ||
787 !ISBASICBLOCK(blocks,i,6) ||
788 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000789 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000790 if (j == 1) {
791 memset(codestr+i, NOP, 6);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000792 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000793 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000794 memset(codestr+i+1, NOP, 5);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000795 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000796 codestr[i] = ROT_THREE;
797 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000798 memset(codestr+i+2, NOP, 4);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000799 }
800 break;
801
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000802 /* Fold binary ops on constants.
803 LOAD_CONST c1 LOAD_CONST c2 BINOP --> LOAD_CONST binop(c1,c2) */
804 case BINARY_POWER:
805 case BINARY_MULTIPLY:
Raymond Hettingerc34f8672005-01-02 06:17:33 +0000806 case BINARY_TRUE_DIVIDE:
807 case BINARY_FLOOR_DIVIDE:
808 case BINARY_MODULO:
809 case BINARY_ADD:
810 case BINARY_SUBTRACT:
811 case BINARY_SUBSCR:
812 case BINARY_LSHIFT:
813 case BINARY_RSHIFT:
814 case BINARY_AND:
815 case BINARY_XOR:
816 case BINARY_OR:
817 if (lastlc >= 2 &&
818 ISBASICBLOCK(blocks, i-6, 7) &&
819 fold_binops_on_constants(&codestr[i-6], consts)) {
820 i -= 2;
821 assert(codestr[i] == LOAD_CONST);
822 cumlc = 1;
823 }
824 break;
825
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000826 /* Simplify conditional jump to conditional jump where the
827 result of the first test implies the success of a similar
828 test or the failure of the opposite test.
829 Arises in code like:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000830 "if a and b:"
831 "if a or b:"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000832 "a and b or c"
Armin Rigod7bcf4d2004-10-30 21:08:59 +0000833 "(a and b) and c"
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000834 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000835 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
836 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000837 */
838 case JUMP_IF_FALSE:
839 case JUMP_IF_TRUE:
840 tgt = GETJUMPTGT(codestr, i);
841 j = codestr[tgt];
842 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
843 if (j == opcode) {
844 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
845 SETARG(codestr, i, tgttgt);
846 } else {
847 tgt -= i;
848 SETARG(codestr, i, tgt);
849 }
850 break;
851 }
852 /* Intentional fallthrough */
853
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000854 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000855 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000856 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000857 case JUMP_ABSOLUTE:
858 case CONTINUE_LOOP:
859 case SETUP_LOOP:
860 case SETUP_EXCEPT:
861 case SETUP_FINALLY:
862 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000863 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000864 continue;
865 tgttgt = GETJUMPTGT(codestr, tgt);
866 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
867 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000868 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000869 tgttgt -= i + 3; /* Calc relative jump addr */
870 if (tgttgt < 0) /* No backward relative jumps */
871 continue;
872 codestr[i] = opcode;
873 SETARG(codestr, i, tgttgt);
874 break;
875
876 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000877 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000878
879 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
880 case RETURN_VALUE:
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000881 if (i+4 >= codelen ||
882 codestr[i+4] != RETURN_VALUE ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000883 !ISBASICBLOCK(blocks,i,5))
884 continue;
885 memset(codestr+i+1, NOP, 4);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000886 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000887 }
888 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000889
890 /* Fixup linenotab */
Raymond Hettinger099ecfb2004-11-01 15:19:11 +0000891 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
892 addrmap[i] = i - nops;
893 if (codestr[i] == NOP)
894 nops++;
895 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000896 cum_orig_line = 0;
897 last_line = 0;
898 for (i=0 ; i < tabsiz ; i+=2) {
899 cum_orig_line += lineno[i];
900 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000901 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000902 lineno[i] =((unsigned char)(new_line - last_line));
903 last_line = new_line;
904 }
905
906 /* Remove NOPs and fixup jump targets */
907 for (i=0, h=0 ; i<codelen ; ) {
908 opcode = codestr[i];
909 switch (opcode) {
910 case NOP:
911 i++;
912 continue;
913
914 case JUMP_ABSOLUTE:
915 case CONTINUE_LOOP:
916 j = addrmap[GETARG(codestr, i)];
917 SETARG(codestr, i, j);
918 break;
919
920 case FOR_ITER:
921 case JUMP_FORWARD:
922 case JUMP_IF_FALSE:
923 case JUMP_IF_TRUE:
924 case SETUP_LOOP:
925 case SETUP_EXCEPT:
926 case SETUP_FINALLY:
927 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
928 SETARG(codestr, i, j);
929 break;
930 }
931 adj = CODESIZE(opcode);
932 while (adj--)
933 codestr[h++] = codestr[i++];
934 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000935 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000936
937 code = PyString_FromStringAndSize((char *)codestr, h);
938 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000939 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000940 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000941 return code;
942
943exitUnchanged:
Raymond Hettingereffb3932004-10-30 08:55:08 +0000944 if (blocks != NULL)
945 PyMem_Free(blocks);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000946 if (addrmap != NULL)
947 PyMem_Free(addrmap);
948 if (codestr != NULL)
949 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000950 Py_INCREF(code);
951 return code;
952}
953
Raymond Hettinger2c31a052004-09-22 18:44:21 +0000954/* End: Peephole optimizations ----------------------------------------- */
955
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000957PyCode_New(int argcount, int nlocals, int stacksize, int flags,
958 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000959 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
960 PyObject *filename, PyObject *name, int firstlineno,
961 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964 int i;
965 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000966 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000967 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 consts == NULL || !PyTuple_Check(consts) ||
969 names == NULL || !PyTuple_Check(names) ||
970 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000971 freevars == NULL || !PyTuple_Check(freevars) ||
972 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 name == NULL || !PyString_Check(name) ||
974 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000975 lnotab == NULL || !PyString_Check(lnotab) ||
976 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000977 PyErr_BadInternalCall();
978 return NULL;
979 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000980 intern_strings(names);
981 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000982 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000983 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000984 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 for (i = PyTuple_Size(consts); --i >= 0; ) {
986 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000988 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000989 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000990 continue;
991 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000992 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000994 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000995 co->co_argcount = argcount;
996 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000997 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000998 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000999 Py_INCREF(code);
1000 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001001 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001002 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001004 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +00001006 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001007 Py_INCREF(freevars);
1008 co->co_freevars = freevars;
1009 Py_INCREF(cellvars);
1010 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +00001012 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001014 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001015 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001017 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +00001018 if (PyTuple_GET_SIZE(freevars) == 0 &&
1019 PyTuple_GET_SIZE(cellvars) == 0)
1020 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021 }
1022 return co;
1023}
1024
1025
1026/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001027
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001028/* The compiler uses two passes to generate bytecodes. The first pass
1029 builds the symbol table. The second pass generates the bytecode.
1030
1031 The first pass uses a single symtable struct. The second pass uses
1032 a compiling struct for each code block. The compiling structs
1033 share a reference to the symtable.
1034
1035 The two passes communicate via symtable_load_symbols() and via
1036 is_local() and is_global(). The former initializes several slots
1037 in the compiling struct: c_varnames, c_locals, c_nlocals,
1038 c_argcount, c_globals, and c_flags.
1039*/
1040
Tim Peters2a7f3842001-06-09 09:26:21 +00001041/* All about c_lnotab.
1042
Michael W. Hudsondd32a912002-08-15 14:59:02 +00001043c_lnotab is an array of unsigned bytes disguised as a Python string. Since
1044version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
1045mapped to source code line #s via c_lnotab instead.
1046
Tim Peters2a7f3842001-06-09 09:26:21 +00001047The array is conceptually a list of
1048 (bytecode offset increment, line number increment)
1049pairs. The details are important and delicate, best illustrated by example:
1050
1051 byte code offset source code line number
1052 0 1
1053 6 2
1054 50 7
1055 350 307
1056 361 308
1057
1058The first trick is that these numbers aren't stored, only the increments
1059from one row to the next (this doesn't really work, but it's a start):
1060
1061 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
1062
1063The second trick is that an unsigned byte can't hold negative values, or
1064values larger than 255, so (a) there's a deep assumption that byte code
1065offsets and their corresponding line #s both increase monotonically, and (b)
1066if at least one column jumps by more than 255 from one row to the next, more
1067than one pair is written to the table. In case #b, there's no way to know
1068from looking at the table later how many were written. That's the delicate
1069part. A user of c_lnotab desiring to find the source line number
1070corresponding to a bytecode address A should do something like this
1071
1072 lineno = addr = 0
1073 for addr_incr, line_incr in c_lnotab:
1074 addr += addr_incr
1075 if addr > A:
1076 return lineno
1077 lineno += line_incr
1078
1079In order for this to work, when the addr field increments by more than 255,
1080the line # increment in each pair generated must be 0 until the remaining addr
1081increment is < 256. So, in the example above, com_set_lineno should not (as
1082was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
1083255, 0, 45, 255, 0, 45.
1084*/
1085
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001086struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +00001087 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001089 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001091 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +00001092 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 PyObject *c_locals; /* dictionary (value=localID) */
1094 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001095 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +00001096 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +00001097 int c_nlocals; /* index of next local */
1098 int c_argcount; /* number of top-level arguments */
1099 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001100 int c_nexti; /* index into c_code */
1101 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001102 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001103 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001105 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001106 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001107 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +00001108 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +00001109 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +00001110 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 int c_stacklevel; /* Current stack level */
1112 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001113 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +00001115 int c_last_addr; /* last op addr seen and recorded in lnotab */
1116 int c_last_line; /* last line seen and recorded in lnotab */
1117 int c_lnotab_next; /* current length of lnotab */
1118 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001119 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001120 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +00001121 int c_nested; /* Is block nested funcdef or lamdef? */
1122 int c_closure; /* Is nested w/freevars? */
1123 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +00001124 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001125 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001126};
1127
Guido van Rossumf68d8e52001-04-14 17:55:09 +00001128static int
1129is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001130{
1131 if ((v & (USE | DEF_FREE))
1132 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
1133 return 1;
1134 if (v & DEF_FREE_CLASS)
1135 return 1;
1136 return 0;
1137}
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001138
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00001139static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001140com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +00001141{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001142 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
1143
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001144 if (c == NULL) {
1145 /* Error occurred via symtable call to
1146 is_constant_false */
1147 PyErr_SetString(exc, msg);
1148 return;
1149 }
Guido van Rossum635abd21997-01-06 22:56:52 +00001150 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001151 if (c->c_lineno < 1 || c->c_interactive) {
1152 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001154 return;
1155 }
Fred Drakedcf08e02000-08-15 15:49:44 +00001156 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +00001157 if (v == NULL)
1158 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +00001159
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +00001160 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001161 if (line == NULL) {
1162 Py_INCREF(Py_None);
1163 line = Py_None;
1164 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001165 if (exc == PyExc_SyntaxError) {
1166 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
1167 Py_None, line);
1168 if (t == NULL)
1169 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001170 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001171 if (w == NULL)
1172 goto exit;
1173 PyErr_SetObject(exc, w);
1174 } else {
1175 /* Make sure additional exceptions are printed with
1176 file and line, also. */
1177 PyErr_SetObject(exc, v);
1178 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
1179 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00001180 exit:
1181 Py_XDECREF(t);
1182 Py_XDECREF(v);
1183 Py_XDECREF(w);
1184 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +00001185}
1186
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001187/* Interface to the block stack */
1188
1189static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001191{
Guido van Rossum8b993a91997-01-17 21:04:03 +00001192 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 com_error(c, PyExc_SystemError,
1194 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001195 }
1196 else {
1197 c->c_block[c->c_nblocks++] = type;
1198 }
1199}
1200
1201static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001202block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001203{
1204 if (c->c_nblocks > 0)
1205 c->c_nblocks--;
1206 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001208 }
1209}
1210
Guido van Rossum681d79a1995-07-18 14:51:37 +00001211/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001212
Martin v. Löwis95292d62002-12-11 14:04:59 +00001213static int issue_warning(const char *, const char *, int);
1214static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001215static void com_free(struct compiling *);
1216static void com_push(struct compiling *, int);
1217static void com_pop(struct compiling *, int);
1218static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001219static void com_node(struct compiling *, node *);
1220static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001221static void com_addbyte(struct compiling *, int);
1222static void com_addint(struct compiling *, int);
1223static void com_addoparg(struct compiling *, int, int);
1224static void com_addfwref(struct compiling *, int, int *);
1225static void com_backpatch(struct compiling *, int);
1226static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
1227static int com_addconst(struct compiling *, PyObject *);
1228static int com_addname(struct compiling *, PyObject *);
1229static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001230static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001231static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001232static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001233static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +00001234static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001235static void com_assign(struct compiling *, node *, int, node *);
1236static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001237static int com_make_closure(struct compiling *c, PyCodeObject *co);
1238
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001239static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +00001240static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00001241 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001242static PyObject *parsestrplus(struct compiling*, node *);
1243static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +00001244static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001246static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001247
1248/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +00001249static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00001250static struct symtable *symtable_build(node *, PyFutureFeatures *,
1251 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001252static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001253static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00001254static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001255static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001256static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001257static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001258
1259static void symtable_node(struct symtable *, node *);
1260static void symtable_funcdef(struct symtable *, node *);
1261static void symtable_default_args(struct symtable *, node *);
1262static void symtable_params(struct symtable *, node *);
1263static void symtable_params_fplist(struct symtable *, node *n);
1264static void symtable_global(struct symtable *, node *);
1265static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001266static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001267static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001268static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001269static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +00001270static void symtable_gen_for(struct symtable *, node *, int);
1271static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001272
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001273static int symtable_update_free_vars(struct symtable *);
1274static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
1275static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1276
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001277/* helper */
1278static void
1279do_pad(int pad)
1280{
1281 int i;
1282 for (i = 0; i < pad; ++i)
1283 fprintf(stderr, " ");
1284}
1285
1286static void
1287dump(node *n, int pad, int depth)
1288{
1289 int i;
1290 if (depth == 0)
1291 return;
1292 do_pad(pad);
1293 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1294 if (depth > 0)
1295 depth--;
1296 for (i = 0; i < NCH(n); ++i)
1297 dump(CHILD(n, i), pad + 1, depth);
1298}
1299
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001300static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001301com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001303 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1305 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001306 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001308 goto fail;
1309 if ((c->c_const_dict = PyDict_New()) == NULL)
1310 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001311 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001312 goto fail;
1313 if ((c->c_name_dict = PyDict_New()) == NULL)
1314 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001316 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1318 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001319 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001320 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001322 c->c_freevars = NULL;
1323 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001324 c->c_nlocals = 0;
1325 c->c_argcount = 0;
1326 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001327 c->c_nexti = 0;
1328 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001329 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001330 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001331 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001332 c->c_begin = 0;
1333 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001334 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001335 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001336 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001337 c->c_stacklevel = 0;
1338 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001339 c->c_firstlineno = 0;
1340 c->c_last_addr = 0;
1341 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001342 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001343 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001344 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001345 c->c_nested = 0;
1346 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001347 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 return 1;
1349
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001350 fail:
1351 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 return 0;
1353}
1354
1355static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001356com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001357{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 Py_XDECREF(c->c_code);
1359 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001360 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001362 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 Py_XDECREF(c->c_globals);
1364 Py_XDECREF(c->c_locals);
1365 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001366 Py_XDECREF(c->c_freevars);
1367 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001369 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001370 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001371}
1372
1373static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001374com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001375{
1376 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001377 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001378 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001379 /*
1380 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1381 c->c_filename, c->c_name, c->c_lineno,
1382 c->c_nexti, c->c_stacklevel, n);
1383 */
1384 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001385}
1386
1387static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001388com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001389{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001390 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001391 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001392 else
1393 c->c_stacklevel -= n;
1394}
1395
1396static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001397com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001398{
1399 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001401 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001403}
1404
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001405static int
1406com_check_size(PyObject **s, int offset)
1407{
1408 int len = PyString_GET_SIZE(*s);
1409 if (offset >= len)
1410 return _PyString_Resize(s, len * 2);
1411 return 0;
1412}
1413
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001414static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001415com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001416{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001417 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001418 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001419 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001420 if (com_check_size(&c->c_code, c->c_nexti)) {
1421 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001422 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001423 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001424 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001425}
1426
1427static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001428com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001429{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001430 com_addbyte(c, x & 0xff);
1431 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001432}
1433
1434static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001435com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001436{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001437 char *p;
1438 if (c->c_lnotab == NULL)
1439 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001440 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1441 c->c_errors++;
1442 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001443 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001444 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001445 *p++ = addr;
1446 *p++ = line;
1447 c->c_lnotab_next += 2;
1448}
1449
1450static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001451com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001452{
1453 c->c_lineno = lineno;
1454 if (c->c_firstlineno == 0) {
1455 c->c_firstlineno = c->c_last_line = lineno;
1456 }
1457 else {
1458 int incr_addr = c->c_nexti - c->c_last_addr;
1459 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001460 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001461 while (incr_addr > 255) {
1462 com_add_lnotab(c, 255, 0);
1463 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001464 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001465 while (incr_line > 255) {
1466 com_add_lnotab(c, incr_addr, 255);
1467 incr_line -=255;
1468 incr_addr = 0;
1469 }
1470 if (incr_addr > 0 || incr_line > 0)
1471 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001472 c->c_last_addr = c->c_nexti;
1473 c->c_last_line = lineno;
1474 }
1475}
1476
1477static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001478com_strip_lnotab(struct compiling *c)
1479{
1480 /* strip the last lnotab entry if no opcode were emitted.
1481 * This prevents a line number to be generated on a final
1482 * pass, like in the following example:
1483 *
1484 * if a:
1485 * print 5
1486 * else:
1487 * pass
1488 *
1489 * Without the fix, a line trace event would be generated
1490 * on the pass even if a is true (because of the implicit
1491 * return).
1492 */
1493 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1494 c->c_lnotab_next = c->c_lnotab_last;
1495 }
1496}
1497
1498static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001499com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001500{
Fred Drakeef8ace32000-08-24 00:32:09 +00001501 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001502 if (extended_arg){
1503 com_addbyte(c, EXTENDED_ARG);
1504 com_addint(c, extended_arg);
1505 arg &= 0xffff;
1506 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001507 com_addbyte(c, op);
1508 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001509}
1510
1511static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001512com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001513{
1514 /* Compile a forward reference for backpatching */
1515 int here;
1516 int anchor;
1517 com_addbyte(c, op);
1518 here = c->c_nexti;
1519 anchor = *p_anchor;
1520 *p_anchor = here;
1521 com_addint(c, anchor == 0 ? 0 : here - anchor);
1522}
1523
1524static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001525com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001526{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001527 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001528 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001529 int dist;
1530 int prev;
1531 for (;;) {
1532 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001533 prev = code[anchor] + (code[anchor+1] << 8);
1534 dist = target - (anchor+2);
1535 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001536 dist >>= 8;
1537 code[anchor+1] = dist;
1538 dist >>= 8;
1539 if (dist) {
1540 com_error(c, PyExc_SystemError,
1541 "com_backpatch: offset too large");
1542 break;
1543 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001544 if (!prev)
1545 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546 anchor -= prev;
1547 }
1548}
1549
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001550/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001551
1552static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001553com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001554{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001555 PyObject *w, *t, *np=NULL;
1556 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001557
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001558 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001559 if (t == NULL)
1560 goto fail;
1561 w = PyDict_GetItem(dict, t);
1562 if (w != NULL) {
1563 n = PyInt_AsLong(w);
1564 } else {
1565 n = PyList_Size(list);
1566 np = PyInt_FromLong(n);
1567 if (np == NULL)
1568 goto fail;
1569 if (PyList_Append(list, v) != 0)
1570 goto fail;
1571 if (PyDict_SetItem(dict, t, np) != 0)
1572 goto fail;
1573 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001574 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001575 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001576 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001577 fail:
1578 Py_XDECREF(np);
1579 Py_XDECREF(t);
1580 c->c_errors++;
1581 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001582}
1583
1584static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001585com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001586{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001587 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001588}
1589
1590static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001591com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001593 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001594}
1595
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001596int
1597_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001598{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001599 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001600 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001601 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001602 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1603 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001604 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001605 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001606 return 0; /* Don't mangle __extremely_long_names */
1607 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1608 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001609 /* Strip leading underscores from class name */
1610 while (*p == '_')
1611 p++;
1612 if (*p == '\0')
1613 return 0; /* Don't mangle if class is just underscores */
1614 plen = strlen(p);
1615 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001616 plen = maxlen-nlen-2; /* Truncate class name if too long */
1617 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001618 buffer[0] = '_';
1619 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001620 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001621 return 1;
1622}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001623
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001624static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001625com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001626{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001628 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001629 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001630
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001631 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001632 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001633 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001634 c->c_errors++;
1635 i = 255;
1636 }
1637 else {
1638 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001640 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001641 com_addoparg(c, op, i);
1642}
1643
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001644#define NAME_LOCAL 0
1645#define NAME_GLOBAL 1
1646#define NAME_DEFAULT 2
1647#define NAME_CLOSURE 3
1648
1649static int
1650com_lookup_arg(PyObject *dict, PyObject *name)
1651{
1652 PyObject *v = PyDict_GetItem(dict, name);
1653 if (v == NULL)
1654 return -1;
1655 else
1656 return PyInt_AS_LONG(v);
1657}
1658
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001659static int
1660none_assignment_check(struct compiling *c, char *name, int assigning)
1661{
1662 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1663 char *msg;
1664 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001665 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001666 else
1667 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001668 com_error(c, PyExc_SyntaxError, msg);
1669 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001670 }
1671 return 0;
1672}
1673
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001674static void
1675com_addop_varname(struct compiling *c, int kind, char *name)
1676{
1677 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001678 int i, reftype;
1679 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001680 int op = STOP_CODE;
1681 char buffer[MANGLE_LEN];
1682
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001683 if (kind != VAR_LOAD &&
1684 none_assignment_check(c, name, kind == VAR_STORE))
1685 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001686 i = 255;
1687 goto done;
1688 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001689 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001690 name = buffer;
1691 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1692 c->c_errors++;
1693 i = 255;
1694 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001695 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001696
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001697 reftype = get_ref_type(c, name);
1698 switch (reftype) {
1699 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001700 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001701 scope = NAME_LOCAL;
1702 break;
1703 case GLOBAL_EXPLICIT:
1704 scope = NAME_GLOBAL;
1705 break;
1706 case GLOBAL_IMPLICIT:
1707 if (c->c_flags & CO_OPTIMIZED)
1708 scope = NAME_GLOBAL;
1709 break;
1710 case FREE:
1711 case CELL:
1712 scope = NAME_CLOSURE;
1713 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001714 }
1715
1716 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001717 if (scope == NAME_LOCAL)
1718 i = com_lookup_arg(c->c_locals, v);
1719 else if (reftype == FREE)
1720 i = com_lookup_arg(c->c_freevars, v);
1721 else if (reftype == CELL)
1722 i = com_lookup_arg(c->c_cellvars, v);
1723 if (i == -1) {
1724 c->c_errors++; /* XXX no exception set */
1725 i = 255;
1726 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001727 }
1728 Py_DECREF(v);
1729
1730 switch (kind) {
1731 case VAR_LOAD:
1732 switch (scope) {
1733 case NAME_LOCAL:
1734 op = LOAD_FAST;
1735 break;
1736 case NAME_GLOBAL:
1737 op = LOAD_GLOBAL;
1738 break;
1739 case NAME_DEFAULT:
1740 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001741 break;
1742 case NAME_CLOSURE:
1743 op = LOAD_DEREF;
1744 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001745 }
1746 break;
1747 case VAR_STORE:
1748 switch (scope) {
1749 case NAME_LOCAL:
1750 op = STORE_FAST;
1751 break;
1752 case NAME_GLOBAL:
1753 op = STORE_GLOBAL;
1754 break;
1755 case NAME_DEFAULT:
1756 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001757 break;
1758 case NAME_CLOSURE:
1759 op = STORE_DEREF;
1760 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001761 }
1762 break;
1763 case VAR_DELETE:
1764 switch (scope) {
1765 case NAME_LOCAL:
1766 op = DELETE_FAST;
1767 break;
1768 case NAME_GLOBAL:
1769 op = DELETE_GLOBAL;
1770 break;
1771 case NAME_DEFAULT:
1772 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001773 break;
1774 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001775 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001776 PyOS_snprintf(buf, sizeof(buf),
1777 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001778 com_error(c, PyExc_SyntaxError, buf);
1779 i = 255;
1780 break;
1781 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001782 }
1783 break;
1784 }
1785done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001786 com_addoparg(c, op, i);
1787}
1788
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001789static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001790com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001791{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001792 char *name;
1793 char buffer[1000];
1794 /* XXX it is possible to write this code without the 1000
1795 chars on the total length of dotted names, I just can't be
1796 bothered right now */
1797 if (TYPE(n) == STAR)
1798 name = "*";
1799 else if (TYPE(n) == dotted_name) {
1800 char *p = buffer;
1801 int i;
1802 name = buffer;
1803 for (i = 0; i < NCH(n); i += 2) {
1804 char *s = STR(CHILD(n, i));
1805 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001807 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001808 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001809 break;
1810 }
1811 if (p != buffer)
1812 *p++ = '.';
1813 strcpy(p, s);
1814 p = strchr(p, '\0');
1815 }
1816 }
1817 else {
1818 REQ(n, NAME);
1819 name = STR(n);
1820 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001821 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001822}
1823
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001825parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001826{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001827 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001828 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001829 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001830#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001831 int imflag;
1832#endif
1833
Guido van Rossum282914b1991-04-04 10:42:56 +00001834 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001835 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001836#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001837 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001838#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001839 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001841 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001843 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001844 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001845 }
1846 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001847 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001849 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001850 if (errno != 0)
1851 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001853 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001854 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001855#ifndef WITHOUT_COMPLEX
1856 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001857 Py_complex z;
1858 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001859 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001860 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001861 PyFPE_END_PROTECT(z)
1862 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001863 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001864 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001865#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001866 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001867 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001868 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001869 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001871 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001872}
1873
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001875decode_utf8(char **sPtr, char *end, char* encoding)
1876{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001877#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001878 Py_FatalError("decode_utf8 should not be called in this build.");
1879 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001880#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001881 PyObject *u, *v;
1882 char *s, *t;
1883 t = s = *sPtr;
1884 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1885 while (s < end && (*s & 0x80)) s++;
1886 *sPtr = s;
1887 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1888 if (u == NULL)
1889 return NULL;
1890 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1891 Py_DECREF(u);
1892 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001893#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001894}
1895
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001896/* compiler.transformer.Transformer.decode_literal depends on what
1897 might seem like minor details of this function -- changes here
1898 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001899static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001900parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001901{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001903 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001904 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001905 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001906 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001907 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001908 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001909
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001910 if (isalpha(quote) || quote == '_') {
1911 if (quote == 'u' || quote == 'U') {
1912 quote = *++s;
1913 unicode = 1;
1914 }
1915 if (quote == 'r' || quote == 'R') {
1916 quote = *++s;
1917 rawmode = 1;
1918 }
1919 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001920 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001922 return NULL;
1923 }
1924 s++;
1925 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001926 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001927 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001928 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001929 return NULL;
1930 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001931 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001933 return NULL;
1934 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001935 if (len >= 4 && s[0] == quote && s[1] == quote) {
1936 s += 2;
1937 len -= 2;
1938 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001939 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001940 return NULL;
1941 }
1942 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001943#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001944 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001945 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001946 char *buf;
1947 char *p;
1948 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001949 if (encoding == NULL) {
1950 buf = s;
1951 u = NULL;
1952 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1953 buf = s;
1954 u = NULL;
1955 } else {
1956 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1957 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1958 if (u == NULL)
1959 return NULL;
1960 p = buf = PyString_AsString(u);
1961 end = s + len;
1962 while (s < end) {
1963 if (*s == '\\') {
1964 *p++ = *s++;
1965 if (*s & 0x80) {
1966 strcpy(p, "u005c");
1967 p += 5;
1968 }
1969 }
1970 if (*s & 0x80) { /* XXX inefficient */
1971 char *r;
1972 int rn, i;
1973 w = decode_utf8(&s, end, "utf-16-be");
1974 if (w == NULL) {
1975 Py_DECREF(u);
1976 return NULL;
1977 }
1978 r = PyString_AsString(w);
1979 rn = PyString_Size(w);
1980 assert(rn % 2 == 0);
1981 for (i = 0; i < rn; i += 2) {
1982 sprintf(p, "\\u%02x%02x",
1983 r[i + 0] & 0xFF,
1984 r[i + 1] & 0xFF);
1985 p += 6;
1986 }
1987 Py_DECREF(w);
1988 } else {
1989 *p++ = *s++;
1990 }
1991 }
1992 len = p - buf;
1993 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001994 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001995 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001996 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001997 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1998 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001999 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002000 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00002001 return v;
2002
Guido van Rossum5aa88f02000-03-10 23:01:36 +00002003 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002004#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002005 need_encoding = (encoding != NULL &&
2006 strcmp(encoding, "utf-8") != 0 &&
2007 strcmp(encoding, "iso-8859-1") != 0);
2008 if (rawmode || strchr(s, '\\') == NULL) {
2009 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00002010#ifndef Py_USING_UNICODE
2011 /* This should not happen - we never see any other
2012 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00002013 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00002014#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002015 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
2016 if (u == NULL)
2017 return NULL;
2018 v = PyUnicode_AsEncodedString(u, encoding, NULL);
2019 Py_DECREF(u);
2020 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00002021#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00002022 } else {
2023 return PyString_FromStringAndSize(s, len);
2024 }
2025 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00002026
2027 v = PyString_DecodeEscape(s, len, NULL, unicode,
2028 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00002029 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00002030 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002031 return v;
2032}
2033
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002035parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002036{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002038 int i;
2039 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002040 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002041 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00002042 for (i = 1; i < NCH(n); i++) {
2043 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002044 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00002045 if (s == NULL)
2046 goto onError;
2047 if (PyString_Check(v) && PyString_Check(s)) {
2048 PyString_ConcatAndDel(&v, s);
2049 if (v == NULL)
2050 goto onError;
2051 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002052#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00002053 else {
2054 PyObject *temp;
2055 temp = PyUnicode_Concat(v, s);
2056 Py_DECREF(s);
2057 if (temp == NULL)
2058 goto onError;
2059 Py_DECREF(v);
2060 v = temp;
2061 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002062#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002063 }
2064 }
2065 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00002066
2067 onError:
2068 Py_XDECREF(v);
2069 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00002070}
2071
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002073com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074{
Skip Montanaro803d6e52000-08-12 18:09:51 +00002075 int anchor = 0;
2076 int save_begin = c->c_begin;
2077
Raymond Hettinger354433a2004-05-19 08:20:33 +00002078 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002079 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002080 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002081 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002082 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002083 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00002084 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002085 c->c_loops++;
2086 com_list_iter(c, n, e, t);
2087 c->c_loops--;
2088 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2089 c->c_begin = save_begin;
2090 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002091 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002092}
2093
2094static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002095com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
2096{
2097 int break_anchor = 0;
2098 int anchor = 0;
2099 int save_begin = c->c_begin;
2100
2101 REQ(n, gen_for);
2102 /* gen_for: for v in test [gen_iter] */
2103
2104 com_addfwref(c, SETUP_LOOP, &break_anchor);
2105 block_push(c, SETUP_LOOP);
2106
2107 if (is_outmost) {
2108 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
2109 com_push(c, 1);
2110 }
2111 else {
2112 com_node(c, CHILD(n, 3));
2113 com_addbyte(c, GET_ITER);
2114 }
2115
2116 c->c_begin = c->c_nexti;
2117 com_set_lineno(c, c->c_last_line);
2118 com_addfwref(c, FOR_ITER, &anchor);
2119 com_push(c, 1);
2120 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
2121
2122 if (NCH(n) == 5)
2123 com_gen_iter(c, CHILD(n, 4), t);
2124 else {
2125 com_test(c, t);
2126 com_addbyte(c, YIELD_VALUE);
2127 com_pop(c, 1);
2128 }
2129
2130 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
2131 c->c_begin = save_begin;
2132
2133 com_backpatch(c, anchor);
2134 com_pop(c, 1); /* FOR_ITER has popped this */
2135 com_addbyte(c, POP_BLOCK);
2136 block_pop(c, SETUP_LOOP);
2137 com_backpatch(c, break_anchor);
2138}
2139
2140static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002141com_list_if(struct compiling *c, node *n, node *e, char *t)
2142{
2143 int anchor = 0;
2144 int a = 0;
2145 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00002146 com_node(c, CHILD(n, 1));
2147 com_addfwref(c, JUMP_IF_FALSE, &a);
2148 com_addbyte(c, POP_TOP);
2149 com_pop(c, 1);
2150 com_list_iter(c, n, e, t);
2151 com_addfwref(c, JUMP_FORWARD, &anchor);
2152 com_backpatch(c, a);
2153 /* We jump here with an extra entry which we now pop */
2154 com_addbyte(c, POP_TOP);
2155 com_backpatch(c, anchor);
2156}
2157
2158static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002159com_gen_if(struct compiling *c, node *n, node *t)
2160{
2161 /* gen_if: 'if' test [gen_iter] */
2162 int anchor = 0;
2163 int a=0;
2164
2165 com_node(c, CHILD(n, 1));
2166 com_addfwref(c, JUMP_IF_FALSE, &a);
2167 com_addbyte(c, POP_TOP);
2168 com_pop(c, 1);
2169
2170 if (NCH(n) == 3)
2171 com_gen_iter(c, CHILD(n, 2), t);
2172 else {
2173 com_test(c, t);
2174 com_addbyte(c, YIELD_VALUE);
2175 com_pop(c, 1);
2176 }
2177 com_addfwref(c, JUMP_FORWARD, &anchor);
2178 com_backpatch(c, a);
2179 /* We jump here with an extra entry which we now pop */
2180 com_addbyte(c, POP_TOP);
2181 com_backpatch(c, anchor);
2182}
2183
2184static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002185com_list_iter(struct compiling *c,
2186 node *p, /* parent of list_iter node */
2187 node *e, /* element expression node */
2188 char *t /* name of result list temp local */)
2189{
2190 /* list_iter is the last child in a listmaker, list_for, or list_if */
2191 node *n = CHILD(p, NCH(p)-1);
2192 if (TYPE(n) == list_iter) {
2193 n = CHILD(n, 0);
2194 switch (TYPE(n)) {
2195 case list_for:
2196 com_list_for(c, n, e, t);
2197 break;
2198 case list_if:
2199 com_list_if(c, n, e, t);
2200 break;
2201 default:
2202 com_error(c, PyExc_SystemError,
2203 "invalid list_iter node type");
2204 }
2205 }
2206 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002207 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002208 com_push(c, 1);
2209 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00002210 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002211 com_pop(c, 2);
2212 }
2213}
2214
2215static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002216com_gen_iter(struct compiling *c, node *n, node *t)
2217{
2218 /* gen_iter: gen_for | gen_if */
2219 node *ch;
2220 REQ(n, gen_iter);
2221
2222 ch = CHILD(n, 0);
2223
2224 switch (TYPE(ch)) {
2225 case gen_for:
2226 com_gen_for(c, ch, t, 0);
2227 break;
2228 case gen_if:
2229 com_gen_if(c, ch, t);
2230 break;
2231 default:
2232 com_error(c, PyExc_SystemError,
2233 "invalid gen_iter node type");
2234 }
2235}
2236
2237static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00002238com_list_comprehension(struct compiling *c, node *n)
2239{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002240 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002241 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00002242
2243 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00002244 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002245 com_addoparg(c, BUILD_LIST, 0);
2246 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
2247 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002248 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002249 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002250 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002251 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002252 --c->c_tmpname;
2253}
2254
2255static void
2256com_listmaker(struct compiling *c, node *n)
2257{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00002258 /* listmaker: test ( list_for | (',' test)* [','] ) */
2259 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00002260 com_list_comprehension(c, n);
2261 else {
2262 int len = 0;
2263 int i;
2264 for (i = 0; i < NCH(n); i += 2, len++)
2265 com_node(c, CHILD(n, i));
2266 com_addoparg(c, BUILD_LIST, len);
2267 com_pop(c, len-1);
2268 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269}
2270
2271static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00002272com_generator_expression(struct compiling *c, node *n)
2273{
2274 /* testlist_gexp: test gen_for */
2275 /* argument: test gen_for */
2276 PyCodeObject *co;
2277
2278 REQ(CHILD(n, 0), test);
2279 REQ(CHILD(n, 1), gen_for);
2280
2281 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2282 n->n_lineno);
2283 co = icompile(n, c);
2284 symtable_exit_scope(c->c_symtable);
2285
2286 if (co == NULL)
2287 c->c_errors++;
2288 else {
2289 int closure = com_make_closure(c, co);
2290 int i = com_addconst(c, (PyObject *)co);
2291
2292 com_addoparg(c, LOAD_CONST, i);
2293 com_push(c, 1);
2294 if (closure)
2295 com_addoparg(c, MAKE_CLOSURE, 0);
2296 else
2297 com_addoparg(c, MAKE_FUNCTION, 0);
2298
2299 com_test(c, CHILD(CHILD(n, 1), 3));
2300 com_addbyte(c, GET_ITER);
2301 com_addoparg(c, CALL_FUNCTION, 1);
2302 com_pop(c, 1);
2303
2304 Py_DECREF(co);
2305 }
2306}
2307
2308static void
2309com_testlist_gexp(struct compiling *c, node *n)
2310{
2311 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2312 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2313 com_generator_expression(c, n);
2314 else com_list(c, n, 0);
2315}
2316
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002317
Raymond Hettinger354433a2004-05-19 08:20:33 +00002318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002319com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002320{
2321 int i;
2322 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2323 for (i = 0; i+2 < NCH(n); i += 4) {
2324 /* We must arrange things just right for STORE_SUBSCR.
2325 It wants the stack to look like (value) (dict) (key) */
2326 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002328 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002329 com_node(c, CHILD(n, i+2)); /* value */
2330 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002331 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002332 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002333 }
2334}
2335
2336static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002337com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002338{
2339 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002341 int i;
2342 REQ(n, atom);
2343 ch = CHILD(n, 0);
2344 switch (TYPE(ch)) {
2345 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002346 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002347 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 com_push(c, 1);
2349 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002350 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002351 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002352 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002353 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002354 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002355 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002356 com_push(c, 1);
2357 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002358 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002359 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002360 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002361 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002362 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002363 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002364 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002365 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002366 break;
2367 case BACKQUOTE:
2368 com_node(c, CHILD(n, 1));
2369 com_addbyte(c, UNARY_CONVERT);
2370 break;
2371 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002372 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002373 i = 255;
2374 }
2375 else {
2376 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002377 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002378 }
2379 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002380 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002381 break;
2382 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002383 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002384 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002385 c->c_errors++;
2386 i = 255;
2387 }
2388 else {
2389 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002390 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002391 }
2392 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002393 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002394 break;
2395 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002396 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002397 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002398 break;
2399 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002400 com_error(c, PyExc_SystemError,
2401 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002402 }
2403}
2404
2405static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002406com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002407{
2408 if (NCH(n) == 1) {
2409 com_addbyte(c, op);
2410 }
2411 else if (NCH(n) == 2) {
2412 if (TYPE(CHILD(n, 0)) != COLON) {
2413 com_node(c, CHILD(n, 0));
2414 com_addbyte(c, op+1);
2415 }
2416 else {
2417 com_node(c, CHILD(n, 1));
2418 com_addbyte(c, op+2);
2419 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002420 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002421 }
2422 else {
2423 com_node(c, CHILD(n, 0));
2424 com_node(c, CHILD(n, 2));
2425 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002426 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002427 }
2428}
2429
Guido van Rossum635abd21997-01-06 22:56:52 +00002430static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002431com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2432{
2433 if (NCH(n) == 1) {
2434 com_addbyte(c, DUP_TOP);
2435 com_push(c, 1);
2436 com_addbyte(c, SLICE);
2437 com_node(c, augn);
2438 com_addbyte(c, opcode);
2439 com_pop(c, 1);
2440 com_addbyte(c, ROT_TWO);
2441 com_addbyte(c, STORE_SLICE);
2442 com_pop(c, 2);
2443 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2444 com_node(c, CHILD(n, 0));
2445 com_addoparg(c, DUP_TOPX, 2);
2446 com_push(c, 2);
2447 com_addbyte(c, SLICE+1);
2448 com_pop(c, 1);
2449 com_node(c, augn);
2450 com_addbyte(c, opcode);
2451 com_pop(c, 1);
2452 com_addbyte(c, ROT_THREE);
2453 com_addbyte(c, STORE_SLICE+1);
2454 com_pop(c, 3);
2455 } else if (NCH(n) == 2) {
2456 com_node(c, CHILD(n, 1));
2457 com_addoparg(c, DUP_TOPX, 2);
2458 com_push(c, 2);
2459 com_addbyte(c, SLICE+2);
2460 com_pop(c, 1);
2461 com_node(c, augn);
2462 com_addbyte(c, opcode);
2463 com_pop(c, 1);
2464 com_addbyte(c, ROT_THREE);
2465 com_addbyte(c, STORE_SLICE+2);
2466 com_pop(c, 3);
2467 } else {
2468 com_node(c, CHILD(n, 0));
2469 com_node(c, CHILD(n, 2));
2470 com_addoparg(c, DUP_TOPX, 3);
2471 com_push(c, 3);
2472 com_addbyte(c, SLICE+3);
2473 com_pop(c, 2);
2474 com_node(c, augn);
2475 com_addbyte(c, opcode);
2476 com_pop(c, 1);
2477 com_addbyte(c, ROT_FOUR);
2478 com_addbyte(c, STORE_SLICE+3);
2479 com_pop(c, 4);
2480 }
2481}
2482
2483static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002484com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002485{
2486 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002487 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002488 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002489 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002490 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002491 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002492 }
2493 else {
2494 com_node(c, CHILD(n, 0));
2495 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002496 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002497 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002498 if (NCH(n) == 2) {
2499 com_generator_expression(c, n);
2500 return;
2501 }
2502
Guido van Rossumf10570b1995-07-07 22:53:21 +00002503 m = n;
2504 do {
2505 m = CHILD(m, 0);
2506 } while (NCH(m) == 1);
2507 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002508 /* f(lambda x: x[0] = 3) ends up getting parsed with
2509 * LHS test = lambda x: x[0], and RHS test = 3.
2510 * SF bug 132313 points out that complaining about a keyword
2511 * then is very confusing.
2512 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002513 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002514 TYPE(m) == lambdef ?
2515 "lambda cannot contain assignment" :
2516 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002517 }
2518 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002519 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002520 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002521 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002522 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002523 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002524 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002525 else if (*pkeywords == NULL) {
2526 c->c_errors++;
2527 Py_DECREF(v);
2528 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002529 if (PyDict_GetItem(*pkeywords, v) != NULL)
2530 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002531 "duplicate keyword argument");
2532 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002533 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002534 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002535 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002536 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002537 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002538 }
2539 }
2540 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002541}
2542
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002544com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002545{
2546 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002547 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002548 }
2549 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002550 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002551 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002552 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002553 int star_flag = 0;
2554 int starstar_flag = 0;
2555 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002556 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002557 na = 0;
2558 nk = 0;
2559 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002560 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002561 if (TYPE(ch) == STAR ||
2562 TYPE(ch) == DOUBLESTAR)
2563 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002564 if (ch->n_lineno != lineno) {
2565 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002566 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002567 }
2568 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002569 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002570 na++;
2571 else
2572 nk++;
2573 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002574 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002575 while (i < NCH(n)) {
2576 node *tok = CHILD(n, i);
2577 node *ch = CHILD(n, i+1);
2578 i += 3;
2579 switch (TYPE(tok)) {
2580 case STAR: star_flag = 1; break;
2581 case DOUBLESTAR: starstar_flag = 1; break;
2582 }
2583 com_node(c, ch);
2584 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002585 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002586 com_error(c, PyExc_SyntaxError,
2587 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002588 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002589 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002590 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002591 star_flag + (starstar_flag << 1);
2592 else
2593 opcode = CALL_FUNCTION;
2594 com_addoparg(c, opcode, na | (nk << 8));
2595 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002596 }
2597}
2598
2599static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002600com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002601{
2602 com_addopname(c, LOAD_ATTR, n);
2603}
2604
2605static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002606com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002607{
2608 int i=0;
2609 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002610 node *ch;
2611
2612 /* first argument */
2613 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002614 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002615 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002616 i++;
2617 }
2618 else {
2619 com_node(c, CHILD(n,i));
2620 i++;
2621 REQ(CHILD(n,i),COLON);
2622 i++;
2623 }
2624 /* second argument */
2625 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2626 com_node(c, CHILD(n,i));
2627 i++;
2628 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002629 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002630 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 com_push(c, 1);
2632 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002633 /* remaining arguments */
2634 for (; i < NCH(n); i++) {
2635 ns++;
2636 ch=CHILD(n,i);
2637 REQ(ch, sliceop);
2638 if (NCH(ch) == 1) {
2639 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002640 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002641 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002642 }
2643 else
2644 com_node(c, CHILD(ch,1));
2645 }
2646 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002647 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002648}
2649
2650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002651com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002652{
2653 node *ch;
2654 REQ(n, subscript);
2655 ch = CHILD(n,0);
2656 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002658 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_push(c, 1);
2660 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002661 else {
2662 /* check for slice */
2663 if ((TYPE(ch) == COLON || NCH(n) > 1))
2664 com_sliceobj(c, n);
2665 else {
2666 REQ(ch, test);
2667 com_node(c, ch);
2668 }
2669 }
2670}
2671
2672static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002673com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002674{
2675 int i, op;
2676 REQ(n, subscriptlist);
2677 /* Check to make backward compatible slice behavior for '[i:j]' */
2678 if (NCH(n) == 1) {
2679 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002680 /* 'Basic' slice, should have exactly one colon. */
2681 if ((TYPE(CHILD(sub, 0)) == COLON
2682 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2683 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2684 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002685 switch (assigning) {
2686 case OP_DELETE:
2687 op = DELETE_SLICE;
2688 break;
2689 case OP_ASSIGN:
2690 op = STORE_SLICE;
2691 break;
2692 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002693 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002694 break;
2695 default:
2696 com_augassign_slice(c, sub, assigning, augn);
2697 return;
2698 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002699 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002700 if (op == STORE_SLICE)
2701 com_pop(c, 2);
2702 else if (op == DELETE_SLICE)
2703 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002704 return;
2705 }
2706 }
2707 /* Else normal subscriptlist. Compile each subscript. */
2708 for (i = 0; i < NCH(n); i += 2)
2709 com_subscript(c, CHILD(n, i));
2710 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 if (NCH(n) > 1) {
2712 i = (NCH(n)+1) / 2;
2713 com_addoparg(c, BUILD_TUPLE, i);
2714 com_pop(c, i-1);
2715 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002716 switch (assigning) {
2717 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002718 op = DELETE_SUBSCR;
2719 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002720 break;
2721 default:
2722 case OP_ASSIGN:
2723 op = STORE_SUBSCR;
2724 i = 3;
2725 break;
2726 case OP_APPLY:
2727 op = BINARY_SUBSCR;
2728 i = 1;
2729 break;
2730 }
2731 if (assigning > OP_APPLY) {
2732 com_addoparg(c, DUP_TOPX, 2);
2733 com_push(c, 2);
2734 com_addbyte(c, BINARY_SUBSCR);
2735 com_pop(c, 1);
2736 com_node(c, augn);
2737 com_addbyte(c, assigning);
2738 com_pop(c, 1);
2739 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002740 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002741 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002742 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002743}
2744
2745static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002746com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747{
2748 REQ(n, trailer);
2749 switch (TYPE(CHILD(n, 0))) {
2750 case LPAR:
2751 com_call_function(c, CHILD(n, 1));
2752 break;
2753 case DOT:
2754 com_select_member(c, CHILD(n, 1));
2755 break;
2756 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002757 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 break;
2759 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002760 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002761 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 }
2763}
2764
2765static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002766com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002767{
2768 int i;
2769 REQ(n, power);
2770 com_atom(c, CHILD(n, 0));
2771 for (i = 1; i < NCH(n); i++) {
2772 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2773 com_factor(c, CHILD(n, i+1));
2774 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002775 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002776 break;
2777 }
2778 else
2779 com_apply_trailer(c, CHILD(n, i));
2780 }
2781}
2782
2783static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002784com_invert_constant(struct compiling *c, node *n)
2785{
2786 /* Compute the inverse of int and longs and use them directly,
2787 but be prepared to generate code for all other
2788 possibilities (invalid numbers, floats, complex).
2789 */
2790 PyObject *num, *inv = NULL;
2791 int i;
2792
2793 REQ(n, NUMBER);
2794 num = parsenumber(c, STR(n));
2795 if (num == NULL)
2796 i = 255;
2797 else {
2798 inv = PyNumber_Invert(num);
2799 if (inv == NULL) {
2800 PyErr_Clear();
2801 i = com_addconst(c, num);
2802 } else {
2803 i = com_addconst(c, inv);
2804 Py_DECREF(inv);
2805 }
2806 Py_DECREF(num);
2807 }
2808 com_addoparg(c, LOAD_CONST, i);
2809 com_push(c, 1);
2810 if (num != NULL && inv == NULL)
2811 com_addbyte(c, UNARY_INVERT);
2812}
2813
Tim Peters51e26512001-09-07 08:45:55 +00002814static int
2815is_float_zero(const char *p)
2816{
2817 int found_radix_point = 0;
2818 int ch;
2819 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2820 switch (ch) {
2821 case '0':
2822 /* no reason to believe it's not 0 -- continue */
2823 break;
2824
2825 case 'e': case 'E': case 'j': case 'J':
2826 /* If this was a hex constant, we already would have
2827 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2828 must be an exponent marker, and we haven't yet
2829 seen a non-zero digit, and it doesn't matter what
2830 the exponent is then. For 'j' or 'J' similarly,
2831 except that this is an imaginary 0 then. */
2832 return 1;
2833
2834 case '.':
2835 found_radix_point = 1;
2836 break;
2837
2838 default:
2839 return 0;
2840 }
2841 }
2842 return found_radix_point;
2843}
2844
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002846com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002848 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002849 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002850 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002851 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002852 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002853 approriate value as a constant. If the value is negative,
2854 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002855 negative in the 0th position -- unless we're doing unary minus
2856 of a floating zero! In that case the sign is significant, but
2857 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002858 */
2859 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002860 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002861 && TYPE((pfactor = CHILD(n, 1))) == factor
2862 && NCH(pfactor) == 1
2863 && TYPE((ppower = CHILD(pfactor, 0))) == power
2864 && NCH(ppower) == 1
2865 && TYPE((patom = CHILD(ppower, 0))) == atom
2866 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002867 && !(childtype == MINUS &&
2868 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002869 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002870 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002871 return;
2872 }
2873 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002874 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002875 if (s == NULL) {
2876 com_error(c, PyExc_MemoryError, "");
2877 com_addbyte(c, 255);
2878 return;
2879 }
2880 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002881 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002882 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002883 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002884 }
Tim Peters51e26512001-09-07 08:45:55 +00002885 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002886 }
2887 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 com_factor(c, CHILD(n, 1));
2889 com_addbyte(c, UNARY_POSITIVE);
2890 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002891 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002892 com_factor(c, CHILD(n, 1));
2893 com_addbyte(c, UNARY_NEGATIVE);
2894 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002895 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002896 com_factor(c, CHILD(n, 1));
2897 com_addbyte(c, UNARY_INVERT);
2898 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002900 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002901 }
2902}
2903
2904static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002905com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002906{
2907 int i;
2908 int op;
2909 REQ(n, term);
2910 com_factor(c, CHILD(n, 0));
2911 for (i = 2; i < NCH(n); i += 2) {
2912 com_factor(c, CHILD(n, i));
2913 switch (TYPE(CHILD(n, i-1))) {
2914 case STAR:
2915 op = BINARY_MULTIPLY;
2916 break;
2917 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002918 if (c->c_flags & CO_FUTURE_DIVISION)
2919 op = BINARY_TRUE_DIVIDE;
2920 else
2921 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002922 break;
2923 case PERCENT:
2924 op = BINARY_MODULO;
2925 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002926 case DOUBLESLASH:
2927 op = BINARY_FLOOR_DIVIDE;
2928 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002929 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002930 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002931 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002932 op = 255;
2933 }
2934 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002935 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002936 }
2937}
2938
2939static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002940com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002941{
2942 int i;
2943 int op;
2944 REQ(n, arith_expr);
2945 com_term(c, CHILD(n, 0));
2946 for (i = 2; i < NCH(n); i += 2) {
2947 com_term(c, CHILD(n, i));
2948 switch (TYPE(CHILD(n, i-1))) {
2949 case PLUS:
2950 op = BINARY_ADD;
2951 break;
2952 case MINUS:
2953 op = BINARY_SUBTRACT;
2954 break;
2955 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002956 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002957 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002958 op = 255;
2959 }
2960 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002961 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002962 }
2963}
2964
2965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002966com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002967{
2968 int i;
2969 int op;
2970 REQ(n, shift_expr);
2971 com_arith_expr(c, CHILD(n, 0));
2972 for (i = 2; i < NCH(n); i += 2) {
2973 com_arith_expr(c, CHILD(n, i));
2974 switch (TYPE(CHILD(n, i-1))) {
2975 case LEFTSHIFT:
2976 op = BINARY_LSHIFT;
2977 break;
2978 case RIGHTSHIFT:
2979 op = BINARY_RSHIFT;
2980 break;
2981 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002982 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002983 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002984 op = 255;
2985 }
2986 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002987 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002988 }
2989}
2990
2991static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002992com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002993{
2994 int i;
2995 int op;
2996 REQ(n, and_expr);
2997 com_shift_expr(c, CHILD(n, 0));
2998 for (i = 2; i < NCH(n); i += 2) {
2999 com_shift_expr(c, CHILD(n, i));
3000 if (TYPE(CHILD(n, i-1)) == AMPER) {
3001 op = BINARY_AND;
3002 }
3003 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003004 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003005 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00003006 op = 255;
3007 }
3008 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003009 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003010 }
3011}
3012
3013static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003014com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00003015{
3016 int i;
3017 int op;
3018 REQ(n, xor_expr);
3019 com_and_expr(c, CHILD(n, 0));
3020 for (i = 2; i < NCH(n); i += 2) {
3021 com_and_expr(c, CHILD(n, i));
3022 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
3023 op = BINARY_XOR;
3024 }
3025 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003026 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003027 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003028 op = 255;
3029 }
3030 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003031 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003032 }
3033}
3034
3035static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003036com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037{
3038 int i;
3039 int op;
3040 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00003041 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00003043 com_xor_expr(c, CHILD(n, i));
3044 if (TYPE(CHILD(n, i-1)) == VBAR) {
3045 op = BINARY_OR;
3046 }
3047 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003048 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003049 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 op = 255;
3051 }
3052 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003053 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 }
3055}
3056
3057static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003058cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059{
3060 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00003061 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 | 'in' | 'not' 'in' | 'is' | 'is' not' */
3063 if (NCH(n) == 1) {
3064 n = CHILD(n, 0);
3065 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00003066 case LESS: return PyCmp_LT;
3067 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00003068 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00003069 case LESSEQUAL: return PyCmp_LE;
3070 case GREATEREQUAL: return PyCmp_GE;
3071 case NOTEQUAL: return PyCmp_NE; /* <> or != */
3072 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
3073 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003074 }
3075 }
3076 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003077 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003078 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003079 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00003081 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003082 }
3083 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00003084 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085}
3086
3087static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003088com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089{
3090 int i;
3091 enum cmp_op op;
3092 int anchor;
3093 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
3094 com_expr(c, CHILD(n, 0));
3095 if (NCH(n) == 1)
3096 return;
3097
3098 /****************************************************************
3099 The following code is generated for all but the last
3100 comparison in a chain:
3101
3102 label: on stack: opcode: jump to:
3103
3104 a <code to load b>
3105 a, b DUP_TOP
3106 a, b, b ROT_THREE
3107 b, a, b COMPARE_OP
3108 b, 0-or-1 JUMP_IF_FALSE L1
3109 b, 1 POP_TOP
3110 b
3111
3112 We are now ready to repeat this sequence for the next
3113 comparison in the chain.
3114
3115 For the last we generate:
3116
3117 b <code to load c>
3118 b, c COMPARE_OP
3119 0-or-1
3120
3121 If there were any jumps to L1 (i.e., there was more than one
3122 comparison), we generate:
3123
3124 0-or-1 JUMP_FORWARD L2
3125 L1: b, 0 ROT_TWO
3126 0, b POP_TOP
3127 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00003128 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 ****************************************************************/
3130
3131 anchor = 0;
3132
3133 for (i = 2; i < NCH(n); i += 2) {
3134 com_expr(c, CHILD(n, i));
3135 if (i+2 < NCH(n)) {
3136 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003137 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 com_addbyte(c, ROT_THREE);
3139 }
3140 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003141 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003142 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003143 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003144 }
3145 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003146 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 if (i+2 < NCH(n)) {
3148 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3149 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003150 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003151 }
3152 }
3153
3154 if (anchor) {
3155 int anchor2 = 0;
3156 com_addfwref(c, JUMP_FORWARD, &anchor2);
3157 com_backpatch(c, anchor);
3158 com_addbyte(c, ROT_TWO);
3159 com_addbyte(c, POP_TOP);
3160 com_backpatch(c, anchor2);
3161 }
3162}
3163
3164static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003165com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166{
3167 REQ(n, not_test); /* 'not' not_test | comparison */
3168 if (NCH(n) == 1) {
3169 com_comparison(c, CHILD(n, 0));
3170 }
3171 else {
3172 com_not_test(c, CHILD(n, 1));
3173 com_addbyte(c, UNARY_NOT);
3174 }
3175}
3176
3177static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003178com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003179{
3180 int i;
3181 int anchor;
3182 REQ(n, and_test); /* not_test ('and' not_test)* */
3183 anchor = 0;
3184 i = 0;
3185 for (;;) {
3186 com_not_test(c, CHILD(n, i));
3187 if ((i += 2) >= NCH(n))
3188 break;
3189 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3190 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003191 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003192 }
3193 if (anchor)
3194 com_backpatch(c, anchor);
3195}
3196
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003197static int
3198com_make_closure(struct compiling *c, PyCodeObject *co)
3199{
Jeremy Hylton733c8932001-12-13 19:51:56 +00003200 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003201 if (free == 0)
3202 return 0;
3203 for (i = 0; i < free; ++i) {
3204 /* Bypass com_addop_varname because it will generate
3205 LOAD_DEREF but LOAD_CLOSURE is needed.
3206 */
3207 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
3208 int arg, reftype;
3209
3210 /* Special case: If a class contains a method with a
3211 free variable that has the same name as a method,
3212 the name will be considered free *and* local in the
3213 class. It should be handled by the closure, as
3214 well as by the normal name loookup logic.
3215 */
3216 reftype = get_ref_type(c, PyString_AS_STRING(name));
3217 if (reftype == CELL)
3218 arg = com_lookup_arg(c->c_cellvars, name);
3219 else /* (reftype == FREE) */
3220 arg = com_lookup_arg(c->c_freevars, name);
3221 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00003222 fprintf(stderr, "lookup %s in %s %d %d\n"
3223 "freevars of %s: %s\n",
3224 PyObject_REPR(name),
3225 c->c_name,
3226 reftype, arg,
3227 PyString_AS_STRING(co->co_name),
3228 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003229 Py_FatalError("com_make_closure()");
3230 }
3231 com_addoparg(c, LOAD_CLOSURE, arg);
3232
3233 }
3234 com_push(c, free);
3235 return 1;
3236}
3237
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003239com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003240{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003241 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00003242 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003243 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003244 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00003245 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00003246 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
3247 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003248 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003249 if (co == NULL) {
3250 c->c_errors++;
3251 return;
3252 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003253 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003254 i = com_addconst(c, (PyObject *)co);
3255 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003256 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003257 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003258 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003259 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00003260 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003261 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003262 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00003263 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003265 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00003266 else {
3267 int anchor = 0;
3268 int i = 0;
3269 for (;;) {
3270 com_and_test(c, CHILD(n, i));
3271 if ((i += 2) >= NCH(n))
3272 break;
3273 com_addfwref(c, JUMP_IF_TRUE, &anchor);
3274 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003275 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003276 }
3277 if (anchor)
3278 com_backpatch(c, anchor);
3279 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003280}
3281
3282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284{
3285 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003286 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003287 com_node(c, CHILD(n, 0));
3288 }
3289 else {
3290 int i;
3291 int len;
3292 len = (NCH(n) + 1) / 2;
3293 for (i = 0; i < NCH(n); i += 2)
3294 com_node(c, CHILD(n, i));
3295 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 }
3298}
3299
3300
3301/* Begin of assignment compilation */
3302
Thomas Wouters434d0822000-08-24 20:11:32 +00003303
3304static void
3305com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3306{
3307 com_addbyte(c, DUP_TOP);
3308 com_push(c, 1);
3309 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003310 com_node(c, augn);
3311 com_addbyte(c, opcode);
3312 com_pop(c, 1);
3313 com_addbyte(c, ROT_TWO);
3314 com_addopname(c, STORE_ATTR, n);
3315 com_pop(c, 2);
3316}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003317
3318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003320{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003321 if (none_assignment_check(c, STR(n), assigning))
3322 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003323 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003324 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325}
3326
3327static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003328com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003329{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003330 REQ(n, trailer);
3331 switch (TYPE(CHILD(n, 0))) {
3332 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003333 if (assigning == OP_DELETE)
3334 com_error(c, PyExc_SyntaxError,
3335 "can't delete function call");
3336 else
3337 com_error(c, PyExc_SyntaxError,
3338 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003339 break;
3340 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003341 if (assigning > OP_APPLY)
3342 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3343 else
3344 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003345 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003346 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003347 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348 break;
3349 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003350 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003351 }
3352}
3353
3354static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003355com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003356{
3357 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003358 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3359 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003360 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003361 if (assigning) {
3362 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003363 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003364 com_push(c, i-1);
3365 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003366 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003367 com_assign(c, CHILD(n, i), assigning, NULL);
3368}
3369
3370static void
3371com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3372{
3373 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003374 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003375 com_push(c, 1);
3376 com_node(c, augn);
3377 com_addbyte(c, opcode);
3378 com_pop(c, 1);
3379 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003380}
3381
3382static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003383com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003384{
3385 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003386 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003387 if (assigning)
3388 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003389}
3390
3391static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003392com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003393{
3394 /* Loop to avoid trivial recursion */
3395 for (;;) {
3396 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003397
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003398 case exprlist:
3399 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003400 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003401 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003402 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003403 if (TYPE(CHILD(n, 1)) == gen_for) {
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003404 com_error(c, PyExc_SyntaxError,
Raymond Hettinger354433a2004-05-19 08:20:33 +00003405 "assign to generator expression not possible");
3406 return;
3407 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003408 if (assigning > OP_APPLY) {
3409 com_error(c, PyExc_SyntaxError,
Raymond Hettinger8ffc1412004-09-29 21:47:10 +00003410 "augmented assign to generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003411 return;
3412 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003413 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003414 return;
3415 }
3416 n = CHILD(n, 0);
3417 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003418
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003419 case test:
3420 case and_test:
3421 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003422 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003423 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003424 case xor_expr:
3425 case and_expr:
3426 case shift_expr:
3427 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003428 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003429 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003430 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003431 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003432 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003433 return;
3434 }
3435 n = CHILD(n, 0);
3436 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003437
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003438 case power: /* atom trailer* ('**' power)*
3439 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003440 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003441 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003442 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003443 return;
3444 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003445 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003446 int i;
3447 com_node(c, CHILD(n, 0));
3448 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003449 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003450 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003451 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003452 return;
3453 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454 com_apply_trailer(c, CHILD(n, i));
3455 } /* NB i is still alive */
3456 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003457 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458 return;
3459 }
3460 n = CHILD(n, 0);
3461 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003462
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003463 case atom:
3464 switch (TYPE(CHILD(n, 0))) {
3465 case LPAR:
3466 n = CHILD(n, 1);
3467 if (TYPE(n) == RPAR) {
3468 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003469 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003470 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003471 return;
3472 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003473 if (assigning > OP_APPLY) {
3474 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003475 "augmented assign to tuple literal or generator expression not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003476 return;
3477 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003478 break;
3479 case LSQB:
3480 n = CHILD(n, 1);
3481 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003482 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003483 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003484 return;
3485 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003486 if (assigning > OP_APPLY) {
3487 com_error(c, PyExc_SyntaxError,
Raymond Hettingerfec0c462004-09-29 23:54:08 +00003488 "augmented assign to list literal or comprehension not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003489 return;
3490 }
3491 if (NCH(n) > 1
3492 && TYPE(CHILD(n, 1)) == list_for) {
3493 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003494 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003495 return;
3496 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003497 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003498 return;
3499 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003500 if (assigning > OP_APPLY)
3501 com_augassign_name(c, CHILD(n, 0),
3502 assigning, augn);
3503 else
3504 com_assign_name(c, CHILD(n, 0),
3505 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003506 return;
3507 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003508 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003509 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003510 return;
3511 }
3512 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003513
3514 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003515 com_error(c, PyExc_SyntaxError,
3516 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003517 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003518
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003520 com_error(c, PyExc_SystemError,
3521 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003523
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 }
3525 }
3526}
Guido van Rossum7c531111997-03-11 18:42:21 +00003527
Thomas Wouters434d0822000-08-24 20:11:32 +00003528static void
3529com_augassign(struct compiling *c, node *n)
3530{
3531 int opcode;
3532
3533 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3534 case '+': opcode = INPLACE_ADD; break;
3535 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003536 case '/':
3537 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3538 opcode = INPLACE_FLOOR_DIVIDE;
3539 else if (c->c_flags & CO_FUTURE_DIVISION)
3540 opcode = INPLACE_TRUE_DIVIDE;
3541 else
3542 opcode = INPLACE_DIVIDE;
3543 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003544 case '%': opcode = INPLACE_MODULO; break;
3545 case '<': opcode = INPLACE_LSHIFT; break;
3546 case '>': opcode = INPLACE_RSHIFT; break;
3547 case '&': opcode = INPLACE_AND; break;
3548 case '^': opcode = INPLACE_XOR; break;
3549 case '|': opcode = INPLACE_OR; break;
3550 case '*':
3551 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3552 opcode = INPLACE_POWER;
3553 else
3554 opcode = INPLACE_MULTIPLY;
3555 break;
3556 default:
3557 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3558 return;
3559 }
3560 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3561}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562
3563static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003564com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003565{
Thomas Wouters434d0822000-08-24 20:11:32 +00003566 REQ(n, expr_stmt);
3567 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003568 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003569 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003570 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003571 if (NCH(n) == 1) {
3572 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003573 if (c->c_interactive)
3574 com_addbyte(c, PRINT_EXPR);
3575 else
3576 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003577 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003578 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003579 else if (TYPE(CHILD(n,1)) == augassign)
3580 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003581 else {
3582 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003583 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003584 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003585 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003586 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003587 com_push(c, 1);
3588 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003589 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003590 }
3591 }
3592}
3593
3594static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003595com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003596{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003597 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003598 int i;
3599 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003600 if (Py_OptimizeFlag)
3601 return;
3602 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003603
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003604 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003605 raise AssertionError [, <message>]
3606
3607 where <message> is the second test, if present.
3608 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003609 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003610 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003611 com_addbyte(c, POP_TOP);
3612 com_pop(c, 1);
3613 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003614 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003615 com_push(c, 1);
3616 i = NCH(n)/2; /* Either 2 or 4 */
3617 if (i > 1)
3618 com_node(c, CHILD(n, 3));
3619 com_addoparg(c, RAISE_VARARGS, i);
3620 com_pop(c, i);
3621 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003622 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003623 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003624 com_addbyte(c, POP_TOP);
3625}
3626
3627static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003628com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003629{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003630 int i = 1;
3631 node* stream = NULL;
3632
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003633 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003634
3635 /* are we using the extended print form? */
3636 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3637 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003638 com_node(c, stream);
3639 /* stack: [...] => [... stream] */
3640 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003641 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3642 i = 4;
3643 else
3644 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003645 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003646 for (; i < NCH(n); i += 2) {
3647 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003648 com_addbyte(c, DUP_TOP);
3649 /* stack: [stream] => [stream stream] */
3650 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003651 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003652 /* stack: [stream stream] => [stream stream obj] */
3653 com_addbyte(c, ROT_TWO);
3654 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003655 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003656 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003657 com_pop(c, 2);
3658 }
3659 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003660 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003661 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003662 com_addbyte(c, PRINT_ITEM);
3663 com_pop(c, 1);
3664 }
3665 }
3666 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003667 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003668 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003669 /* must pop the extra stream object off the stack */
3670 com_addbyte(c, POP_TOP);
3671 /* stack: [... stream] => [...] */
3672 com_pop(c, 1);
3673 }
3674 }
3675 else {
3676 if (stream != NULL) {
3677 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003678 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003679 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003680 com_pop(c, 1);
3681 }
3682 else
3683 com_addbyte(c, PRINT_NEWLINE);
3684 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003685}
3686
3687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003688com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003689{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003690 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003691 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003692 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003693 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003694 if (c->c_flags & CO_GENERATOR) {
3695 if (NCH(n) > 1) {
3696 com_error(c, PyExc_SyntaxError,
3697 "'return' with argument inside generator");
3698 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003699 }
3700 if (NCH(n) < 2) {
3701 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003702 com_push(c, 1);
3703 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003704 else
3705 com_node(c, CHILD(n, 1));
3706 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003707 com_pop(c, 1);
3708}
3709
3710static void
3711com_yield_stmt(struct compiling *c, node *n)
3712{
Tim Peters95c80f82001-06-23 02:07:08 +00003713 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003714 REQ(n, yield_stmt); /* 'yield' testlist */
3715 if (!c->c_infunction) {
3716 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3717 }
Tim Peters95c80f82001-06-23 02:07:08 +00003718
3719 for (i = 0; i < c->c_nblocks; ++i) {
3720 if (c->c_block[i] == SETUP_FINALLY) {
3721 com_error(c, PyExc_SyntaxError,
3722 "'yield' not allowed in a 'try' block "
3723 "with a 'finally' clause");
3724 return;
3725 }
3726 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003727 com_node(c, CHILD(n, 1));
3728 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730}
3731
3732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003733com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003735 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003736 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3737 if (NCH(n) > 1) {
3738 com_node(c, CHILD(n, 1));
3739 if (NCH(n) > 3) {
3740 com_node(c, CHILD(n, 3));
3741 if (NCH(n) > 5)
3742 com_node(c, CHILD(n, 5));
3743 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003744 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003745 i = NCH(n)/2;
3746 com_addoparg(c, RAISE_VARARGS, i);
3747 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748}
3749
3750static void
Thomas Wouters52152252000-08-17 22:55:00 +00003751com_from_import(struct compiling *c, node *n)
3752{
3753 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3754 com_push(c, 1);
3755 if (NCH(n) > 1) {
3756 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3757 com_error(c, PyExc_SyntaxError, "invalid syntax");
3758 return;
3759 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003760 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003761 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003762 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003763 com_pop(c, 1);
3764}
3765
3766static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003767com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003769 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 int i;
3771 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003772 n = CHILD(n, 0);
3773 /* import_stmt: import_name | import_from */
3774 if (TYPE(n) == import_from) {
3775 /* 'from' dotted_name 'import' ('*' |
3776 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003777 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003778 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003779 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3780 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003781 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003782 else {
3783 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3784 TYPE(CHILD(n, 3)) != LPAR) {
3785 com_error(c, PyExc_SyntaxError,
3786 "trailing comma not allowed "
3787 "without surrounding parentheses");
3788 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003789 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003790 REQ(nn, import_as_names);
3791 tup = PyTuple_New((NCH(nn) + 1) / 2);
Jeremy Hylton16b04792004-11-07 14:04:00 +00003792 for (i = 0; i < NCH(nn); i += 2) {
3793 PyObject *s = PyString_FromString(
3794 STR(CHILD(CHILD(nn, i), 0)));
3795 if (s == NULL) {
3796 Py_CLEAR(tup);
3797 break;
3798 } else
3799 PyTuple_SET_ITEM(tup, i / 2, s);
3800 }
3801 if (tup == NULL) {
3802 /* Assume that failue above was MemoryError */
3803 com_error(c, PyExc_MemoryError, "");
3804 return;
3805 }
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003806 }
3807 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003808 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003809 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003810 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003811 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003812 com_addbyte(c, IMPORT_STAR);
3813 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003814 for (i = 0; i < NCH(nn); i += 2)
3815 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003816 com_addbyte(c, POP_TOP);
3817 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003818 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003819 }
3820 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003821 /* 'import' dotted_as_names */
3822 nn = CHILD(n, 1);
3823 REQ(nn, dotted_as_names);
3824 for (i = 0; i < NCH(nn); i += 2) {
3825 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003826 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003827 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003828 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003829 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003830 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003831 int j;
3832 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003833 com_error(c, PyExc_SyntaxError,
3834 "invalid syntax");
3835 return;
3836 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003837 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3838 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003839 CHILD(CHILD(subn, 0),
3840 j));
3841 com_addop_varname(c, VAR_STORE,
3842 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003843 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003844 com_addop_varname(c, VAR_STORE,
3845 STR(CHILD(CHILD(subn, 0),
3846 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003847 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003848 }
3849 }
3850}
3851
3852static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003853com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003854{
3855 REQ(n, exec_stmt);
3856 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3857 com_node(c, CHILD(n, 1));
3858 if (NCH(n) >= 4)
3859 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003860 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003861 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003862 com_push(c, 1);
3863 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003864 if (NCH(n) >= 6)
3865 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003866 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003867 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003868 com_push(c, 1);
3869 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003870 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003872}
3873
Guido van Rossum7c531111997-03-11 18:42:21 +00003874static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003875is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003876{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003877 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003878 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003879 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003880
3881 /* Label to avoid tail recursion */
3882 next:
3883 switch (TYPE(n)) {
3884
3885 case suite:
3886 if (NCH(n) == 1) {
3887 n = CHILD(n, 0);
3888 goto next;
3889 }
3890 /* Fall through */
3891 case file_input:
3892 for (i = 0; i < NCH(n); i++) {
3893 node *ch = CHILD(n, i);
3894 if (TYPE(ch) == stmt) {
3895 n = ch;
3896 goto next;
3897 }
3898 }
3899 break;
3900
3901 case stmt:
3902 case simple_stmt:
3903 case small_stmt:
3904 n = CHILD(n, 0);
3905 goto next;
3906
3907 case expr_stmt:
3908 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003909 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003910 case test:
3911 case and_test:
3912 case not_test:
3913 case comparison:
3914 case expr:
3915 case xor_expr:
3916 case and_expr:
3917 case shift_expr:
3918 case arith_expr:
3919 case term:
3920 case factor:
3921 case power:
3922 case atom:
3923 if (NCH(n) == 1) {
3924 n = CHILD(n, 0);
3925 goto next;
3926 }
3927 break;
3928
3929 case NAME:
3930 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3931 return 1;
3932 break;
3933
3934 case NUMBER:
3935 v = parsenumber(c, STR(n));
3936 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003937 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003938 break;
3939 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003940 i = PyObject_IsTrue(v);
3941 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003942 return i == 0;
3943
3944 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003945 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003946 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003947 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003948 break;
3949 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003950 i = PyObject_IsTrue(v);
3951 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003952 return i == 0;
3953
3954 }
3955 return 0;
3956}
3957
Tim Peters08a898f2001-06-28 01:52:22 +00003958
3959/* Look under n for a return stmt with an expression.
3960 * This hack is used to find illegal returns under "if 0:" blocks in
3961 * functions already known to be generators (as determined by the symtable
3962 * pass).
3963 * Return the offending return node if found, else NULL.
3964 */
3965static node *
3966look_for_offending_return(node *n)
3967{
3968 int i;
3969
3970 for (i = 0; i < NCH(n); ++i) {
3971 node *kid = CHILD(n, i);
3972
3973 switch (TYPE(kid)) {
3974 case classdef:
3975 case funcdef:
3976 case lambdef:
3977 /* Stuff in nested functions & classes doesn't
3978 affect the code block we started in. */
3979 return NULL;
3980
3981 case return_stmt:
3982 if (NCH(kid) > 1)
3983 return kid;
3984 break;
3985
3986 default: {
3987 node *bad = look_for_offending_return(kid);
3988 if (bad != NULL)
3989 return bad;
3990 }
3991 }
3992 }
3993
3994 return NULL;
3995}
3996
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003997static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003998com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003999{
4000 int i;
4001 int anchor = 0;
4002 REQ(n, if_stmt);
4003 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
4004 for (i = 0; i+3 < NCH(n); i+=4) {
4005 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004006 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00004007 if (is_constant_false(c, ch)) {
4008 /* We're going to skip this block. However, if this
4009 is a generator, we have to check the dead code
4010 anyway to make sure there aren't any return stmts
4011 with expressions, in the same scope. */
4012 if (c->c_flags & CO_GENERATOR) {
4013 node *p = look_for_offending_return(n);
4014 if (p != NULL) {
4015 int savelineno = c->c_lineno;
4016 c->c_lineno = p->n_lineno;
4017 com_error(c, PyExc_SyntaxError,
4018 "'return' with argument "
4019 "inside generator");
4020 c->c_lineno = savelineno;
4021 }
4022 }
Guido van Rossum7c531111997-03-11 18:42:21 +00004023 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00004024 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00004025 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004026 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00004027 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004028 com_addfwref(c, JUMP_IF_FALSE, &a);
4029 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004030 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004031 com_node(c, CHILD(n, i+3));
4032 com_addfwref(c, JUMP_FORWARD, &anchor);
4033 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004034 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004035 com_addbyte(c, POP_TOP);
4036 }
4037 if (i+2 < NCH(n))
4038 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00004039 if (anchor)
4040 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004041}
4042
4043static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004044com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004045{
4046 int break_anchor = 0;
4047 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004048 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004049 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
4050 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004051 block_push(c, SETUP_LOOP);
4052 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004053 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054 com_node(c, CHILD(n, 1));
4055 com_addfwref(c, JUMP_IF_FALSE, &anchor);
4056 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004057 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004058 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004059 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004060 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004061 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4062 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004063 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004064 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065 com_addbyte(c, POP_TOP);
4066 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004067 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068 if (NCH(n) > 4)
4069 com_node(c, CHILD(n, 6));
4070 com_backpatch(c, break_anchor);
4071}
4072
4073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004074com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004075{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076 int break_anchor = 0;
4077 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004078 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004079 REQ(n, for_stmt);
4080 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
4081 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004082 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004083 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004084 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004085 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00004086 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004087 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004088 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00004089 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004090 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004091 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004092 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004093 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4094 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004095 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00004096 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004097 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004098 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004099 if (NCH(n) > 8)
4100 com_node(c, CHILD(n, 8));
4101 com_backpatch(c, break_anchor);
4102}
4103
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004104/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004105
4106 SETUP_FINALLY L
4107 <code for S>
4108 POP_BLOCK
4109 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004110 L: <code for Sf>
4111 END_FINALLY
4112
4113 The special instructions use the block stack. Each block
4114 stack entry contains the instruction that created it (here
4115 SETUP_FINALLY), the level of the value stack at the time the
4116 block stack entry was created, and a label (here L).
4117
4118 SETUP_FINALLY:
4119 Pushes the current value stack level and the label
4120 onto the block stack.
4121 POP_BLOCK:
4122 Pops en entry from the block stack, and pops the value
4123 stack until its level is the same as indicated on the
4124 block stack. (The label is ignored.)
4125 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004126 Pops a variable number of entries from the *value* stack
4127 and re-raises the exception they specify. The number of
4128 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004129
4130 The block stack is unwound when an exception is raised:
4131 when a SETUP_FINALLY entry is found, the exception is pushed
4132 onto the value stack (and the exception condition is cleared),
4133 and the interpreter jumps to the label gotten from the block
4134 stack.
4135
4136 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00004137 (The contents of the value stack is shown in [], with the top
4138 at the right; 'tb' is trace-back info, 'val' the exception's
4139 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004140
4141 Value stack Label Instruction Argument
4142 [] SETUP_EXCEPT L1
4143 [] <code for S>
4144 [] POP_BLOCK
4145 [] JUMP_FORWARD L0
4146
Guido van Rossum3f5da241990-12-20 15:06:42 +00004147 [tb, val, exc] L1: DUP )
4148 [tb, val, exc, exc] <evaluate E1> )
4149 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
4150 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
4151 [tb, val, exc, 1] POP )
4152 [tb, val, exc] POP
4153 [tb, val] <assign to V1> (or POP if no V1)
4154 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004155 [] <code for S1>
4156 JUMP_FORWARD L0
4157
Guido van Rossum3f5da241990-12-20 15:06:42 +00004158 [tb, val, exc, 0] L2: POP
4159 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004160 .............................etc.......................
4161
Guido van Rossum3f5da241990-12-20 15:06:42 +00004162 [tb, val, exc, 0] Ln+1: POP
4163 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004164
4165 [] L0: <next statement>
4166
4167 Of course, parts are not generated if Vi or Ei is not present.
4168*/
4169
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004171com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004172{
4173 int except_anchor = 0;
4174 int end_anchor = 0;
4175 int else_anchor = 0;
4176 int i;
4177 node *ch;
4178
4179 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
4180 block_push(c, SETUP_EXCEPT);
4181 com_node(c, CHILD(n, 2));
4182 com_addbyte(c, POP_BLOCK);
4183 block_pop(c, SETUP_EXCEPT);
4184 com_addfwref(c, JUMP_FORWARD, &else_anchor);
4185 com_backpatch(c, except_anchor);
4186 for (i = 3;
4187 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
4188 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004189 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004190 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004191 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004192 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004193 break;
4194 }
4195 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004196 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004197 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004198 if (NCH(ch) > 1) {
4199 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004200 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004201 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00004202 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004203 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004204 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
4205 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004206 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004207 }
4208 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004209 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004210 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00004211 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004212 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004213 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004214 com_pop(c, 1);
4215 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004216 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004217 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004218 com_node(c, CHILD(n, i+2));
4219 com_addfwref(c, JUMP_FORWARD, &end_anchor);
4220 if (except_anchor) {
4221 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004222 /* We come in with [tb, val, exc, 0] on the
4223 stack; one pop and it's the same as
4224 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004225 com_addbyte(c, POP_TOP);
4226 }
4227 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004228 /* We actually come in here with [tb, val, exc] but the
4229 END_FINALLY will zap those and jump around.
4230 The c_stacklevel does not reflect them so we need not pop
4231 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004232 com_addbyte(c, END_FINALLY);
4233 com_backpatch(c, else_anchor);
4234 if (i < NCH(n))
4235 com_node(c, CHILD(n, i+2));
4236 com_backpatch(c, end_anchor);
4237}
4238
4239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004240com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004241{
4242 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004243 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00004244
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004245 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
4246 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004247 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004248 com_addbyte(c, POP_BLOCK);
4249 block_pop(c, SETUP_FINALLY);
4250 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004251 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004252 /* While the generated code pushes only one item,
4253 the try-finally handling can enter here with
4254 up to three items. OK, here are the details:
4255 3 for an exception, 2 for RETURN, 1 for BREAK. */
4256 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004257 com_backpatch(c, finally_anchor);
4258 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004259 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004260 com_node(c, ch);
4261 com_addbyte(c, END_FINALLY);
4262 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004263 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004264}
4265
4266static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004267com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004268{
4269 REQ(n, try_stmt);
4270 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
4271 | 'try' ':' suite 'finally' ':' suite */
4272 if (TYPE(CHILD(n, 3)) != except_clause)
4273 com_try_finally(c, n);
4274 else
4275 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004276}
4277
Guido van Rossum8b993a91997-01-17 21:04:03 +00004278static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004279get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004280{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004281 int i;
4282
Guido van Rossum8b993a91997-01-17 21:04:03 +00004283 /* Label to avoid tail recursion */
4284 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004285 switch (TYPE(n)) {
4286
4287 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004288 if (NCH(n) == 1) {
4289 n = CHILD(n, 0);
4290 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004291 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004292 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004293 case file_input:
4294 for (i = 0; i < NCH(n); i++) {
4295 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004296 if (TYPE(ch) == stmt) {
4297 n = ch;
4298 goto next;
4299 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004300 }
4301 break;
4302
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004303 case stmt:
4304 case simple_stmt:
4305 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004306 n = CHILD(n, 0);
4307 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004308
4309 case expr_stmt:
4310 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004311 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004312 case test:
4313 case and_test:
4314 case not_test:
4315 case comparison:
4316 case expr:
4317 case xor_expr:
4318 case and_expr:
4319 case shift_expr:
4320 case arith_expr:
4321 case term:
4322 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004323 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004324 if (NCH(n) == 1) {
4325 n = CHILD(n, 0);
4326 goto next;
4327 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004328 break;
4329
4330 case atom:
4331 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004332 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004333 break;
4334
4335 }
4336 return NULL;
4337}
4338
Guido van Rossum79f25d91997-04-29 20:08:16 +00004339static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004340get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004341{
Guido van Rossum541563e1999-01-28 15:08:09 +00004342 /* Don't generate doc-strings if run with -OO */
4343 if (Py_OptimizeFlag > 1)
4344 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004345 n = get_rawdocstring(n);
4346 if (n == NULL)
4347 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004348 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004349}
4350
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004352com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004353{
4354 REQ(n, suite);
4355 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4356 if (NCH(n) == 1) {
4357 com_node(c, CHILD(n, 0));
4358 }
4359 else {
4360 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004361 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004362 node *ch = CHILD(n, i);
4363 if (TYPE(ch) == stmt)
4364 com_node(c, ch);
4365 }
4366 }
4367}
4368
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004369/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004371com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004372{
4373 int i = c->c_nblocks;
4374 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4375 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4376 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004377 else if (i <= 0) {
4378 /* at the outer level */
4379 com_error(c, PyExc_SyntaxError,
4380 "'continue' not properly in loop");
4381 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004382 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004383 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004384 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004385 if (c->c_block[j] == SETUP_LOOP)
4386 break;
4387 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004388 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004389 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004390 for (; i > j; --i) {
4391 if (c->c_block[i] == SETUP_EXCEPT ||
4392 c->c_block[i] == SETUP_FINALLY) {
4393 com_addoparg(c, CONTINUE_LOOP,
4394 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004395 return;
4396 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004397 if (c->c_block[i] == END_FINALLY) {
4398 com_error(c, PyExc_SyntaxError,
4399 "'continue' not supported inside 'finally' clause");
4400 return;
4401 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004402 }
4403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004404 com_error(c, PyExc_SyntaxError,
4405 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004406 }
4407 /* XXX Could allow it inside a 'finally' clause
4408 XXX if we could pop the exception still on the stack */
4409}
4410
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004411/* Return the number of default values in the argument list.
4412
4413 If a non-default argument follows a default argument, set an
4414 exception and return -1.
4415*/
4416
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004417static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004418com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004419{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004420 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004421 if (TYPE(n) == lambdef) {
4422 /* lambdef: 'lambda' [varargslist] ':' test */
4423 n = CHILD(n, 1);
4424 }
4425 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004426 REQ(n, funcdef);
4427 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4428 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004429 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4430 n = CHILD(n, 1);
4431 }
4432 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004433 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004434 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004435 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004436 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4437 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004438 ndefs = 0;
4439 for (i = 0; i < nch; i++) {
4440 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004441 if (TYPE(CHILD(n, i)) == STAR ||
4442 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004443 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004444 i++;
4445 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004446 t = RPAR; /* Anything except EQUAL or COMMA */
4447 else
4448 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004449 if (t == EQUAL) {
4450 i++;
4451 ndefs++;
4452 com_node(c, CHILD(n, i));
4453 i++;
4454 if (i >= nch)
4455 break;
4456 t = TYPE(CHILD(n, i));
4457 }
4458 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004459 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004460 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004461 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004462 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004463 return -1;
4464 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004465 }
4466 if (t != COMMA)
4467 break;
4468 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004469 return ndefs;
4470}
4471
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004472static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004473com_decorator_name(struct compiling *c, node *n)
4474{
4475 /* dotted_name: NAME ('.' NAME)* */
4476
4477 int i, nch;
4478 node *varname;
4479
4480 REQ(n, dotted_name);
4481 nch = NCH(n);
4482 assert(nch >= 1 && nch % 2 == 1);
4483
4484 varname = CHILD(n, 0);
4485 REQ(varname, NAME);
4486 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004487 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004488
4489 for (i = 1; i < nch; i += 2) {
4490 node *attrname;
4491
4492 REQ(CHILD(n, i), DOT);
4493
4494 attrname = CHILD(n, i + 1);
4495 REQ(attrname, NAME);
4496 com_addop_name(c, LOAD_ATTR, STR(attrname));
4497 }
4498}
4499
4500static void
4501com_decorator(struct compiling *c, node *n)
4502{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004503 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004504 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004505 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004506 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004507 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004508 com_decorator_name(c, CHILD(n, 1));
4509
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004510 if (nch > 3) {
4511 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004512 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004513 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004514 com_call_function(c, CHILD(n, 3));
4515 }
4516}
4517
4518static int
4519com_decorators(struct compiling *c, node *n)
4520{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004521 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004522
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004523 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004524 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004525 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004526
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004527 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004528 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004529 REQ(ch, decorator);
4530
4531 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004532 }
4533
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004534 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004535}
4536
4537static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004538com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004539{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004540 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004541 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004542
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004543 REQ(n, funcdef);
4544 /* -6 -5 -4 -3 -2 -1
4545 funcdef: [decorators] 'def' NAME parameters ':' suite */
4546
4547 if (NCH(n) == 6)
4548 ndecorators = com_decorators(c, CHILD(n, 0));
4549 else
4550 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004551
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004552 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004553 if (ndefs < 0)
4554 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004555 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004556 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004557 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004558 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004559 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004560 c->c_errors++;
4561 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004562 int closure = com_make_closure(c, (PyCodeObject *)co);
4563 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004564 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004565 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004566 if (closure)
4567 com_addoparg(c, MAKE_CLOSURE, ndefs);
4568 else
4569 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004570 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004571
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004572 while (ndecorators > 0) {
4573 com_addoparg(c, CALL_FUNCTION, 1);
4574 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004575 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004576 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004577
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004578 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004579 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004580 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004581 }
4582}
4583
4584static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004585com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004586{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004587 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004588 REQ(n, testlist);
4589 /* testlist: test (',' test)* [','] */
4590 for (i = 0; i < NCH(n); i += 2)
4591 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004592 i = (NCH(n)+1) / 2;
4593 com_addoparg(c, BUILD_TUPLE, i);
4594 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004595}
4596
4597static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004598com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004599{
Guido van Rossum25831651993-05-19 14:50:45 +00004600 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004601 PyObject *v;
4602 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 char *name;
4604
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004605 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004606 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004607 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004608 c->c_errors++;
4609 return;
4610 }
4611 /* Push the class name on the stack */
4612 i = com_addconst(c, v);
4613 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004614 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004615 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004616 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004617 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004618 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004619 com_push(c, 1);
4620 }
Guido van Rossum25831651993-05-19 14:50:45 +00004621 else
4622 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004623 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004624 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004625 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004626 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004627 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004628 c->c_errors++;
4629 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004630 int closure = com_make_closure(c, co);
4631 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004632 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004633 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004634 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004635 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004636 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004637 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004638 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004639 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004640 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004641 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004642 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004643 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004644 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004645 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004646}
4647
4648static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004649com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004650{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004651 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004652 if (c->c_errors)
4653 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004654 switch (TYPE(n)) {
4655
4656 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004657
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004658 case funcdef:
4659 com_funcdef(c, n);
4660 break;
4661 case classdef:
4662 com_classdef(c, n);
4663 break;
4664
4665 /* Trivial parse tree nodes */
4666
4667 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004668 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004669 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004670 n = CHILD(n, 0);
4671 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004672
4673 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004674 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004675 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004676 {
4677 int i;
4678 for (i = 0; i < NCH(n)-1; i += 2)
4679 com_node(c, CHILD(n, i));
4680 }
4681 break;
4682
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004683 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004684 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 n = CHILD(n, 0);
4686 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004687
4688 /* Statement nodes */
4689
4690 case expr_stmt:
4691 com_expr_stmt(c, n);
4692 break;
4693 case print_stmt:
4694 com_print_stmt(c, n);
4695 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004696 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004697 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004698 break;
4699 case pass_stmt:
4700 break;
4701 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004702 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004703 com_error(c, PyExc_SyntaxError,
4704 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004705 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004706 com_addbyte(c, BREAK_LOOP);
4707 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004708 case continue_stmt:
4709 com_continue_stmt(c, n);
4710 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004711 case return_stmt:
4712 com_return_stmt(c, n);
4713 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004714 case yield_stmt:
4715 com_yield_stmt(c, n);
4716 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004717 case raise_stmt:
4718 com_raise_stmt(c, n);
4719 break;
4720 case import_stmt:
4721 com_import_stmt(c, n);
4722 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004723 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004724 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004725 case exec_stmt:
4726 com_exec_stmt(c, n);
4727 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004728 case assert_stmt:
4729 com_assert_stmt(c, n);
4730 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004731 case if_stmt:
4732 com_if_stmt(c, n);
4733 break;
4734 case while_stmt:
4735 com_while_stmt(c, n);
4736 break;
4737 case for_stmt:
4738 com_for_stmt(c, n);
4739 break;
4740 case try_stmt:
4741 com_try_stmt(c, n);
4742 break;
4743 case suite:
4744 com_suite(c, n);
4745 break;
4746
4747 /* Expression nodes */
4748
4749 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004750 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004751 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004752 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004753 break;
4754 case test:
4755 com_test(c, n);
4756 break;
4757 case and_test:
4758 com_and_test(c, n);
4759 break;
4760 case not_test:
4761 com_not_test(c, n);
4762 break;
4763 case comparison:
4764 com_comparison(c, n);
4765 break;
4766 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004767 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004768 break;
4769 case expr:
4770 com_expr(c, n);
4771 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004772 case xor_expr:
4773 com_xor_expr(c, n);
4774 break;
4775 case and_expr:
4776 com_and_expr(c, n);
4777 break;
4778 case shift_expr:
4779 com_shift_expr(c, n);
4780 break;
4781 case arith_expr:
4782 com_arith_expr(c, n);
4783 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004784 case term:
4785 com_term(c, n);
4786 break;
4787 case factor:
4788 com_factor(c, n);
4789 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004790 case power:
4791 com_power(c, n);
4792 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004793 case atom:
4794 com_atom(c, n);
4795 break;
4796
4797 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004798 com_error(c, PyExc_SystemError,
4799 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004800 }
4801}
4802
Tim Petersdbd9ba62000-07-09 03:09:57 +00004803static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004804
4805static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004806com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004807{
4808 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4809 if (TYPE(CHILD(n, 0)) == LPAR)
4810 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004811 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004812 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004813 com_pop(c, 1);
4814 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004815}
4816
4817static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004818com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004819{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004820 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004821 if (NCH(n) == 1) {
4822 com_fpdef(c, CHILD(n, 0));
4823 }
4824 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004825 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004826 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004827 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004828 for (i = 0; i < NCH(n); i += 2)
4829 com_fpdef(c, CHILD(n, i));
4830 }
4831}
4832
4833static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004834com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004835{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004836 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004837 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004838 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004839 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004840 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004841 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004842 nch = NCH(n);
4843 /* Enter all arguments in table of locals */
4844 for (i = 0, narg = 0; i < nch; i++) {
4845 node *ch = CHILD(n, i);
4846 node *fp;
4847 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004848 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004849 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4850 fp = CHILD(ch, 0);
4851 if (TYPE(fp) != NAME) {
4852 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4853 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004854 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004855 narg++;
4856 /* all name updates handled by symtable */
4857 if (++i >= nch)
4858 break;
4859 ch = CHILD(n, i);
4860 if (TYPE(ch) == EQUAL)
4861 i += 2;
4862 else
4863 REQ(ch, COMMA);
4864 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004865 if (complex) {
4866 /* Generate code for complex arguments only after
4867 having counted the simple arguments */
4868 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004869 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004870 node *ch = CHILD(n, i);
4871 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004872 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004873 break;
4874 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4875 fp = CHILD(ch, 0);
4876 if (TYPE(fp) != NAME) {
4877 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004878 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004879 com_fpdef(c, ch);
4880 }
4881 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004882 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004883 break;
4884 ch = CHILD(n, i);
4885 if (TYPE(ch) == EQUAL)
4886 i += 2;
4887 else
4888 REQ(ch, COMMA);
4889 }
4890 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004891}
4892
4893static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004894com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004895{
4896 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004897 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004898 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004899 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004900 if (doc != NULL) {
4901 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004902 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004903 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004904 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004905 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004906 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004907 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004908 for (i = 0; i < NCH(n); i++) {
4909 node *ch = CHILD(n, i);
4910 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4911 com_node(c, ch);
4912 }
4913}
4914
4915/* Top-level compile-node interface */
4916
4917static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004918compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004919{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004920 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004921 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004922 REQ(n, funcdef);
4923 /* -6 -5 -4 -3 -2 -1
4924 funcdef: [decorators] 'def' NAME parameters ':' suite */
4925 c->c_name = STR(RCHILD(n, -4));
4926 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004927 if (doc != NULL) {
4928 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004929 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004930 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004931 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004932 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004933 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004934 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004935 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004936 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004937 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004938 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004939 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004940 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004941 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4942 com_push(c, 1);
4943 com_addbyte(c, RETURN_VALUE);
4944 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004945}
4946
4947static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004948compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004949{
Guido van Rossum590baa41993-11-30 13:40:46 +00004950 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004951 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004952 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004953
4954 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004955 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004956 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004957 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004958 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004959 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004960 else
4961 ch = CHILD(n, 2);
4962 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004963 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004964 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004965}
4966
4967static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004968compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004969{
4970 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004971 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004972 REQ(n, classdef);
4973 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4974 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004975 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004976 /* Initialize local __module__ from global __name__ */
4977 com_addop_name(c, LOAD_GLOBAL, "__name__");
4978 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004979 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004980 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004981 if (doc != NULL) {
4982 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004983 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004984 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004985 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004986 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004987 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004988 }
4989 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004990 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004991 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004992 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004993 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004994 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004995 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004996 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004997}
4998
4999static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00005000compile_generator_expression(struct compiling *c, node *n)
5001{
5002 /* testlist_gexp: test gen_for */
5003 /* argument: test gen_for */
5004 REQ(CHILD(n, 0), test);
5005 REQ(CHILD(n, 1), gen_for);
5006
5007 c->c_name = "<generator expression>";
5008 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
5009
5010 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5011 com_push(c, 1);
5012 com_addbyte(c, RETURN_VALUE);
5013 com_pop(c, 1);
5014}
5015
5016static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005017compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005018{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00005019 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00005020
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005021 switch (TYPE(n)) {
5022
Guido van Rossum4c417781991-01-21 16:09:22 +00005023 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005024 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005025 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005026 n = CHILD(n, 0);
5027 if (TYPE(n) != NEWLINE)
5028 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005029 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005030 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);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00005034 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005035 break;
5036
Guido van Rossum4c417781991-01-21 16:09:22 +00005037 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005038 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00005039 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00005040 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
5041 com_push(c, 1);
5042 com_addbyte(c, RETURN_VALUE);
5043 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005044 break;
5045
Guido van Rossum590baa41993-11-30 13:40:46 +00005046 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00005047 com_node(c, CHILD(n, 0));
5048 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00005049 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00005050 break;
5051
Guido van Rossum590baa41993-11-30 13:40:46 +00005052 case lambdef: /* anonymous function definition */
5053 compile_lambdef(c, n);
5054 break;
5055
Guido van Rossum4c417781991-01-21 16:09:22 +00005056 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005057 compile_funcdef(c, n);
5058 break;
5059
Guido van Rossum4c417781991-01-21 16:09:22 +00005060 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00005061 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00005062 break;
5063
Raymond Hettinger354433a2004-05-19 08:20:33 +00005064 case testlist_gexp: /* A generator expression */
5065 case argument: /* A generator expression */
5066 compile_generator_expression(c, n);
5067 break;
5068
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00005070 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00005071 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005072 }
5073}
5074
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005075static PyObject *
5076dict_keys_inorder(PyObject *dict, int offset)
5077{
5078 PyObject *tuple, *k, *v;
5079 int i, pos = 0, size = PyDict_Size(dict);
5080
5081 tuple = PyTuple_New(size);
5082 if (tuple == NULL)
5083 return NULL;
5084 while (PyDict_Next(dict, &pos, &k, &v)) {
5085 i = PyInt_AS_LONG(v);
5086 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005087 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005088 PyTuple_SET_ITEM(tuple, i - offset, k);
5089 }
5090 return tuple;
5091}
5092
Guido van Rossum79f25d91997-04-29 20:08:16 +00005093PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005094PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005095{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005096 return PyNode_CompileFlags(n, filename, NULL);
5097}
5098
5099PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005100PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005101{
5102 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005103}
5104
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005105struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005106PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005107{
5108 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005109 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005110
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00005111 ff = PyNode_Future(n, filename);
5112 if (ff == NULL)
5113 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005114 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00005115 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005116 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005117 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00005118 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005119 return st;
5120}
5121
Guido van Rossum79f25d91997-04-29 20:08:16 +00005122static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005123icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005124{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005125 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005126}
5127
Guido van Rossum79f25d91997-04-29 20:08:16 +00005128static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00005129jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005130 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005131{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005132 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005133 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00005134 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005135 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00005136 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
5137 sc.c_encoding = "utf-8";
5138 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005139 sc.c_encoding = STR(n);
5140 n = CHILD(n, 0);
5141 } else {
5142 sc.c_encoding = NULL;
5143 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005144 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005145 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005146 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005147 /* c_symtable still points to parent's symbols */
5148 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005149 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005150 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00005151 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00005152 if (base->c_encoding != NULL) {
5153 assert(sc.c_encoding == NULL);
5154 sc.c_encoding = base->c_encoding;
5155 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005156 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00005157 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00005158 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00005159 if (sc.c_future == NULL) {
5160 com_free(&sc);
5161 return NULL;
5162 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00005163 if (flags) {
5164 int merged = sc.c_future->ff_features |
5165 flags->cf_flags;
5166 sc.c_future->ff_features = merged;
5167 flags->cf_flags = merged;
5168 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005169 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
5170 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005171 com_free(&sc);
5172 return NULL;
5173 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005174 /* reset symbol table for second pass */
5175 sc.c_symtable->st_nscopes = 1;
5176 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005177 }
5178 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005179 if (symtable_load_symbols(&sc) < 0) {
5180 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005181 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005182 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005183 compile_node(&sc, n);
5184 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00005185 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005186 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005187 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00005188 names = PyList_AsTuple(sc.c_names);
5189 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005190 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
5191 freevars = dict_keys_inorder(sc.c_freevars,
5192 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00005193 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00005194 name = PyString_InternFromString(sc.c_name);
Raymond Hettinger2c31a052004-09-22 18:44:21 +00005195 code = optimize_code(sc.c_code, sc.c_consts, names, sc.c_lnotab);
5196 consts = PyList_AsTuple(sc.c_consts);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005197 if (!PyErr_Occurred())
5198 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005199 sc.c_nlocals,
5200 sc.c_maxstacklevel,
5201 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00005202 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005203 consts,
5204 names,
5205 varnames,
5206 freevars,
5207 cellvars,
5208 filename,
5209 name,
5210 sc.c_firstlineno,
5211 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005212 Py_XDECREF(consts);
5213 Py_XDECREF(names);
5214 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005215 Py_XDECREF(freevars);
5216 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00005217 Py_XDECREF(filename);
5218 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00005219 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00005220 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00005221 else if (!PyErr_Occurred()) {
5222 /* This could happen if someone called PyErr_Clear() after an
5223 error was reported above. That's not supposed to happen,
5224 but I just plugged one case and I'm not sure there can't be
5225 others. In that case, raise SystemError so that at least
5226 it gets reported instead dumping core. */
5227 PyErr_SetString(PyExc_SystemError, "lost syntax error");
5228 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005229 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005230 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005231 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005232 sc.c_symtable = NULL;
5233 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005234 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00005235 return co;
5236}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005237
5238int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00005239PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005240{
5241 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00005242 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00005243 int line = co->co_firstlineno;
5244 int addr = 0;
5245 while (--size >= 0) {
5246 addr += *p++;
5247 if (addr > addrq)
5248 break;
5249 line += *p++;
5250 }
5251 return line;
5252}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005253
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005254/* The test for LOCAL must come before the test for FREE in order to
5255 handle classes where name is both local and free. The local var is
5256 a method and the free var is a free var referenced within a method.
5257*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005258
5259static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005260get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005261{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005262 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005263 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00005264
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005265 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
5266 return CELL;
5267 if (PyDict_GetItemString(c->c_locals, name) != NULL)
5268 return LOCAL;
5269 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
5270 return FREE;
5271 v = PyDict_GetItemString(c->c_globals, name);
5272 if (v) {
5273 if (v == Py_None)
5274 return GLOBAL_EXPLICIT;
5275 else {
5276 return GLOBAL_IMPLICIT;
5277 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005278 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00005279 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005280 "unknown scope for %.100s in %.100s(%s) "
5281 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
5282 name, c->c_name,
5283 PyObject_REPR(c->c_symtable->st_cur->ste_id),
5284 c->c_filename,
5285 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5286 PyObject_REPR(c->c_locals),
5287 PyObject_REPR(c->c_globals)
5288 );
5289
5290 Py_FatalError(buf);
5291 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005292}
5293
Guido van Rossum207fda62001-03-02 03:30:41 +00005294/* Helper functions to issue warnings */
5295
5296static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005297issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005298{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005299 if (PyErr_Occurred()) {
5300 /* This can happen because symtable_node continues
5301 processing even after raising a SyntaxError.
5302 Calling PyErr_WarnExplicit now would clobber the
5303 pending exception; instead we fail and let that
5304 exception propagate.
5305 */
5306 return -1;
5307 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005308 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5309 lineno, NULL, NULL) < 0) {
5310 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5311 PyErr_SetString(PyExc_SyntaxError, msg);
5312 PyErr_SyntaxLocation(filename, lineno);
5313 }
5314 return -1;
5315 }
5316 return 0;
5317}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005318
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005319static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005320symtable_warn(struct symtable *st, char *msg)
5321{
Guido van Rossum207fda62001-03-02 03:30:41 +00005322 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005323 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005324 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005325 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005326 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005327}
5328
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005329/* Helper function for setting lineno and filename */
5330
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005331static struct symtable *
5332symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005333{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005334 struct symtable *st;
5335
5336 st = symtable_init();
5337 if (st == NULL)
5338 return NULL;
5339 st->st_future = ff;
5340 st->st_filename = filename;
5341 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5342 if (st->st_errors > 0)
5343 goto fail;
5344 symtable_node(st, n);
5345 if (st->st_errors > 0)
5346 goto fail;
5347 return st;
5348 fail:
5349 if (!PyErr_Occurred()) {
5350 /* This could happen because after a syntax error is
5351 detected, the symbol-table-building continues for
5352 a while, and PyErr_Clear() might erroneously be
5353 called during that process. One such case has been
5354 fixed, but there might be more (now or later).
5355 */
5356 PyErr_SetString(PyExc_SystemError, "lost exception");
5357 }
5358 st->st_future = NULL;
5359 st->st_filename = NULL;
5360 PySymtable_Free(st);
5361 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362}
5363
5364static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005365symtable_init_compiling_symbols(struct compiling *c)
5366{
5367 PyObject *varnames;
5368
5369 varnames = c->c_symtable->st_cur->ste_varnames;
5370 if (varnames == NULL) {
5371 varnames = PyList_New(0);
5372 if (varnames == NULL)
5373 return -1;
5374 c->c_symtable->st_cur->ste_varnames = varnames;
5375 Py_INCREF(varnames);
5376 } else
5377 Py_INCREF(varnames);
5378 c->c_varnames = varnames;
5379
5380 c->c_globals = PyDict_New();
5381 if (c->c_globals == NULL)
5382 return -1;
5383 c->c_freevars = PyDict_New();
5384 if (c->c_freevars == NULL)
5385 return -1;
5386 c->c_cellvars = PyDict_New();
5387 if (c->c_cellvars == NULL)
5388 return -1;
5389 return 0;
5390}
5391
5392struct symbol_info {
5393 int si_nlocals;
5394 int si_ncells;
5395 int si_nfrees;
5396 int si_nimplicit;
5397};
5398
5399static void
5400symtable_init_info(struct symbol_info *si)
5401{
5402 si->si_nlocals = 0;
5403 si->si_ncells = 0;
5404 si->si_nfrees = 0;
5405 si->si_nimplicit = 0;
5406}
5407
5408static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005409symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005410 struct symbol_info *si)
5411{
5412 PyObject *dict, *v;
5413
5414 /* Seperate logic for DEF_FREE. If it occurs in a function,
5415 it indicates a local that we must allocate storage for (a
5416 cell var). If it occurs in a class, then the class has a
5417 method and a free variable with the same name.
5418 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005419 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005420 /* If it isn't declared locally, it can't be a cell. */
5421 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5422 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005423 v = PyInt_FromLong(si->si_ncells++);
5424 dict = c->c_cellvars;
5425 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005426 /* If it is free anyway, then there is no need to do
5427 anything here.
5428 */
5429 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005430 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005431 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005432 v = PyInt_FromLong(si->si_nfrees++);
5433 dict = c->c_freevars;
5434 }
5435 if (v == NULL)
5436 return -1;
5437 if (PyDict_SetItem(dict, name, v) < 0) {
5438 Py_DECREF(v);
5439 return -1;
5440 }
5441 Py_DECREF(v);
5442 return 0;
5443}
5444
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005445/* If a variable is a cell and an argument, make sure that appears in
5446 co_cellvars before any variable to its right in varnames.
5447*/
5448
5449
5450static int
5451symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5452 PyObject *varnames, int flags)
5453{
Tim Petersb39903b2003-03-24 17:22:24 +00005454 PyObject *v = NULL;
5455 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005456 int i, pos;
5457
5458 if (flags & CO_VARARGS)
5459 argcount++;
5460 if (flags & CO_VARKEYWORDS)
5461 argcount++;
5462 for (i = argcount; --i >= 0; ) {
5463 v = PyList_GET_ITEM(varnames, i);
5464 if (PyDict_GetItem(*cellvars, v)) {
5465 if (list == NULL) {
5466 list = PyList_New(1);
5467 if (list == NULL)
5468 return -1;
5469 PyList_SET_ITEM(list, 0, v);
5470 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005471 } else {
5472 if (PyList_Insert(list, 0, v) < 0) {
5473 Py_DECREF(list);
5474 return -1;
5475 }
5476 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005477 }
5478 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005479 if (list == NULL)
5480 return 0;
5481
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005482 /* There are cellvars that are also arguments. Create a dict
5483 to replace cellvars and put the args at the front.
5484 */
5485 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005486 if (d == NULL)
5487 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005488 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5489 v = PyInt_FromLong(i);
5490 if (v == NULL)
5491 goto fail;
5492 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5493 goto fail;
5494 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5495 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005496 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005497 }
5498 pos = 0;
5499 i = PyList_GET_SIZE(list);
5500 Py_DECREF(list);
5501 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5502 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005503 if (w == NULL)
5504 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005505 if (PyDict_SetItem(d, v, w) < 0) {
5506 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005507 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005508 goto fail;
5509 }
5510 Py_DECREF(w);
5511 }
5512 Py_DECREF(*cellvars);
5513 *cellvars = d;
5514 return 1;
5515 fail:
5516 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005517 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005518 return -1;
5519}
5520
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005521static int
5522symtable_freevar_offsets(PyObject *freevars, int offset)
5523{
5524 PyObject *name, *v;
5525 int pos;
5526
5527 /* The cell vars are the first elements of the closure,
5528 followed by the free vars. Update the offsets in
5529 c_freevars to account for number of cellvars. */
5530 pos = 0;
5531 while (PyDict_Next(freevars, &pos, &name, &v)) {
5532 int i = PyInt_AS_LONG(v) + offset;
5533 PyObject *o = PyInt_FromLong(i);
5534 if (o == NULL)
5535 return -1;
5536 if (PyDict_SetItem(freevars, name, o) < 0) {
5537 Py_DECREF(o);
5538 return -1;
5539 }
5540 Py_DECREF(o);
5541 }
5542 return 0;
5543}
5544
5545static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005546symtable_check_unoptimized(struct compiling *c,
5547 PySymtableEntryObject *ste,
5548 struct symbol_info *si)
5549{
5550 char buf[300];
5551
5552 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5553 || (ste->ste_nested && si->si_nimplicit)))
5554 return 0;
5555
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005556#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5557
5558#define ILLEGAL_IS "is a nested function"
5559
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005560#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005561"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005562
5563#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005564"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005565
5566#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005567"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005568"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005569
5570 /* XXX perhaps the linenos for these opt-breaking statements
5571 should be stored so the exception can point to them. */
5572
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005573 if (ste->ste_child_free) {
5574 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005575 PyOS_snprintf(buf, sizeof(buf),
5576 ILLEGAL_IMPORT_STAR,
5577 PyString_AS_STRING(ste->ste_name),
5578 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005579 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005580 PyOS_snprintf(buf, sizeof(buf),
5581 ILLEGAL_BARE_EXEC,
5582 PyString_AS_STRING(ste->ste_name),
5583 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005584 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005585 PyOS_snprintf(buf, sizeof(buf),
5586 ILLEGAL_EXEC_AND_IMPORT_STAR,
5587 PyString_AS_STRING(ste->ste_name),
5588 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005589 }
5590 } else {
5591 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005592 PyOS_snprintf(buf, sizeof(buf),
5593 ILLEGAL_IMPORT_STAR,
5594 PyString_AS_STRING(ste->ste_name),
5595 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005596 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005597 PyOS_snprintf(buf, sizeof(buf),
5598 ILLEGAL_BARE_EXEC,
5599 PyString_AS_STRING(ste->ste_name),
5600 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005601 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005602 PyOS_snprintf(buf, sizeof(buf),
5603 ILLEGAL_EXEC_AND_IMPORT_STAR,
5604 PyString_AS_STRING(ste->ste_name),
5605 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005606 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005607 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005608
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005609 PyErr_SetString(PyExc_SyntaxError, buf);
5610 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5611 ste->ste_opt_lineno);
5612 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005613}
5614
5615static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005616symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5617 struct symbol_info *si)
5618{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005619 if (c->c_future)
5620 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005621 if (ste->ste_generator)
5622 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005623 if (ste->ste_type != TYPE_MODULE)
5624 c->c_flags |= CO_NEWLOCALS;
5625 if (ste->ste_type == TYPE_FUNCTION) {
5626 c->c_nlocals = si->si_nlocals;
5627 if (ste->ste_optimized == 0)
5628 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005629 else if (ste->ste_optimized != OPT_EXEC)
5630 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005631 }
5632 return 0;
5633}
5634
5635static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005636symtable_error(struct symtable *st, int lineno)
5637{
5638 if (lineno == 0)
5639 lineno = st->st_cur->ste_lineno;
5640 PyErr_SyntaxLocation(st->st_filename, lineno);
5641 st->st_errors++;
5642 return -1;
5643}
5644
5645static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646symtable_load_symbols(struct compiling *c)
5647{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005648 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005649 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005650 PyObject *name, *varnames, *v;
5651 int i, flags, pos;
5652 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005653
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005654 v = NULL;
5655
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005656 if (symtable_init_compiling_symbols(c) < 0)
5657 goto fail;
5658 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005659 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005660 si.si_nlocals = PyList_GET_SIZE(varnames);
5661 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005663 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005664 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005665 if (v == NULL)
5666 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005667 if (PyDict_SetItem(c->c_locals,
5668 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 goto fail;
5670 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005671 }
5672
5673 /* XXX The cases below define the rules for whether a name is
5674 local or global. The logic could probably be clearer. */
5675 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005676 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5677 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005680 /* undo the original DEF_FREE */
5681 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005682
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005683 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005684 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005685 2. Free variables in methods that are also class
5686 variables or declared global.
5687 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005688 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005689 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005690
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005691 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692 c->c_argcount--;
5693 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005694 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005695 c->c_argcount--;
5696 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005697 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005698 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005699 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005700 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005701 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005702 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005703 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005704 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005705 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005706 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5707 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005708 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005709 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005710 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005711 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005712 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005713 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005714 if (v == NULL)
5715 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005716 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005717 goto fail;
5718 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005719 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005722 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005723 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005724 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005725 if (v == NULL)
5726 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005727 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005728 goto fail;
5729 Py_DECREF(v);
5730 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005731 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005732 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005733 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005734 goto fail;
5735 if (st->st_nscopes != 1) {
5736 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005737 if (v == NULL)
5738 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005739 if (PyDict_SetItem(st->st_global,
5740 name, v))
5741 goto fail;
5742 Py_DECREF(v);
5743 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005745 }
5746 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005747 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5748
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005749 if (si.si_ncells > 1) { /* one cell is always in order */
5750 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5751 c->c_varnames, c->c_flags) < 0)
5752 return -1;
5753 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005754 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5755 return -1;
5756 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 fail:
5758 /* is this always the right thing to do? */
5759 Py_XDECREF(v);
5760 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761}
5762
5763static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005764symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765{
5766 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005768 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769 if (st == NULL)
5770 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005771 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005772
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005773 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005774 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005775 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 goto fail;
5777 if ((st->st_symbols = PyDict_New()) == NULL)
5778 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005779 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005780 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005782 st->st_private = NULL;
5783 return st;
5784 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005785 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005786 return NULL;
5787}
5788
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005789void
5790PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005791{
5792 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005793 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005794 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005795 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796}
5797
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005798/* When the compiler exits a scope, it must should update the scope's
5799 free variable information with the list of free variables in its
5800 children.
5801
5802 Variables that are free in children and defined in the current
5803 scope are cellvars.
5804
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005805 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005806 false), free variables in children that are not defined here are
5807 implicit globals.
5808
5809*/
5810
5811static int
5812symtable_update_free_vars(struct symtable *st)
5813{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005814 int i, j, def;
5815 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005816 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005817
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005818 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005819 def = DEF_FREE_CLASS;
5820 else
5821 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005822 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005823 int pos = 0;
5824
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005825 if (list && PyList_SetSlice(list, 0,
5826 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005827 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005828 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005829 PyList_GET_ITEM(ste->ste_children, i);
5830 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005831 int flags = PyInt_AS_LONG(o);
5832 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005833 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005834 if (list == NULL) {
5835 list = PyList_New(0);
5836 if (list == NULL)
5837 return -1;
5838 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005839 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005840 if (PyList_Append(list, name) < 0) {
5841 Py_DECREF(list);
5842 return -1;
5843 }
5844 }
5845 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005846 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005847 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005848 v = PyDict_GetItem(ste->ste_symbols, name);
5849 /* If a name N is declared global in scope A and
5850 referenced in scope B contained (perhaps
5851 indirectly) in A and there are no scopes
5852 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005853 is global in B. Unless A is a class scope,
5854 because class scopes are not considered for
5855 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005856 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005857 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005858 int flags = PyInt_AS_LONG(v);
5859 if (flags & DEF_GLOBAL) {
5860 symtable_undo_free(st, child->ste_id,
5861 name);
5862 continue;
5863 }
5864 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005865 if (ste->ste_nested) {
5866 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005867 name, def) < 0) {
5868 Py_DECREF(list);
5869 return -1;
5870 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005871 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005872 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005873 name) < 0) {
5874 Py_DECREF(list);
5875 return -1;
5876 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005877 }
5878 }
5879 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005880
5881 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005882 return 0;
5883}
5884
5885/* If the current scope is a non-nested class or if name is not
5886 defined in the current, non-nested scope, then it is an implicit
5887 global in all nested scopes.
5888*/
5889
5890static int
5891symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5892{
5893 PyObject *o;
5894 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005895 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005896
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005897 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005898 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005899 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005900 if (o == NULL)
5901 return symtable_undo_free(st, child, name);
5902 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005903
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005904 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005905 return symtable_undo_free(st, child, name);
5906 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005907 return symtable_add_def_o(st, ste->ste_symbols,
5908 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005909}
5910
5911static int
5912symtable_undo_free(struct symtable *st, PyObject *id,
5913 PyObject *name)
5914{
5915 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005916 PyObject *info;
5917 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005918
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005919 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5920 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005921 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005922
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005923 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005924 if (info == NULL)
5925 return 0;
5926 v = PyInt_AS_LONG(info);
5927 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005928 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005929 DEF_FREE_GLOBAL) < 0)
5930 return -1;
5931 } else
5932 /* If the name is defined here or declared global,
5933 then the recursion stops. */
5934 return 0;
5935
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005936 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5937 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005938 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005939 PyList_GET_ITEM(ste->ste_children, i);
5940 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005941 if (x < 0)
5942 return x;
5943 }
5944 return 0;
5945}
5946
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005947/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5948 This reference is released when the scope is exited, via the DECREF
5949 in symtable_exit_scope().
5950*/
5951
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005952static int
5953symtable_exit_scope(struct symtable *st)
5954{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005955 int end;
5956
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005957 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005958 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005959 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005960 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005961 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5962 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005963 if (PySequence_DelItem(st->st_stack, end) < 0)
5964 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005965 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005966}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005967
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005968static void
5969symtable_enter_scope(struct symtable *st, char *name, int type,
5970 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005971{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005972 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005973
5974 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005975 prev = st->st_cur;
5976 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005977 st->st_errors++;
5978 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005979 }
5980 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005981 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005982 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005983 if (st->st_cur == NULL) {
5984 st->st_errors++;
5985 return;
5986 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005987 if (strcmp(name, TOP) == 0)
5988 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005989 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005990 if (PyList_Append(prev->ste_children,
5991 (PyObject *)st->st_cur) < 0)
5992 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005993 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005994}
5995
5996static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005997symtable_lookup(struct symtable *st, char *name)
5998{
5999 char buffer[MANGLE_LEN];
6000 PyObject *v;
6001 int flags;
6002
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006003 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006004 name = buffer;
6005 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
6006 if (v == NULL) {
6007 if (PyErr_Occurred())
6008 return -1;
6009 else
6010 return 0;
6011 }
6012
6013 flags = PyInt_AS_LONG(v);
6014 return flags;
6015}
6016
6017static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006018symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006020 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006021 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006022 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006023
Guido van Rossumb7164622002-08-16 02:48:11 +00006024 /* Warn about None, except inside a tuple (where the assignment
6025 code already issues a warning). */
6026 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
6027 *name == 'N' && strcmp(name, "None") == 0)
6028 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00006029 PyErr_SetString(PyExc_SyntaxError,
6030 "Invalid syntax. Assignment to None.");
6031 symtable_error(st, 0);
6032 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00006033 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00006034 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006035 name = buffer;
6036 if ((s = PyString_InternFromString(name)) == NULL)
6037 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006038 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
6039 Py_DECREF(s);
6040 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006041}
6042
6043/* Must only be called with mangled names */
6044
6045static int
6046symtable_add_def_o(struct symtable *st, PyObject *dict,
6047 PyObject *name, int flag)
6048{
6049 PyObject *o;
6050 int val;
6051
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006052 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006053 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006054 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006055 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00006056 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00006057 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006058 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006059 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006060 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006061 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006062 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00006063 if (o == NULL)
6064 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006065 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006066 Py_DECREF(o);
6067 return -1;
6068 }
6069 Py_DECREF(o);
6070
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006071 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00006072 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006073 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006074 } else if (flag & DEF_GLOBAL) {
6075 /* XXX need to update DEF_GLOBAL for other flags too;
6076 perhaps only DEF_FREE_GLOBAL */
6077 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006078 val = PyInt_AS_LONG(o);
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(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006086 Py_DECREF(o);
6087 return -1;
6088 }
6089 Py_DECREF(o);
6090 }
6091 return 0;
6092}
6093
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006094#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006095
Tim Peters08a898f2001-06-28 01:52:22 +00006096/* Look for a yield stmt under n. Return 1 if found, else 0.
6097 This hack is used to look inside "if 0:" blocks (which are normally
6098 ignored) in case those are the only places a yield occurs (so that this
6099 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00006100static int
6101look_for_yield(node *n)
6102{
6103 int i;
6104
6105 for (i = 0; i < NCH(n); ++i) {
6106 node *kid = CHILD(n, i);
6107
6108 switch (TYPE(kid)) {
6109
6110 case classdef:
6111 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00006112 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00006113 /* Stuff in nested functions and classes can't make
6114 the parent a generator. */
6115 return 0;
6116
6117 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00006118 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006119
6120 default:
6121 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00006122 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006123 }
6124 }
6125 return 0;
6126}
6127
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128static void
6129symtable_node(struct symtable *st, node *n)
6130{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006131 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006132
6133 loop:
6134 switch (TYPE(n)) {
6135 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006136 char *func_name;
6137 if (NCH(n) == 6)
6138 symtable_node(st, CHILD(n, 0));
6139 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006140 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006141 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006142 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006143 symtable_funcdef(st, n);
6144 symtable_exit_scope(st);
6145 break;
6146 }
6147 case lambdef:
6148 if (NCH(n) == 4)
6149 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006150 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151 symtable_funcdef(st, n);
6152 symtable_exit_scope(st);
6153 break;
6154 case classdef: {
6155 char *tmp, *class_name = STR(CHILD(n, 1));
6156 symtable_add_def(st, class_name, DEF_LOCAL);
6157 if (TYPE(CHILD(n, 2)) == LPAR) {
6158 node *bases = CHILD(n, 3);
6159 int i;
6160 for (i = 0; i < NCH(bases); i += 2) {
6161 symtable_node(st, CHILD(bases, i));
6162 }
6163 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00006164 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006165 tmp = st->st_private;
6166 st->st_private = class_name;
6167 symtable_node(st, CHILD(n, NCH(n) - 1));
6168 st->st_private = tmp;
6169 symtable_exit_scope(st);
6170 break;
6171 }
6172 case if_stmt:
6173 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00006174 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
6175 if (st->st_cur->ste_generator == 0)
6176 st->st_cur->ste_generator =
6177 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006178 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00006179 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006180 symtable_node(st, CHILD(n, i + 1));
6181 symtable_node(st, CHILD(n, i + 3));
6182 }
6183 if (i + 2 < NCH(n))
6184 symtable_node(st, CHILD(n, i + 2));
6185 break;
6186 case global_stmt:
6187 symtable_global(st, n);
6188 break;
6189 case import_stmt:
6190 symtable_import(st, n);
6191 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006192 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006193 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006194 symtable_node(st, CHILD(n, 1));
6195 if (NCH(n) > 2)
6196 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006197 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006198 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006199 st->st_cur->ste_opt_lineno = n->n_lineno;
6200 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006201 if (NCH(n) > 4)
6202 symtable_node(st, CHILD(n, 5));
6203 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006204
6205 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00006206 case assert_stmt:
6207 if (Py_OptimizeFlag)
6208 return;
6209 if (NCH(n) == 2) {
6210 n = CHILD(n, 1);
6211 goto loop;
6212 } else {
6213 symtable_node(st, CHILD(n, 1));
6214 n = CHILD(n, 3);
6215 goto loop;
6216 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006217 case except_clause:
6218 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006219 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006220 if (NCH(n) > 1) {
6221 n = CHILD(n, 1);
6222 goto loop;
6223 }
6224 break;
6225 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006226 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006227 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00006228 case yield_stmt:
6229 st->st_cur->ste_generator = 1;
6230 n = CHILD(n, 1);
6231 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 case expr_stmt:
6233 if (NCH(n) == 1)
6234 n = CHILD(n, 0);
6235 else {
6236 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006237 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006238 symtable_node(st, CHILD(n, 2));
6239 break;
6240 } else {
6241 int i;
6242 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006243 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006244 n = CHILD(n, NCH(n) - 1);
6245 }
6246 }
6247 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006248 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006249 /* only occurs when there are multiple for loops
6250 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006251 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006252 if (TYPE(n) == list_for)
6253 symtable_list_for(st, n);
6254 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006255 REQ(n, list_if);
6256 symtable_node(st, CHILD(n, 1));
6257 if (NCH(n) == 3) {
6258 n = CHILD(n, 2);
6259 goto loop;
6260 }
6261 }
6262 break;
6263 case for_stmt:
6264 symtable_assign(st, CHILD(n, 1), 0);
6265 for (i = 3; i < NCH(n); ++i)
6266 if (TYPE(CHILD(n, i)) >= single_input)
6267 symtable_node(st, CHILD(n, i));
6268 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006269 case arglist:
6270 if (NCH(n) > 1)
6271 for (i = 0; i < NCH(n); ++i) {
6272 node *ch = CHILD(n, i);
6273 if (TYPE(ch) == argument && NCH(ch) == 2 &&
6274 TYPE(CHILD(ch, 1)) == gen_for) {
6275 PyErr_SetString(PyExc_SyntaxError,
6276 "invalid syntax");
6277 symtable_error(st, n->n_lineno);
6278 return;
6279 }
6280 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006281 /* The remaining cases fall through to default except in
6282 special circumstances. This requires the individual cases
6283 to be coded with great care, even though they look like
6284 rather innocuous. Each case must double-check TYPE(n).
6285 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006286 case decorator:
6287 if (TYPE(n) == decorator) {
6288 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6289 node *name, *varname;
6290 name = CHILD(n, 1);
6291 REQ(name, dotted_name);
6292 varname = CHILD(name, 0);
6293 REQ(varname, NAME);
6294 symtable_add_use(st, STR(varname));
6295 }
6296 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006297 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006298 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006299 n = CHILD(n, 2);
6300 goto loop;
6301 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006302 else if (TYPE(n) == argument && NCH(n) == 2 &&
6303 TYPE(CHILD(n, 1)) == gen_for) {
6304 symtable_generator_expression(st, n);
6305 break;
6306 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006307 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006308 case listmaker:
6309 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006310 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006311 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006312 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006313 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006314 case testlist_gexp:
6315 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6316 symtable_generator_expression(st, n);
6317 break;
6318 }
6319 /* fall through */
6320
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006321 case atom:
6322 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6323 symtable_add_use(st, STR(CHILD(n, 0)));
6324 break;
6325 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006326 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006327 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006328 /* Walk over every non-token child with a special case
6329 for one child.
6330 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006331 if (NCH(n) == 1) {
6332 n = CHILD(n, 0);
6333 goto loop;
6334 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006335 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006336 if (TYPE(CHILD(n, i)) >= single_input)
6337 symtable_node(st, CHILD(n, i));
6338 }
6339}
6340
6341static void
6342symtable_funcdef(struct symtable *st, node *n)
6343{
6344 node *body;
6345
6346 if (TYPE(n) == lambdef) {
6347 if (NCH(n) == 4)
6348 symtable_params(st, CHILD(n, 1));
6349 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006350 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006351 body = CHILD(n, NCH(n) - 1);
6352 symtable_node(st, body);
6353}
6354
6355/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006356 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006357 which are references in the defining scope. symtable_params()
6358 parses the parameter names, which are defined in the function's
6359 body.
6360
6361 varargslist:
6362 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6363 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6364*/
6365
6366static void
6367symtable_default_args(struct symtable *st, node *n)
6368{
6369 node *c;
6370 int i;
6371
6372 if (TYPE(n) == parameters) {
6373 n = CHILD(n, 1);
6374 if (TYPE(n) == RPAR)
6375 return;
6376 }
6377 REQ(n, varargslist);
6378 for (i = 0; i < NCH(n); i += 2) {
6379 c = CHILD(n, i);
6380 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6381 break;
6382 }
6383 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6384 symtable_node(st, CHILD(n, i));
6385 }
6386}
6387
6388static void
6389symtable_params(struct symtable *st, node *n)
6390{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006391 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006392 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006393
6394 if (TYPE(n) == parameters) {
6395 n = CHILD(n, 1);
6396 if (TYPE(n) == RPAR)
6397 return;
6398 }
6399 REQ(n, varargslist);
6400 for (i = 0; i < NCH(n); i += 2) {
6401 c = CHILD(n, i);
6402 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6403 ext = 1;
6404 break;
6405 }
6406 if (TYPE(c) == test) {
6407 continue;
6408 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006409 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006410 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006411 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006412 char nbuf[30];
6413 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006414 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006415 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006416 }
6417 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006418 if (ext) {
6419 c = CHILD(n, i);
6420 if (TYPE(c) == STAR) {
6421 i++;
6422 symtable_add_def(st, STR(CHILD(n, i)),
6423 DEF_PARAM | DEF_STAR);
6424 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006425 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006426 c = NULL;
6427 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006428 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006429 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006430 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006431 i++;
6432 symtable_add_def(st, STR(CHILD(n, i)),
6433 DEF_PARAM | DEF_DOUBLESTAR);
6434 }
6435 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006436 if (complex >= 0) {
6437 int j;
6438 for (j = 0; j <= complex; j++) {
6439 c = CHILD(n, j);
6440 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006441 c = CHILD(n, ++j);
6442 else if (TYPE(c) == EQUAL)
6443 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006444 if (TYPE(CHILD(c, 0)) == LPAR)
6445 symtable_params_fplist(st, CHILD(c, 1));
6446 }
6447 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006448}
6449
6450static void
6451symtable_params_fplist(struct symtable *st, node *n)
6452{
6453 int i;
6454 node *c;
6455
6456 REQ(n, fplist);
6457 for (i = 0; i < NCH(n); i += 2) {
6458 c = CHILD(n, i);
6459 REQ(c, fpdef);
6460 if (NCH(c) == 1)
6461 symtable_add_def(st, STR(CHILD(c, 0)),
6462 DEF_PARAM | DEF_INTUPLE);
6463 else
6464 symtable_params_fplist(st, CHILD(c, 1));
6465 }
6466
6467}
6468
6469static void
6470symtable_global(struct symtable *st, node *n)
6471{
6472 int i;
6473
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006474 /* XXX It might be helpful to warn about module-level global
6475 statements, but it's hard to tell the difference between
6476 module-level and a string passed to exec.
6477 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006478
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006479 for (i = 1; i < NCH(n); i += 2) {
6480 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006481 int flags;
6482
6483 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006484 if (flags < 0)
6485 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006486 if (flags && flags != DEF_GLOBAL) {
6487 char buf[500];
6488 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006489 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006490 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006491 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006492 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006493 }
6494 else {
6495 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006496 PyOS_snprintf(buf, sizeof(buf),
6497 GLOBAL_AFTER_ASSIGN,
6498 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006499 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006500 PyOS_snprintf(buf, sizeof(buf),
6501 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006502 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006503 }
6504 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006505 symtable_add_def(st, name, DEF_GLOBAL);
6506 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006507}
6508
6509static void
6510symtable_list_comprehension(struct symtable *st, node *n)
6511{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006512 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006513 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006514
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006515 REQ(n, listmaker);
6516 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6517 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006518 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006519 symtable_list_for(st, CHILD(n, 1));
6520 symtable_node(st, CHILD(n, 0));
6521 --st->st_cur->ste_tmpname;
6522}
6523
6524static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006525symtable_generator_expression(struct symtable *st, node *n)
6526{
6527 /* testlist_gexp: test gen_for */
6528 REQ(CHILD(n, 0), test);
6529 REQ(CHILD(n, 1), gen_for);
6530
6531 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6532 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6533
6534 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6535
6536 symtable_gen_for(st, CHILD(n, 1), 1);
6537 symtable_node(st, CHILD(n, 0));
6538 symtable_exit_scope(st);
6539
6540 /* for outmost iterable precomputation */
6541 symtable_node(st, CHILD(CHILD(n, 1), 3));
6542}
6543
6544static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006545symtable_list_for(struct symtable *st, node *n)
6546{
6547 REQ(n, list_for);
6548 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006549 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006550 symtable_node(st, CHILD(n, 3));
6551 if (NCH(n) == 5)
6552 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006553}
6554
6555static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006556symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6557{
6558 REQ(n, gen_for);
6559
6560 /* gen_for: for v in test [gen_iter] */
6561 symtable_assign(st, CHILD(n, 1), 0);
6562 if (is_outmost)
6563 symtable_add_use(st, "[outmost-iterable]");
6564 else
6565 symtable_node(st, CHILD(n, 3));
6566
6567 if (NCH(n) == 5)
6568 symtable_gen_iter(st, CHILD(n, 4));
6569}
6570
6571static void
6572symtable_gen_iter(struct symtable *st, node *n)
6573{
6574 REQ(n, gen_iter);
6575
6576 n = CHILD(n, 0);
6577 if (TYPE(n) == gen_for)
6578 symtable_gen_for(st, n, 0);
6579 else {
6580 REQ(n, gen_if);
6581 symtable_node(st, CHILD(n, 1));
6582
6583 if (NCH(n) == 3)
6584 symtable_gen_iter(st, CHILD(n, 2));
6585 }
6586}
6587
6588static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006589symtable_import(struct symtable *st, node *n)
6590{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006591 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006592 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006593 /* import_stmt: import_name | import_from */
6594 n = CHILD(n, 0);
6595 if (TYPE(n) == import_from) {
6596 /* import_from: 'from' dotted_name 'import' ('*' |
6597 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006598 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006599 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006600 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6601 /* check for bogus imports */
6602 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6603 PyErr_SetString(PyExc_SyntaxError,
6604 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006605 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006606 return;
6607 }
6608 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006609 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6610 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006611 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006612 if (symtable_warn(st,
6613 "import * only allowed at module level") < 0)
6614 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006615 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006616 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006617 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006618 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006619 REQ(nn, import_as_names);
6620 for (i = 0; i < NCH(nn); i += 2) {
6621 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006622 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006623 symtable_assign(st, CHILD(c, 2),
6624 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006625 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006626 symtable_assign(st, CHILD(c, 0),
6627 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006628 }
6629 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006630 } else {
6631 /* 'import' dotted_as_names */
6632 nn = CHILD(n, 1);
6633 REQ(nn, dotted_as_names);
6634 for (i = 0; i < NCH(nn); i += 2)
6635 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006636 }
6637}
6638
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006639/* The third argument to symatble_assign() is a flag to be passed to
6640 symtable_add_def() if it is eventually called. The flag is useful
6641 to specify the particular type of assignment that should be
6642 recorded, e.g. an assignment caused by import.
6643 */
6644
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006645static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006646symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006647{
6648 node *tmp;
6649 int i;
6650
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006651 loop:
6652 switch (TYPE(n)) {
6653 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006654 /* invalid assignment, e.g. lambda x:x=2. The next
6655 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006656 return;
6657 case power:
6658 if (NCH(n) > 2) {
6659 for (i = 2; i < NCH(n); ++i)
6660 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6661 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006662 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006663 if (NCH(n) > 1) {
6664 symtable_node(st, CHILD(n, 0));
6665 symtable_node(st, CHILD(n, 1));
6666 } else {
6667 n = CHILD(n, 0);
6668 goto loop;
6669 }
6670 return;
6671 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006672 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6673 /* XXX This is an error, but the next pass
6674 will catch it. */
6675 return;
6676 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006677 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006678 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006679 }
6680 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006681 case testlist_gexp:
6682 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6683 /* XXX This is an error, but the next pass
6684 will catch it. */
6685 return;
6686 } else {
6687 for (i = 0; i < NCH(n); i += 2)
6688 symtable_assign(st, CHILD(n, i), def_flag);
6689 }
6690 return;
6691
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006692 case exprlist:
6693 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006694 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006695 if (NCH(n) == 1) {
6696 n = CHILD(n, 0);
6697 goto loop;
6698 }
6699 else {
6700 int i;
6701 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006702 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006703 return;
6704 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006705 case atom:
6706 tmp = CHILD(n, 0);
6707 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6708 n = CHILD(n, 1);
6709 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006710 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006711 if (strcmp(STR(tmp), "__debug__") == 0) {
6712 PyErr_SetString(PyExc_SyntaxError,
6713 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006714 symtable_error(st, n->n_lineno);
6715 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006716 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006717 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006718 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006719 return;
6720 case dotted_as_name:
6721 if (NCH(n) == 3)
6722 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006723 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006724 else
6725 symtable_add_def(st,
6726 STR(CHILD(CHILD(n,
6727 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006728 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006729 return;
6730 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006731 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006732 return;
6733 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006734 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006735 return;
6736 default:
6737 if (NCH(n) == 0)
6738 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006739 if (NCH(n) == 1) {
6740 n = CHILD(n, 0);
6741 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006742 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006743 /* Should only occur for errors like x + 1 = 1,
6744 which will be caught in the next pass. */
6745 for (i = 0; i < NCH(n); ++i)
6746 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006747 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006748 }
6749}