blob: 4653ff7bc33b6fbbbc68bb81a0510dea5796ae4a [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;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
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_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000429 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000430 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000431 unsigned char *codestr = NULL;
432 unsigned char *lineno;
433 int *addrmap = NULL;
434 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000435 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000436 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000438 /* Bypass optimization when the lineno table is too complex */
439 assert(PyString_Check(lineno_obj));
440 lineno = PyString_AS_STRING(lineno_obj);
441 tabsiz = PyString_GET_SIZE(lineno_obj);
442 if (memchr(lineno, 255, tabsiz) != NULL)
443 goto exitUnchanged;
444
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000445 if (!PyString_Check(code))
446 goto exitUnchanged;
Raymond Hettingera12fa142004-08-24 04:34:16 +0000447
448 /* Avoid situations where jump retargeting could overflow */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000449 codelen = PyString_Size(code);
Raymond Hettingera12fa142004-08-24 04:34:16 +0000450 if (codelen > 32000)
451 goto exitUnchanged;
452
453 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000454 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000455 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000456 goto exitUnchanged;
457 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000458
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000459 /* Mapping to new jump targets after NOPs are removed */
460 addrmap = PyMem_Malloc(codelen * sizeof(int));
461 if (addrmap == NULL)
462 goto exitUnchanged;
463
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000464 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000465 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000466 goto exitUnchanged;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000467 assert(PyTuple_Check(consts));
468
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000469 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
470 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000471 opcode = codestr[i];
472 switch (opcode) {
473
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000474 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000475 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000476 case UNARY_NOT:
477 if (codestr[i+1] != JUMP_IF_FALSE ||
478 codestr[i+4] != POP_TOP ||
479 !ISBASICBLOCK(blocks,i,5))
480 continue;
481 tgt = GETJUMPTGT(codestr, (i+1));
482 if (codestr[tgt] != POP_TOP)
483 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000484 j = GETARG(codestr, i+1) + 1;
485 codestr[i] = JUMP_IF_TRUE;
486 SETARG(codestr, i, j);
487 codestr[i+3] = POP_TOP;
488 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000489 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000490 break;
491
492 /* not a is b --> a is not b
493 not a in b --> a not in b
494 not a is not b --> a is b
495 not a not in b --> a in b */
496 case COMPARE_OP:
497 j = GETARG(codestr, i);
498 if (j < 6 || j > 9 ||
499 codestr[i+3] != UNARY_NOT ||
500 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000501 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000502 SETARG(codestr, i, (j^1));
503 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000504 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000505 break;
506
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000507 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
508 case LOAD_NAME:
509 case LOAD_GLOBAL:
510 j = GETARG(codestr, i);
511 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
512 if (name == NULL || strcmp(name, "None") != 0)
513 continue;
514 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
515 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
516 codestr[i] = LOAD_CONST;
517 SETARG(codestr, i, j);
518 break;
519 }
520 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000521 break;
522
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000523 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000524 case LOAD_CONST:
525 j = GETARG(codestr, i);
526 if (codestr[i+3] != JUMP_IF_FALSE ||
527 codestr[i+6] != POP_TOP ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 !ISBASICBLOCK(blocks,i,7) ||
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000529 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
530 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000531 memset(codestr+i, NOP, 7);
532 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000533 break;
534
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000535 /* Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
536 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
537 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000538 case BUILD_TUPLE:
539 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000540 j = GETARG(codestr, i);
541 if (codestr[i+3] != UNPACK_SEQUENCE ||
542 !ISBASICBLOCK(blocks,i,6) ||
543 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000544 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000545 if (j == 1) {
546 memset(codestr+i, NOP, 6);
547 nops += 6;
548 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000549 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000550 memset(codestr+i+1, NOP, 5);
551 nops += 5;
552 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000553 codestr[i] = ROT_THREE;
554 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000555 memset(codestr+i+2, NOP, 4);
556 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000557 }
558 break;
559
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000560 /* Simplify conditional jump to conditional jump where the
561 result of the first test implies the success of a similar
562 test or the failure of the opposite test.
563 Arises in code like:
564 "a and b or c"
565 "a and b and c"
566 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000567 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
568 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000569 */
570 case JUMP_IF_FALSE:
571 case JUMP_IF_TRUE:
572 tgt = GETJUMPTGT(codestr, i);
573 j = codestr[tgt];
574 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
575 if (j == opcode) {
576 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
577 SETARG(codestr, i, tgttgt);
578 } else {
579 tgt -= i;
580 SETARG(codestr, i, tgt);
581 }
582 break;
583 }
584 /* Intentional fallthrough */
585
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000586 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000587 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000588 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000589 case JUMP_ABSOLUTE:
590 case CONTINUE_LOOP:
591 case SETUP_LOOP:
592 case SETUP_EXCEPT:
593 case SETUP_FINALLY:
594 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000596 continue;
597 tgttgt = GETJUMPTGT(codestr, tgt);
598 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
599 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000600 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000601 tgttgt -= i + 3; /* Calc relative jump addr */
602 if (tgttgt < 0) /* No backward relative jumps */
603 continue;
604 codestr[i] = opcode;
605 SETARG(codestr, i, tgttgt);
606 break;
607
608 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000609 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000610
611 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
612 case RETURN_VALUE:
613 if (i+4 >= codelen ||
614 codestr[i+4] != RETURN_VALUE ||
615 !ISBASICBLOCK(blocks,i,5))
616 continue;
617 memset(codestr+i+1, NOP, 4);
618 nops += 4;
619 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000620 }
621 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000622
623 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000624 cum_orig_line = 0;
625 last_line = 0;
626 for (i=0 ; i < tabsiz ; i+=2) {
627 cum_orig_line += lineno[i];
628 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000629 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000630 lineno[i] =((unsigned char)(new_line - last_line));
631 last_line = new_line;
632 }
633
634 /* Remove NOPs and fixup jump targets */
635 for (i=0, h=0 ; i<codelen ; ) {
636 opcode = codestr[i];
637 switch (opcode) {
638 case NOP:
639 i++;
640 continue;
641
642 case JUMP_ABSOLUTE:
643 case CONTINUE_LOOP:
644 j = addrmap[GETARG(codestr, i)];
645 SETARG(codestr, i, j);
646 break;
647
648 case FOR_ITER:
649 case JUMP_FORWARD:
650 case JUMP_IF_FALSE:
651 case JUMP_IF_TRUE:
652 case SETUP_LOOP:
653 case SETUP_EXCEPT:
654 case SETUP_FINALLY:
655 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
656 SETARG(codestr, i, j);
657 break;
658 }
659 adj = CODESIZE(opcode);
660 while (adj--)
661 codestr[h++] = codestr[i++];
662 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000663 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000664
665 code = PyString_FromStringAndSize((char *)codestr, h);
666 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000667 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000668 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000669 return code;
670
671exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000672 if (addrmap != NULL)
673 PyMem_Free(addrmap);
674 if (codestr != NULL)
675 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000676 Py_INCREF(code);
677 return code;
678}
679
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681PyCode_New(int argcount, int nlocals, int stacksize, int flags,
682 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000683 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
684 PyObject *filename, PyObject *name, int firstlineno,
685 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688 int i;
689 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000690 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000691 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 consts == NULL || !PyTuple_Check(consts) ||
693 names == NULL || !PyTuple_Check(names) ||
694 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000695 freevars == NULL || !PyTuple_Check(freevars) ||
696 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 name == NULL || !PyString_Check(name) ||
698 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000699 lnotab == NULL || !PyString_Check(lnotab) ||
700 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000701 PyErr_BadInternalCall();
702 return NULL;
703 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000704 intern_strings(names);
705 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000706 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000707 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000708 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 for (i = PyTuple_Size(consts); --i >= 0; ) {
710 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000712 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000713 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000714 continue;
715 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000719 co->co_argcount = argcount;
720 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000721 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000722 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000723 Py_INCREF(code);
724 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000730 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000731 Py_INCREF(freevars);
732 co->co_freevars = freevars;
733 Py_INCREF(cellvars);
734 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000736 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000738 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000739 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000741 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000742 if (PyTuple_GET_SIZE(freevars) == 0 &&
743 PyTuple_GET_SIZE(cellvars) == 0)
744 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000745 }
746 return co;
747}
748
749
750/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000751
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000752/* The compiler uses two passes to generate bytecodes. The first pass
753 builds the symbol table. The second pass generates the bytecode.
754
755 The first pass uses a single symtable struct. The second pass uses
756 a compiling struct for each code block. The compiling structs
757 share a reference to the symtable.
758
759 The two passes communicate via symtable_load_symbols() and via
760 is_local() and is_global(). The former initializes several slots
761 in the compiling struct: c_varnames, c_locals, c_nlocals,
762 c_argcount, c_globals, and c_flags.
763*/
764
Tim Peters2a7f3842001-06-09 09:26:21 +0000765/* All about c_lnotab.
766
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000767c_lnotab is an array of unsigned bytes disguised as a Python string. Since
768version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
769mapped to source code line #s via c_lnotab instead.
770
Tim Peters2a7f3842001-06-09 09:26:21 +0000771The array is conceptually a list of
772 (bytecode offset increment, line number increment)
773pairs. The details are important and delicate, best illustrated by example:
774
775 byte code offset source code line number
776 0 1
777 6 2
778 50 7
779 350 307
780 361 308
781
782The first trick is that these numbers aren't stored, only the increments
783from one row to the next (this doesn't really work, but it's a start):
784
785 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
786
787The second trick is that an unsigned byte can't hold negative values, or
788values larger than 255, so (a) there's a deep assumption that byte code
789offsets and their corresponding line #s both increase monotonically, and (b)
790if at least one column jumps by more than 255 from one row to the next, more
791than one pair is written to the table. In case #b, there's no way to know
792from looking at the table later how many were written. That's the delicate
793part. A user of c_lnotab desiring to find the source line number
794corresponding to a bytecode address A should do something like this
795
796 lineno = addr = 0
797 for addr_incr, line_incr in c_lnotab:
798 addr += addr_incr
799 if addr > A:
800 return lineno
801 lineno += line_incr
802
803In order for this to work, when the addr field increments by more than 255,
804the line # increment in each pair generated must be 0 until the remaining addr
805increment is < 256. So, in the example above, com_set_lineno should not (as
806was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
807255, 0, 45, 255, 0, 45.
808*/
809
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000811 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000815 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000816 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 PyObject *c_locals; /* dictionary (value=localID) */
818 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000819 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000820 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000821 int c_nlocals; /* index of next local */
822 int c_argcount; /* number of top-level arguments */
823 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 int c_nexti; /* index into c_code */
825 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000827 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000829 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000830 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000831 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000832 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000834 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000835 int c_stacklevel; /* Current stack level */
836 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000839 int c_last_addr; /* last op addr seen and recorded in lnotab */
840 int c_last_line; /* last line seen and recorded in lnotab */
841 int c_lnotab_next; /* current length of lnotab */
842 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000843 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000844 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000845 int c_nested; /* Is block nested funcdef or lamdef? */
846 int c_closure; /* Is nested w/freevars? */
847 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000848 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000849 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850};
851
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000852static int
853is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000854{
855 if ((v & (USE | DEF_FREE))
856 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
857 return 1;
858 if (v & DEF_FREE_CLASS)
859 return 1;
860 return 0;
861}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000862
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000864com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000865{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000866 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
867
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000868 if (c == NULL) {
869 /* Error occurred via symtable call to
870 is_constant_false */
871 PyErr_SetString(exc, msg);
872 return;
873 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000874 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000875 if (c->c_lineno < 1 || c->c_interactive) {
876 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000878 return;
879 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000880 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000881 if (v == NULL)
882 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000883
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000884 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000885 if (line == NULL) {
886 Py_INCREF(Py_None);
887 line = Py_None;
888 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000889 if (exc == PyExc_SyntaxError) {
890 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
891 Py_None, line);
892 if (t == NULL)
893 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000894 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000895 if (w == NULL)
896 goto exit;
897 PyErr_SetObject(exc, w);
898 } else {
899 /* Make sure additional exceptions are printed with
900 file and line, also. */
901 PyErr_SetObject(exc, v);
902 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
903 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000904 exit:
905 Py_XDECREF(t);
906 Py_XDECREF(v);
907 Py_XDECREF(w);
908 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000909}
910
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000911/* Interface to the block stack */
912
913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000914block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000915{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000916 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 com_error(c, PyExc_SystemError,
918 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000919 }
920 else {
921 c->c_block[c->c_nblocks++] = type;
922 }
923}
924
925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000927{
928 if (c->c_nblocks > 0)
929 c->c_nblocks--;
930 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000932 }
933}
934
Guido van Rossum681d79a1995-07-18 14:51:37 +0000935/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000936
Martin v. Löwis95292d62002-12-11 14:04:59 +0000937static int issue_warning(const char *, const char *, int);
938static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000939static void com_free(struct compiling *);
940static void com_push(struct compiling *, int);
941static void com_pop(struct compiling *, int);
942static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000943static void com_node(struct compiling *, node *);
944static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000945static void com_addbyte(struct compiling *, int);
946static void com_addint(struct compiling *, int);
947static void com_addoparg(struct compiling *, int, int);
948static void com_addfwref(struct compiling *, int, int *);
949static void com_backpatch(struct compiling *, int);
950static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
951static int com_addconst(struct compiling *, PyObject *);
952static int com_addname(struct compiling *, PyObject *);
953static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000954static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000955static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000956static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000957static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000958static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000959static void com_assign(struct compiling *, node *, int, node *);
960static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000961static int com_make_closure(struct compiling *c, PyCodeObject *co);
962
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000964static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000965 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000966static PyObject *parsestrplus(struct compiling*, node *);
967static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000968static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000971
972/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000973static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000974static struct symtable *symtable_build(node *, PyFutureFeatures *,
975 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000977static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000978static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000979static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000980static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000981static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000982
983static void symtable_node(struct symtable *, node *);
984static void symtable_funcdef(struct symtable *, node *);
985static void symtable_default_args(struct symtable *, node *);
986static void symtable_params(struct symtable *, node *);
987static void symtable_params_fplist(struct symtable *, node *n);
988static void symtable_global(struct symtable *, node *);
989static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000990static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000991static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000992static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000993static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000994static void symtable_gen_for(struct symtable *, node *, int);
995static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000997static int symtable_update_free_vars(struct symtable *);
998static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
999static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1000
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001/* helper */
1002static void
1003do_pad(int pad)
1004{
1005 int i;
1006 for (i = 0; i < pad; ++i)
1007 fprintf(stderr, " ");
1008}
1009
1010static void
1011dump(node *n, int pad, int depth)
1012{
1013 int i;
1014 if (depth == 0)
1015 return;
1016 do_pad(pad);
1017 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1018 if (depth > 0)
1019 depth--;
1020 for (i = 0; i < NCH(n); ++i)
1021 dump(CHILD(n, i), pad + 1, depth);
1022}
1023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001025com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001027 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1029 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001030 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001032 goto fail;
1033 if ((c->c_const_dict = PyDict_New()) == NULL)
1034 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001036 goto fail;
1037 if ((c->c_name_dict = PyDict_New()) == NULL)
1038 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001040 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1042 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001043 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001044 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001045 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001046 c->c_freevars = NULL;
1047 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001048 c->c_nlocals = 0;
1049 c->c_argcount = 0;
1050 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 c->c_nexti = 0;
1052 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001053 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001054 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001055 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001056 c->c_begin = 0;
1057 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001059 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001060 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 c->c_stacklevel = 0;
1062 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001063 c->c_firstlineno = 0;
1064 c->c_last_addr = 0;
1065 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001066 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001067 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001069 c->c_nested = 0;
1070 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001071 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 return 1;
1073
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001074 fail:
1075 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 return 0;
1077}
1078
1079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001080com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 Py_XDECREF(c->c_code);
1083 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001084 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001086 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 Py_XDECREF(c->c_globals);
1088 Py_XDECREF(c->c_locals);
1089 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001090 Py_XDECREF(c->c_freevars);
1091 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001093 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001094 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095}
1096
1097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099{
1100 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001101 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001102 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001103 /*
1104 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1105 c->c_filename, c->c_name, c->c_lineno,
1106 c->c_nexti, c->c_stacklevel, n);
1107 */
1108 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001109}
1110
1111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001112com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001114 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001116 else
1117 c->c_stacklevel -= n;
1118}
1119
1120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001121com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122{
1123 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001125 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127}
1128
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001129static int
1130com_check_size(PyObject **s, int offset)
1131{
1132 int len = PyString_GET_SIZE(*s);
1133 if (offset >= len)
1134 return _PyString_Resize(s, len * 2);
1135 return 0;
1136}
1137
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001139com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001141 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001142 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001143 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001144 if (com_check_size(&c->c_code, c->c_nexti)) {
1145 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001148 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149}
1150
1151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001152com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001154 com_addbyte(c, x & 0xff);
1155 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156}
1157
1158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001159com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001160{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001161 char *p;
1162 if (c->c_lnotab == NULL)
1163 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001164 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1165 c->c_errors++;
1166 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001167 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001168 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001169 *p++ = addr;
1170 *p++ = line;
1171 c->c_lnotab_next += 2;
1172}
1173
1174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001175com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001176{
1177 c->c_lineno = lineno;
1178 if (c->c_firstlineno == 0) {
1179 c->c_firstlineno = c->c_last_line = lineno;
1180 }
1181 else {
1182 int incr_addr = c->c_nexti - c->c_last_addr;
1183 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001184 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001185 while (incr_addr > 255) {
1186 com_add_lnotab(c, 255, 0);
1187 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001188 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001189 while (incr_line > 255) {
1190 com_add_lnotab(c, incr_addr, 255);
1191 incr_line -=255;
1192 incr_addr = 0;
1193 }
1194 if (incr_addr > 0 || incr_line > 0)
1195 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001196 c->c_last_addr = c->c_nexti;
1197 c->c_last_line = lineno;
1198 }
1199}
1200
1201static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001202com_strip_lnotab(struct compiling *c)
1203{
1204 /* strip the last lnotab entry if no opcode were emitted.
1205 * This prevents a line number to be generated on a final
1206 * pass, like in the following example:
1207 *
1208 * if a:
1209 * print 5
1210 * else:
1211 * pass
1212 *
1213 * Without the fix, a line trace event would be generated
1214 * on the pass even if a is true (because of the implicit
1215 * return).
1216 */
1217 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1218 c->c_lnotab_next = c->c_lnotab_last;
1219 }
1220}
1221
1222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001223com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224{
Fred Drakeef8ace32000-08-24 00:32:09 +00001225 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001226 if (extended_arg){
1227 com_addbyte(c, EXTENDED_ARG);
1228 com_addint(c, extended_arg);
1229 arg &= 0xffff;
1230 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001231 com_addbyte(c, op);
1232 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233}
1234
1235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001236com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237{
1238 /* Compile a forward reference for backpatching */
1239 int here;
1240 int anchor;
1241 com_addbyte(c, op);
1242 here = c->c_nexti;
1243 anchor = *p_anchor;
1244 *p_anchor = here;
1245 com_addint(c, anchor == 0 ? 0 : here - anchor);
1246}
1247
1248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001249com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001251 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 int dist;
1254 int prev;
1255 for (;;) {
1256 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001257 prev = code[anchor] + (code[anchor+1] << 8);
1258 dist = target - (anchor+2);
1259 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001260 dist >>= 8;
1261 code[anchor+1] = dist;
1262 dist >>= 8;
1263 if (dist) {
1264 com_error(c, PyExc_SystemError,
1265 "com_backpatch: offset too large");
1266 break;
1267 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 if (!prev)
1269 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 anchor -= prev;
1271 }
1272}
1273
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001274/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275
1276static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001277com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001279 PyObject *w, *t, *np=NULL;
1280 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001281
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001282 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001283 if (t == NULL)
1284 goto fail;
1285 w = PyDict_GetItem(dict, t);
1286 if (w != NULL) {
1287 n = PyInt_AsLong(w);
1288 } else {
1289 n = PyList_Size(list);
1290 np = PyInt_FromLong(n);
1291 if (np == NULL)
1292 goto fail;
1293 if (PyList_Append(list, v) != 0)
1294 goto fail;
1295 if (PyDict_SetItem(dict, t, np) != 0)
1296 goto fail;
1297 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001298 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001299 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001300 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001301 fail:
1302 Py_XDECREF(np);
1303 Py_XDECREF(t);
1304 c->c_errors++;
1305 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306}
1307
1308static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001309com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001311 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312}
1313
1314static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001317 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318}
1319
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001320int
1321_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001322{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001323 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001324 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001325 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001326 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1327 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001328 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001329 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001330 return 0; /* Don't mangle __extremely_long_names */
1331 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1332 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001333 /* Strip leading underscores from class name */
1334 while (*p == '_')
1335 p++;
1336 if (*p == '\0')
1337 return 0; /* Don't mangle if class is just underscores */
1338 plen = strlen(p);
1339 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001340 plen = maxlen-nlen-2; /* Truncate class name if too long */
1341 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001342 buffer[0] = '_';
1343 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001344 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001345 return 1;
1346}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001347
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001349com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001353 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001354
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001355 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001356 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001357 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 c->c_errors++;
1359 i = 255;
1360 }
1361 else {
1362 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001365 com_addoparg(c, op, i);
1366}
1367
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001368#define NAME_LOCAL 0
1369#define NAME_GLOBAL 1
1370#define NAME_DEFAULT 2
1371#define NAME_CLOSURE 3
1372
1373static int
1374com_lookup_arg(PyObject *dict, PyObject *name)
1375{
1376 PyObject *v = PyDict_GetItem(dict, name);
1377 if (v == NULL)
1378 return -1;
1379 else
1380 return PyInt_AS_LONG(v);
1381}
1382
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001383static int
1384none_assignment_check(struct compiling *c, char *name, int assigning)
1385{
1386 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1387 char *msg;
1388 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001389 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001390 else
1391 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001392 com_error(c, PyExc_SyntaxError, msg);
1393 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001394 }
1395 return 0;
1396}
1397
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001398static void
1399com_addop_varname(struct compiling *c, int kind, char *name)
1400{
1401 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001402 int i, reftype;
1403 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001404 int op = STOP_CODE;
1405 char buffer[MANGLE_LEN];
1406
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001407 if (kind != VAR_LOAD &&
1408 none_assignment_check(c, name, kind == VAR_STORE))
1409 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001410 i = 255;
1411 goto done;
1412 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001413 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001414 name = buffer;
1415 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1416 c->c_errors++;
1417 i = 255;
1418 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001419 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001420
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001421 reftype = get_ref_type(c, name);
1422 switch (reftype) {
1423 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001424 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001425 scope = NAME_LOCAL;
1426 break;
1427 case GLOBAL_EXPLICIT:
1428 scope = NAME_GLOBAL;
1429 break;
1430 case GLOBAL_IMPLICIT:
1431 if (c->c_flags & CO_OPTIMIZED)
1432 scope = NAME_GLOBAL;
1433 break;
1434 case FREE:
1435 case CELL:
1436 scope = NAME_CLOSURE;
1437 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001438 }
1439
1440 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001441 if (scope == NAME_LOCAL)
1442 i = com_lookup_arg(c->c_locals, v);
1443 else if (reftype == FREE)
1444 i = com_lookup_arg(c->c_freevars, v);
1445 else if (reftype == CELL)
1446 i = com_lookup_arg(c->c_cellvars, v);
1447 if (i == -1) {
1448 c->c_errors++; /* XXX no exception set */
1449 i = 255;
1450 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001451 }
1452 Py_DECREF(v);
1453
1454 switch (kind) {
1455 case VAR_LOAD:
1456 switch (scope) {
1457 case NAME_LOCAL:
1458 op = LOAD_FAST;
1459 break;
1460 case NAME_GLOBAL:
1461 op = LOAD_GLOBAL;
1462 break;
1463 case NAME_DEFAULT:
1464 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001465 break;
1466 case NAME_CLOSURE:
1467 op = LOAD_DEREF;
1468 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001469 }
1470 break;
1471 case VAR_STORE:
1472 switch (scope) {
1473 case NAME_LOCAL:
1474 op = STORE_FAST;
1475 break;
1476 case NAME_GLOBAL:
1477 op = STORE_GLOBAL;
1478 break;
1479 case NAME_DEFAULT:
1480 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001481 break;
1482 case NAME_CLOSURE:
1483 op = STORE_DEREF;
1484 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001485 }
1486 break;
1487 case VAR_DELETE:
1488 switch (scope) {
1489 case NAME_LOCAL:
1490 op = DELETE_FAST;
1491 break;
1492 case NAME_GLOBAL:
1493 op = DELETE_GLOBAL;
1494 break;
1495 case NAME_DEFAULT:
1496 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001497 break;
1498 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001499 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001500 PyOS_snprintf(buf, sizeof(buf),
1501 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001502 com_error(c, PyExc_SyntaxError, buf);
1503 i = 255;
1504 break;
1505 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001506 }
1507 break;
1508 }
1509done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 com_addoparg(c, op, i);
1511}
1512
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001515{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001516 char *name;
1517 char buffer[1000];
1518 /* XXX it is possible to write this code without the 1000
1519 chars on the total length of dotted names, I just can't be
1520 bothered right now */
1521 if (TYPE(n) == STAR)
1522 name = "*";
1523 else if (TYPE(n) == dotted_name) {
1524 char *p = buffer;
1525 int i;
1526 name = buffer;
1527 for (i = 0; i < NCH(n); i += 2) {
1528 char *s = STR(CHILD(n, i));
1529 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001531 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001532 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001533 break;
1534 }
1535 if (p != buffer)
1536 *p++ = '.';
1537 strcpy(p, s);
1538 p = strchr(p, '\0');
1539 }
1540 }
1541 else {
1542 REQ(n, NAME);
1543 name = STR(n);
1544 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001545 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001546}
1547
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001549parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001551 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001553 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001554#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001555 int imflag;
1556#endif
1557
Guido van Rossum282914b1991-04-04 10:42:56 +00001558 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001559 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001560#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001561 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001562#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001563 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001565 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001567 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001568 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001569 }
1570 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001571 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001573 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001574 if (errno != 0)
1575 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001577 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001578 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001579#ifndef WITHOUT_COMPLEX
1580 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001581 Py_complex z;
1582 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001583 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001584 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001585 PyFPE_END_PROTECT(z)
1586 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001587 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001588 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001589#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001590 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001591 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001592 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001593 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001595 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596}
1597
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001599decode_utf8(char **sPtr, char *end, char* encoding)
1600{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001601#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001602 Py_FatalError("decode_utf8 should not be called in this build.");
1603 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001604#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001605 PyObject *u, *v;
1606 char *s, *t;
1607 t = s = *sPtr;
1608 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1609 while (s < end && (*s & 0x80)) s++;
1610 *sPtr = s;
1611 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1612 if (u == NULL)
1613 return NULL;
1614 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1615 Py_DECREF(u);
1616 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001617#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001618}
1619
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001620/* compiler.transformer.Transformer.decode_literal depends on what
1621 might seem like minor details of this function -- changes here
1622 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001623static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001624parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001627 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001628 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001629 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001630 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001631 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001632 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001633
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001634 if (isalpha(quote) || quote == '_') {
1635 if (quote == 'u' || quote == 'U') {
1636 quote = *++s;
1637 unicode = 1;
1638 }
1639 if (quote == 'r' || quote == 'R') {
1640 quote = *++s;
1641 rawmode = 1;
1642 }
1643 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001644 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 return NULL;
1647 }
1648 s++;
1649 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001650 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001651 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001652 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001653 return NULL;
1654 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001655 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001656 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 return NULL;
1658 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001659 if (len >= 4 && s[0] == quote && s[1] == quote) {
1660 s += 2;
1661 len -= 2;
1662 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001664 return NULL;
1665 }
1666 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001667#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001668 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001669 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001670 char *buf;
1671 char *p;
1672 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001673 if (encoding == NULL) {
1674 buf = s;
1675 u = NULL;
1676 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1677 buf = s;
1678 u = NULL;
1679 } else {
1680 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1681 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1682 if (u == NULL)
1683 return NULL;
1684 p = buf = PyString_AsString(u);
1685 end = s + len;
1686 while (s < end) {
1687 if (*s == '\\') {
1688 *p++ = *s++;
1689 if (*s & 0x80) {
1690 strcpy(p, "u005c");
1691 p += 5;
1692 }
1693 }
1694 if (*s & 0x80) { /* XXX inefficient */
1695 char *r;
1696 int rn, i;
1697 w = decode_utf8(&s, end, "utf-16-be");
1698 if (w == NULL) {
1699 Py_DECREF(u);
1700 return NULL;
1701 }
1702 r = PyString_AsString(w);
1703 rn = PyString_Size(w);
1704 assert(rn % 2 == 0);
1705 for (i = 0; i < rn; i += 2) {
1706 sprintf(p, "\\u%02x%02x",
1707 r[i + 0] & 0xFF,
1708 r[i + 1] & 0xFF);
1709 p += 6;
1710 }
1711 Py_DECREF(w);
1712 } else {
1713 *p++ = *s++;
1714 }
1715 }
1716 len = p - buf;
1717 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001718 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001719 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001720 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001721 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1722 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001723 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001724 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001725 return v;
1726
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001727 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001728#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001729 need_encoding = (encoding != NULL &&
1730 strcmp(encoding, "utf-8") != 0 &&
1731 strcmp(encoding, "iso-8859-1") != 0);
1732 if (rawmode || strchr(s, '\\') == NULL) {
1733 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001734#ifndef Py_USING_UNICODE
1735 /* This should not happen - we never see any other
1736 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001737 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001738#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001739 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1740 if (u == NULL)
1741 return NULL;
1742 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1743 Py_DECREF(u);
1744 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001745#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001746 } else {
1747 return PyString_FromStringAndSize(s, len);
1748 }
1749 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001750
1751 v = PyString_DecodeEscape(s, len, NULL, unicode,
1752 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001753 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001754 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 return v;
1756}
1757
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001759parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001760{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001762 int i;
1763 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001764 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001765 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001766 for (i = 1; i < NCH(n); i++) {
1767 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001768 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001769 if (s == NULL)
1770 goto onError;
1771 if (PyString_Check(v) && PyString_Check(s)) {
1772 PyString_ConcatAndDel(&v, s);
1773 if (v == NULL)
1774 goto onError;
1775 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001776#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001777 else {
1778 PyObject *temp;
1779 temp = PyUnicode_Concat(v, s);
1780 Py_DECREF(s);
1781 if (temp == NULL)
1782 goto onError;
1783 Py_DECREF(v);
1784 v = temp;
1785 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001786#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001787 }
1788 }
1789 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001790
1791 onError:
1792 Py_XDECREF(v);
1793 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001794}
1795
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001797com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001799 int anchor = 0;
1800 int save_begin = c->c_begin;
1801
Raymond Hettinger354433a2004-05-19 08:20:33 +00001802 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001803 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001804 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001805 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001806 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001807 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001808 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001809 c->c_loops++;
1810 com_list_iter(c, n, e, t);
1811 c->c_loops--;
1812 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1813 c->c_begin = save_begin;
1814 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001815 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001816}
1817
1818static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001819com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1820{
1821 int break_anchor = 0;
1822 int anchor = 0;
1823 int save_begin = c->c_begin;
1824
1825 REQ(n, gen_for);
1826 /* gen_for: for v in test [gen_iter] */
1827
1828 com_addfwref(c, SETUP_LOOP, &break_anchor);
1829 block_push(c, SETUP_LOOP);
1830
1831 if (is_outmost) {
1832 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1833 com_push(c, 1);
1834 }
1835 else {
1836 com_node(c, CHILD(n, 3));
1837 com_addbyte(c, GET_ITER);
1838 }
1839
1840 c->c_begin = c->c_nexti;
1841 com_set_lineno(c, c->c_last_line);
1842 com_addfwref(c, FOR_ITER, &anchor);
1843 com_push(c, 1);
1844 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1845
1846 if (NCH(n) == 5)
1847 com_gen_iter(c, CHILD(n, 4), t);
1848 else {
1849 com_test(c, t);
1850 com_addbyte(c, YIELD_VALUE);
1851 com_pop(c, 1);
1852 }
1853
1854 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1855 c->c_begin = save_begin;
1856
1857 com_backpatch(c, anchor);
1858 com_pop(c, 1); /* FOR_ITER has popped this */
1859 com_addbyte(c, POP_BLOCK);
1860 block_pop(c, SETUP_LOOP);
1861 com_backpatch(c, break_anchor);
1862}
1863
1864static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001865com_list_if(struct compiling *c, node *n, node *e, char *t)
1866{
1867 int anchor = 0;
1868 int a = 0;
1869 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001870 com_node(c, CHILD(n, 1));
1871 com_addfwref(c, JUMP_IF_FALSE, &a);
1872 com_addbyte(c, POP_TOP);
1873 com_pop(c, 1);
1874 com_list_iter(c, n, e, t);
1875 com_addfwref(c, JUMP_FORWARD, &anchor);
1876 com_backpatch(c, a);
1877 /* We jump here with an extra entry which we now pop */
1878 com_addbyte(c, POP_TOP);
1879 com_backpatch(c, anchor);
1880}
1881
1882static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001883com_gen_if(struct compiling *c, node *n, node *t)
1884{
1885 /* gen_if: 'if' test [gen_iter] */
1886 int anchor = 0;
1887 int a=0;
1888
1889 com_node(c, CHILD(n, 1));
1890 com_addfwref(c, JUMP_IF_FALSE, &a);
1891 com_addbyte(c, POP_TOP);
1892 com_pop(c, 1);
1893
1894 if (NCH(n) == 3)
1895 com_gen_iter(c, CHILD(n, 2), t);
1896 else {
1897 com_test(c, t);
1898 com_addbyte(c, YIELD_VALUE);
1899 com_pop(c, 1);
1900 }
1901 com_addfwref(c, JUMP_FORWARD, &anchor);
1902 com_backpatch(c, a);
1903 /* We jump here with an extra entry which we now pop */
1904 com_addbyte(c, POP_TOP);
1905 com_backpatch(c, anchor);
1906}
1907
1908static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001909com_list_iter(struct compiling *c,
1910 node *p, /* parent of list_iter node */
1911 node *e, /* element expression node */
1912 char *t /* name of result list temp local */)
1913{
1914 /* list_iter is the last child in a listmaker, list_for, or list_if */
1915 node *n = CHILD(p, NCH(p)-1);
1916 if (TYPE(n) == list_iter) {
1917 n = CHILD(n, 0);
1918 switch (TYPE(n)) {
1919 case list_for:
1920 com_list_for(c, n, e, t);
1921 break;
1922 case list_if:
1923 com_list_if(c, n, e, t);
1924 break;
1925 default:
1926 com_error(c, PyExc_SystemError,
1927 "invalid list_iter node type");
1928 }
1929 }
1930 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001931 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001932 com_push(c, 1);
1933 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001934 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001935 com_pop(c, 2);
1936 }
1937}
1938
1939static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001940com_gen_iter(struct compiling *c, node *n, node *t)
1941{
1942 /* gen_iter: gen_for | gen_if */
1943 node *ch;
1944 REQ(n, gen_iter);
1945
1946 ch = CHILD(n, 0);
1947
1948 switch (TYPE(ch)) {
1949 case gen_for:
1950 com_gen_for(c, ch, t, 0);
1951 break;
1952 case gen_if:
1953 com_gen_if(c, ch, t);
1954 break;
1955 default:
1956 com_error(c, PyExc_SystemError,
1957 "invalid gen_iter node type");
1958 }
1959}
1960
1961static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001962com_list_comprehension(struct compiling *c, node *n)
1963{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001964 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001965 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001966
1967 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001968 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001969 com_addoparg(c, BUILD_LIST, 0);
1970 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1971 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001972 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001973 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001974 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001975 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001976 --c->c_tmpname;
1977}
1978
1979static void
1980com_listmaker(struct compiling *c, node *n)
1981{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001982 /* listmaker: test ( list_for | (',' test)* [','] ) */
1983 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001984 com_list_comprehension(c, n);
1985 else {
1986 int len = 0;
1987 int i;
1988 for (i = 0; i < NCH(n); i += 2, len++)
1989 com_node(c, CHILD(n, i));
1990 com_addoparg(c, BUILD_LIST, len);
1991 com_pop(c, len-1);
1992 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993}
1994
1995static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001996com_generator_expression(struct compiling *c, node *n)
1997{
1998 /* testlist_gexp: test gen_for */
1999 /* argument: test gen_for */
2000 PyCodeObject *co;
2001
2002 REQ(CHILD(n, 0), test);
2003 REQ(CHILD(n, 1), gen_for);
2004
2005 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2006 n->n_lineno);
2007 co = icompile(n, c);
2008 symtable_exit_scope(c->c_symtable);
2009
2010 if (co == NULL)
2011 c->c_errors++;
2012 else {
2013 int closure = com_make_closure(c, co);
2014 int i = com_addconst(c, (PyObject *)co);
2015
2016 com_addoparg(c, LOAD_CONST, i);
2017 com_push(c, 1);
2018 if (closure)
2019 com_addoparg(c, MAKE_CLOSURE, 0);
2020 else
2021 com_addoparg(c, MAKE_FUNCTION, 0);
2022
2023 com_test(c, CHILD(CHILD(n, 1), 3));
2024 com_addbyte(c, GET_ITER);
2025 com_addoparg(c, CALL_FUNCTION, 1);
2026 com_pop(c, 1);
2027
2028 Py_DECREF(co);
2029 }
2030}
2031
2032static void
2033com_testlist_gexp(struct compiling *c, node *n)
2034{
2035 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2036 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2037 com_generator_expression(c, n);
2038 else com_list(c, n, 0);
2039}
2040
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002041
Raymond Hettinger354433a2004-05-19 08:20:33 +00002042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002043com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002044{
2045 int i;
2046 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2047 for (i = 0; i+2 < NCH(n); i += 4) {
2048 /* We must arrange things just right for STORE_SUBSCR.
2049 It wants the stack to look like (value) (dict) (key) */
2050 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002053 com_node(c, CHILD(n, i+2)); /* value */
2054 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002055 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002057 }
2058}
2059
2060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002061com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062{
2063 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 int i;
2066 REQ(n, atom);
2067 ch = CHILD(n, 0);
2068 switch (TYPE(ch)) {
2069 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002070 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_push(c, 1);
2073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002075 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002077 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002078 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002080 com_push(c, 1);
2081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002083 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002085 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002087 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002088 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002089 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 break;
2091 case BACKQUOTE:
2092 com_node(c, CHILD(n, 1));
2093 com_addbyte(c, UNARY_CONVERT);
2094 break;
2095 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002096 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 i = 255;
2098 }
2099 else {
2100 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 break;
2106 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002107 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002108 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 c->c_errors++;
2110 i = 255;
2111 }
2112 else {
2113 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 break;
2119 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002120 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002121 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 break;
2123 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 com_error(c, PyExc_SystemError,
2125 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 }
2127}
2128
2129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131{
2132 if (NCH(n) == 1) {
2133 com_addbyte(c, op);
2134 }
2135 else if (NCH(n) == 2) {
2136 if (TYPE(CHILD(n, 0)) != COLON) {
2137 com_node(c, CHILD(n, 0));
2138 com_addbyte(c, op+1);
2139 }
2140 else {
2141 com_node(c, CHILD(n, 1));
2142 com_addbyte(c, op+2);
2143 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 }
2146 else {
2147 com_node(c, CHILD(n, 0));
2148 com_node(c, CHILD(n, 2));
2149 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002150 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 }
2152}
2153
Guido van Rossum635abd21997-01-06 22:56:52 +00002154static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002155com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2156{
2157 if (NCH(n) == 1) {
2158 com_addbyte(c, DUP_TOP);
2159 com_push(c, 1);
2160 com_addbyte(c, SLICE);
2161 com_node(c, augn);
2162 com_addbyte(c, opcode);
2163 com_pop(c, 1);
2164 com_addbyte(c, ROT_TWO);
2165 com_addbyte(c, STORE_SLICE);
2166 com_pop(c, 2);
2167 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2168 com_node(c, CHILD(n, 0));
2169 com_addoparg(c, DUP_TOPX, 2);
2170 com_push(c, 2);
2171 com_addbyte(c, SLICE+1);
2172 com_pop(c, 1);
2173 com_node(c, augn);
2174 com_addbyte(c, opcode);
2175 com_pop(c, 1);
2176 com_addbyte(c, ROT_THREE);
2177 com_addbyte(c, STORE_SLICE+1);
2178 com_pop(c, 3);
2179 } else if (NCH(n) == 2) {
2180 com_node(c, CHILD(n, 1));
2181 com_addoparg(c, DUP_TOPX, 2);
2182 com_push(c, 2);
2183 com_addbyte(c, SLICE+2);
2184 com_pop(c, 1);
2185 com_node(c, augn);
2186 com_addbyte(c, opcode);
2187 com_pop(c, 1);
2188 com_addbyte(c, ROT_THREE);
2189 com_addbyte(c, STORE_SLICE+2);
2190 com_pop(c, 3);
2191 } else {
2192 com_node(c, CHILD(n, 0));
2193 com_node(c, CHILD(n, 2));
2194 com_addoparg(c, DUP_TOPX, 3);
2195 com_push(c, 3);
2196 com_addbyte(c, SLICE+3);
2197 com_pop(c, 2);
2198 com_node(c, augn);
2199 com_addbyte(c, opcode);
2200 com_pop(c, 1);
2201 com_addbyte(c, ROT_FOUR);
2202 com_addbyte(c, STORE_SLICE+3);
2203 com_pop(c, 4);
2204 }
2205}
2206
2207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002209{
2210 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002211 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002212 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002213 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002215 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 }
2217 else {
2218 com_node(c, CHILD(n, 0));
2219 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002220 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002221 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002222 if (NCH(n) == 2) {
2223 com_generator_expression(c, n);
2224 return;
2225 }
2226
Guido van Rossumf10570b1995-07-07 22:53:21 +00002227 m = n;
2228 do {
2229 m = CHILD(m, 0);
2230 } while (NCH(m) == 1);
2231 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002232 /* f(lambda x: x[0] = 3) ends up getting parsed with
2233 * LHS test = lambda x: x[0], and RHS test = 3.
2234 * SF bug 132313 points out that complaining about a keyword
2235 * then is very confusing.
2236 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002238 TYPE(m) == lambdef ?
2239 "lambda cannot contain assignment" :
2240 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002241 }
2242 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002244 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002245 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002247 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002248 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002249 else if (*pkeywords == NULL) {
2250 c->c_errors++;
2251 Py_DECREF(v);
2252 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 if (PyDict_GetItem(*pkeywords, v) != NULL)
2254 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002255 "duplicate keyword argument");
2256 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002257 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002258 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002259 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002260 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002261 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002262 }
2263 }
2264 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002265}
2266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269{
2270 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002271 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 }
2273 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002275 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002276 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002277 int star_flag = 0;
2278 int starstar_flag = 0;
2279 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002280 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002281 na = 0;
2282 nk = 0;
2283 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002284 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002285 if (TYPE(ch) == STAR ||
2286 TYPE(ch) == DOUBLESTAR)
2287 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002288 if (ch->n_lineno != lineno) {
2289 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002290 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002291 }
2292 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002293 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002294 na++;
2295 else
2296 nk++;
2297 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002299 while (i < NCH(n)) {
2300 node *tok = CHILD(n, i);
2301 node *ch = CHILD(n, i+1);
2302 i += 3;
2303 switch (TYPE(tok)) {
2304 case STAR: star_flag = 1; break;
2305 case DOUBLESTAR: starstar_flag = 1; break;
2306 }
2307 com_node(c, ch);
2308 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_error(c, PyExc_SyntaxError,
2311 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002312 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002313 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002314 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002315 star_flag + (starstar_flag << 1);
2316 else
2317 opcode = CALL_FUNCTION;
2318 com_addoparg(c, opcode, na | (nk << 8));
2319 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 }
2321}
2322
2323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325{
2326 com_addopname(c, LOAD_ATTR, n);
2327}
2328
2329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002331{
2332 int i=0;
2333 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002334 node *ch;
2335
2336 /* first argument */
2337 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002340 i++;
2341 }
2342 else {
2343 com_node(c, CHILD(n,i));
2344 i++;
2345 REQ(CHILD(n,i),COLON);
2346 i++;
2347 }
2348 /* second argument */
2349 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2350 com_node(c, CHILD(n,i));
2351 i++;
2352 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_push(c, 1);
2356 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002357 /* remaining arguments */
2358 for (; i < NCH(n); i++) {
2359 ns++;
2360 ch=CHILD(n,i);
2361 REQ(ch, sliceop);
2362 if (NCH(ch) == 1) {
2363 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002365 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002366 }
2367 else
2368 com_node(c, CHILD(ch,1));
2369 }
2370 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002372}
2373
2374static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002375com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002376{
2377 node *ch;
2378 REQ(n, subscript);
2379 ch = CHILD(n,0);
2380 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002382 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_push(c, 1);
2384 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002385 else {
2386 /* check for slice */
2387 if ((TYPE(ch) == COLON || NCH(n) > 1))
2388 com_sliceobj(c, n);
2389 else {
2390 REQ(ch, test);
2391 com_node(c, ch);
2392 }
2393 }
2394}
2395
2396static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002397com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002398{
2399 int i, op;
2400 REQ(n, subscriptlist);
2401 /* Check to make backward compatible slice behavior for '[i:j]' */
2402 if (NCH(n) == 1) {
2403 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002404 /* 'Basic' slice, should have exactly one colon. */
2405 if ((TYPE(CHILD(sub, 0)) == COLON
2406 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2407 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2408 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002409 switch (assigning) {
2410 case OP_DELETE:
2411 op = DELETE_SLICE;
2412 break;
2413 case OP_ASSIGN:
2414 op = STORE_SLICE;
2415 break;
2416 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002417 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 break;
2419 default:
2420 com_augassign_slice(c, sub, assigning, augn);
2421 return;
2422 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002423 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002424 if (op == STORE_SLICE)
2425 com_pop(c, 2);
2426 else if (op == DELETE_SLICE)
2427 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002428 return;
2429 }
2430 }
2431 /* Else normal subscriptlist. Compile each subscript. */
2432 for (i = 0; i < NCH(n); i += 2)
2433 com_subscript(c, CHILD(n, i));
2434 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 if (NCH(n) > 1) {
2436 i = (NCH(n)+1) / 2;
2437 com_addoparg(c, BUILD_TUPLE, i);
2438 com_pop(c, i-1);
2439 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002440 switch (assigning) {
2441 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 op = DELETE_SUBSCR;
2443 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002444 break;
2445 default:
2446 case OP_ASSIGN:
2447 op = STORE_SUBSCR;
2448 i = 3;
2449 break;
2450 case OP_APPLY:
2451 op = BINARY_SUBSCR;
2452 i = 1;
2453 break;
2454 }
2455 if (assigning > OP_APPLY) {
2456 com_addoparg(c, DUP_TOPX, 2);
2457 com_push(c, 2);
2458 com_addbyte(c, BINARY_SUBSCR);
2459 com_pop(c, 1);
2460 com_node(c, augn);
2461 com_addbyte(c, assigning);
2462 com_pop(c, 1);
2463 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002465 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002467}
2468
2469static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002470com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471{
2472 REQ(n, trailer);
2473 switch (TYPE(CHILD(n, 0))) {
2474 case LPAR:
2475 com_call_function(c, CHILD(n, 1));
2476 break;
2477 case DOT:
2478 com_select_member(c, CHILD(n, 1));
2479 break;
2480 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002481 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 break;
2483 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002485 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 }
2487}
2488
2489static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002490com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002491{
2492 int i;
2493 REQ(n, power);
2494 com_atom(c, CHILD(n, 0));
2495 for (i = 1; i < NCH(n); i++) {
2496 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2497 com_factor(c, CHILD(n, i+1));
2498 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002500 break;
2501 }
2502 else
2503 com_apply_trailer(c, CHILD(n, i));
2504 }
2505}
2506
2507static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002508com_invert_constant(struct compiling *c, node *n)
2509{
2510 /* Compute the inverse of int and longs and use them directly,
2511 but be prepared to generate code for all other
2512 possibilities (invalid numbers, floats, complex).
2513 */
2514 PyObject *num, *inv = NULL;
2515 int i;
2516
2517 REQ(n, NUMBER);
2518 num = parsenumber(c, STR(n));
2519 if (num == NULL)
2520 i = 255;
2521 else {
2522 inv = PyNumber_Invert(num);
2523 if (inv == NULL) {
2524 PyErr_Clear();
2525 i = com_addconst(c, num);
2526 } else {
2527 i = com_addconst(c, inv);
2528 Py_DECREF(inv);
2529 }
2530 Py_DECREF(num);
2531 }
2532 com_addoparg(c, LOAD_CONST, i);
2533 com_push(c, 1);
2534 if (num != NULL && inv == NULL)
2535 com_addbyte(c, UNARY_INVERT);
2536}
2537
Tim Peters51e26512001-09-07 08:45:55 +00002538static int
2539is_float_zero(const char *p)
2540{
2541 int found_radix_point = 0;
2542 int ch;
2543 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2544 switch (ch) {
2545 case '0':
2546 /* no reason to believe it's not 0 -- continue */
2547 break;
2548
2549 case 'e': case 'E': case 'j': case 'J':
2550 /* If this was a hex constant, we already would have
2551 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2552 must be an exponent marker, and we haven't yet
2553 seen a non-zero digit, and it doesn't matter what
2554 the exponent is then. For 'j' or 'J' similarly,
2555 except that this is an imaginary 0 then. */
2556 return 1;
2557
2558 case '.':
2559 found_radix_point = 1;
2560 break;
2561
2562 default:
2563 return 0;
2564 }
2565 }
2566 return found_radix_point;
2567}
2568
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002572 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002573 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002575 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002576 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002577 approriate value as a constant. If the value is negative,
2578 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002579 negative in the 0th position -- unless we're doing unary minus
2580 of a floating zero! In that case the sign is significant, but
2581 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002582 */
2583 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002584 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002585 && TYPE((pfactor = CHILD(n, 1))) == factor
2586 && NCH(pfactor) == 1
2587 && TYPE((ppower = CHILD(pfactor, 0))) == power
2588 && NCH(ppower) == 1
2589 && TYPE((patom = CHILD(ppower, 0))) == atom
2590 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002591 && !(childtype == MINUS &&
2592 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002593 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002594 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002595 return;
2596 }
2597 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002598 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002599 if (s == NULL) {
2600 com_error(c, PyExc_MemoryError, "");
2601 com_addbyte(c, 255);
2602 return;
2603 }
2604 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002605 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002606 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002607 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002608 }
Tim Peters51e26512001-09-07 08:45:55 +00002609 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002610 }
2611 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 com_factor(c, CHILD(n, 1));
2613 com_addbyte(c, UNARY_POSITIVE);
2614 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002615 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 com_factor(c, CHILD(n, 1));
2617 com_addbyte(c, UNARY_NEGATIVE);
2618 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002619 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002620 com_factor(c, CHILD(n, 1));
2621 com_addbyte(c, UNARY_INVERT);
2622 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002624 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 }
2626}
2627
2628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
2631 int i;
2632 int op;
2633 REQ(n, term);
2634 com_factor(c, CHILD(n, 0));
2635 for (i = 2; i < NCH(n); i += 2) {
2636 com_factor(c, CHILD(n, i));
2637 switch (TYPE(CHILD(n, i-1))) {
2638 case STAR:
2639 op = BINARY_MULTIPLY;
2640 break;
2641 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002642 if (c->c_flags & CO_FUTURE_DIVISION)
2643 op = BINARY_TRUE_DIVIDE;
2644 else
2645 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 break;
2647 case PERCENT:
2648 op = BINARY_MODULO;
2649 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002650 case DOUBLESLASH:
2651 op = BINARY_FLOOR_DIVIDE;
2652 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002654 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002655 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002656 op = 255;
2657 }
2658 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002660 }
2661}
2662
2663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002665{
2666 int i;
2667 int op;
2668 REQ(n, arith_expr);
2669 com_term(c, CHILD(n, 0));
2670 for (i = 2; i < NCH(n); i += 2) {
2671 com_term(c, CHILD(n, i));
2672 switch (TYPE(CHILD(n, i-1))) {
2673 case PLUS:
2674 op = BINARY_ADD;
2675 break;
2676 case MINUS:
2677 op = BINARY_SUBTRACT;
2678 break;
2679 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002680 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002681 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002682 op = 255;
2683 }
2684 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002685 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002686 }
2687}
2688
2689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002690com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002691{
2692 int i;
2693 int op;
2694 REQ(n, shift_expr);
2695 com_arith_expr(c, CHILD(n, 0));
2696 for (i = 2; i < NCH(n); i += 2) {
2697 com_arith_expr(c, CHILD(n, i));
2698 switch (TYPE(CHILD(n, i-1))) {
2699 case LEFTSHIFT:
2700 op = BINARY_LSHIFT;
2701 break;
2702 case RIGHTSHIFT:
2703 op = BINARY_RSHIFT;
2704 break;
2705 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002707 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002708 op = 255;
2709 }
2710 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002712 }
2713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002717{
2718 int i;
2719 int op;
2720 REQ(n, and_expr);
2721 com_shift_expr(c, CHILD(n, 0));
2722 for (i = 2; i < NCH(n); i += 2) {
2723 com_shift_expr(c, CHILD(n, i));
2724 if (TYPE(CHILD(n, i-1)) == AMPER) {
2725 op = BINARY_AND;
2726 }
2727 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002729 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002730 op = 255;
2731 }
2732 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002733 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002734 }
2735}
2736
2737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002739{
2740 int i;
2741 int op;
2742 REQ(n, xor_expr);
2743 com_and_expr(c, CHILD(n, 0));
2744 for (i = 2; i < NCH(n); i += 2) {
2745 com_and_expr(c, CHILD(n, i));
2746 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2747 op = BINARY_XOR;
2748 }
2749 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002750 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002751 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 op = 255;
2753 }
2754 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 }
2757}
2758
2759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761{
2762 int i;
2763 int op;
2764 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002765 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002767 com_xor_expr(c, CHILD(n, i));
2768 if (TYPE(CHILD(n, i-1)) == VBAR) {
2769 op = BINARY_OR;
2770 }
2771 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002773 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 op = 255;
2775 }
2776 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 }
2779}
2780
2781static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002782cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783{
2784 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002785 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2787 if (NCH(n) == 1) {
2788 n = CHILD(n, 0);
2789 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002790 case LESS: return PyCmp_LT;
2791 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002792 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002793 case LESSEQUAL: return PyCmp_LE;
2794 case GREATEREQUAL: return PyCmp_GE;
2795 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2796 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2797 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 }
2799 }
2800 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002803 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002805 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 }
2807 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002808 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
2810
2811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
2814 int i;
2815 enum cmp_op op;
2816 int anchor;
2817 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2818 com_expr(c, CHILD(n, 0));
2819 if (NCH(n) == 1)
2820 return;
2821
2822 /****************************************************************
2823 The following code is generated for all but the last
2824 comparison in a chain:
2825
2826 label: on stack: opcode: jump to:
2827
2828 a <code to load b>
2829 a, b DUP_TOP
2830 a, b, b ROT_THREE
2831 b, a, b COMPARE_OP
2832 b, 0-or-1 JUMP_IF_FALSE L1
2833 b, 1 POP_TOP
2834 b
2835
2836 We are now ready to repeat this sequence for the next
2837 comparison in the chain.
2838
2839 For the last we generate:
2840
2841 b <code to load c>
2842 b, c COMPARE_OP
2843 0-or-1
2844
2845 If there were any jumps to L1 (i.e., there was more than one
2846 comparison), we generate:
2847
2848 0-or-1 JUMP_FORWARD L2
2849 L1: b, 0 ROT_TWO
2850 0, b POP_TOP
2851 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 ****************************************************************/
2854
2855 anchor = 0;
2856
2857 for (i = 2; i < NCH(n); i += 2) {
2858 com_expr(c, CHILD(n, i));
2859 if (i+2 < NCH(n)) {
2860 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, ROT_THREE);
2863 }
2864 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002865 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002867 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 }
2869 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 if (i+2 < NCH(n)) {
2872 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2873 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 }
2876 }
2877
2878 if (anchor) {
2879 int anchor2 = 0;
2880 com_addfwref(c, JUMP_FORWARD, &anchor2);
2881 com_backpatch(c, anchor);
2882 com_addbyte(c, ROT_TWO);
2883 com_addbyte(c, POP_TOP);
2884 com_backpatch(c, anchor2);
2885 }
2886}
2887
2888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002889com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890{
2891 REQ(n, not_test); /* 'not' not_test | comparison */
2892 if (NCH(n) == 1) {
2893 com_comparison(c, CHILD(n, 0));
2894 }
2895 else {
2896 com_not_test(c, CHILD(n, 1));
2897 com_addbyte(c, UNARY_NOT);
2898 }
2899}
2900
2901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903{
2904 int i;
2905 int anchor;
2906 REQ(n, and_test); /* not_test ('and' not_test)* */
2907 anchor = 0;
2908 i = 0;
2909 for (;;) {
2910 com_not_test(c, CHILD(n, i));
2911 if ((i += 2) >= NCH(n))
2912 break;
2913 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2914 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002915 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 }
2917 if (anchor)
2918 com_backpatch(c, anchor);
2919}
2920
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002921static int
2922com_make_closure(struct compiling *c, PyCodeObject *co)
2923{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002924 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002925 if (free == 0)
2926 return 0;
2927 for (i = 0; i < free; ++i) {
2928 /* Bypass com_addop_varname because it will generate
2929 LOAD_DEREF but LOAD_CLOSURE is needed.
2930 */
2931 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2932 int arg, reftype;
2933
2934 /* Special case: If a class contains a method with a
2935 free variable that has the same name as a method,
2936 the name will be considered free *and* local in the
2937 class. It should be handled by the closure, as
2938 well as by the normal name loookup logic.
2939 */
2940 reftype = get_ref_type(c, PyString_AS_STRING(name));
2941 if (reftype == CELL)
2942 arg = com_lookup_arg(c->c_cellvars, name);
2943 else /* (reftype == FREE) */
2944 arg = com_lookup_arg(c->c_freevars, name);
2945 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002946 fprintf(stderr, "lookup %s in %s %d %d\n"
2947 "freevars of %s: %s\n",
2948 PyObject_REPR(name),
2949 c->c_name,
2950 reftype, arg,
2951 PyString_AS_STRING(co->co_name),
2952 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002953 Py_FatalError("com_make_closure()");
2954 }
2955 com_addoparg(c, LOAD_CLOSURE, arg);
2956
2957 }
2958 com_push(c, free);
2959 return 1;
2960}
2961
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002963com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002966 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002967 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002968 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002969 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002970 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2971 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002972 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002973 if (co == NULL) {
2974 c->c_errors++;
2975 return;
2976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002977 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002978 i = com_addconst(c, (PyObject *)co);
2979 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002980 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002981 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002982 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002983 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002984 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002985 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002986 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002987 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002990 else {
2991 int anchor = 0;
2992 int i = 0;
2993 for (;;) {
2994 com_and_test(c, CHILD(n, i));
2995 if ((i += 2) >= NCH(n))
2996 break;
2997 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2998 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003000 }
3001 if (anchor)
3002 com_backpatch(c, anchor);
3003 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004}
3005
3006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003007com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008{
3009 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003010 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 com_node(c, CHILD(n, 0));
3012 }
3013 else {
3014 int i;
3015 int len;
3016 len = (NCH(n) + 1) / 2;
3017 for (i = 0; i < NCH(n); i += 2)
3018 com_node(c, CHILD(n, i));
3019 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 }
3022}
3023
3024
3025/* Begin of assignment compilation */
3026
Thomas Wouters434d0822000-08-24 20:11:32 +00003027
3028static void
3029com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3030{
3031 com_addbyte(c, DUP_TOP);
3032 com_push(c, 1);
3033 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003034 com_node(c, augn);
3035 com_addbyte(c, opcode);
3036 com_pop(c, 1);
3037 com_addbyte(c, ROT_TWO);
3038 com_addopname(c, STORE_ATTR, n);
3039 com_pop(c, 2);
3040}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041
3042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003045 if (none_assignment_check(c, STR(n), assigning))
3046 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049}
3050
3051static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003052com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 REQ(n, trailer);
3055 switch (TYPE(CHILD(n, 0))) {
3056 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003057 if (assigning == OP_DELETE)
3058 com_error(c, PyExc_SyntaxError,
3059 "can't delete function call");
3060 else
3061 com_error(c, PyExc_SyntaxError,
3062 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063 break;
3064 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003065 if (assigning > OP_APPLY)
3066 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3067 else
3068 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003070 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003071 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 break;
3073 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003074 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075 }
3076}
3077
3078static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003079com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080{
3081 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003082 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3083 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 if (assigning) {
3086 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003087 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003088 com_push(c, i-1);
3089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003091 com_assign(c, CHILD(n, i), assigning, NULL);
3092}
3093
3094static void
3095com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3096{
3097 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003098 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003099 com_push(c, 1);
3100 com_node(c, augn);
3101 com_addbyte(c, opcode);
3102 com_pop(c, 1);
3103 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104}
3105
3106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003107com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108{
3109 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003110 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 if (assigning)
3112 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113}
3114
3115static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003116com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117{
3118 /* Loop to avoid trivial recursion */
3119 for (;;) {
3120 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003121
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 case exprlist:
3123 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003124 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003125 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003127 if (TYPE(CHILD(n, 1)) == gen_for) {
3128 com_error(c, PyExc_SystemError,
3129 "assign to generator expression not possible");
3130 return;
3131 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003132 if (assigning > OP_APPLY) {
3133 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003134 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003135 return;
3136 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003137 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 return;
3139 }
3140 n = CHILD(n, 0);
3141 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 case test:
3144 case and_test:
3145 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003148 case xor_expr:
3149 case and_expr:
3150 case shift_expr:
3151 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003153 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003155 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003156 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 return;
3158 }
3159 n = CHILD(n, 0);
3160 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003161
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003162 case power: /* atom trailer* ('**' power)*
3163 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003164 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003165 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003166 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 return;
3168 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003169 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170 int i;
3171 com_node(c, CHILD(n, 0));
3172 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003173 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003174 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003175 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003176 return;
3177 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 com_apply_trailer(c, CHILD(n, i));
3179 } /* NB i is still alive */
3180 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003181 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 return;
3183 }
3184 n = CHILD(n, 0);
3185 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003186
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187 case atom:
3188 switch (TYPE(CHILD(n, 0))) {
3189 case LPAR:
3190 n = CHILD(n, 1);
3191 if (TYPE(n) == RPAR) {
3192 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003194 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 return;
3196 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003197 if (assigning > OP_APPLY) {
3198 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003199 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003200 return;
3201 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 break;
3203 case LSQB:
3204 n = CHILD(n, 1);
3205 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003207 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 return;
3209 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003210 if (assigning > OP_APPLY) {
3211 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003212 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003213 return;
3214 }
3215 if (NCH(n) > 1
3216 && TYPE(CHILD(n, 1)) == list_for) {
3217 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003218 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003219 return;
3220 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003221 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 return;
3223 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003224 if (assigning > OP_APPLY)
3225 com_augassign_name(c, CHILD(n, 0),
3226 assigning, augn);
3227 else
3228 com_assign_name(c, CHILD(n, 0),
3229 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 return;
3231 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003233 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 return;
3235 }
3236 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003237
3238 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_error(c, PyExc_SyntaxError,
3240 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003241 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003242
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003244 com_error(c, PyExc_SystemError,
3245 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003247
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 }
3249 }
3250}
Guido van Rossum7c531111997-03-11 18:42:21 +00003251
Thomas Wouters434d0822000-08-24 20:11:32 +00003252static void
3253com_augassign(struct compiling *c, node *n)
3254{
3255 int opcode;
3256
3257 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3258 case '+': opcode = INPLACE_ADD; break;
3259 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003260 case '/':
3261 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3262 opcode = INPLACE_FLOOR_DIVIDE;
3263 else if (c->c_flags & CO_FUTURE_DIVISION)
3264 opcode = INPLACE_TRUE_DIVIDE;
3265 else
3266 opcode = INPLACE_DIVIDE;
3267 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003268 case '%': opcode = INPLACE_MODULO; break;
3269 case '<': opcode = INPLACE_LSHIFT; break;
3270 case '>': opcode = INPLACE_RSHIFT; break;
3271 case '&': opcode = INPLACE_AND; break;
3272 case '^': opcode = INPLACE_XOR; break;
3273 case '|': opcode = INPLACE_OR; break;
3274 case '*':
3275 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3276 opcode = INPLACE_POWER;
3277 else
3278 opcode = INPLACE_MULTIPLY;
3279 break;
3280 default:
3281 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3282 return;
3283 }
3284 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3285}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289{
Thomas Wouters434d0822000-08-24 20:11:32 +00003290 REQ(n, expr_stmt);
3291 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003293 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003295 if (NCH(n) == 1) {
3296 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297 if (c->c_interactive)
3298 com_addbyte(c, PRINT_EXPR);
3299 else
3300 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003301 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003303 else if (TYPE(CHILD(n,1)) == augassign)
3304 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 else {
3306 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003307 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003308 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
3312 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003313 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 }
3315 }
3316}
3317
3318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003320{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003321 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003322 int i;
3323 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003324 if (Py_OptimizeFlag)
3325 return;
3326 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003327
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003328 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003329 raise AssertionError [, <message>]
3330
3331 where <message> is the second test, if present.
3332 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003333 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003334 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003335 com_addbyte(c, POP_TOP);
3336 com_pop(c, 1);
3337 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003338 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003339 com_push(c, 1);
3340 i = NCH(n)/2; /* Either 2 or 4 */
3341 if (i > 1)
3342 com_node(c, CHILD(n, 3));
3343 com_addoparg(c, RAISE_VARARGS, i);
3344 com_pop(c, i);
3345 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003346 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003347 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003348 com_addbyte(c, POP_TOP);
3349}
3350
3351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003352com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003354 int i = 1;
3355 node* stream = NULL;
3356
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003357 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003358
3359 /* are we using the extended print form? */
3360 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3361 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003362 com_node(c, stream);
3363 /* stack: [...] => [... stream] */
3364 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003365 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3366 i = 4;
3367 else
3368 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003370 for (; i < NCH(n); i += 2) {
3371 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003372 com_addbyte(c, DUP_TOP);
3373 /* stack: [stream] => [stream stream] */
3374 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003375 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003376 /* stack: [stream stream] => [stream stream obj] */
3377 com_addbyte(c, ROT_TWO);
3378 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003379 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003380 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003381 com_pop(c, 2);
3382 }
3383 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003384 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003385 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003386 com_addbyte(c, PRINT_ITEM);
3387 com_pop(c, 1);
3388 }
3389 }
3390 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003391 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003392 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003393 /* must pop the extra stream object off the stack */
3394 com_addbyte(c, POP_TOP);
3395 /* stack: [... stream] => [...] */
3396 com_pop(c, 1);
3397 }
3398 }
3399 else {
3400 if (stream != NULL) {
3401 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003402 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003403 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003404 com_pop(c, 1);
3405 }
3406 else
3407 com_addbyte(c, PRINT_NEWLINE);
3408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
3410
3411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003412com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003414 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003415 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003418 if (c->c_flags & CO_GENERATOR) {
3419 if (NCH(n) > 1) {
3420 com_error(c, PyExc_SyntaxError,
3421 "'return' with argument inside generator");
3422 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003423 }
3424 if (NCH(n) < 2) {
3425 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003426 com_push(c, 1);
3427 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003428 else
3429 com_node(c, CHILD(n, 1));
3430 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003431 com_pop(c, 1);
3432}
3433
3434static void
3435com_yield_stmt(struct compiling *c, node *n)
3436{
Tim Peters95c80f82001-06-23 02:07:08 +00003437 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003438 REQ(n, yield_stmt); /* 'yield' testlist */
3439 if (!c->c_infunction) {
3440 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3441 }
Tim Peters95c80f82001-06-23 02:07:08 +00003442
3443 for (i = 0; i < c->c_nblocks; ++i) {
3444 if (c->c_block[i] == SETUP_FINALLY) {
3445 com_error(c, PyExc_SyntaxError,
3446 "'yield' not allowed in a 'try' block "
3447 "with a 'finally' clause");
3448 return;
3449 }
3450 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003451 com_node(c, CHILD(n, 1));
3452 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003453 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454}
3455
3456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003460 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3461 if (NCH(n) > 1) {
3462 com_node(c, CHILD(n, 1));
3463 if (NCH(n) > 3) {
3464 com_node(c, CHILD(n, 3));
3465 if (NCH(n) > 5)
3466 com_node(c, CHILD(n, 5));
3467 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003468 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 i = NCH(n)/2;
3470 com_addoparg(c, RAISE_VARARGS, i);
3471 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472}
3473
3474static void
Thomas Wouters52152252000-08-17 22:55:00 +00003475com_from_import(struct compiling *c, node *n)
3476{
3477 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3478 com_push(c, 1);
3479 if (NCH(n) > 1) {
3480 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3481 com_error(c, PyExc_SyntaxError, "invalid syntax");
3482 return;
3483 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003484 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003485 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003486 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003487 com_pop(c, 1);
3488}
3489
3490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003491com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492{
3493 int i;
3494 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003495 /* 'import' dotted_name (',' dotted_name)* |
3496 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003497 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003498 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003499 /* 'from' dotted_name 'import' ... */
3500 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003501
3502 if (TYPE(CHILD(n, 3)) == STAR) {
3503 tup = Py_BuildValue("(s)", "*");
3504 } else {
3505 tup = PyTuple_New((NCH(n) - 2)/2);
3506 for (i = 3; i < NCH(n); i += 2) {
3507 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003508 PyString_FromString(STR(
3509 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003510 }
3511 }
3512 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003513 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003514 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003515 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003516 if (TYPE(CHILD(n, 3)) == STAR)
3517 com_addbyte(c, IMPORT_STAR);
3518 else {
3519 for (i = 3; i < NCH(n); i += 2)
3520 com_from_import(c, CHILD(n, i));
3521 com_addbyte(c, POP_TOP);
3522 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003524 }
3525 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003526 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003527 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003528 node *subn = CHILD(n, i);
3529 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003530 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003531 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003532 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003533 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003534 int j;
3535 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003536 com_error(c, PyExc_SyntaxError,
3537 "invalid syntax");
3538 return;
3539 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003540 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3541 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003542 CHILD(CHILD(subn, 0),
3543 j));
3544 com_addop_varname(c, VAR_STORE,
3545 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003546 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003547 com_addop_varname(c, VAR_STORE,
3548 STR(CHILD(CHILD(subn, 0),
3549 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003550 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003551 }
3552 }
3553}
3554
3555static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003556com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003557{
3558 REQ(n, exec_stmt);
3559 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3560 com_node(c, CHILD(n, 1));
3561 if (NCH(n) >= 4)
3562 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003563 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003564 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 com_push(c, 1);
3566 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003567 if (NCH(n) >= 6)
3568 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003569 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003570 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003571 com_push(c, 1);
3572 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003573 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003575}
3576
Guido van Rossum7c531111997-03-11 18:42:21 +00003577static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003578is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003579{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003580 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003581 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003582 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003583
3584 /* Label to avoid tail recursion */
3585 next:
3586 switch (TYPE(n)) {
3587
3588 case suite:
3589 if (NCH(n) == 1) {
3590 n = CHILD(n, 0);
3591 goto next;
3592 }
3593 /* Fall through */
3594 case file_input:
3595 for (i = 0; i < NCH(n); i++) {
3596 node *ch = CHILD(n, i);
3597 if (TYPE(ch) == stmt) {
3598 n = ch;
3599 goto next;
3600 }
3601 }
3602 break;
3603
3604 case stmt:
3605 case simple_stmt:
3606 case small_stmt:
3607 n = CHILD(n, 0);
3608 goto next;
3609
3610 case expr_stmt:
3611 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003612 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003613 case test:
3614 case and_test:
3615 case not_test:
3616 case comparison:
3617 case expr:
3618 case xor_expr:
3619 case and_expr:
3620 case shift_expr:
3621 case arith_expr:
3622 case term:
3623 case factor:
3624 case power:
3625 case atom:
3626 if (NCH(n) == 1) {
3627 n = CHILD(n, 0);
3628 goto next;
3629 }
3630 break;
3631
3632 case NAME:
3633 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3634 return 1;
3635 break;
3636
3637 case NUMBER:
3638 v = parsenumber(c, STR(n));
3639 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003640 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003641 break;
3642 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003643 i = PyObject_IsTrue(v);
3644 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003645 return i == 0;
3646
3647 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003648 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003649 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003650 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003651 break;
3652 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003653 i = PyObject_IsTrue(v);
3654 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003655 return i == 0;
3656
3657 }
3658 return 0;
3659}
3660
Tim Peters08a898f2001-06-28 01:52:22 +00003661
3662/* Look under n for a return stmt with an expression.
3663 * This hack is used to find illegal returns under "if 0:" blocks in
3664 * functions already known to be generators (as determined by the symtable
3665 * pass).
3666 * Return the offending return node if found, else NULL.
3667 */
3668static node *
3669look_for_offending_return(node *n)
3670{
3671 int i;
3672
3673 for (i = 0; i < NCH(n); ++i) {
3674 node *kid = CHILD(n, i);
3675
3676 switch (TYPE(kid)) {
3677 case classdef:
3678 case funcdef:
3679 case lambdef:
3680 /* Stuff in nested functions & classes doesn't
3681 affect the code block we started in. */
3682 return NULL;
3683
3684 case return_stmt:
3685 if (NCH(kid) > 1)
3686 return kid;
3687 break;
3688
3689 default: {
3690 node *bad = look_for_offending_return(kid);
3691 if (bad != NULL)
3692 return bad;
3693 }
3694 }
3695 }
3696
3697 return NULL;
3698}
3699
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003700static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003701com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003702{
3703 int i;
3704 int anchor = 0;
3705 REQ(n, if_stmt);
3706 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3707 for (i = 0; i+3 < NCH(n); i+=4) {
3708 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003709 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003710 if (is_constant_false(c, ch)) {
3711 /* We're going to skip this block. However, if this
3712 is a generator, we have to check the dead code
3713 anyway to make sure there aren't any return stmts
3714 with expressions, in the same scope. */
3715 if (c->c_flags & CO_GENERATOR) {
3716 node *p = look_for_offending_return(n);
3717 if (p != NULL) {
3718 int savelineno = c->c_lineno;
3719 c->c_lineno = p->n_lineno;
3720 com_error(c, PyExc_SyntaxError,
3721 "'return' with argument "
3722 "inside generator");
3723 c->c_lineno = savelineno;
3724 }
3725 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003726 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003727 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003728 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003729 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003730 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003731 com_addfwref(c, JUMP_IF_FALSE, &a);
3732 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734 com_node(c, CHILD(n, i+3));
3735 com_addfwref(c, JUMP_FORWARD, &anchor);
3736 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003737 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 com_addbyte(c, POP_TOP);
3739 }
3740 if (i+2 < NCH(n))
3741 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003742 if (anchor)
3743 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744}
3745
3746static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003747com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748{
3749 int break_anchor = 0;
3750 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003751 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3753 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003754 block_push(c, SETUP_LOOP);
3755 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003756 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 com_node(c, CHILD(n, 1));
3758 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3759 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003760 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003761 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003763 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003764 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3765 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003767 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 com_addbyte(c, POP_TOP);
3769 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003770 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003771 if (NCH(n) > 4)
3772 com_node(c, CHILD(n, 6));
3773 com_backpatch(c, break_anchor);
3774}
3775
3776static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003777com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 int break_anchor = 0;
3780 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003781 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 REQ(n, for_stmt);
3783 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3784 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003785 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003786 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003787 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003788 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003789 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003790 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003791 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003792 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003793 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003795 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003796 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3797 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003799 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003800 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003801 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003802 if (NCH(n) > 8)
3803 com_node(c, CHILD(n, 8));
3804 com_backpatch(c, break_anchor);
3805}
3806
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003807/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003808
3809 SETUP_FINALLY L
3810 <code for S>
3811 POP_BLOCK
3812 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003813 L: <code for Sf>
3814 END_FINALLY
3815
3816 The special instructions use the block stack. Each block
3817 stack entry contains the instruction that created it (here
3818 SETUP_FINALLY), the level of the value stack at the time the
3819 block stack entry was created, and a label (here L).
3820
3821 SETUP_FINALLY:
3822 Pushes the current value stack level and the label
3823 onto the block stack.
3824 POP_BLOCK:
3825 Pops en entry from the block stack, and pops the value
3826 stack until its level is the same as indicated on the
3827 block stack. (The label is ignored.)
3828 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003829 Pops a variable number of entries from the *value* stack
3830 and re-raises the exception they specify. The number of
3831 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003832
3833 The block stack is unwound when an exception is raised:
3834 when a SETUP_FINALLY entry is found, the exception is pushed
3835 onto the value stack (and the exception condition is cleared),
3836 and the interpreter jumps to the label gotten from the block
3837 stack.
3838
3839 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003840 (The contents of the value stack is shown in [], with the top
3841 at the right; 'tb' is trace-back info, 'val' the exception's
3842 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003843
3844 Value stack Label Instruction Argument
3845 [] SETUP_EXCEPT L1
3846 [] <code for S>
3847 [] POP_BLOCK
3848 [] JUMP_FORWARD L0
3849
Guido van Rossum3f5da241990-12-20 15:06:42 +00003850 [tb, val, exc] L1: DUP )
3851 [tb, val, exc, exc] <evaluate E1> )
3852 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3853 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3854 [tb, val, exc, 1] POP )
3855 [tb, val, exc] POP
3856 [tb, val] <assign to V1> (or POP if no V1)
3857 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003858 [] <code for S1>
3859 JUMP_FORWARD L0
3860
Guido van Rossum3f5da241990-12-20 15:06:42 +00003861 [tb, val, exc, 0] L2: POP
3862 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003863 .............................etc.......................
3864
Guido van Rossum3f5da241990-12-20 15:06:42 +00003865 [tb, val, exc, 0] Ln+1: POP
3866 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003867
3868 [] L0: <next statement>
3869
3870 Of course, parts are not generated if Vi or Ei is not present.
3871*/
3872
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003874com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003875{
3876 int except_anchor = 0;
3877 int end_anchor = 0;
3878 int else_anchor = 0;
3879 int i;
3880 node *ch;
3881
3882 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3883 block_push(c, SETUP_EXCEPT);
3884 com_node(c, CHILD(n, 2));
3885 com_addbyte(c, POP_BLOCK);
3886 block_pop(c, SETUP_EXCEPT);
3887 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3888 com_backpatch(c, except_anchor);
3889 for (i = 3;
3890 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3891 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003893 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003894 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003895 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003896 break;
3897 }
3898 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003900 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003901 if (NCH(ch) > 1) {
3902 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003904 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003905 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003906 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003907 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3908 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003909 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003910 }
3911 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003912 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003913 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003914 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003916 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003917 com_pop(c, 1);
3918 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003919 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003920 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003921 com_node(c, CHILD(n, i+2));
3922 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3923 if (except_anchor) {
3924 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003925 /* We come in with [tb, val, exc, 0] on the
3926 stack; one pop and it's the same as
3927 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003928 com_addbyte(c, POP_TOP);
3929 }
3930 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003931 /* We actually come in here with [tb, val, exc] but the
3932 END_FINALLY will zap those and jump around.
3933 The c_stacklevel does not reflect them so we need not pop
3934 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003935 com_addbyte(c, END_FINALLY);
3936 com_backpatch(c, else_anchor);
3937 if (i < NCH(n))
3938 com_node(c, CHILD(n, i+2));
3939 com_backpatch(c, end_anchor);
3940}
3941
3942static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003943com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003944{
3945 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003946 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003947
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003948 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3949 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003950 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003951 com_addbyte(c, POP_BLOCK);
3952 block_pop(c, SETUP_FINALLY);
3953 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003954 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003955 /* While the generated code pushes only one item,
3956 the try-finally handling can enter here with
3957 up to three items. OK, here are the details:
3958 3 for an exception, 2 for RETURN, 1 for BREAK. */
3959 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003960 com_backpatch(c, finally_anchor);
3961 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003962 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963 com_node(c, ch);
3964 com_addbyte(c, END_FINALLY);
3965 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003966 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003967}
3968
3969static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003970com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003971{
3972 REQ(n, try_stmt);
3973 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3974 | 'try' ':' suite 'finally' ':' suite */
3975 if (TYPE(CHILD(n, 3)) != except_clause)
3976 com_try_finally(c, n);
3977 else
3978 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003979}
3980
Guido van Rossum8b993a91997-01-17 21:04:03 +00003981static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003982get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003983{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003984 int i;
3985
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 /* Label to avoid tail recursion */
3987 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003988 switch (TYPE(n)) {
3989
3990 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 if (NCH(n) == 1) {
3992 n = CHILD(n, 0);
3993 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003994 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003996 case file_input:
3997 for (i = 0; i < NCH(n); i++) {
3998 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003999 if (TYPE(ch) == stmt) {
4000 n = ch;
4001 goto next;
4002 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004003 }
4004 break;
4005
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006 case stmt:
4007 case simple_stmt:
4008 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004009 n = CHILD(n, 0);
4010 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004011
4012 case expr_stmt:
4013 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004014 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004015 case test:
4016 case and_test:
4017 case not_test:
4018 case comparison:
4019 case expr:
4020 case xor_expr:
4021 case and_expr:
4022 case shift_expr:
4023 case arith_expr:
4024 case term:
4025 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004026 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004027 if (NCH(n) == 1) {
4028 n = CHILD(n, 0);
4029 goto next;
4030 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004031 break;
4032
4033 case atom:
4034 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004035 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004036 break;
4037
4038 }
4039 return NULL;
4040}
4041
Guido van Rossum79f25d91997-04-29 20:08:16 +00004042static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004043get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004044{
Guido van Rossum541563e1999-01-28 15:08:09 +00004045 /* Don't generate doc-strings if run with -OO */
4046 if (Py_OptimizeFlag > 1)
4047 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004048 n = get_rawdocstring(n);
4049 if (n == NULL)
4050 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004051 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004052}
4053
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004054static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004055com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004056{
4057 REQ(n, suite);
4058 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4059 if (NCH(n) == 1) {
4060 com_node(c, CHILD(n, 0));
4061 }
4062 else {
4063 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004064 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065 node *ch = CHILD(n, i);
4066 if (TYPE(ch) == stmt)
4067 com_node(c, ch);
4068 }
4069 }
4070}
4071
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004072/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004073static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004074com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004075{
4076 int i = c->c_nblocks;
4077 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4078 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4079 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004080 else if (i <= 0) {
4081 /* at the outer level */
4082 com_error(c, PyExc_SyntaxError,
4083 "'continue' not properly in loop");
4084 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004085 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004086 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004087 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004088 if (c->c_block[j] == SETUP_LOOP)
4089 break;
4090 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004091 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004092 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004093 for (; i > j; --i) {
4094 if (c->c_block[i] == SETUP_EXCEPT ||
4095 c->c_block[i] == SETUP_FINALLY) {
4096 com_addoparg(c, CONTINUE_LOOP,
4097 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004098 return;
4099 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004100 if (c->c_block[i] == END_FINALLY) {
4101 com_error(c, PyExc_SyntaxError,
4102 "'continue' not supported inside 'finally' clause");
4103 return;
4104 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004105 }
4106 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004107 com_error(c, PyExc_SyntaxError,
4108 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004109 }
4110 /* XXX Could allow it inside a 'finally' clause
4111 XXX if we could pop the exception still on the stack */
4112}
4113
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004114/* Return the number of default values in the argument list.
4115
4116 If a non-default argument follows a default argument, set an
4117 exception and return -1.
4118*/
4119
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004120static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004121com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004122{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004123 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004124 if (TYPE(n) == lambdef) {
4125 /* lambdef: 'lambda' [varargslist] ':' test */
4126 n = CHILD(n, 1);
4127 }
4128 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004129 REQ(n, funcdef);
4130 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4131 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004132 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4133 n = CHILD(n, 1);
4134 }
4135 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004136 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004137 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004138 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004139 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4140 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004141 ndefs = 0;
4142 for (i = 0; i < nch; i++) {
4143 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004144 if (TYPE(CHILD(n, i)) == STAR ||
4145 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004146 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004147 i++;
4148 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004149 t = RPAR; /* Anything except EQUAL or COMMA */
4150 else
4151 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004152 if (t == EQUAL) {
4153 i++;
4154 ndefs++;
4155 com_node(c, CHILD(n, i));
4156 i++;
4157 if (i >= nch)
4158 break;
4159 t = TYPE(CHILD(n, i));
4160 }
4161 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004162 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004163 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004164 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004165 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004166 return -1;
4167 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004168 }
4169 if (t != COMMA)
4170 break;
4171 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004172 return ndefs;
4173}
4174
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004175static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004176com_decorator_name(struct compiling *c, node *n)
4177{
4178 /* dotted_name: NAME ('.' NAME)* */
4179
4180 int i, nch;
4181 node *varname;
4182
4183 REQ(n, dotted_name);
4184 nch = NCH(n);
4185 assert(nch >= 1 && nch % 2 == 1);
4186
4187 varname = CHILD(n, 0);
4188 REQ(varname, NAME);
4189 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004190 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004191
4192 for (i = 1; i < nch; i += 2) {
4193 node *attrname;
4194
4195 REQ(CHILD(n, i), DOT);
4196
4197 attrname = CHILD(n, i + 1);
4198 REQ(attrname, NAME);
4199 com_addop_name(c, LOAD_ATTR, STR(attrname));
4200 }
4201}
4202
4203static void
4204com_decorator(struct compiling *c, node *n)
4205{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004206 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004207 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004208 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004209 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004210 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004211 com_decorator_name(c, CHILD(n, 1));
4212
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004213 if (nch > 3) {
4214 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004215 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004216 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004217 com_call_function(c, CHILD(n, 3));
4218 }
4219}
4220
4221static int
4222com_decorators(struct compiling *c, node *n)
4223{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004224 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004225
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004226 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004227 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004228 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004229
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004230 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004231 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004232 REQ(ch, decorator);
4233
4234 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004235 }
4236
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004237 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004238}
4239
4240static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004241com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004242{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004243 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004244 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004245
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004246 REQ(n, funcdef);
4247 /* -6 -5 -4 -3 -2 -1
4248 funcdef: [decorators] 'def' NAME parameters ':' suite */
4249
4250 if (NCH(n) == 6)
4251 ndecorators = com_decorators(c, CHILD(n, 0));
4252 else
4253 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004254
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004255 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004256 if (ndefs < 0)
4257 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004258 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004259 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004260 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004261 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004262 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263 c->c_errors++;
4264 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004265 int closure = com_make_closure(c, (PyCodeObject *)co);
4266 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004267 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004268 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004269 if (closure)
4270 com_addoparg(c, MAKE_CLOSURE, ndefs);
4271 else
4272 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004273 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004274
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004275 while (ndecorators > 0) {
4276 com_addoparg(c, CALL_FUNCTION, 1);
4277 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004278 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004279 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004280
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004281 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004282 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004283 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004284 }
4285}
4286
4287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004288com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004289{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004290 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004291 REQ(n, testlist);
4292 /* testlist: test (',' test)* [','] */
4293 for (i = 0; i < NCH(n); i += 2)
4294 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004295 i = (NCH(n)+1) / 2;
4296 com_addoparg(c, BUILD_TUPLE, i);
4297 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004298}
4299
4300static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004301com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004302{
Guido van Rossum25831651993-05-19 14:50:45 +00004303 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004304 PyObject *v;
4305 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004306 char *name;
4307
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004308 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004309 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004310 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004311 c->c_errors++;
4312 return;
4313 }
4314 /* Push the class name on the stack */
4315 i = com_addconst(c, v);
4316 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004317 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004318 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004319 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004320 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004321 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004322 com_push(c, 1);
4323 }
Guido van Rossum25831651993-05-19 14:50:45 +00004324 else
4325 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004327 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004328 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004329 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004330 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004331 c->c_errors++;
4332 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004333 int closure = com_make_closure(c, co);
4334 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004335 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004336 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004337 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004338 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004339 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004340 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004342 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004343 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004344 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004345 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004346 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004347 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004348 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004349}
4350
4351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004352com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004353{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004354 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004355 if (c->c_errors)
4356 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004357 switch (TYPE(n)) {
4358
4359 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004360
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004361 case funcdef:
4362 com_funcdef(c, n);
4363 break;
4364 case classdef:
4365 com_classdef(c, n);
4366 break;
4367
4368 /* Trivial parse tree nodes */
4369
4370 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004371 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004372 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004373 n = CHILD(n, 0);
4374 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004375
4376 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004377 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004378 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004379 {
4380 int i;
4381 for (i = 0; i < NCH(n)-1; i += 2)
4382 com_node(c, CHILD(n, i));
4383 }
4384 break;
4385
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004386 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004387 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004388 n = CHILD(n, 0);
4389 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004390
4391 /* Statement nodes */
4392
4393 case expr_stmt:
4394 com_expr_stmt(c, n);
4395 break;
4396 case print_stmt:
4397 com_print_stmt(c, n);
4398 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004399 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004400 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401 break;
4402 case pass_stmt:
4403 break;
4404 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004405 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004406 com_error(c, PyExc_SyntaxError,
4407 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004409 com_addbyte(c, BREAK_LOOP);
4410 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004411 case continue_stmt:
4412 com_continue_stmt(c, n);
4413 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004414 case return_stmt:
4415 com_return_stmt(c, n);
4416 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004417 case yield_stmt:
4418 com_yield_stmt(c, n);
4419 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004420 case raise_stmt:
4421 com_raise_stmt(c, n);
4422 break;
4423 case import_stmt:
4424 com_import_stmt(c, n);
4425 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004426 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004427 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004428 case exec_stmt:
4429 com_exec_stmt(c, n);
4430 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004431 case assert_stmt:
4432 com_assert_stmt(c, n);
4433 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004434 case if_stmt:
4435 com_if_stmt(c, n);
4436 break;
4437 case while_stmt:
4438 com_while_stmt(c, n);
4439 break;
4440 case for_stmt:
4441 com_for_stmt(c, n);
4442 break;
4443 case try_stmt:
4444 com_try_stmt(c, n);
4445 break;
4446 case suite:
4447 com_suite(c, n);
4448 break;
4449
4450 /* Expression nodes */
4451
4452 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004453 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004454 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004455 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004456 break;
4457 case test:
4458 com_test(c, n);
4459 break;
4460 case and_test:
4461 com_and_test(c, n);
4462 break;
4463 case not_test:
4464 com_not_test(c, n);
4465 break;
4466 case comparison:
4467 com_comparison(c, n);
4468 break;
4469 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004470 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004471 break;
4472 case expr:
4473 com_expr(c, n);
4474 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004475 case xor_expr:
4476 com_xor_expr(c, n);
4477 break;
4478 case and_expr:
4479 com_and_expr(c, n);
4480 break;
4481 case shift_expr:
4482 com_shift_expr(c, n);
4483 break;
4484 case arith_expr:
4485 com_arith_expr(c, n);
4486 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004487 case term:
4488 com_term(c, n);
4489 break;
4490 case factor:
4491 com_factor(c, n);
4492 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004493 case power:
4494 com_power(c, n);
4495 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004496 case atom:
4497 com_atom(c, n);
4498 break;
4499
4500 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004501 com_error(c, PyExc_SystemError,
4502 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503 }
4504}
4505
Tim Petersdbd9ba62000-07-09 03:09:57 +00004506static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004507
4508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004509com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004510{
4511 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4512 if (TYPE(CHILD(n, 0)) == LPAR)
4513 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004514 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004515 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004516 com_pop(c, 1);
4517 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004518}
4519
4520static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004521com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004522{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004523 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004524 if (NCH(n) == 1) {
4525 com_fpdef(c, CHILD(n, 0));
4526 }
4527 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004528 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004529 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004530 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004531 for (i = 0; i < NCH(n); i += 2)
4532 com_fpdef(c, CHILD(n, i));
4533 }
4534}
4535
4536static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004537com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004538{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004539 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004540 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004541 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004542 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004543 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004544 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004545 nch = NCH(n);
4546 /* Enter all arguments in table of locals */
4547 for (i = 0, narg = 0; i < nch; i++) {
4548 node *ch = CHILD(n, i);
4549 node *fp;
4550 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004551 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004552 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4553 fp = CHILD(ch, 0);
4554 if (TYPE(fp) != NAME) {
4555 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4556 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004557 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004558 narg++;
4559 /* all name updates handled by symtable */
4560 if (++i >= nch)
4561 break;
4562 ch = CHILD(n, i);
4563 if (TYPE(ch) == EQUAL)
4564 i += 2;
4565 else
4566 REQ(ch, COMMA);
4567 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004568 if (complex) {
4569 /* Generate code for complex arguments only after
4570 having counted the simple arguments */
4571 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004572 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004573 node *ch = CHILD(n, i);
4574 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004575 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004576 break;
4577 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4578 fp = CHILD(ch, 0);
4579 if (TYPE(fp) != NAME) {
4580 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004581 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004582 com_fpdef(c, ch);
4583 }
4584 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004585 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004586 break;
4587 ch = CHILD(n, i);
4588 if (TYPE(ch) == EQUAL)
4589 i += 2;
4590 else
4591 REQ(ch, COMMA);
4592 }
4593 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004594}
4595
4596static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004597com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004598{
4599 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004600 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004601 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004602 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004603 if (doc != NULL) {
4604 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004605 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004606 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004607 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004608 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004609 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004610 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004611 for (i = 0; i < NCH(n); i++) {
4612 node *ch = CHILD(n, i);
4613 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4614 com_node(c, ch);
4615 }
4616}
4617
4618/* Top-level compile-node interface */
4619
4620static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004621compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004622{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004623 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004624 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004625 REQ(n, funcdef);
4626 /* -6 -5 -4 -3 -2 -1
4627 funcdef: [decorators] 'def' NAME parameters ':' suite */
4628 c->c_name = STR(RCHILD(n, -4));
4629 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004630 if (doc != NULL) {
4631 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004632 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004633 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004634 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004635 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004636 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004637 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004638 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004639 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004640 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004641 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004642 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004643 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004644 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4645 com_push(c, 1);
4646 com_addbyte(c, RETURN_VALUE);
4647 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004648}
4649
4650static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004651compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004652{
Guido van Rossum590baa41993-11-30 13:40:46 +00004653 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004654 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004655 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004656
4657 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004658 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004659 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004660 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004661 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004662 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004663 else
4664 ch = CHILD(n, 2);
4665 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004666 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004667 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004668}
4669
4670static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004671compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004672{
4673 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004674 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004675 REQ(n, classdef);
4676 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4677 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004678 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004679 /* Initialize local __module__ from global __name__ */
4680 com_addop_name(c, LOAD_GLOBAL, "__name__");
4681 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004682 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004683 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004684 if (doc != NULL) {
4685 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004686 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004687 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004688 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004689 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004690 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004691 }
4692 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004693 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004694 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004695 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004696 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004697 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004698 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004699 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004700}
4701
4702static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004703compile_generator_expression(struct compiling *c, node *n)
4704{
4705 /* testlist_gexp: test gen_for */
4706 /* argument: test gen_for */
4707 REQ(CHILD(n, 0), test);
4708 REQ(CHILD(n, 1), gen_for);
4709
4710 c->c_name = "<generator expression>";
4711 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4712
4713 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4714 com_push(c, 1);
4715 com_addbyte(c, RETURN_VALUE);
4716 com_pop(c, 1);
4717}
4718
4719static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004720compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004721{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004722 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004723
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004724 switch (TYPE(n)) {
4725
Guido van Rossum4c417781991-01-21 16:09:22 +00004726 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004727 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004728 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004729 n = CHILD(n, 0);
4730 if (TYPE(n) != NEWLINE)
4731 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004732 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004733 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4734 com_push(c, 1);
4735 com_addbyte(c, RETURN_VALUE);
4736 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004737 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738 break;
4739
Guido van Rossum4c417781991-01-21 16:09:22 +00004740 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004741 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004742 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004743 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4744 com_push(c, 1);
4745 com_addbyte(c, RETURN_VALUE);
4746 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004747 break;
4748
Guido van Rossum590baa41993-11-30 13:40:46 +00004749 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004750 com_node(c, CHILD(n, 0));
4751 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004752 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004753 break;
4754
Guido van Rossum590baa41993-11-30 13:40:46 +00004755 case lambdef: /* anonymous function definition */
4756 compile_lambdef(c, n);
4757 break;
4758
Guido van Rossum4c417781991-01-21 16:09:22 +00004759 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004760 compile_funcdef(c, n);
4761 break;
4762
Guido van Rossum4c417781991-01-21 16:09:22 +00004763 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004764 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004765 break;
4766
Raymond Hettinger354433a2004-05-19 08:20:33 +00004767 case testlist_gexp: /* A generator expression */
4768 case argument: /* A generator expression */
4769 compile_generator_expression(c, n);
4770 break;
4771
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004772 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004773 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004774 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004775 }
4776}
4777
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004778static PyObject *
4779dict_keys_inorder(PyObject *dict, int offset)
4780{
4781 PyObject *tuple, *k, *v;
4782 int i, pos = 0, size = PyDict_Size(dict);
4783
4784 tuple = PyTuple_New(size);
4785 if (tuple == NULL)
4786 return NULL;
4787 while (PyDict_Next(dict, &pos, &k, &v)) {
4788 i = PyInt_AS_LONG(v);
4789 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004790 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004791 PyTuple_SET_ITEM(tuple, i - offset, k);
4792 }
4793 return tuple;
4794}
4795
Guido van Rossum79f25d91997-04-29 20:08:16 +00004796PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004797PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004798{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004799 return PyNode_CompileFlags(n, filename, NULL);
4800}
4801
4802PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004803PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004804{
4805 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004806}
4807
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004808struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004809PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004810{
4811 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004812 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004813
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004814 ff = PyNode_Future(n, filename);
4815 if (ff == NULL)
4816 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004817 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004818 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004819 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004820 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004821 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004822 return st;
4823}
4824
Guido van Rossum79f25d91997-04-29 20:08:16 +00004825static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004826icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004827{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004828 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004829}
4830
Guido van Rossum79f25d91997-04-29 20:08:16 +00004831static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004832jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004833 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004834{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004835 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004836 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004837 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004838 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004839 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4840 sc.c_encoding = "utf-8";
4841 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004842 sc.c_encoding = STR(n);
4843 n = CHILD(n, 0);
4844 } else {
4845 sc.c_encoding = NULL;
4846 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004847 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004848 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004849 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004850 /* c_symtable still points to parent's symbols */
4851 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004852 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004853 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004854 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004855 if (base->c_encoding != NULL) {
4856 assert(sc.c_encoding == NULL);
4857 sc.c_encoding = base->c_encoding;
4858 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004859 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004860 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004861 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004862 if (sc.c_future == NULL) {
4863 com_free(&sc);
4864 return NULL;
4865 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004866 if (flags) {
4867 int merged = sc.c_future->ff_features |
4868 flags->cf_flags;
4869 sc.c_future->ff_features = merged;
4870 flags->cf_flags = merged;
4871 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004872 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4873 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004874 com_free(&sc);
4875 return NULL;
4876 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004877 /* reset symbol table for second pass */
4878 sc.c_symtable->st_nscopes = 1;
4879 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004880 }
4881 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004882 if (symtable_load_symbols(&sc) < 0) {
4883 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004884 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004885 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004886 compile_node(&sc, n);
4887 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004888 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004890 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004891 consts = PyList_AsTuple(sc.c_consts);
4892 names = PyList_AsTuple(sc.c_names);
4893 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004894 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4895 freevars = dict_keys_inorder(sc.c_freevars,
4896 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004897 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004898 name = PyString_InternFromString(sc.c_name);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00004899 code = optimize_code(sc.c_code, consts, names, sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004900 if (!PyErr_Occurred())
4901 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902 sc.c_nlocals,
4903 sc.c_maxstacklevel,
4904 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004905 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004906 consts,
4907 names,
4908 varnames,
4909 freevars,
4910 cellvars,
4911 filename,
4912 name,
4913 sc.c_firstlineno,
4914 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004915 Py_XDECREF(consts);
4916 Py_XDECREF(names);
4917 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004918 Py_XDECREF(freevars);
4919 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004920 Py_XDECREF(filename);
4921 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004922 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004923 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004924 else if (!PyErr_Occurred()) {
4925 /* This could happen if someone called PyErr_Clear() after an
4926 error was reported above. That's not supposed to happen,
4927 but I just plugged one case and I'm not sure there can't be
4928 others. In that case, raise SystemError so that at least
4929 it gets reported instead dumping core. */
4930 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4931 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004932 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004933 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004934 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004935 sc.c_symtable = NULL;
4936 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004937 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004938 return co;
4939}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004940
4941int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004942PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004943{
4944 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004945 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004946 int line = co->co_firstlineno;
4947 int addr = 0;
4948 while (--size >= 0) {
4949 addr += *p++;
4950 if (addr > addrq)
4951 break;
4952 line += *p++;
4953 }
4954 return line;
4955}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004957/* The test for LOCAL must come before the test for FREE in order to
4958 handle classes where name is both local and free. The local var is
4959 a method and the free var is a free var referenced within a method.
4960*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961
4962static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004963get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004964{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004965 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004966 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004967
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004968 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4969 return CELL;
4970 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4971 return LOCAL;
4972 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4973 return FREE;
4974 v = PyDict_GetItemString(c->c_globals, name);
4975 if (v) {
4976 if (v == Py_None)
4977 return GLOBAL_EXPLICIT;
4978 else {
4979 return GLOBAL_IMPLICIT;
4980 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004981 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004982 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004983 "unknown scope for %.100s in %.100s(%s) "
4984 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4985 name, c->c_name,
4986 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4987 c->c_filename,
4988 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4989 PyObject_REPR(c->c_locals),
4990 PyObject_REPR(c->c_globals)
4991 );
4992
4993 Py_FatalError(buf);
4994 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004995}
4996
Guido van Rossum207fda62001-03-02 03:30:41 +00004997/* Helper functions to issue warnings */
4998
4999static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005000issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005001{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005002 if (PyErr_Occurred()) {
5003 /* This can happen because symtable_node continues
5004 processing even after raising a SyntaxError.
5005 Calling PyErr_WarnExplicit now would clobber the
5006 pending exception; instead we fail and let that
5007 exception propagate.
5008 */
5009 return -1;
5010 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005011 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5012 lineno, NULL, NULL) < 0) {
5013 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5014 PyErr_SetString(PyExc_SyntaxError, msg);
5015 PyErr_SyntaxLocation(filename, lineno);
5016 }
5017 return -1;
5018 }
5019 return 0;
5020}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005021
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005022static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005023symtable_warn(struct symtable *st, char *msg)
5024{
Guido van Rossum207fda62001-03-02 03:30:41 +00005025 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005026 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005027 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005028 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005029 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005030}
5031
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005032/* Helper function for setting lineno and filename */
5033
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005034static struct symtable *
5035symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005036{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005037 struct symtable *st;
5038
5039 st = symtable_init();
5040 if (st == NULL)
5041 return NULL;
5042 st->st_future = ff;
5043 st->st_filename = filename;
5044 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5045 if (st->st_errors > 0)
5046 goto fail;
5047 symtable_node(st, n);
5048 if (st->st_errors > 0)
5049 goto fail;
5050 return st;
5051 fail:
5052 if (!PyErr_Occurred()) {
5053 /* This could happen because after a syntax error is
5054 detected, the symbol-table-building continues for
5055 a while, and PyErr_Clear() might erroneously be
5056 called during that process. One such case has been
5057 fixed, but there might be more (now or later).
5058 */
5059 PyErr_SetString(PyExc_SystemError, "lost exception");
5060 }
5061 st->st_future = NULL;
5062 st->st_filename = NULL;
5063 PySymtable_Free(st);
5064 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005065}
5066
5067static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005068symtable_init_compiling_symbols(struct compiling *c)
5069{
5070 PyObject *varnames;
5071
5072 varnames = c->c_symtable->st_cur->ste_varnames;
5073 if (varnames == NULL) {
5074 varnames = PyList_New(0);
5075 if (varnames == NULL)
5076 return -1;
5077 c->c_symtable->st_cur->ste_varnames = varnames;
5078 Py_INCREF(varnames);
5079 } else
5080 Py_INCREF(varnames);
5081 c->c_varnames = varnames;
5082
5083 c->c_globals = PyDict_New();
5084 if (c->c_globals == NULL)
5085 return -1;
5086 c->c_freevars = PyDict_New();
5087 if (c->c_freevars == NULL)
5088 return -1;
5089 c->c_cellvars = PyDict_New();
5090 if (c->c_cellvars == NULL)
5091 return -1;
5092 return 0;
5093}
5094
5095struct symbol_info {
5096 int si_nlocals;
5097 int si_ncells;
5098 int si_nfrees;
5099 int si_nimplicit;
5100};
5101
5102static void
5103symtable_init_info(struct symbol_info *si)
5104{
5105 si->si_nlocals = 0;
5106 si->si_ncells = 0;
5107 si->si_nfrees = 0;
5108 si->si_nimplicit = 0;
5109}
5110
5111static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005112symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005113 struct symbol_info *si)
5114{
5115 PyObject *dict, *v;
5116
5117 /* Seperate logic for DEF_FREE. If it occurs in a function,
5118 it indicates a local that we must allocate storage for (a
5119 cell var). If it occurs in a class, then the class has a
5120 method and a free variable with the same name.
5121 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005122 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005123 /* If it isn't declared locally, it can't be a cell. */
5124 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5125 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005126 v = PyInt_FromLong(si->si_ncells++);
5127 dict = c->c_cellvars;
5128 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005129 /* If it is free anyway, then there is no need to do
5130 anything here.
5131 */
5132 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005133 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005134 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005135 v = PyInt_FromLong(si->si_nfrees++);
5136 dict = c->c_freevars;
5137 }
5138 if (v == NULL)
5139 return -1;
5140 if (PyDict_SetItem(dict, name, v) < 0) {
5141 Py_DECREF(v);
5142 return -1;
5143 }
5144 Py_DECREF(v);
5145 return 0;
5146}
5147
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005148/* If a variable is a cell and an argument, make sure that appears in
5149 co_cellvars before any variable to its right in varnames.
5150*/
5151
5152
5153static int
5154symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5155 PyObject *varnames, int flags)
5156{
Tim Petersb39903b2003-03-24 17:22:24 +00005157 PyObject *v = NULL;
5158 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005159 int i, pos;
5160
5161 if (flags & CO_VARARGS)
5162 argcount++;
5163 if (flags & CO_VARKEYWORDS)
5164 argcount++;
5165 for (i = argcount; --i >= 0; ) {
5166 v = PyList_GET_ITEM(varnames, i);
5167 if (PyDict_GetItem(*cellvars, v)) {
5168 if (list == NULL) {
5169 list = PyList_New(1);
5170 if (list == NULL)
5171 return -1;
5172 PyList_SET_ITEM(list, 0, v);
5173 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005174 } else {
5175 if (PyList_Insert(list, 0, v) < 0) {
5176 Py_DECREF(list);
5177 return -1;
5178 }
5179 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005180 }
5181 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005182 if (list == NULL)
5183 return 0;
5184
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005185 /* There are cellvars that are also arguments. Create a dict
5186 to replace cellvars and put the args at the front.
5187 */
5188 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005189 if (d == NULL)
5190 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005191 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5192 v = PyInt_FromLong(i);
5193 if (v == NULL)
5194 goto fail;
5195 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5196 goto fail;
5197 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5198 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005199 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005200 }
5201 pos = 0;
5202 i = PyList_GET_SIZE(list);
5203 Py_DECREF(list);
5204 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5205 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005206 if (w == NULL)
5207 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005208 if (PyDict_SetItem(d, v, w) < 0) {
5209 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005210 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005211 goto fail;
5212 }
5213 Py_DECREF(w);
5214 }
5215 Py_DECREF(*cellvars);
5216 *cellvars = d;
5217 return 1;
5218 fail:
5219 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005220 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005221 return -1;
5222}
5223
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005224static int
5225symtable_freevar_offsets(PyObject *freevars, int offset)
5226{
5227 PyObject *name, *v;
5228 int pos;
5229
5230 /* The cell vars are the first elements of the closure,
5231 followed by the free vars. Update the offsets in
5232 c_freevars to account for number of cellvars. */
5233 pos = 0;
5234 while (PyDict_Next(freevars, &pos, &name, &v)) {
5235 int i = PyInt_AS_LONG(v) + offset;
5236 PyObject *o = PyInt_FromLong(i);
5237 if (o == NULL)
5238 return -1;
5239 if (PyDict_SetItem(freevars, name, o) < 0) {
5240 Py_DECREF(o);
5241 return -1;
5242 }
5243 Py_DECREF(o);
5244 }
5245 return 0;
5246}
5247
5248static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005249symtable_check_unoptimized(struct compiling *c,
5250 PySymtableEntryObject *ste,
5251 struct symbol_info *si)
5252{
5253 char buf[300];
5254
5255 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5256 || (ste->ste_nested && si->si_nimplicit)))
5257 return 0;
5258
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005259#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5260
5261#define ILLEGAL_IS "is a nested function"
5262
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005263#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005264"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005265
5266#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005267"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005268
5269#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005270"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005271"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005272
5273 /* XXX perhaps the linenos for these opt-breaking statements
5274 should be stored so the exception can point to them. */
5275
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005276 if (ste->ste_child_free) {
5277 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005278 PyOS_snprintf(buf, sizeof(buf),
5279 ILLEGAL_IMPORT_STAR,
5280 PyString_AS_STRING(ste->ste_name),
5281 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005282 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005283 PyOS_snprintf(buf, sizeof(buf),
5284 ILLEGAL_BARE_EXEC,
5285 PyString_AS_STRING(ste->ste_name),
5286 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005287 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005288 PyOS_snprintf(buf, sizeof(buf),
5289 ILLEGAL_EXEC_AND_IMPORT_STAR,
5290 PyString_AS_STRING(ste->ste_name),
5291 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005292 }
5293 } else {
5294 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005295 PyOS_snprintf(buf, sizeof(buf),
5296 ILLEGAL_IMPORT_STAR,
5297 PyString_AS_STRING(ste->ste_name),
5298 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005299 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005300 PyOS_snprintf(buf, sizeof(buf),
5301 ILLEGAL_BARE_EXEC,
5302 PyString_AS_STRING(ste->ste_name),
5303 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005304 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005305 PyOS_snprintf(buf, sizeof(buf),
5306 ILLEGAL_EXEC_AND_IMPORT_STAR,
5307 PyString_AS_STRING(ste->ste_name),
5308 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005309 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005310 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005311
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005312 PyErr_SetString(PyExc_SyntaxError, buf);
5313 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5314 ste->ste_opt_lineno);
5315 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005316}
5317
5318static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005319symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5320 struct symbol_info *si)
5321{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005322 if (c->c_future)
5323 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005324 if (ste->ste_generator)
5325 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005326 if (ste->ste_type != TYPE_MODULE)
5327 c->c_flags |= CO_NEWLOCALS;
5328 if (ste->ste_type == TYPE_FUNCTION) {
5329 c->c_nlocals = si->si_nlocals;
5330 if (ste->ste_optimized == 0)
5331 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005332 else if (ste->ste_optimized != OPT_EXEC)
5333 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005334 }
5335 return 0;
5336}
5337
5338static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005339symtable_error(struct symtable *st, int lineno)
5340{
5341 if (lineno == 0)
5342 lineno = st->st_cur->ste_lineno;
5343 PyErr_SyntaxLocation(st->st_filename, lineno);
5344 st->st_errors++;
5345 return -1;
5346}
5347
5348static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005349symtable_load_symbols(struct compiling *c)
5350{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005352 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005353 PyObject *name, *varnames, *v;
5354 int i, flags, pos;
5355 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005356
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005357 v = NULL;
5358
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005359 if (symtable_init_compiling_symbols(c) < 0)
5360 goto fail;
5361 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005362 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005363 si.si_nlocals = PyList_GET_SIZE(varnames);
5364 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005366 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005368 if (v == NULL)
5369 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370 if (PyDict_SetItem(c->c_locals,
5371 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005372 goto fail;
5373 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005374 }
5375
5376 /* XXX The cases below define the rules for whether a name is
5377 local or global. The logic could probably be clearer. */
5378 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005379 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5380 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005382 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005383 /* undo the original DEF_FREE */
5384 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005385
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005386 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005387 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005388 2. Free variables in methods that are also class
5389 variables or declared global.
5390 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005391 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005392 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005393
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005394 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395 c->c_argcount--;
5396 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005397 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005398 c->c_argcount--;
5399 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005400 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005401 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005402 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005403 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005404 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005405 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005406 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005407 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005408 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5410 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005411 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005412 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005413 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005414 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005415 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005416 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005417 if (v == NULL)
5418 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 goto fail;
5421 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005422 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005423 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005425 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005426 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005427 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005428 if (v == NULL)
5429 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005430 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 goto fail;
5432 Py_DECREF(v);
5433 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005434 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005435 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005436 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005437 goto fail;
5438 if (st->st_nscopes != 1) {
5439 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005440 if (v == NULL)
5441 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005442 if (PyDict_SetItem(st->st_global,
5443 name, v))
5444 goto fail;
5445 Py_DECREF(v);
5446 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005447 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005448 }
5449 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005450 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5451
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005452 if (si.si_ncells > 1) { /* one cell is always in order */
5453 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5454 c->c_varnames, c->c_flags) < 0)
5455 return -1;
5456 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005457 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5458 return -1;
5459 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005460 fail:
5461 /* is this always the right thing to do? */
5462 Py_XDECREF(v);
5463 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005464}
5465
5466static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005467symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468{
5469 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005470
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005471 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005472 if (st == NULL)
5473 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005475
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005476 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005477 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005478 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005479 goto fail;
5480 if ((st->st_symbols = PyDict_New()) == NULL)
5481 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005482 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005483 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485 st->st_private = NULL;
5486 return st;
5487 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005488 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489 return NULL;
5490}
5491
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005492void
5493PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494{
5495 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005497 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005498 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005499}
5500
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005501/* When the compiler exits a scope, it must should update the scope's
5502 free variable information with the list of free variables in its
5503 children.
5504
5505 Variables that are free in children and defined in the current
5506 scope are cellvars.
5507
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005508 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005509 false), free variables in children that are not defined here are
5510 implicit globals.
5511
5512*/
5513
5514static int
5515symtable_update_free_vars(struct symtable *st)
5516{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005517 int i, j, def;
5518 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005519 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005521 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 def = DEF_FREE_CLASS;
5523 else
5524 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005525 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005526 int pos = 0;
5527
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005528 if (list && PyList_SetSlice(list, 0,
5529 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005530 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005531 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005532 PyList_GET_ITEM(ste->ste_children, i);
5533 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005534 int flags = PyInt_AS_LONG(o);
5535 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005536 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005537 if (list == NULL) {
5538 list = PyList_New(0);
5539 if (list == NULL)
5540 return -1;
5541 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005542 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005543 if (PyList_Append(list, name) < 0) {
5544 Py_DECREF(list);
5545 return -1;
5546 }
5547 }
5548 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005549 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005550 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005551 v = PyDict_GetItem(ste->ste_symbols, name);
5552 /* If a name N is declared global in scope A and
5553 referenced in scope B contained (perhaps
5554 indirectly) in A and there are no scopes
5555 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005556 is global in B. Unless A is a class scope,
5557 because class scopes are not considered for
5558 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005559 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005560 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005561 int flags = PyInt_AS_LONG(v);
5562 if (flags & DEF_GLOBAL) {
5563 symtable_undo_free(st, child->ste_id,
5564 name);
5565 continue;
5566 }
5567 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005568 if (ste->ste_nested) {
5569 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005570 name, def) < 0) {
5571 Py_DECREF(list);
5572 return -1;
5573 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005574 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005575 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005576 name) < 0) {
5577 Py_DECREF(list);
5578 return -1;
5579 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005580 }
5581 }
5582 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005583
5584 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 return 0;
5586}
5587
5588/* If the current scope is a non-nested class or if name is not
5589 defined in the current, non-nested scope, then it is an implicit
5590 global in all nested scopes.
5591*/
5592
5593static int
5594symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5595{
5596 PyObject *o;
5597 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005598 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005599
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005600 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005601 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005602 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603 if (o == NULL)
5604 return symtable_undo_free(st, child, name);
5605 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005606
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005607 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608 return symtable_undo_free(st, child, name);
5609 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005610 return symtable_add_def_o(st, ste->ste_symbols,
5611 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005612}
5613
5614static int
5615symtable_undo_free(struct symtable *st, PyObject *id,
5616 PyObject *name)
5617{
5618 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005619 PyObject *info;
5620 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005621
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005622 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5623 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005624 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005625
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005626 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 if (info == NULL)
5628 return 0;
5629 v = PyInt_AS_LONG(info);
5630 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005631 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632 DEF_FREE_GLOBAL) < 0)
5633 return -1;
5634 } else
5635 /* If the name is defined here or declared global,
5636 then the recursion stops. */
5637 return 0;
5638
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005639 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5640 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005641 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005642 PyList_GET_ITEM(ste->ste_children, i);
5643 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005644 if (x < 0)
5645 return x;
5646 }
5647 return 0;
5648}
5649
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005650/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5651 This reference is released when the scope is exited, via the DECREF
5652 in symtable_exit_scope().
5653*/
5654
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005655static int
5656symtable_exit_scope(struct symtable *st)
5657{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 int end;
5659
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005660 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005661 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005662 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005663 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005664 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5665 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666 if (PySequence_DelItem(st->st_stack, end) < 0)
5667 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005668 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005671static void
5672symtable_enter_scope(struct symtable *st, char *name, int type,
5673 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005674{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005675 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005676
5677 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005678 prev = st->st_cur;
5679 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005680 st->st_errors++;
5681 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005682 }
5683 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005684 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005685 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005686 if (st->st_cur == NULL) {
5687 st->st_errors++;
5688 return;
5689 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005690 if (strcmp(name, TOP) == 0)
5691 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005692 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005693 if (PyList_Append(prev->ste_children,
5694 (PyObject *)st->st_cur) < 0)
5695 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005696 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005697}
5698
5699static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005700symtable_lookup(struct symtable *st, char *name)
5701{
5702 char buffer[MANGLE_LEN];
5703 PyObject *v;
5704 int flags;
5705
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005706 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005707 name = buffer;
5708 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5709 if (v == NULL) {
5710 if (PyErr_Occurred())
5711 return -1;
5712 else
5713 return 0;
5714 }
5715
5716 flags = PyInt_AS_LONG(v);
5717 return flags;
5718}
5719
5720static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005721symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005722{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005723 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005724 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005725 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005726
Guido van Rossumb7164622002-08-16 02:48:11 +00005727 /* Warn about None, except inside a tuple (where the assignment
5728 code already issues a warning). */
5729 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5730 *name == 'N' && strcmp(name, "None") == 0)
5731 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005732 PyErr_SetString(PyExc_SyntaxError,
5733 "Invalid syntax. Assignment to None.");
5734 symtable_error(st, 0);
5735 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005736 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005737 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005738 name = buffer;
5739 if ((s = PyString_InternFromString(name)) == NULL)
5740 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005741 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5742 Py_DECREF(s);
5743 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005744}
5745
5746/* Must only be called with mangled names */
5747
5748static int
5749symtable_add_def_o(struct symtable *st, PyObject *dict,
5750 PyObject *name, int flag)
5751{
5752 PyObject *o;
5753 int val;
5754
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005755 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005758 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005759 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005760 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005762 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005763 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005766 if (o == NULL)
5767 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005768 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005769 Py_DECREF(o);
5770 return -1;
5771 }
5772 Py_DECREF(o);
5773
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005774 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005775 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 } else if (flag & DEF_GLOBAL) {
5778 /* XXX need to update DEF_GLOBAL for other flags too;
5779 perhaps only DEF_FREE_GLOBAL */
5780 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005782 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005783 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005784 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005786 if (o == NULL)
5787 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005788 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005789 Py_DECREF(o);
5790 return -1;
5791 }
5792 Py_DECREF(o);
5793 }
5794 return 0;
5795}
5796
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005797#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005798
Tim Peters08a898f2001-06-28 01:52:22 +00005799/* Look for a yield stmt under n. Return 1 if found, else 0.
5800 This hack is used to look inside "if 0:" blocks (which are normally
5801 ignored) in case those are the only places a yield occurs (so that this
5802 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005803static int
5804look_for_yield(node *n)
5805{
5806 int i;
5807
5808 for (i = 0; i < NCH(n); ++i) {
5809 node *kid = CHILD(n, i);
5810
5811 switch (TYPE(kid)) {
5812
5813 case classdef:
5814 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005815 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005816 /* Stuff in nested functions and classes can't make
5817 the parent a generator. */
5818 return 0;
5819
5820 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005821 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005822
5823 default:
5824 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005825 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005826 }
5827 }
5828 return 0;
5829}
5830
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005831static void
5832symtable_node(struct symtable *st, node *n)
5833{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005834 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005835
5836 loop:
5837 switch (TYPE(n)) {
5838 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005839 char *func_name;
5840 if (NCH(n) == 6)
5841 symtable_node(st, CHILD(n, 0));
5842 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005843 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005844 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005845 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005846 symtable_funcdef(st, n);
5847 symtable_exit_scope(st);
5848 break;
5849 }
5850 case lambdef:
5851 if (NCH(n) == 4)
5852 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005853 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 symtable_funcdef(st, n);
5855 symtable_exit_scope(st);
5856 break;
5857 case classdef: {
5858 char *tmp, *class_name = STR(CHILD(n, 1));
5859 symtable_add_def(st, class_name, DEF_LOCAL);
5860 if (TYPE(CHILD(n, 2)) == LPAR) {
5861 node *bases = CHILD(n, 3);
5862 int i;
5863 for (i = 0; i < NCH(bases); i += 2) {
5864 symtable_node(st, CHILD(bases, i));
5865 }
5866 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005867 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005868 tmp = st->st_private;
5869 st->st_private = class_name;
5870 symtable_node(st, CHILD(n, NCH(n) - 1));
5871 st->st_private = tmp;
5872 symtable_exit_scope(st);
5873 break;
5874 }
5875 case if_stmt:
5876 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005877 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5878 if (st->st_cur->ste_generator == 0)
5879 st->st_cur->ste_generator =
5880 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005881 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005882 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005883 symtable_node(st, CHILD(n, i + 1));
5884 symtable_node(st, CHILD(n, i + 3));
5885 }
5886 if (i + 2 < NCH(n))
5887 symtable_node(st, CHILD(n, i + 2));
5888 break;
5889 case global_stmt:
5890 symtable_global(st, n);
5891 break;
5892 case import_stmt:
5893 symtable_import(st, n);
5894 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005895 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005896 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005897 symtable_node(st, CHILD(n, 1));
5898 if (NCH(n) > 2)
5899 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005900 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005901 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005902 st->st_cur->ste_opt_lineno = n->n_lineno;
5903 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005904 if (NCH(n) > 4)
5905 symtable_node(st, CHILD(n, 5));
5906 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005907
5908 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005909 case assert_stmt:
5910 if (Py_OptimizeFlag)
5911 return;
5912 if (NCH(n) == 2) {
5913 n = CHILD(n, 1);
5914 goto loop;
5915 } else {
5916 symtable_node(st, CHILD(n, 1));
5917 n = CHILD(n, 3);
5918 goto loop;
5919 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005920 case except_clause:
5921 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005922 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005923 if (NCH(n) > 1) {
5924 n = CHILD(n, 1);
5925 goto loop;
5926 }
5927 break;
5928 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005929 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005930 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005931 case yield_stmt:
5932 st->st_cur->ste_generator = 1;
5933 n = CHILD(n, 1);
5934 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005935 case expr_stmt:
5936 if (NCH(n) == 1)
5937 n = CHILD(n, 0);
5938 else {
5939 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005940 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005941 symtable_node(st, CHILD(n, 2));
5942 break;
5943 } else {
5944 int i;
5945 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005946 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005947 n = CHILD(n, NCH(n) - 1);
5948 }
5949 }
5950 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005951 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005952 /* only occurs when there are multiple for loops
5953 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005954 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005955 if (TYPE(n) == list_for)
5956 symtable_list_for(st, n);
5957 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005958 REQ(n, list_if);
5959 symtable_node(st, CHILD(n, 1));
5960 if (NCH(n) == 3) {
5961 n = CHILD(n, 2);
5962 goto loop;
5963 }
5964 }
5965 break;
5966 case for_stmt:
5967 symtable_assign(st, CHILD(n, 1), 0);
5968 for (i = 3; i < NCH(n); ++i)
5969 if (TYPE(CHILD(n, i)) >= single_input)
5970 symtable_node(st, CHILD(n, i));
5971 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005972 case arglist:
5973 if (NCH(n) > 1)
5974 for (i = 0; i < NCH(n); ++i) {
5975 node *ch = CHILD(n, i);
5976 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5977 TYPE(CHILD(ch, 1)) == gen_for) {
5978 PyErr_SetString(PyExc_SyntaxError,
5979 "invalid syntax");
5980 symtable_error(st, n->n_lineno);
5981 return;
5982 }
5983 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005984 /* The remaining cases fall through to default except in
5985 special circumstances. This requires the individual cases
5986 to be coded with great care, even though they look like
5987 rather innocuous. Each case must double-check TYPE(n).
5988 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005989 case decorator:
5990 if (TYPE(n) == decorator) {
5991 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5992 node *name, *varname;
5993 name = CHILD(n, 1);
5994 REQ(name, dotted_name);
5995 varname = CHILD(name, 0);
5996 REQ(varname, NAME);
5997 symtable_add_use(st, STR(varname));
5998 }
5999 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006000 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006001 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006002 n = CHILD(n, 2);
6003 goto loop;
6004 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006005 else if (TYPE(n) == argument && NCH(n) == 2 &&
6006 TYPE(CHILD(n, 1)) == gen_for) {
6007 symtable_generator_expression(st, n);
6008 break;
6009 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006010 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 case listmaker:
6012 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006013 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006014 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006015 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006016 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006017 case testlist_gexp:
6018 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6019 symtable_generator_expression(st, n);
6020 break;
6021 }
6022 /* fall through */
6023
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006024 case atom:
6025 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6026 symtable_add_use(st, STR(CHILD(n, 0)));
6027 break;
6028 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006029 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006031 /* Walk over every non-token child with a special case
6032 for one child.
6033 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 if (NCH(n) == 1) {
6035 n = CHILD(n, 0);
6036 goto loop;
6037 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006038 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006039 if (TYPE(CHILD(n, i)) >= single_input)
6040 symtable_node(st, CHILD(n, i));
6041 }
6042}
6043
6044static void
6045symtable_funcdef(struct symtable *st, node *n)
6046{
6047 node *body;
6048
6049 if (TYPE(n) == lambdef) {
6050 if (NCH(n) == 4)
6051 symtable_params(st, CHILD(n, 1));
6052 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006053 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006054 body = CHILD(n, NCH(n) - 1);
6055 symtable_node(st, body);
6056}
6057
6058/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006059 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006060 which are references in the defining scope. symtable_params()
6061 parses the parameter names, which are defined in the function's
6062 body.
6063
6064 varargslist:
6065 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6066 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6067*/
6068
6069static void
6070symtable_default_args(struct symtable *st, node *n)
6071{
6072 node *c;
6073 int i;
6074
6075 if (TYPE(n) == parameters) {
6076 n = CHILD(n, 1);
6077 if (TYPE(n) == RPAR)
6078 return;
6079 }
6080 REQ(n, varargslist);
6081 for (i = 0; i < NCH(n); i += 2) {
6082 c = CHILD(n, i);
6083 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6084 break;
6085 }
6086 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6087 symtable_node(st, CHILD(n, i));
6088 }
6089}
6090
6091static void
6092symtable_params(struct symtable *st, node *n)
6093{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006094 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006095 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006096
6097 if (TYPE(n) == parameters) {
6098 n = CHILD(n, 1);
6099 if (TYPE(n) == RPAR)
6100 return;
6101 }
6102 REQ(n, varargslist);
6103 for (i = 0; i < NCH(n); i += 2) {
6104 c = CHILD(n, i);
6105 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6106 ext = 1;
6107 break;
6108 }
6109 if (TYPE(c) == test) {
6110 continue;
6111 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006112 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006113 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006114 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006115 char nbuf[30];
6116 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006117 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006118 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006119 }
6120 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006121 if (ext) {
6122 c = CHILD(n, i);
6123 if (TYPE(c) == STAR) {
6124 i++;
6125 symtable_add_def(st, STR(CHILD(n, i)),
6126 DEF_PARAM | DEF_STAR);
6127 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006128 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006129 c = NULL;
6130 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006131 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006132 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006133 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006134 i++;
6135 symtable_add_def(st, STR(CHILD(n, i)),
6136 DEF_PARAM | DEF_DOUBLESTAR);
6137 }
6138 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006139 if (complex >= 0) {
6140 int j;
6141 for (j = 0; j <= complex; j++) {
6142 c = CHILD(n, j);
6143 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006144 c = CHILD(n, ++j);
6145 else if (TYPE(c) == EQUAL)
6146 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006147 if (TYPE(CHILD(c, 0)) == LPAR)
6148 symtable_params_fplist(st, CHILD(c, 1));
6149 }
6150 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006151}
6152
6153static void
6154symtable_params_fplist(struct symtable *st, node *n)
6155{
6156 int i;
6157 node *c;
6158
6159 REQ(n, fplist);
6160 for (i = 0; i < NCH(n); i += 2) {
6161 c = CHILD(n, i);
6162 REQ(c, fpdef);
6163 if (NCH(c) == 1)
6164 symtable_add_def(st, STR(CHILD(c, 0)),
6165 DEF_PARAM | DEF_INTUPLE);
6166 else
6167 symtable_params_fplist(st, CHILD(c, 1));
6168 }
6169
6170}
6171
6172static void
6173symtable_global(struct symtable *st, node *n)
6174{
6175 int i;
6176
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006177 /* XXX It might be helpful to warn about module-level global
6178 statements, but it's hard to tell the difference between
6179 module-level and a string passed to exec.
6180 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006181
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006182 for (i = 1; i < NCH(n); i += 2) {
6183 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006184 int flags;
6185
6186 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006187 if (flags < 0)
6188 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006189 if (flags && flags != DEF_GLOBAL) {
6190 char buf[500];
6191 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006192 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006193 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006194 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006195 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006196 }
6197 else {
6198 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006199 PyOS_snprintf(buf, sizeof(buf),
6200 GLOBAL_AFTER_ASSIGN,
6201 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006202 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006203 PyOS_snprintf(buf, sizeof(buf),
6204 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006205 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006206 }
6207 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006208 symtable_add_def(st, name, DEF_GLOBAL);
6209 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006210}
6211
6212static void
6213symtable_list_comprehension(struct symtable *st, node *n)
6214{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006215 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006216 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006217
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006218 REQ(n, listmaker);
6219 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6220 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006222 symtable_list_for(st, CHILD(n, 1));
6223 symtable_node(st, CHILD(n, 0));
6224 --st->st_cur->ste_tmpname;
6225}
6226
6227static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006228symtable_generator_expression(struct symtable *st, node *n)
6229{
6230 /* testlist_gexp: test gen_for */
6231 REQ(CHILD(n, 0), test);
6232 REQ(CHILD(n, 1), gen_for);
6233
6234 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6235 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6236
6237 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6238
6239 symtable_gen_for(st, CHILD(n, 1), 1);
6240 symtable_node(st, CHILD(n, 0));
6241 symtable_exit_scope(st);
6242
6243 /* for outmost iterable precomputation */
6244 symtable_node(st, CHILD(CHILD(n, 1), 3));
6245}
6246
6247static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006248symtable_list_for(struct symtable *st, node *n)
6249{
6250 REQ(n, list_for);
6251 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006252 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006253 symtable_node(st, CHILD(n, 3));
6254 if (NCH(n) == 5)
6255 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006256}
6257
6258static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006259symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6260{
6261 REQ(n, gen_for);
6262
6263 /* gen_for: for v in test [gen_iter] */
6264 symtable_assign(st, CHILD(n, 1), 0);
6265 if (is_outmost)
6266 symtable_add_use(st, "[outmost-iterable]");
6267 else
6268 symtable_node(st, CHILD(n, 3));
6269
6270 if (NCH(n) == 5)
6271 symtable_gen_iter(st, CHILD(n, 4));
6272}
6273
6274static void
6275symtable_gen_iter(struct symtable *st, node *n)
6276{
6277 REQ(n, gen_iter);
6278
6279 n = CHILD(n, 0);
6280 if (TYPE(n) == gen_for)
6281 symtable_gen_for(st, n, 0);
6282 else {
6283 REQ(n, gen_if);
6284 symtable_node(st, CHILD(n, 1));
6285
6286 if (NCH(n) == 3)
6287 symtable_gen_iter(st, CHILD(n, 2));
6288 }
6289}
6290
6291static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006292symtable_import(struct symtable *st, node *n)
6293{
6294 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006295 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006296 | 'from' dotted_name 'import'
6297 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006298 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006299 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006300 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006301 node *dotname = CHILD(n, 1);
6302 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6303 /* check for bogus imports */
6304 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6305 PyErr_SetString(PyExc_SyntaxError,
6306 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006307 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006308 return;
6309 }
6310 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006311 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006312 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006313 if (symtable_warn(st,
6314 "import * only allowed at module level") < 0)
6315 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006316 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006317 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006318 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006319 } else {
6320 for (i = 3; i < NCH(n); i += 2) {
6321 node *c = CHILD(n, i);
6322 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006323 symtable_assign(st, CHILD(c, 2),
6324 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006325 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006326 symtable_assign(st, CHILD(c, 0),
6327 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006328 }
6329 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006330 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006331 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006332 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006333 }
6334 }
6335}
6336
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006337/* The third argument to symatble_assign() is a flag to be passed to
6338 symtable_add_def() if it is eventually called. The flag is useful
6339 to specify the particular type of assignment that should be
6340 recorded, e.g. an assignment caused by import.
6341 */
6342
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006343static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006344symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006345{
6346 node *tmp;
6347 int i;
6348
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006349 loop:
6350 switch (TYPE(n)) {
6351 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006352 /* invalid assignment, e.g. lambda x:x=2. The next
6353 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006354 return;
6355 case power:
6356 if (NCH(n) > 2) {
6357 for (i = 2; i < NCH(n); ++i)
6358 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6359 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006360 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006361 if (NCH(n) > 1) {
6362 symtable_node(st, CHILD(n, 0));
6363 symtable_node(st, CHILD(n, 1));
6364 } else {
6365 n = CHILD(n, 0);
6366 goto loop;
6367 }
6368 return;
6369 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006370 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6371 /* XXX This is an error, but the next pass
6372 will catch it. */
6373 return;
6374 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006375 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006376 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006377 }
6378 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006379 case testlist_gexp:
6380 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6381 /* XXX This is an error, but the next pass
6382 will catch it. */
6383 return;
6384 } else {
6385 for (i = 0; i < NCH(n); i += 2)
6386 symtable_assign(st, CHILD(n, i), def_flag);
6387 }
6388 return;
6389
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006390 case exprlist:
6391 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006392 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006393 if (NCH(n) == 1) {
6394 n = CHILD(n, 0);
6395 goto loop;
6396 }
6397 else {
6398 int i;
6399 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006400 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006401 return;
6402 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006403 case atom:
6404 tmp = CHILD(n, 0);
6405 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6406 n = CHILD(n, 1);
6407 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006408 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006409 if (strcmp(STR(tmp), "__debug__") == 0) {
6410 PyErr_SetString(PyExc_SyntaxError,
6411 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006412 symtable_error(st, n->n_lineno);
6413 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006414 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006415 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006416 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006417 return;
6418 case dotted_as_name:
6419 if (NCH(n) == 3)
6420 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006421 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006422 else
6423 symtable_add_def(st,
6424 STR(CHILD(CHILD(n,
6425 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006426 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006427 return;
6428 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006429 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006430 return;
6431 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006432 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006433 return;
6434 default:
6435 if (NCH(n) == 0)
6436 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006437 if (NCH(n) == 1) {
6438 n = CHILD(n, 0);
6439 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006440 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006441 /* Should only occur for errors like x + 1 = 1,
6442 which will be caught in the next pass. */
6443 for (i = 0; i < NCH(n); ++i)
6444 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006445 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006446 }
6447}