blob: fe31e6f105ef0b03c1859f1a084a776fa9a19d1e [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 Hettingerf6f575a2003-03-26 01:07:54 +0000438 if (!PyString_Check(code))
439 goto exitUnchanged;
Raymond Hettingera12fa142004-08-24 04:34:16 +0000440
441 /* Avoid situations where jump retargeting could overflow */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000442 codelen = PyString_Size(code);
Raymond Hettingera12fa142004-08-24 04:34:16 +0000443 if (codelen > 32000)
444 goto exitUnchanged;
445
446 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000447 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000448 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000449 goto exitUnchanged;
450 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000451
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000452 /* Mapping to new jump targets after NOPs are removed */
453 addrmap = PyMem_Malloc(codelen * sizeof(int));
454 if (addrmap == NULL)
455 goto exitUnchanged;
456
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000457 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000458 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000459 goto exitUnchanged;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000460 assert(PyTuple_Check(consts));
461
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000462 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
463 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000464 opcode = codestr[i];
465 switch (opcode) {
466
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000467 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000468 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000469 case UNARY_NOT:
470 if (codestr[i+1] != JUMP_IF_FALSE ||
471 codestr[i+4] != POP_TOP ||
472 !ISBASICBLOCK(blocks,i,5))
473 continue;
474 tgt = GETJUMPTGT(codestr, (i+1));
475 if (codestr[tgt] != POP_TOP)
476 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000477 j = GETARG(codestr, i+1) + 1;
478 codestr[i] = JUMP_IF_TRUE;
479 SETARG(codestr, i, j);
480 codestr[i+3] = POP_TOP;
481 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000482 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000483 break;
484
485 /* not a is b --> a is not b
486 not a in b --> a not in b
487 not a is not b --> a is b
488 not a not in b --> a in b */
489 case COMPARE_OP:
490 j = GETARG(codestr, i);
491 if (j < 6 || j > 9 ||
492 codestr[i+3] != UNARY_NOT ||
493 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000494 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000495 SETARG(codestr, i, (j^1));
496 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000497 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000498 break;
499
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000500 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
501 case LOAD_NAME:
502 case LOAD_GLOBAL:
503 j = GETARG(codestr, i);
504 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
505 if (name == NULL || strcmp(name, "None") != 0)
506 continue;
507 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
508 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
509 codestr[i] = LOAD_CONST;
510 SETARG(codestr, i, j);
511 break;
512 }
513 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000514 break;
515
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000516 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 case LOAD_CONST:
518 j = GETARG(codestr, i);
519 if (codestr[i+3] != JUMP_IF_FALSE ||
520 codestr[i+6] != POP_TOP ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000521 !ISBASICBLOCK(blocks,i,7) ||
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000522 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
523 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000524 memset(codestr+i, NOP, 7);
525 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000526 break;
527
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 /* Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
529 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
530 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000531 case BUILD_TUPLE:
532 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000533 j = GETARG(codestr, i);
534 if (codestr[i+3] != UNPACK_SEQUENCE ||
535 !ISBASICBLOCK(blocks,i,6) ||
536 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000538 if (j == 1) {
539 memset(codestr+i, NOP, 6);
540 nops += 6;
541 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000542 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000543 memset(codestr+i+1, NOP, 5);
544 nops += 5;
545 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000546 codestr[i] = ROT_THREE;
547 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000548 memset(codestr+i+2, NOP, 4);
549 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000550 }
551 break;
552
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000553 /* Simplify conditional jump to conditional jump where the
554 result of the first test implies the success of a similar
555 test or the failure of the opposite test.
556 Arises in code like:
557 "a and b or c"
558 "a and b and c"
559 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
560 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE y+3
561 */
562 case JUMP_IF_FALSE:
563 case JUMP_IF_TRUE:
564 tgt = GETJUMPTGT(codestr, i);
565 j = codestr[tgt];
566 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
567 if (j == opcode) {
568 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
569 SETARG(codestr, i, tgttgt);
570 } else {
571 tgt -= i;
572 SETARG(codestr, i, tgt);
573 }
574 break;
575 }
576 /* Intentional fallthrough */
577
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000578 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000579 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000580 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000581 case JUMP_ABSOLUTE:
582 case CONTINUE_LOOP:
583 case SETUP_LOOP:
584 case SETUP_EXCEPT:
585 case SETUP_FINALLY:
586 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000587 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000588 continue;
589 tgttgt = GETJUMPTGT(codestr, tgt);
590 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
591 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000592 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000593 tgttgt -= i + 3; /* Calc relative jump addr */
594 if (tgttgt < 0) /* No backward relative jumps */
595 continue;
596 codestr[i] = opcode;
597 SETARG(codestr, i, tgttgt);
598 break;
599
600 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000601 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000602
603 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
604 case RETURN_VALUE:
605 if (i+4 >= codelen ||
606 codestr[i+4] != RETURN_VALUE ||
607 !ISBASICBLOCK(blocks,i,5))
608 continue;
609 memset(codestr+i+1, NOP, 4);
610 nops += 4;
611 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000612 }
613 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000614
615 /* Fixup linenotab */
Raymond Hettingera12fa142004-08-24 04:34:16 +0000616 /* XXX make sure this handles intervals > 256 */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000617 assert(PyString_Check(lineno_obj));
618 lineno = PyString_AS_STRING(lineno_obj);
619 tabsiz = PyString_GET_SIZE(lineno_obj);
620 cum_orig_line = 0;
621 last_line = 0;
622 for (i=0 ; i < tabsiz ; i+=2) {
623 cum_orig_line += lineno[i];
624 new_line = addrmap[cum_orig_line];
625 lineno[i] =((unsigned char)(new_line - last_line));
626 last_line = new_line;
627 }
628
629 /* Remove NOPs and fixup jump targets */
630 for (i=0, h=0 ; i<codelen ; ) {
631 opcode = codestr[i];
632 switch (opcode) {
633 case NOP:
634 i++;
635 continue;
636
637 case JUMP_ABSOLUTE:
638 case CONTINUE_LOOP:
639 j = addrmap[GETARG(codestr, i)];
640 SETARG(codestr, i, j);
641 break;
642
643 case FOR_ITER:
644 case JUMP_FORWARD:
645 case JUMP_IF_FALSE:
646 case JUMP_IF_TRUE:
647 case SETUP_LOOP:
648 case SETUP_EXCEPT:
649 case SETUP_FINALLY:
650 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
651 SETARG(codestr, i, j);
652 break;
653 }
654 adj = CODESIZE(opcode);
655 while (adj--)
656 codestr[h++] = codestr[i++];
657 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000658 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000659
660 code = PyString_FromStringAndSize((char *)codestr, h);
661 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000662 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000663 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000664 return code;
665
666exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000667 if (addrmap != NULL)
668 PyMem_Free(addrmap);
669 if (codestr != NULL)
670 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000671 Py_INCREF(code);
672 return code;
673}
674
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000676PyCode_New(int argcount, int nlocals, int stacksize, int flags,
677 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000678 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
679 PyObject *filename, PyObject *name, int firstlineno,
680 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000681{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000683 int i;
684 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000685 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000686 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 consts == NULL || !PyTuple_Check(consts) ||
688 names == NULL || !PyTuple_Check(names) ||
689 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000690 freevars == NULL || !PyTuple_Check(freevars) ||
691 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 name == NULL || !PyString_Check(name) ||
693 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000694 lnotab == NULL || !PyString_Check(lnotab) ||
695 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000696 PyErr_BadInternalCall();
697 return NULL;
698 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000699 intern_strings(names);
700 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000701 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000702 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000703 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 for (i = PyTuple_Size(consts); --i >= 0; ) {
705 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000707 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000708 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000709 continue;
710 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000711 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000713 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000714 co->co_argcount = argcount;
715 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000716 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000717 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000718 Py_INCREF(code);
719 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000720 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000721 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000723 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000725 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000726 Py_INCREF(freevars);
727 co->co_freevars = freevars;
728 Py_INCREF(cellvars);
729 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000731 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000733 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000734 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000736 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000737 if (PyTuple_GET_SIZE(freevars) == 0 &&
738 PyTuple_GET_SIZE(cellvars) == 0)
739 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000740 }
741 return co;
742}
743
744
745/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000746
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000747/* The compiler uses two passes to generate bytecodes. The first pass
748 builds the symbol table. The second pass generates the bytecode.
749
750 The first pass uses a single symtable struct. The second pass uses
751 a compiling struct for each code block. The compiling structs
752 share a reference to the symtable.
753
754 The two passes communicate via symtable_load_symbols() and via
755 is_local() and is_global(). The former initializes several slots
756 in the compiling struct: c_varnames, c_locals, c_nlocals,
757 c_argcount, c_globals, and c_flags.
758*/
759
Tim Peters2a7f3842001-06-09 09:26:21 +0000760/* All about c_lnotab.
761
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000762c_lnotab is an array of unsigned bytes disguised as a Python string. Since
763version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
764mapped to source code line #s via c_lnotab instead.
765
Tim Peters2a7f3842001-06-09 09:26:21 +0000766The array is conceptually a list of
767 (bytecode offset increment, line number increment)
768pairs. The details are important and delicate, best illustrated by example:
769
770 byte code offset source code line number
771 0 1
772 6 2
773 50 7
774 350 307
775 361 308
776
777The first trick is that these numbers aren't stored, only the increments
778from one row to the next (this doesn't really work, but it's a start):
779
780 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
781
782The second trick is that an unsigned byte can't hold negative values, or
783values larger than 255, so (a) there's a deep assumption that byte code
784offsets and their corresponding line #s both increase monotonically, and (b)
785if at least one column jumps by more than 255 from one row to the next, more
786than one pair is written to the table. In case #b, there's no way to know
787from looking at the table later how many were written. That's the delicate
788part. A user of c_lnotab desiring to find the source line number
789corresponding to a bytecode address A should do something like this
790
791 lineno = addr = 0
792 for addr_incr, line_incr in c_lnotab:
793 addr += addr_incr
794 if addr > A:
795 return lineno
796 lineno += line_incr
797
798In order for this to work, when the addr field increments by more than 255,
799the line # increment in each pair generated must be 0 until the remaining addr
800increment is < 256. So, in the example above, com_set_lineno should not (as
801was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
802255, 0, 45, 255, 0, 45.
803*/
804
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000805struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000806 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000808 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000810 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000811 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyObject *c_locals; /* dictionary (value=localID) */
813 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000814 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000815 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000816 int c_nlocals; /* index of next local */
817 int c_argcount; /* number of top-level arguments */
818 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000819 int c_nexti; /* index into c_code */
820 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000821 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000822 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000823 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000824 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000825 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000826 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000827 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000829 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000830 int c_stacklevel; /* Current stack level */
831 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000832 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000834 int c_last_addr; /* last op addr seen and recorded in lnotab */
835 int c_last_line; /* last line seen and recorded in lnotab */
836 int c_lnotab_next; /* current length of lnotab */
837 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000838 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000839 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000840 int c_nested; /* Is block nested funcdef or lamdef? */
841 int c_closure; /* Is nested w/freevars? */
842 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000843 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000844 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000845};
846
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000847static int
848is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000849{
850 if ((v & (USE | DEF_FREE))
851 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
852 return 1;
853 if (v & DEF_FREE_CLASS)
854 return 1;
855 return 0;
856}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000857
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000858static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000860{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000861 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
862
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000863 if (c == NULL) {
864 /* Error occurred via symtable call to
865 is_constant_false */
866 PyErr_SetString(exc, msg);
867 return;
868 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000869 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000870 if (c->c_lineno < 1 || c->c_interactive) {
871 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000873 return;
874 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000875 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000876 if (v == NULL)
877 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000878
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000879 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000880 if (line == NULL) {
881 Py_INCREF(Py_None);
882 line = Py_None;
883 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000884 if (exc == PyExc_SyntaxError) {
885 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
886 Py_None, line);
887 if (t == NULL)
888 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000889 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000890 if (w == NULL)
891 goto exit;
892 PyErr_SetObject(exc, w);
893 } else {
894 /* Make sure additional exceptions are printed with
895 file and line, also. */
896 PyErr_SetObject(exc, v);
897 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
898 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000899 exit:
900 Py_XDECREF(t);
901 Py_XDECREF(v);
902 Py_XDECREF(w);
903 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000904}
905
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000906/* Interface to the block stack */
907
908static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000909block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000910{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000911 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 com_error(c, PyExc_SystemError,
913 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000914 }
915 else {
916 c->c_block[c->c_nblocks++] = type;
917 }
918}
919
920static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000922{
923 if (c->c_nblocks > 0)
924 c->c_nblocks--;
925 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000927 }
928}
929
Guido van Rossum681d79a1995-07-18 14:51:37 +0000930/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000931
Martin v. Löwis95292d62002-12-11 14:04:59 +0000932static int issue_warning(const char *, const char *, int);
933static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000934static void com_free(struct compiling *);
935static void com_push(struct compiling *, int);
936static void com_pop(struct compiling *, int);
937static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000938static void com_node(struct compiling *, node *);
939static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000940static void com_addbyte(struct compiling *, int);
941static void com_addint(struct compiling *, int);
942static void com_addoparg(struct compiling *, int, int);
943static void com_addfwref(struct compiling *, int, int *);
944static void com_backpatch(struct compiling *, int);
945static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
946static int com_addconst(struct compiling *, PyObject *);
947static int com_addname(struct compiling *, PyObject *);
948static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000949static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000950static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000951static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000952static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000953static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000954static void com_assign(struct compiling *, node *, int, node *);
955static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000956static int com_make_closure(struct compiling *c, PyCodeObject *co);
957
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000958static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000959static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000960 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000961static PyObject *parsestrplus(struct compiling*, node *);
962static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000963static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000964
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000965static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000966
967/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000968static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000969static struct symtable *symtable_build(node *, PyFutureFeatures *,
970 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000971static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000972static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000973static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000974static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000976static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000977
978static void symtable_node(struct symtable *, node *);
979static void symtable_funcdef(struct symtable *, node *);
980static void symtable_default_args(struct symtable *, node *);
981static void symtable_params(struct symtable *, node *);
982static void symtable_params_fplist(struct symtable *, node *n);
983static void symtable_global(struct symtable *, node *);
984static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000985static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000986static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000987static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000988static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000989static void symtable_gen_for(struct symtable *, node *, int);
990static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000991
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000992static int symtable_update_free_vars(struct symtable *);
993static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
994static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
995
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996/* helper */
997static void
998do_pad(int pad)
999{
1000 int i;
1001 for (i = 0; i < pad; ++i)
1002 fprintf(stderr, " ");
1003}
1004
1005static void
1006dump(node *n, int pad, int depth)
1007{
1008 int i;
1009 if (depth == 0)
1010 return;
1011 do_pad(pad);
1012 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1013 if (depth > 0)
1014 depth--;
1015 for (i = 0; i < NCH(n); ++i)
1016 dump(CHILD(n, i), pad + 1, depth);
1017}
1018
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001019static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001020com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001021{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001022 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1024 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001025 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001027 goto fail;
1028 if ((c->c_const_dict = PyDict_New()) == NULL)
1029 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001031 goto fail;
1032 if ((c->c_name_dict = PyDict_New()) == NULL)
1033 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001035 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1037 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001038 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001039 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001040 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001041 c->c_freevars = NULL;
1042 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001043 c->c_nlocals = 0;
1044 c->c_argcount = 0;
1045 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001046 c->c_nexti = 0;
1047 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001048 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001049 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001050 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001051 c->c_begin = 0;
1052 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001053 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001054 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001055 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001056 c->c_stacklevel = 0;
1057 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001058 c->c_firstlineno = 0;
1059 c->c_last_addr = 0;
1060 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001061 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001062 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001063 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001064 c->c_nested = 0;
1065 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001066 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067 return 1;
1068
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001069 fail:
1070 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001071 return 0;
1072}
1073
1074static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001075com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 Py_XDECREF(c->c_code);
1078 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001079 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001081 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 Py_XDECREF(c->c_globals);
1083 Py_XDECREF(c->c_locals);
1084 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001085 Py_XDECREF(c->c_freevars);
1086 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001088 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001089 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001090}
1091
1092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001093com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001094{
1095 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001096 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001097 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001098 /*
1099 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1100 c->c_filename, c->c_name, c->c_lineno,
1101 c->c_nexti, c->c_stacklevel, n);
1102 */
1103 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001104}
1105
1106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001107com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001108{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001109 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001110 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 else
1112 c->c_stacklevel -= n;
1113}
1114
1115static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001117{
1118 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001120 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122}
1123
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001124static int
1125com_check_size(PyObject **s, int offset)
1126{
1127 int len = PyString_GET_SIZE(*s);
1128 if (offset >= len)
1129 return _PyString_Resize(s, len * 2);
1130 return 0;
1131}
1132
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001133static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001134com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001135{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001136 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001137 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001138 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001139 if (com_check_size(&c->c_code, c->c_nexti)) {
1140 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001141 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001143 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001144}
1145
1146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001148{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001149 com_addbyte(c, x & 0xff);
1150 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001151}
1152
1153static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001154com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001155{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001156 char *p;
1157 if (c->c_lnotab == NULL)
1158 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001159 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1160 c->c_errors++;
1161 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001162 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001163 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001164 *p++ = addr;
1165 *p++ = line;
1166 c->c_lnotab_next += 2;
1167}
1168
1169static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001170com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001171{
1172 c->c_lineno = lineno;
1173 if (c->c_firstlineno == 0) {
1174 c->c_firstlineno = c->c_last_line = lineno;
1175 }
1176 else {
1177 int incr_addr = c->c_nexti - c->c_last_addr;
1178 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001179 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001180 while (incr_addr > 255) {
1181 com_add_lnotab(c, 255, 0);
1182 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001183 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001184 while (incr_line > 255) {
1185 com_add_lnotab(c, incr_addr, 255);
1186 incr_line -=255;
1187 incr_addr = 0;
1188 }
1189 if (incr_addr > 0 || incr_line > 0)
1190 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001191 c->c_last_addr = c->c_nexti;
1192 c->c_last_line = lineno;
1193 }
1194}
1195
1196static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001197com_strip_lnotab(struct compiling *c)
1198{
1199 /* strip the last lnotab entry if no opcode were emitted.
1200 * This prevents a line number to be generated on a final
1201 * pass, like in the following example:
1202 *
1203 * if a:
1204 * print 5
1205 * else:
1206 * pass
1207 *
1208 * Without the fix, a line trace event would be generated
1209 * on the pass even if a is true (because of the implicit
1210 * return).
1211 */
1212 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1213 c->c_lnotab_next = c->c_lnotab_last;
1214 }
1215}
1216
1217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001218com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001219{
Fred Drakeef8ace32000-08-24 00:32:09 +00001220 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001221 if (extended_arg){
1222 com_addbyte(c, EXTENDED_ARG);
1223 com_addint(c, extended_arg);
1224 arg &= 0xffff;
1225 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001226 com_addbyte(c, op);
1227 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001228}
1229
1230static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001231com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001232{
1233 /* Compile a forward reference for backpatching */
1234 int here;
1235 int anchor;
1236 com_addbyte(c, op);
1237 here = c->c_nexti;
1238 anchor = *p_anchor;
1239 *p_anchor = here;
1240 com_addint(c, anchor == 0 ? 0 : here - anchor);
1241}
1242
1243static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001244com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001245{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001246 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 int dist;
1249 int prev;
1250 for (;;) {
1251 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001252 prev = code[anchor] + (code[anchor+1] << 8);
1253 dist = target - (anchor+2);
1254 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001255 dist >>= 8;
1256 code[anchor+1] = dist;
1257 dist >>= 8;
1258 if (dist) {
1259 com_error(c, PyExc_SystemError,
1260 "com_backpatch: offset too large");
1261 break;
1262 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001263 if (!prev)
1264 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001265 anchor -= prev;
1266 }
1267}
1268
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001269/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270
1271static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001272com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001273{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001274 PyObject *w, *t, *np=NULL;
1275 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001276
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001277 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001278 if (t == NULL)
1279 goto fail;
1280 w = PyDict_GetItem(dict, t);
1281 if (w != NULL) {
1282 n = PyInt_AsLong(w);
1283 } else {
1284 n = PyList_Size(list);
1285 np = PyInt_FromLong(n);
1286 if (np == NULL)
1287 goto fail;
1288 if (PyList_Append(list, v) != 0)
1289 goto fail;
1290 if (PyDict_SetItem(dict, t, np) != 0)
1291 goto fail;
1292 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001293 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001294 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001295 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001296 fail:
1297 Py_XDECREF(np);
1298 Py_XDECREF(t);
1299 c->c_errors++;
1300 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001301}
1302
1303static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001304com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001305{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001306 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001307}
1308
1309static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001310com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001311{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001312 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001313}
1314
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001315int
1316_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001317{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001318 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001319 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001320 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1322 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001323 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001324 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001325 return 0; /* Don't mangle __extremely_long_names */
1326 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1327 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001328 /* Strip leading underscores from class name */
1329 while (*p == '_')
1330 p++;
1331 if (*p == '\0')
1332 return 0; /* Don't mangle if class is just underscores */
1333 plen = strlen(p);
1334 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001335 plen = maxlen-nlen-2; /* Truncate class name if too long */
1336 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001337 buffer[0] = '_';
1338 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001339 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001340 return 1;
1341}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001342
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001343static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001344com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001345{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001347 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001348 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001349
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001350 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001351 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001352 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001353 c->c_errors++;
1354 i = 255;
1355 }
1356 else {
1357 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001359 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001360 com_addoparg(c, op, i);
1361}
1362
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001363#define NAME_LOCAL 0
1364#define NAME_GLOBAL 1
1365#define NAME_DEFAULT 2
1366#define NAME_CLOSURE 3
1367
1368static int
1369com_lookup_arg(PyObject *dict, PyObject *name)
1370{
1371 PyObject *v = PyDict_GetItem(dict, name);
1372 if (v == NULL)
1373 return -1;
1374 else
1375 return PyInt_AS_LONG(v);
1376}
1377
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001378static int
1379none_assignment_check(struct compiling *c, char *name, int assigning)
1380{
1381 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1382 char *msg;
1383 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001384 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001385 else
1386 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001387 com_error(c, PyExc_SyntaxError, msg);
1388 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001389 }
1390 return 0;
1391}
1392
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001393static void
1394com_addop_varname(struct compiling *c, int kind, char *name)
1395{
1396 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001397 int i, reftype;
1398 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001399 int op = STOP_CODE;
1400 char buffer[MANGLE_LEN];
1401
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001402 if (kind != VAR_LOAD &&
1403 none_assignment_check(c, name, kind == VAR_STORE))
1404 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001405 i = 255;
1406 goto done;
1407 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001408 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001409 name = buffer;
1410 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1411 c->c_errors++;
1412 i = 255;
1413 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001414 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001415
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001416 reftype = get_ref_type(c, name);
1417 switch (reftype) {
1418 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001419 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001420 scope = NAME_LOCAL;
1421 break;
1422 case GLOBAL_EXPLICIT:
1423 scope = NAME_GLOBAL;
1424 break;
1425 case GLOBAL_IMPLICIT:
1426 if (c->c_flags & CO_OPTIMIZED)
1427 scope = NAME_GLOBAL;
1428 break;
1429 case FREE:
1430 case CELL:
1431 scope = NAME_CLOSURE;
1432 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001433 }
1434
1435 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001436 if (scope == NAME_LOCAL)
1437 i = com_lookup_arg(c->c_locals, v);
1438 else if (reftype == FREE)
1439 i = com_lookup_arg(c->c_freevars, v);
1440 else if (reftype == CELL)
1441 i = com_lookup_arg(c->c_cellvars, v);
1442 if (i == -1) {
1443 c->c_errors++; /* XXX no exception set */
1444 i = 255;
1445 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001446 }
1447 Py_DECREF(v);
1448
1449 switch (kind) {
1450 case VAR_LOAD:
1451 switch (scope) {
1452 case NAME_LOCAL:
1453 op = LOAD_FAST;
1454 break;
1455 case NAME_GLOBAL:
1456 op = LOAD_GLOBAL;
1457 break;
1458 case NAME_DEFAULT:
1459 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001460 break;
1461 case NAME_CLOSURE:
1462 op = LOAD_DEREF;
1463 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001464 }
1465 break;
1466 case VAR_STORE:
1467 switch (scope) {
1468 case NAME_LOCAL:
1469 op = STORE_FAST;
1470 break;
1471 case NAME_GLOBAL:
1472 op = STORE_GLOBAL;
1473 break;
1474 case NAME_DEFAULT:
1475 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001476 break;
1477 case NAME_CLOSURE:
1478 op = STORE_DEREF;
1479 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001480 }
1481 break;
1482 case VAR_DELETE:
1483 switch (scope) {
1484 case NAME_LOCAL:
1485 op = DELETE_FAST;
1486 break;
1487 case NAME_GLOBAL:
1488 op = DELETE_GLOBAL;
1489 break;
1490 case NAME_DEFAULT:
1491 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001492 break;
1493 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001494 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001495 PyOS_snprintf(buf, sizeof(buf),
1496 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001497 com_error(c, PyExc_SyntaxError, buf);
1498 i = 255;
1499 break;
1500 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001501 }
1502 break;
1503 }
1504done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001505 com_addoparg(c, op, i);
1506}
1507
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001509com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001510{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001511 char *name;
1512 char buffer[1000];
1513 /* XXX it is possible to write this code without the 1000
1514 chars on the total length of dotted names, I just can't be
1515 bothered right now */
1516 if (TYPE(n) == STAR)
1517 name = "*";
1518 else if (TYPE(n) == dotted_name) {
1519 char *p = buffer;
1520 int i;
1521 name = buffer;
1522 for (i = 0; i < NCH(n); i += 2) {
1523 char *s = STR(CHILD(n, i));
1524 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001526 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001527 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001528 break;
1529 }
1530 if (p != buffer)
1531 *p++ = '.';
1532 strcpy(p, s);
1533 p = strchr(p, '\0');
1534 }
1535 }
1536 else {
1537 REQ(n, NAME);
1538 name = STR(n);
1539 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001540 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001541}
1542
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001544parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001545{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001546 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001547 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001548 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001549#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001550 int imflag;
1551#endif
1552
Guido van Rossum282914b1991-04-04 10:42:56 +00001553 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001554 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001555#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001556 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001557#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001558 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001559 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001560 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001562 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001563 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001564 }
1565 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001566 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001568 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001569 if (errno != 0)
1570 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001572 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001573 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001574#ifndef WITHOUT_COMPLEX
1575 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001576 Py_complex z;
1577 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001578 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001579 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001580 PyFPE_END_PROTECT(z)
1581 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001582 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001583 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001584#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001585 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001586 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001587 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001588 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001590 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001591}
1592
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001594decode_utf8(char **sPtr, char *end, char* encoding)
1595{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001596#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001597 Py_FatalError("decode_utf8 should not be called in this build.");
1598 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001599#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001600 PyObject *u, *v;
1601 char *s, *t;
1602 t = s = *sPtr;
1603 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1604 while (s < end && (*s & 0x80)) s++;
1605 *sPtr = s;
1606 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1607 if (u == NULL)
1608 return NULL;
1609 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1610 Py_DECREF(u);
1611 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001612#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001613}
1614
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001615/* compiler.transformer.Transformer.decode_literal depends on what
1616 might seem like minor details of this function -- changes here
1617 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001618static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001619parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001620{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001622 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001623 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001624 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001625 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001626 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001627 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001628
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001629 if (isalpha(quote) || quote == '_') {
1630 if (quote == 'u' || quote == 'U') {
1631 quote = *++s;
1632 unicode = 1;
1633 }
1634 if (quote == 'r' || quote == 'R') {
1635 quote = *++s;
1636 rawmode = 1;
1637 }
1638 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001639 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001640 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001641 return NULL;
1642 }
1643 s++;
1644 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001645 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001646 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001647 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001648 return NULL;
1649 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001650 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001652 return NULL;
1653 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001654 if (len >= 4 && s[0] == quote && s[1] == quote) {
1655 s += 2;
1656 len -= 2;
1657 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001659 return NULL;
1660 }
1661 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001662#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001663 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001664 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001665 char *buf;
1666 char *p;
1667 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001668 if (encoding == NULL) {
1669 buf = s;
1670 u = NULL;
1671 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1672 buf = s;
1673 u = NULL;
1674 } else {
1675 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1676 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1677 if (u == NULL)
1678 return NULL;
1679 p = buf = PyString_AsString(u);
1680 end = s + len;
1681 while (s < end) {
1682 if (*s == '\\') {
1683 *p++ = *s++;
1684 if (*s & 0x80) {
1685 strcpy(p, "u005c");
1686 p += 5;
1687 }
1688 }
1689 if (*s & 0x80) { /* XXX inefficient */
1690 char *r;
1691 int rn, i;
1692 w = decode_utf8(&s, end, "utf-16-be");
1693 if (w == NULL) {
1694 Py_DECREF(u);
1695 return NULL;
1696 }
1697 r = PyString_AsString(w);
1698 rn = PyString_Size(w);
1699 assert(rn % 2 == 0);
1700 for (i = 0; i < rn; i += 2) {
1701 sprintf(p, "\\u%02x%02x",
1702 r[i + 0] & 0xFF,
1703 r[i + 1] & 0xFF);
1704 p += 6;
1705 }
1706 Py_DECREF(w);
1707 } else {
1708 *p++ = *s++;
1709 }
1710 }
1711 len = p - buf;
1712 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001713 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001714 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001715 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001716 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1717 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001718 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001719 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001720 return v;
1721
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001722 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001723#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001724 need_encoding = (encoding != NULL &&
1725 strcmp(encoding, "utf-8") != 0 &&
1726 strcmp(encoding, "iso-8859-1") != 0);
1727 if (rawmode || strchr(s, '\\') == NULL) {
1728 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001729#ifndef Py_USING_UNICODE
1730 /* This should not happen - we never see any other
1731 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001732 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001733#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001734 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1735 if (u == NULL)
1736 return NULL;
1737 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1738 Py_DECREF(u);
1739 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001740#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001741 } else {
1742 return PyString_FromStringAndSize(s, len);
1743 }
1744 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001745
1746 v = PyString_DecodeEscape(s, len, NULL, unicode,
1747 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001748 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001749 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001750 return v;
1751}
1752
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001754parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001755{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001757 int i;
1758 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001759 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001760 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001761 for (i = 1; i < NCH(n); i++) {
1762 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001763 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001764 if (s == NULL)
1765 goto onError;
1766 if (PyString_Check(v) && PyString_Check(s)) {
1767 PyString_ConcatAndDel(&v, s);
1768 if (v == NULL)
1769 goto onError;
1770 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001771#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001772 else {
1773 PyObject *temp;
1774 temp = PyUnicode_Concat(v, s);
1775 Py_DECREF(s);
1776 if (temp == NULL)
1777 goto onError;
1778 Py_DECREF(v);
1779 v = temp;
1780 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001781#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001782 }
1783 }
1784 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001785
1786 onError:
1787 Py_XDECREF(v);
1788 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001789}
1790
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001791static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001792com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001793{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001794 int anchor = 0;
1795 int save_begin = c->c_begin;
1796
Raymond Hettinger354433a2004-05-19 08:20:33 +00001797 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001798 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001799 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001800 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001801 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001802 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001803 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001804 c->c_loops++;
1805 com_list_iter(c, n, e, t);
1806 c->c_loops--;
1807 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1808 c->c_begin = save_begin;
1809 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001810 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001811}
1812
1813static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001814com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1815{
1816 int break_anchor = 0;
1817 int anchor = 0;
1818 int save_begin = c->c_begin;
1819
1820 REQ(n, gen_for);
1821 /* gen_for: for v in test [gen_iter] */
1822
1823 com_addfwref(c, SETUP_LOOP, &break_anchor);
1824 block_push(c, SETUP_LOOP);
1825
1826 if (is_outmost) {
1827 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1828 com_push(c, 1);
1829 }
1830 else {
1831 com_node(c, CHILD(n, 3));
1832 com_addbyte(c, GET_ITER);
1833 }
1834
1835 c->c_begin = c->c_nexti;
1836 com_set_lineno(c, c->c_last_line);
1837 com_addfwref(c, FOR_ITER, &anchor);
1838 com_push(c, 1);
1839 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1840
1841 if (NCH(n) == 5)
1842 com_gen_iter(c, CHILD(n, 4), t);
1843 else {
1844 com_test(c, t);
1845 com_addbyte(c, YIELD_VALUE);
1846 com_pop(c, 1);
1847 }
1848
1849 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1850 c->c_begin = save_begin;
1851
1852 com_backpatch(c, anchor);
1853 com_pop(c, 1); /* FOR_ITER has popped this */
1854 com_addbyte(c, POP_BLOCK);
1855 block_pop(c, SETUP_LOOP);
1856 com_backpatch(c, break_anchor);
1857}
1858
1859static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001860com_list_if(struct compiling *c, node *n, node *e, char *t)
1861{
1862 int anchor = 0;
1863 int a = 0;
1864 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001865 com_node(c, CHILD(n, 1));
1866 com_addfwref(c, JUMP_IF_FALSE, &a);
1867 com_addbyte(c, POP_TOP);
1868 com_pop(c, 1);
1869 com_list_iter(c, n, e, t);
1870 com_addfwref(c, JUMP_FORWARD, &anchor);
1871 com_backpatch(c, a);
1872 /* We jump here with an extra entry which we now pop */
1873 com_addbyte(c, POP_TOP);
1874 com_backpatch(c, anchor);
1875}
1876
1877static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001878com_gen_if(struct compiling *c, node *n, node *t)
1879{
1880 /* gen_if: 'if' test [gen_iter] */
1881 int anchor = 0;
1882 int a=0;
1883
1884 com_node(c, CHILD(n, 1));
1885 com_addfwref(c, JUMP_IF_FALSE, &a);
1886 com_addbyte(c, POP_TOP);
1887 com_pop(c, 1);
1888
1889 if (NCH(n) == 3)
1890 com_gen_iter(c, CHILD(n, 2), t);
1891 else {
1892 com_test(c, t);
1893 com_addbyte(c, YIELD_VALUE);
1894 com_pop(c, 1);
1895 }
1896 com_addfwref(c, JUMP_FORWARD, &anchor);
1897 com_backpatch(c, a);
1898 /* We jump here with an extra entry which we now pop */
1899 com_addbyte(c, POP_TOP);
1900 com_backpatch(c, anchor);
1901}
1902
1903static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001904com_list_iter(struct compiling *c,
1905 node *p, /* parent of list_iter node */
1906 node *e, /* element expression node */
1907 char *t /* name of result list temp local */)
1908{
1909 /* list_iter is the last child in a listmaker, list_for, or list_if */
1910 node *n = CHILD(p, NCH(p)-1);
1911 if (TYPE(n) == list_iter) {
1912 n = CHILD(n, 0);
1913 switch (TYPE(n)) {
1914 case list_for:
1915 com_list_for(c, n, e, t);
1916 break;
1917 case list_if:
1918 com_list_if(c, n, e, t);
1919 break;
1920 default:
1921 com_error(c, PyExc_SystemError,
1922 "invalid list_iter node type");
1923 }
1924 }
1925 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001926 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001927 com_push(c, 1);
1928 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001929 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001930 com_pop(c, 2);
1931 }
1932}
1933
1934static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001935com_gen_iter(struct compiling *c, node *n, node *t)
1936{
1937 /* gen_iter: gen_for | gen_if */
1938 node *ch;
1939 REQ(n, gen_iter);
1940
1941 ch = CHILD(n, 0);
1942
1943 switch (TYPE(ch)) {
1944 case gen_for:
1945 com_gen_for(c, ch, t, 0);
1946 break;
1947 case gen_if:
1948 com_gen_if(c, ch, t);
1949 break;
1950 default:
1951 com_error(c, PyExc_SystemError,
1952 "invalid gen_iter node type");
1953 }
1954}
1955
1956static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001957com_list_comprehension(struct compiling *c, node *n)
1958{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001959 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001960 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001961
1962 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001963 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001964 com_addoparg(c, BUILD_LIST, 0);
1965 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1966 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001967 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001968 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001969 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001970 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001971 --c->c_tmpname;
1972}
1973
1974static void
1975com_listmaker(struct compiling *c, node *n)
1976{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001977 /* listmaker: test ( list_for | (',' test)* [','] ) */
1978 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001979 com_list_comprehension(c, n);
1980 else {
1981 int len = 0;
1982 int i;
1983 for (i = 0; i < NCH(n); i += 2, len++)
1984 com_node(c, CHILD(n, i));
1985 com_addoparg(c, BUILD_LIST, len);
1986 com_pop(c, len-1);
1987 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001988}
1989
1990static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001991com_generator_expression(struct compiling *c, node *n)
1992{
1993 /* testlist_gexp: test gen_for */
1994 /* argument: test gen_for */
1995 PyCodeObject *co;
1996
1997 REQ(CHILD(n, 0), test);
1998 REQ(CHILD(n, 1), gen_for);
1999
2000 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2001 n->n_lineno);
2002 co = icompile(n, c);
2003 symtable_exit_scope(c->c_symtable);
2004
2005 if (co == NULL)
2006 c->c_errors++;
2007 else {
2008 int closure = com_make_closure(c, co);
2009 int i = com_addconst(c, (PyObject *)co);
2010
2011 com_addoparg(c, LOAD_CONST, i);
2012 com_push(c, 1);
2013 if (closure)
2014 com_addoparg(c, MAKE_CLOSURE, 0);
2015 else
2016 com_addoparg(c, MAKE_FUNCTION, 0);
2017
2018 com_test(c, CHILD(CHILD(n, 1), 3));
2019 com_addbyte(c, GET_ITER);
2020 com_addoparg(c, CALL_FUNCTION, 1);
2021 com_pop(c, 1);
2022
2023 Py_DECREF(co);
2024 }
2025}
2026
2027static void
2028com_testlist_gexp(struct compiling *c, node *n)
2029{
2030 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2031 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2032 com_generator_expression(c, n);
2033 else com_list(c, n, 0);
2034}
2035
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002036
Raymond Hettinger354433a2004-05-19 08:20:33 +00002037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002038com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002039{
2040 int i;
2041 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2042 for (i = 0; i+2 < NCH(n); i += 4) {
2043 /* We must arrange things just right for STORE_SUBSCR.
2044 It wants the stack to look like (value) (dict) (key) */
2045 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002046 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002047 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002048 com_node(c, CHILD(n, i+2)); /* value */
2049 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002050 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 }
2053}
2054
2055static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002056com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002057{
2058 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002060 int i;
2061 REQ(n, atom);
2062 ch = CHILD(n, 0);
2063 switch (TYPE(ch)) {
2064 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002065 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002066 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002067 com_push(c, 1);
2068 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002070 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002072 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002073 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002075 com_push(c, 1);
2076 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002078 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002080 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002082 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002083 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002084 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002085 break;
2086 case BACKQUOTE:
2087 com_node(c, CHILD(n, 1));
2088 com_addbyte(c, UNARY_CONVERT);
2089 break;
2090 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002091 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002092 i = 255;
2093 }
2094 else {
2095 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 }
2098 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002099 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002100 break;
2101 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002102 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002103 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002104 c->c_errors++;
2105 i = 255;
2106 }
2107 else {
2108 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002109 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002110 }
2111 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002112 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002113 break;
2114 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002115 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 break;
2118 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002119 com_error(c, PyExc_SystemError,
2120 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002121 }
2122}
2123
2124static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002125com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126{
2127 if (NCH(n) == 1) {
2128 com_addbyte(c, op);
2129 }
2130 else if (NCH(n) == 2) {
2131 if (TYPE(CHILD(n, 0)) != COLON) {
2132 com_node(c, CHILD(n, 0));
2133 com_addbyte(c, op+1);
2134 }
2135 else {
2136 com_node(c, CHILD(n, 1));
2137 com_addbyte(c, op+2);
2138 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002139 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002140 }
2141 else {
2142 com_node(c, CHILD(n, 0));
2143 com_node(c, CHILD(n, 2));
2144 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002145 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002146 }
2147}
2148
Guido van Rossum635abd21997-01-06 22:56:52 +00002149static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002150com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2151{
2152 if (NCH(n) == 1) {
2153 com_addbyte(c, DUP_TOP);
2154 com_push(c, 1);
2155 com_addbyte(c, SLICE);
2156 com_node(c, augn);
2157 com_addbyte(c, opcode);
2158 com_pop(c, 1);
2159 com_addbyte(c, ROT_TWO);
2160 com_addbyte(c, STORE_SLICE);
2161 com_pop(c, 2);
2162 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2163 com_node(c, CHILD(n, 0));
2164 com_addoparg(c, DUP_TOPX, 2);
2165 com_push(c, 2);
2166 com_addbyte(c, SLICE+1);
2167 com_pop(c, 1);
2168 com_node(c, augn);
2169 com_addbyte(c, opcode);
2170 com_pop(c, 1);
2171 com_addbyte(c, ROT_THREE);
2172 com_addbyte(c, STORE_SLICE+1);
2173 com_pop(c, 3);
2174 } else if (NCH(n) == 2) {
2175 com_node(c, CHILD(n, 1));
2176 com_addoparg(c, DUP_TOPX, 2);
2177 com_push(c, 2);
2178 com_addbyte(c, SLICE+2);
2179 com_pop(c, 1);
2180 com_node(c, augn);
2181 com_addbyte(c, opcode);
2182 com_pop(c, 1);
2183 com_addbyte(c, ROT_THREE);
2184 com_addbyte(c, STORE_SLICE+2);
2185 com_pop(c, 3);
2186 } else {
2187 com_node(c, CHILD(n, 0));
2188 com_node(c, CHILD(n, 2));
2189 com_addoparg(c, DUP_TOPX, 3);
2190 com_push(c, 3);
2191 com_addbyte(c, SLICE+3);
2192 com_pop(c, 2);
2193 com_node(c, augn);
2194 com_addbyte(c, opcode);
2195 com_pop(c, 1);
2196 com_addbyte(c, ROT_FOUR);
2197 com_addbyte(c, STORE_SLICE+3);
2198 com_pop(c, 4);
2199 }
2200}
2201
2202static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002203com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002204{
2205 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002206 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002207 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002208 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002210 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002211 }
2212 else {
2213 com_node(c, CHILD(n, 0));
2214 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002215 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002217 if (NCH(n) == 2) {
2218 com_generator_expression(c, n);
2219 return;
2220 }
2221
Guido van Rossumf10570b1995-07-07 22:53:21 +00002222 m = n;
2223 do {
2224 m = CHILD(m, 0);
2225 } while (NCH(m) == 1);
2226 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002227 /* f(lambda x: x[0] = 3) ends up getting parsed with
2228 * LHS test = lambda x: x[0], and RHS test = 3.
2229 * SF bug 132313 points out that complaining about a keyword
2230 * then is very confusing.
2231 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002232 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002233 TYPE(m) == lambdef ?
2234 "lambda cannot contain assignment" :
2235 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002236 }
2237 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002238 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002239 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002240 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002241 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002242 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002243 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002244 else if (*pkeywords == NULL) {
2245 c->c_errors++;
2246 Py_DECREF(v);
2247 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002248 if (PyDict_GetItem(*pkeywords, v) != NULL)
2249 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002250 "duplicate keyword argument");
2251 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002252 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002253 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002254 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002255 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002256 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002257 }
2258 }
2259 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002260}
2261
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002262static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002263com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002264{
2265 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002266 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267 }
2268 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002269 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002270 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002271 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002272 int star_flag = 0;
2273 int starstar_flag = 0;
2274 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002275 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002276 na = 0;
2277 nk = 0;
2278 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002279 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002280 if (TYPE(ch) == STAR ||
2281 TYPE(ch) == DOUBLESTAR)
2282 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002283 if (ch->n_lineno != lineno) {
2284 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002285 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002286 }
2287 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002288 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002289 na++;
2290 else
2291 nk++;
2292 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002294 while (i < NCH(n)) {
2295 node *tok = CHILD(n, i);
2296 node *ch = CHILD(n, i+1);
2297 i += 3;
2298 switch (TYPE(tok)) {
2299 case STAR: star_flag = 1; break;
2300 case DOUBLESTAR: starstar_flag = 1; break;
2301 }
2302 com_node(c, ch);
2303 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002304 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 com_error(c, PyExc_SyntaxError,
2306 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002307 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002308 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002309 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002310 star_flag + (starstar_flag << 1);
2311 else
2312 opcode = CALL_FUNCTION;
2313 com_addoparg(c, opcode, na | (nk << 8));
2314 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002315 }
2316}
2317
2318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002319com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320{
2321 com_addopname(c, LOAD_ATTR, n);
2322}
2323
2324static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002325com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002326{
2327 int i=0;
2328 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002329 node *ch;
2330
2331 /* first argument */
2332 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002334 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002335 i++;
2336 }
2337 else {
2338 com_node(c, CHILD(n,i));
2339 i++;
2340 REQ(CHILD(n,i),COLON);
2341 i++;
2342 }
2343 /* second argument */
2344 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2345 com_node(c, CHILD(n,i));
2346 i++;
2347 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002348 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002350 com_push(c, 1);
2351 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002352 /* remaining arguments */
2353 for (; i < NCH(n); i++) {
2354 ns++;
2355 ch=CHILD(n,i);
2356 REQ(ch, sliceop);
2357 if (NCH(ch) == 1) {
2358 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002360 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002361 }
2362 else
2363 com_node(c, CHILD(ch,1));
2364 }
2365 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002366 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002367}
2368
2369static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002370com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002371{
2372 node *ch;
2373 REQ(n, subscript);
2374 ch = CHILD(n,0);
2375 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002376 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002377 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002378 com_push(c, 1);
2379 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002380 else {
2381 /* check for slice */
2382 if ((TYPE(ch) == COLON || NCH(n) > 1))
2383 com_sliceobj(c, n);
2384 else {
2385 REQ(ch, test);
2386 com_node(c, ch);
2387 }
2388 }
2389}
2390
2391static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002392com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002393{
2394 int i, op;
2395 REQ(n, subscriptlist);
2396 /* Check to make backward compatible slice behavior for '[i:j]' */
2397 if (NCH(n) == 1) {
2398 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002399 /* 'Basic' slice, should have exactly one colon. */
2400 if ((TYPE(CHILD(sub, 0)) == COLON
2401 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2402 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2403 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002404 switch (assigning) {
2405 case OP_DELETE:
2406 op = DELETE_SLICE;
2407 break;
2408 case OP_ASSIGN:
2409 op = STORE_SLICE;
2410 break;
2411 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002412 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002413 break;
2414 default:
2415 com_augassign_slice(c, sub, assigning, augn);
2416 return;
2417 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002418 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002419 if (op == STORE_SLICE)
2420 com_pop(c, 2);
2421 else if (op == DELETE_SLICE)
2422 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002423 return;
2424 }
2425 }
2426 /* Else normal subscriptlist. Compile each subscript. */
2427 for (i = 0; i < NCH(n); i += 2)
2428 com_subscript(c, CHILD(n, i));
2429 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002430 if (NCH(n) > 1) {
2431 i = (NCH(n)+1) / 2;
2432 com_addoparg(c, BUILD_TUPLE, i);
2433 com_pop(c, i-1);
2434 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002435 switch (assigning) {
2436 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002437 op = DELETE_SUBSCR;
2438 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002439 break;
2440 default:
2441 case OP_ASSIGN:
2442 op = STORE_SUBSCR;
2443 i = 3;
2444 break;
2445 case OP_APPLY:
2446 op = BINARY_SUBSCR;
2447 i = 1;
2448 break;
2449 }
2450 if (assigning > OP_APPLY) {
2451 com_addoparg(c, DUP_TOPX, 2);
2452 com_push(c, 2);
2453 com_addbyte(c, BINARY_SUBSCR);
2454 com_pop(c, 1);
2455 com_node(c, augn);
2456 com_addbyte(c, assigning);
2457 com_pop(c, 1);
2458 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002459 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002460 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002461 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002462}
2463
2464static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002465com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002466{
2467 REQ(n, trailer);
2468 switch (TYPE(CHILD(n, 0))) {
2469 case LPAR:
2470 com_call_function(c, CHILD(n, 1));
2471 break;
2472 case DOT:
2473 com_select_member(c, CHILD(n, 1));
2474 break;
2475 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002476 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002477 break;
2478 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002479 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002480 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002481 }
2482}
2483
2484static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002485com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002486{
2487 int i;
2488 REQ(n, power);
2489 com_atom(c, CHILD(n, 0));
2490 for (i = 1; i < NCH(n); i++) {
2491 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2492 com_factor(c, CHILD(n, i+1));
2493 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002494 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002495 break;
2496 }
2497 else
2498 com_apply_trailer(c, CHILD(n, i));
2499 }
2500}
2501
2502static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002503com_invert_constant(struct compiling *c, node *n)
2504{
2505 /* Compute the inverse of int and longs and use them directly,
2506 but be prepared to generate code for all other
2507 possibilities (invalid numbers, floats, complex).
2508 */
2509 PyObject *num, *inv = NULL;
2510 int i;
2511
2512 REQ(n, NUMBER);
2513 num = parsenumber(c, STR(n));
2514 if (num == NULL)
2515 i = 255;
2516 else {
2517 inv = PyNumber_Invert(num);
2518 if (inv == NULL) {
2519 PyErr_Clear();
2520 i = com_addconst(c, num);
2521 } else {
2522 i = com_addconst(c, inv);
2523 Py_DECREF(inv);
2524 }
2525 Py_DECREF(num);
2526 }
2527 com_addoparg(c, LOAD_CONST, i);
2528 com_push(c, 1);
2529 if (num != NULL && inv == NULL)
2530 com_addbyte(c, UNARY_INVERT);
2531}
2532
Tim Peters51e26512001-09-07 08:45:55 +00002533static int
2534is_float_zero(const char *p)
2535{
2536 int found_radix_point = 0;
2537 int ch;
2538 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2539 switch (ch) {
2540 case '0':
2541 /* no reason to believe it's not 0 -- continue */
2542 break;
2543
2544 case 'e': case 'E': case 'j': case 'J':
2545 /* If this was a hex constant, we already would have
2546 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2547 must be an exponent marker, and we haven't yet
2548 seen a non-zero digit, and it doesn't matter what
2549 the exponent is then. For 'j' or 'J' similarly,
2550 except that this is an imaginary 0 then. */
2551 return 1;
2552
2553 case '.':
2554 found_radix_point = 1;
2555 break;
2556
2557 default:
2558 return 0;
2559 }
2560 }
2561 return found_radix_point;
2562}
2563
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002564static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002565com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002566{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002567 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002568 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002569 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002570 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002571 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002572 approriate value as a constant. If the value is negative,
2573 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002574 negative in the 0th position -- unless we're doing unary minus
2575 of a floating zero! In that case the sign is significant, but
2576 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002577 */
2578 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002579 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002580 && TYPE((pfactor = CHILD(n, 1))) == factor
2581 && NCH(pfactor) == 1
2582 && TYPE((ppower = CHILD(pfactor, 0))) == power
2583 && NCH(ppower) == 1
2584 && TYPE((patom = CHILD(ppower, 0))) == atom
2585 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002586 && !(childtype == MINUS &&
2587 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002588 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002589 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002590 return;
2591 }
2592 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002593 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002594 if (s == NULL) {
2595 com_error(c, PyExc_MemoryError, "");
2596 com_addbyte(c, 255);
2597 return;
2598 }
2599 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002600 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002601 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002602 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002603 }
Tim Peters51e26512001-09-07 08:45:55 +00002604 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002605 }
2606 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002607 com_factor(c, CHILD(n, 1));
2608 com_addbyte(c, UNARY_POSITIVE);
2609 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002610 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002611 com_factor(c, CHILD(n, 1));
2612 com_addbyte(c, UNARY_NEGATIVE);
2613 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002614 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002615 com_factor(c, CHILD(n, 1));
2616 com_addbyte(c, UNARY_INVERT);
2617 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002619 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002620 }
2621}
2622
2623static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002624com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625{
2626 int i;
2627 int op;
2628 REQ(n, term);
2629 com_factor(c, CHILD(n, 0));
2630 for (i = 2; i < NCH(n); i += 2) {
2631 com_factor(c, CHILD(n, i));
2632 switch (TYPE(CHILD(n, i-1))) {
2633 case STAR:
2634 op = BINARY_MULTIPLY;
2635 break;
2636 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002637 if (c->c_flags & CO_FUTURE_DIVISION)
2638 op = BINARY_TRUE_DIVIDE;
2639 else
2640 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002641 break;
2642 case PERCENT:
2643 op = BINARY_MODULO;
2644 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002645 case DOUBLESLASH:
2646 op = BINARY_FLOOR_DIVIDE;
2647 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002648 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002649 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002650 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002651 op = 255;
2652 }
2653 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002654 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002655 }
2656}
2657
2658static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002659com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002660{
2661 int i;
2662 int op;
2663 REQ(n, arith_expr);
2664 com_term(c, CHILD(n, 0));
2665 for (i = 2; i < NCH(n); i += 2) {
2666 com_term(c, CHILD(n, i));
2667 switch (TYPE(CHILD(n, i-1))) {
2668 case PLUS:
2669 op = BINARY_ADD;
2670 break;
2671 case MINUS:
2672 op = BINARY_SUBTRACT;
2673 break;
2674 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002675 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002676 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002677 op = 255;
2678 }
2679 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002680 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002681 }
2682}
2683
2684static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002685com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002686{
2687 int i;
2688 int op;
2689 REQ(n, shift_expr);
2690 com_arith_expr(c, CHILD(n, 0));
2691 for (i = 2; i < NCH(n); i += 2) {
2692 com_arith_expr(c, CHILD(n, i));
2693 switch (TYPE(CHILD(n, i-1))) {
2694 case LEFTSHIFT:
2695 op = BINARY_LSHIFT;
2696 break;
2697 case RIGHTSHIFT:
2698 op = BINARY_RSHIFT;
2699 break;
2700 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002701 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002702 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002703 op = 255;
2704 }
2705 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002706 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002707 }
2708}
2709
2710static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002711com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002712{
2713 int i;
2714 int op;
2715 REQ(n, and_expr);
2716 com_shift_expr(c, CHILD(n, 0));
2717 for (i = 2; i < NCH(n); i += 2) {
2718 com_shift_expr(c, CHILD(n, i));
2719 if (TYPE(CHILD(n, i-1)) == AMPER) {
2720 op = BINARY_AND;
2721 }
2722 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002723 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002724 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002725 op = 255;
2726 }
2727 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002728 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002729 }
2730}
2731
2732static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002733com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002734{
2735 int i;
2736 int op;
2737 REQ(n, xor_expr);
2738 com_and_expr(c, CHILD(n, 0));
2739 for (i = 2; i < NCH(n); i += 2) {
2740 com_and_expr(c, CHILD(n, i));
2741 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2742 op = BINARY_XOR;
2743 }
2744 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002745 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002746 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002747 op = 255;
2748 }
2749 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002750 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002751 }
2752}
2753
2754static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002755com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756{
2757 int i;
2758 int op;
2759 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002760 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002762 com_xor_expr(c, CHILD(n, i));
2763 if (TYPE(CHILD(n, i-1)) == VBAR) {
2764 op = BINARY_OR;
2765 }
2766 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002767 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002768 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002769 op = 255;
2770 }
2771 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002772 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 }
2774}
2775
2776static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002777cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778{
2779 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002780 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2782 if (NCH(n) == 1) {
2783 n = CHILD(n, 0);
2784 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002785 case LESS: return PyCmp_LT;
2786 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002787 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002788 case LESSEQUAL: return PyCmp_LE;
2789 case GREATEREQUAL: return PyCmp_GE;
2790 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2791 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2792 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002793 }
2794 }
2795 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002796 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002798 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002799 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002800 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 }
2802 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002803 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804}
2805
2806static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002807com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002808{
2809 int i;
2810 enum cmp_op op;
2811 int anchor;
2812 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2813 com_expr(c, CHILD(n, 0));
2814 if (NCH(n) == 1)
2815 return;
2816
2817 /****************************************************************
2818 The following code is generated for all but the last
2819 comparison in a chain:
2820
2821 label: on stack: opcode: jump to:
2822
2823 a <code to load b>
2824 a, b DUP_TOP
2825 a, b, b ROT_THREE
2826 b, a, b COMPARE_OP
2827 b, 0-or-1 JUMP_IF_FALSE L1
2828 b, 1 POP_TOP
2829 b
2830
2831 We are now ready to repeat this sequence for the next
2832 comparison in the chain.
2833
2834 For the last we generate:
2835
2836 b <code to load c>
2837 b, c COMPARE_OP
2838 0-or-1
2839
2840 If there were any jumps to L1 (i.e., there was more than one
2841 comparison), we generate:
2842
2843 0-or-1 JUMP_FORWARD L2
2844 L1: b, 0 ROT_TWO
2845 0, b POP_TOP
2846 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002847 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002848 ****************************************************************/
2849
2850 anchor = 0;
2851
2852 for (i = 2; i < NCH(n); i += 2) {
2853 com_expr(c, CHILD(n, i));
2854 if (i+2 < NCH(n)) {
2855 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002856 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002857 com_addbyte(c, ROT_THREE);
2858 }
2859 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002860 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002861 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002862 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002863 }
2864 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002865 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002866 if (i+2 < NCH(n)) {
2867 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2868 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002869 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002870 }
2871 }
2872
2873 if (anchor) {
2874 int anchor2 = 0;
2875 com_addfwref(c, JUMP_FORWARD, &anchor2);
2876 com_backpatch(c, anchor);
2877 com_addbyte(c, ROT_TWO);
2878 com_addbyte(c, POP_TOP);
2879 com_backpatch(c, anchor2);
2880 }
2881}
2882
2883static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002884com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002885{
2886 REQ(n, not_test); /* 'not' not_test | comparison */
2887 if (NCH(n) == 1) {
2888 com_comparison(c, CHILD(n, 0));
2889 }
2890 else {
2891 com_not_test(c, CHILD(n, 1));
2892 com_addbyte(c, UNARY_NOT);
2893 }
2894}
2895
2896static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002897com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002898{
2899 int i;
2900 int anchor;
2901 REQ(n, and_test); /* not_test ('and' not_test)* */
2902 anchor = 0;
2903 i = 0;
2904 for (;;) {
2905 com_not_test(c, CHILD(n, i));
2906 if ((i += 2) >= NCH(n))
2907 break;
2908 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2909 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002910 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002911 }
2912 if (anchor)
2913 com_backpatch(c, anchor);
2914}
2915
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002916static int
2917com_make_closure(struct compiling *c, PyCodeObject *co)
2918{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002919 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002920 if (free == 0)
2921 return 0;
2922 for (i = 0; i < free; ++i) {
2923 /* Bypass com_addop_varname because it will generate
2924 LOAD_DEREF but LOAD_CLOSURE is needed.
2925 */
2926 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2927 int arg, reftype;
2928
2929 /* Special case: If a class contains a method with a
2930 free variable that has the same name as a method,
2931 the name will be considered free *and* local in the
2932 class. It should be handled by the closure, as
2933 well as by the normal name loookup logic.
2934 */
2935 reftype = get_ref_type(c, PyString_AS_STRING(name));
2936 if (reftype == CELL)
2937 arg = com_lookup_arg(c->c_cellvars, name);
2938 else /* (reftype == FREE) */
2939 arg = com_lookup_arg(c->c_freevars, name);
2940 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002941 fprintf(stderr, "lookup %s in %s %d %d\n"
2942 "freevars of %s: %s\n",
2943 PyObject_REPR(name),
2944 c->c_name,
2945 reftype, arg,
2946 PyString_AS_STRING(co->co_name),
2947 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002948 Py_FatalError("com_make_closure()");
2949 }
2950 com_addoparg(c, LOAD_CLOSURE, arg);
2951
2952 }
2953 com_push(c, free);
2954 return 1;
2955}
2956
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002957static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002958com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002959{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002961 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002962 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002963 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002964 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002965 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2966 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002967 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002968 if (co == NULL) {
2969 c->c_errors++;
2970 return;
2971 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002972 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002973 i = com_addconst(c, (PyObject *)co);
2974 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002975 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002976 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002977 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002978 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002979 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002980 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002981 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002982 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002983 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002984 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002985 else {
2986 int anchor = 0;
2987 int i = 0;
2988 for (;;) {
2989 com_and_test(c, CHILD(n, i));
2990 if ((i += 2) >= NCH(n))
2991 break;
2992 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2993 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002994 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002995 }
2996 if (anchor)
2997 com_backpatch(c, anchor);
2998 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002999}
3000
3001static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003002com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003003{
3004 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003005 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003006 com_node(c, CHILD(n, 0));
3007 }
3008 else {
3009 int i;
3010 int len;
3011 len = (NCH(n) + 1) / 2;
3012 for (i = 0; i < NCH(n); i += 2)
3013 com_node(c, CHILD(n, i));
3014 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003015 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016 }
3017}
3018
3019
3020/* Begin of assignment compilation */
3021
Thomas Wouters434d0822000-08-24 20:11:32 +00003022
3023static void
3024com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3025{
3026 com_addbyte(c, DUP_TOP);
3027 com_push(c, 1);
3028 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003029 com_node(c, augn);
3030 com_addbyte(c, opcode);
3031 com_pop(c, 1);
3032 com_addbyte(c, ROT_TWO);
3033 com_addopname(c, STORE_ATTR, n);
3034 com_pop(c, 2);
3035}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003036
3037static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003038com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003039{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003040 if (none_assignment_check(c, STR(n), assigning))
3041 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003042 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003043 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044}
3045
3046static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003047com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003048{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049 REQ(n, trailer);
3050 switch (TYPE(CHILD(n, 0))) {
3051 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003052 if (assigning == OP_DELETE)
3053 com_error(c, PyExc_SyntaxError,
3054 "can't delete function call");
3055 else
3056 com_error(c, PyExc_SyntaxError,
3057 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003058 break;
3059 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003060 if (assigning > OP_APPLY)
3061 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3062 else
3063 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003064 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003065 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003066 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003067 break;
3068 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003069 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003070 }
3071}
3072
3073static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003074com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075{
3076 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003077 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3078 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003079 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003080 if (assigning) {
3081 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003082 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 com_push(c, i-1);
3084 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003086 com_assign(c, CHILD(n, i), assigning, NULL);
3087}
3088
3089static void
3090com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3091{
3092 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003093 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003094 com_push(c, 1);
3095 com_node(c, augn);
3096 com_addbyte(c, opcode);
3097 com_pop(c, 1);
3098 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003099}
3100
3101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003102com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003103{
3104 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003105 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003106 if (assigning)
3107 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108}
3109
3110static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003111com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003112{
3113 /* Loop to avoid trivial recursion */
3114 for (;;) {
3115 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003116
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117 case exprlist:
3118 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003119 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003120 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003121 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003122 if (TYPE(CHILD(n, 1)) == gen_for) {
3123 com_error(c, PyExc_SystemError,
3124 "assign to generator expression not possible");
3125 return;
3126 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003127 if (assigning > OP_APPLY) {
3128 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003129 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003130 return;
3131 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003132 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003133 return;
3134 }
3135 n = CHILD(n, 0);
3136 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003137
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 case test:
3139 case and_test:
3140 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003141 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003143 case xor_expr:
3144 case and_expr:
3145 case shift_expr:
3146 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003148 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003149 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003150 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003151 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 return;
3153 }
3154 n = CHILD(n, 0);
3155 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003156
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003157 case power: /* atom trailer* ('**' power)*
3158 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003159 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003160 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003161 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003162 return;
3163 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003164 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003165 int i;
3166 com_node(c, CHILD(n, 0));
3167 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003168 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003169 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003170 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003171 return;
3172 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003173 com_apply_trailer(c, CHILD(n, i));
3174 } /* NB i is still alive */
3175 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003176 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003177 return;
3178 }
3179 n = CHILD(n, 0);
3180 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003181
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 case atom:
3183 switch (TYPE(CHILD(n, 0))) {
3184 case LPAR:
3185 n = CHILD(n, 1);
3186 if (TYPE(n) == RPAR) {
3187 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003188 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003189 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003190 return;
3191 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003192 if (assigning > OP_APPLY) {
3193 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003194 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003195 return;
3196 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003197 break;
3198 case LSQB:
3199 n = CHILD(n, 1);
3200 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003201 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003202 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003203 return;
3204 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003205 if (assigning > OP_APPLY) {
3206 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003207 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003208 return;
3209 }
3210 if (NCH(n) > 1
3211 && TYPE(CHILD(n, 1)) == list_for) {
3212 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003213 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003214 return;
3215 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003216 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003217 return;
3218 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003219 if (assigning > OP_APPLY)
3220 com_augassign_name(c, CHILD(n, 0),
3221 assigning, augn);
3222 else
3223 com_assign_name(c, CHILD(n, 0),
3224 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003225 return;
3226 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003227 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003228 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003229 return;
3230 }
3231 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003232
3233 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003234 com_error(c, PyExc_SyntaxError,
3235 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003236 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003237
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003238 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_error(c, PyExc_SystemError,
3240 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003241 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003242
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 }
3244 }
3245}
Guido van Rossum7c531111997-03-11 18:42:21 +00003246
Thomas Wouters434d0822000-08-24 20:11:32 +00003247static void
3248com_augassign(struct compiling *c, node *n)
3249{
3250 int opcode;
3251
3252 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3253 case '+': opcode = INPLACE_ADD; break;
3254 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003255 case '/':
3256 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3257 opcode = INPLACE_FLOOR_DIVIDE;
3258 else if (c->c_flags & CO_FUTURE_DIVISION)
3259 opcode = INPLACE_TRUE_DIVIDE;
3260 else
3261 opcode = INPLACE_DIVIDE;
3262 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003263 case '%': opcode = INPLACE_MODULO; break;
3264 case '<': opcode = INPLACE_LSHIFT; break;
3265 case '>': opcode = INPLACE_RSHIFT; break;
3266 case '&': opcode = INPLACE_AND; break;
3267 case '^': opcode = INPLACE_XOR; break;
3268 case '|': opcode = INPLACE_OR; break;
3269 case '*':
3270 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3271 opcode = INPLACE_POWER;
3272 else
3273 opcode = INPLACE_MULTIPLY;
3274 break;
3275 default:
3276 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3277 return;
3278 }
3279 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3280}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003281
3282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003283com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003284{
Thomas Wouters434d0822000-08-24 20:11:32 +00003285 REQ(n, expr_stmt);
3286 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003287 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003288 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003289 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003290 if (NCH(n) == 1) {
3291 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003292 if (c->c_interactive)
3293 com_addbyte(c, PRINT_EXPR);
3294 else
3295 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003296 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003297 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003298 else if (TYPE(CHILD(n,1)) == augassign)
3299 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003300 else {
3301 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003302 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003303 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003304 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003306 com_push(c, 1);
3307 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003308 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003309 }
3310 }
3311}
3312
3313static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003314com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003315{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003316 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003317 int i;
3318 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003319 if (Py_OptimizeFlag)
3320 return;
3321 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003322
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003323 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003324 raise AssertionError [, <message>]
3325
3326 where <message> is the second test, if present.
3327 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003328 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003329 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003330 com_addbyte(c, POP_TOP);
3331 com_pop(c, 1);
3332 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003333 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003334 com_push(c, 1);
3335 i = NCH(n)/2; /* Either 2 or 4 */
3336 if (i > 1)
3337 com_node(c, CHILD(n, 3));
3338 com_addoparg(c, RAISE_VARARGS, i);
3339 com_pop(c, i);
3340 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003341 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003342 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003343 com_addbyte(c, POP_TOP);
3344}
3345
3346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003347com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003348{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003349 int i = 1;
3350 node* stream = NULL;
3351
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003352 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003353
3354 /* are we using the extended print form? */
3355 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3356 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003357 com_node(c, stream);
3358 /* stack: [...] => [... stream] */
3359 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003360 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3361 i = 4;
3362 else
3363 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003364 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003365 for (; i < NCH(n); i += 2) {
3366 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003367 com_addbyte(c, DUP_TOP);
3368 /* stack: [stream] => [stream stream] */
3369 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003370 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003371 /* stack: [stream stream] => [stream stream obj] */
3372 com_addbyte(c, ROT_TWO);
3373 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003374 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003375 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003376 com_pop(c, 2);
3377 }
3378 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003379 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003380 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003381 com_addbyte(c, PRINT_ITEM);
3382 com_pop(c, 1);
3383 }
3384 }
3385 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003386 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003387 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003388 /* must pop the extra stream object off the stack */
3389 com_addbyte(c, POP_TOP);
3390 /* stack: [... stream] => [...] */
3391 com_pop(c, 1);
3392 }
3393 }
3394 else {
3395 if (stream != NULL) {
3396 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003397 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003398 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003399 com_pop(c, 1);
3400 }
3401 else
3402 com_addbyte(c, PRINT_NEWLINE);
3403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003404}
3405
3406static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003407com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003408{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003409 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003410 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003411 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003412 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003413 if (c->c_flags & CO_GENERATOR) {
3414 if (NCH(n) > 1) {
3415 com_error(c, PyExc_SyntaxError,
3416 "'return' with argument inside generator");
3417 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003418 }
3419 if (NCH(n) < 2) {
3420 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003421 com_push(c, 1);
3422 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003423 else
3424 com_node(c, CHILD(n, 1));
3425 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003426 com_pop(c, 1);
3427}
3428
3429static void
3430com_yield_stmt(struct compiling *c, node *n)
3431{
Tim Peters95c80f82001-06-23 02:07:08 +00003432 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003433 REQ(n, yield_stmt); /* 'yield' testlist */
3434 if (!c->c_infunction) {
3435 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3436 }
Tim Peters95c80f82001-06-23 02:07:08 +00003437
3438 for (i = 0; i < c->c_nblocks; ++i) {
3439 if (c->c_block[i] == SETUP_FINALLY) {
3440 com_error(c, PyExc_SyntaxError,
3441 "'yield' not allowed in a 'try' block "
3442 "with a 'finally' clause");
3443 return;
3444 }
3445 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003446 com_node(c, CHILD(n, 1));
3447 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003448 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003449}
3450
3451static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003452com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003453{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003454 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003455 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3456 if (NCH(n) > 1) {
3457 com_node(c, CHILD(n, 1));
3458 if (NCH(n) > 3) {
3459 com_node(c, CHILD(n, 3));
3460 if (NCH(n) > 5)
3461 com_node(c, CHILD(n, 5));
3462 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003463 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003464 i = NCH(n)/2;
3465 com_addoparg(c, RAISE_VARARGS, i);
3466 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003467}
3468
3469static void
Thomas Wouters52152252000-08-17 22:55:00 +00003470com_from_import(struct compiling *c, node *n)
3471{
3472 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3473 com_push(c, 1);
3474 if (NCH(n) > 1) {
3475 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3476 com_error(c, PyExc_SyntaxError, "invalid syntax");
3477 return;
3478 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003479 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003480 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003481 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003482 com_pop(c, 1);
3483}
3484
3485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003486com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003487{
3488 int i;
3489 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003490 /* 'import' dotted_name (',' dotted_name)* |
3491 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003493 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003494 /* 'from' dotted_name 'import' ... */
3495 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003496
3497 if (TYPE(CHILD(n, 3)) == STAR) {
3498 tup = Py_BuildValue("(s)", "*");
3499 } else {
3500 tup = PyTuple_New((NCH(n) - 2)/2);
3501 for (i = 3; i < NCH(n); i += 2) {
3502 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003503 PyString_FromString(STR(
3504 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003505 }
3506 }
3507 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003508 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003509 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003510 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003511 if (TYPE(CHILD(n, 3)) == STAR)
3512 com_addbyte(c, IMPORT_STAR);
3513 else {
3514 for (i = 3; i < NCH(n); i += 2)
3515 com_from_import(c, CHILD(n, i));
3516 com_addbyte(c, POP_TOP);
3517 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003518 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003519 }
3520 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003521 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003522 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003523 node *subn = CHILD(n, i);
3524 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003525 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003526 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003527 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003528 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003529 int j;
3530 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003531 com_error(c, PyExc_SyntaxError,
3532 "invalid syntax");
3533 return;
3534 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003535 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3536 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003537 CHILD(CHILD(subn, 0),
3538 j));
3539 com_addop_varname(c, VAR_STORE,
3540 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003541 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003542 com_addop_varname(c, VAR_STORE,
3543 STR(CHILD(CHILD(subn, 0),
3544 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003545 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003546 }
3547 }
3548}
3549
3550static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003551com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003552{
3553 REQ(n, exec_stmt);
3554 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3555 com_node(c, CHILD(n, 1));
3556 if (NCH(n) >= 4)
3557 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003558 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003559 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003560 com_push(c, 1);
3561 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003562 if (NCH(n) >= 6)
3563 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003564 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003565 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003566 com_push(c, 1);
3567 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003568 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003569 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003570}
3571
Guido van Rossum7c531111997-03-11 18:42:21 +00003572static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003573is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003574{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003575 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003576 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003577 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003578
3579 /* Label to avoid tail recursion */
3580 next:
3581 switch (TYPE(n)) {
3582
3583 case suite:
3584 if (NCH(n) == 1) {
3585 n = CHILD(n, 0);
3586 goto next;
3587 }
3588 /* Fall through */
3589 case file_input:
3590 for (i = 0; i < NCH(n); i++) {
3591 node *ch = CHILD(n, i);
3592 if (TYPE(ch) == stmt) {
3593 n = ch;
3594 goto next;
3595 }
3596 }
3597 break;
3598
3599 case stmt:
3600 case simple_stmt:
3601 case small_stmt:
3602 n = CHILD(n, 0);
3603 goto next;
3604
3605 case expr_stmt:
3606 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003607 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003608 case test:
3609 case and_test:
3610 case not_test:
3611 case comparison:
3612 case expr:
3613 case xor_expr:
3614 case and_expr:
3615 case shift_expr:
3616 case arith_expr:
3617 case term:
3618 case factor:
3619 case power:
3620 case atom:
3621 if (NCH(n) == 1) {
3622 n = CHILD(n, 0);
3623 goto next;
3624 }
3625 break;
3626
3627 case NAME:
3628 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3629 return 1;
3630 break;
3631
3632 case NUMBER:
3633 v = parsenumber(c, STR(n));
3634 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003635 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003636 break;
3637 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003638 i = PyObject_IsTrue(v);
3639 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003640 return i == 0;
3641
3642 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003643 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003644 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003645 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003646 break;
3647 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003648 i = PyObject_IsTrue(v);
3649 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003650 return i == 0;
3651
3652 }
3653 return 0;
3654}
3655
Tim Peters08a898f2001-06-28 01:52:22 +00003656
3657/* Look under n for a return stmt with an expression.
3658 * This hack is used to find illegal returns under "if 0:" blocks in
3659 * functions already known to be generators (as determined by the symtable
3660 * pass).
3661 * Return the offending return node if found, else NULL.
3662 */
3663static node *
3664look_for_offending_return(node *n)
3665{
3666 int i;
3667
3668 for (i = 0; i < NCH(n); ++i) {
3669 node *kid = CHILD(n, i);
3670
3671 switch (TYPE(kid)) {
3672 case classdef:
3673 case funcdef:
3674 case lambdef:
3675 /* Stuff in nested functions & classes doesn't
3676 affect the code block we started in. */
3677 return NULL;
3678
3679 case return_stmt:
3680 if (NCH(kid) > 1)
3681 return kid;
3682 break;
3683
3684 default: {
3685 node *bad = look_for_offending_return(kid);
3686 if (bad != NULL)
3687 return bad;
3688 }
3689 }
3690 }
3691
3692 return NULL;
3693}
3694
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003695static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003696com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003697{
3698 int i;
3699 int anchor = 0;
3700 REQ(n, if_stmt);
3701 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3702 for (i = 0; i+3 < NCH(n); i+=4) {
3703 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003704 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003705 if (is_constant_false(c, ch)) {
3706 /* We're going to skip this block. However, if this
3707 is a generator, we have to check the dead code
3708 anyway to make sure there aren't any return stmts
3709 with expressions, in the same scope. */
3710 if (c->c_flags & CO_GENERATOR) {
3711 node *p = look_for_offending_return(n);
3712 if (p != NULL) {
3713 int savelineno = c->c_lineno;
3714 c->c_lineno = p->n_lineno;
3715 com_error(c, PyExc_SyntaxError,
3716 "'return' with argument "
3717 "inside generator");
3718 c->c_lineno = savelineno;
3719 }
3720 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003721 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003722 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003723 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003724 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003725 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003726 com_addfwref(c, JUMP_IF_FALSE, &a);
3727 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003728 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003729 com_node(c, CHILD(n, i+3));
3730 com_addfwref(c, JUMP_FORWARD, &anchor);
3731 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003733 com_addbyte(c, POP_TOP);
3734 }
3735 if (i+2 < NCH(n))
3736 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003737 if (anchor)
3738 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003739}
3740
3741static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003742com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003743{
3744 int break_anchor = 0;
3745 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003746 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003747 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3748 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003749 block_push(c, SETUP_LOOP);
3750 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003751 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003752 com_node(c, CHILD(n, 1));
3753 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3754 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003755 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003756 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003757 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003758 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003759 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3760 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003761 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003762 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003763 com_addbyte(c, POP_TOP);
3764 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003765 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 if (NCH(n) > 4)
3767 com_node(c, CHILD(n, 6));
3768 com_backpatch(c, break_anchor);
3769}
3770
3771static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003772com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 int break_anchor = 0;
3775 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003776 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 REQ(n, for_stmt);
3778 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3779 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003780 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003781 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003782 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003783 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003784 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003785 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003786 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003787 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003788 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003790 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003791 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3792 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003794 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003795 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003796 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 if (NCH(n) > 8)
3798 com_node(c, CHILD(n, 8));
3799 com_backpatch(c, break_anchor);
3800}
3801
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003802/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003803
3804 SETUP_FINALLY L
3805 <code for S>
3806 POP_BLOCK
3807 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003808 L: <code for Sf>
3809 END_FINALLY
3810
3811 The special instructions use the block stack. Each block
3812 stack entry contains the instruction that created it (here
3813 SETUP_FINALLY), the level of the value stack at the time the
3814 block stack entry was created, and a label (here L).
3815
3816 SETUP_FINALLY:
3817 Pushes the current value stack level and the label
3818 onto the block stack.
3819 POP_BLOCK:
3820 Pops en entry from the block stack, and pops the value
3821 stack until its level is the same as indicated on the
3822 block stack. (The label is ignored.)
3823 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003824 Pops a variable number of entries from the *value* stack
3825 and re-raises the exception they specify. The number of
3826 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003827
3828 The block stack is unwound when an exception is raised:
3829 when a SETUP_FINALLY entry is found, the exception is pushed
3830 onto the value stack (and the exception condition is cleared),
3831 and the interpreter jumps to the label gotten from the block
3832 stack.
3833
3834 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003835 (The contents of the value stack is shown in [], with the top
3836 at the right; 'tb' is trace-back info, 'val' the exception's
3837 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003838
3839 Value stack Label Instruction Argument
3840 [] SETUP_EXCEPT L1
3841 [] <code for S>
3842 [] POP_BLOCK
3843 [] JUMP_FORWARD L0
3844
Guido van Rossum3f5da241990-12-20 15:06:42 +00003845 [tb, val, exc] L1: DUP )
3846 [tb, val, exc, exc] <evaluate E1> )
3847 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3848 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3849 [tb, val, exc, 1] POP )
3850 [tb, val, exc] POP
3851 [tb, val] <assign to V1> (or POP if no V1)
3852 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003853 [] <code for S1>
3854 JUMP_FORWARD L0
3855
Guido van Rossum3f5da241990-12-20 15:06:42 +00003856 [tb, val, exc, 0] L2: POP
3857 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003858 .............................etc.......................
3859
Guido van Rossum3f5da241990-12-20 15:06:42 +00003860 [tb, val, exc, 0] Ln+1: POP
3861 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003862
3863 [] L0: <next statement>
3864
3865 Of course, parts are not generated if Vi or Ei is not present.
3866*/
3867
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003868static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003869com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003870{
3871 int except_anchor = 0;
3872 int end_anchor = 0;
3873 int else_anchor = 0;
3874 int i;
3875 node *ch;
3876
3877 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3878 block_push(c, SETUP_EXCEPT);
3879 com_node(c, CHILD(n, 2));
3880 com_addbyte(c, POP_BLOCK);
3881 block_pop(c, SETUP_EXCEPT);
3882 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3883 com_backpatch(c, except_anchor);
3884 for (i = 3;
3885 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3886 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003887 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003888 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003889 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003890 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003891 break;
3892 }
3893 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003894 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003895 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003896 if (NCH(ch) > 1) {
3897 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003898 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003899 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003900 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003901 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003902 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3903 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003904 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003905 }
3906 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003907 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003908 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003909 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003910 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003911 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003912 com_pop(c, 1);
3913 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003914 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003915 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003916 com_node(c, CHILD(n, i+2));
3917 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3918 if (except_anchor) {
3919 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003920 /* We come in with [tb, val, exc, 0] on the
3921 stack; one pop and it's the same as
3922 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003923 com_addbyte(c, POP_TOP);
3924 }
3925 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003926 /* We actually come in here with [tb, val, exc] but the
3927 END_FINALLY will zap those and jump around.
3928 The c_stacklevel does not reflect them so we need not pop
3929 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003930 com_addbyte(c, END_FINALLY);
3931 com_backpatch(c, else_anchor);
3932 if (i < NCH(n))
3933 com_node(c, CHILD(n, i+2));
3934 com_backpatch(c, end_anchor);
3935}
3936
3937static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003938com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003939{
3940 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003941 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003942
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003943 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3944 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003945 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003946 com_addbyte(c, POP_BLOCK);
3947 block_pop(c, SETUP_FINALLY);
3948 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003949 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003950 /* While the generated code pushes only one item,
3951 the try-finally handling can enter here with
3952 up to three items. OK, here are the details:
3953 3 for an exception, 2 for RETURN, 1 for BREAK. */
3954 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003955 com_backpatch(c, finally_anchor);
3956 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003957 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003958 com_node(c, ch);
3959 com_addbyte(c, END_FINALLY);
3960 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003961 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003962}
3963
3964static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003965com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003966{
3967 REQ(n, try_stmt);
3968 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3969 | 'try' ':' suite 'finally' ':' suite */
3970 if (TYPE(CHILD(n, 3)) != except_clause)
3971 com_try_finally(c, n);
3972 else
3973 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003974}
3975
Guido van Rossum8b993a91997-01-17 21:04:03 +00003976static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003977get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003978{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003979 int i;
3980
Guido van Rossum8b993a91997-01-17 21:04:03 +00003981 /* Label to avoid tail recursion */
3982 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003983 switch (TYPE(n)) {
3984
3985 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003986 if (NCH(n) == 1) {
3987 n = CHILD(n, 0);
3988 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003989 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003990 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003991 case file_input:
3992 for (i = 0; i < NCH(n); i++) {
3993 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003994 if (TYPE(ch) == stmt) {
3995 n = ch;
3996 goto next;
3997 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003998 }
3999 break;
4000
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004001 case stmt:
4002 case simple_stmt:
4003 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004004 n = CHILD(n, 0);
4005 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004006
4007 case expr_stmt:
4008 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004009 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004010 case test:
4011 case and_test:
4012 case not_test:
4013 case comparison:
4014 case expr:
4015 case xor_expr:
4016 case and_expr:
4017 case shift_expr:
4018 case arith_expr:
4019 case term:
4020 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004021 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004022 if (NCH(n) == 1) {
4023 n = CHILD(n, 0);
4024 goto next;
4025 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004026 break;
4027
4028 case atom:
4029 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004030 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004031 break;
4032
4033 }
4034 return NULL;
4035}
4036
Guido van Rossum79f25d91997-04-29 20:08:16 +00004037static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004038get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004039{
Guido van Rossum541563e1999-01-28 15:08:09 +00004040 /* Don't generate doc-strings if run with -OO */
4041 if (Py_OptimizeFlag > 1)
4042 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004043 n = get_rawdocstring(n);
4044 if (n == NULL)
4045 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004046 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004047}
4048
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004049static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004050com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004051{
4052 REQ(n, suite);
4053 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4054 if (NCH(n) == 1) {
4055 com_node(c, CHILD(n, 0));
4056 }
4057 else {
4058 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004059 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004060 node *ch = CHILD(n, i);
4061 if (TYPE(ch) == stmt)
4062 com_node(c, ch);
4063 }
4064 }
4065}
4066
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004067/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004068static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004069com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004070{
4071 int i = c->c_nblocks;
4072 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4073 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4074 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004075 else if (i <= 0) {
4076 /* at the outer level */
4077 com_error(c, PyExc_SyntaxError,
4078 "'continue' not properly in loop");
4079 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004080 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004081 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004082 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004083 if (c->c_block[j] == SETUP_LOOP)
4084 break;
4085 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004086 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004087 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004088 for (; i > j; --i) {
4089 if (c->c_block[i] == SETUP_EXCEPT ||
4090 c->c_block[i] == SETUP_FINALLY) {
4091 com_addoparg(c, CONTINUE_LOOP,
4092 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004093 return;
4094 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004095 if (c->c_block[i] == END_FINALLY) {
4096 com_error(c, PyExc_SyntaxError,
4097 "'continue' not supported inside 'finally' clause");
4098 return;
4099 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004100 }
4101 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004102 com_error(c, PyExc_SyntaxError,
4103 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004104 }
4105 /* XXX Could allow it inside a 'finally' clause
4106 XXX if we could pop the exception still on the stack */
4107}
4108
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004109/* Return the number of default values in the argument list.
4110
4111 If a non-default argument follows a default argument, set an
4112 exception and return -1.
4113*/
4114
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004115static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004116com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004117{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004118 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004119 if (TYPE(n) == lambdef) {
4120 /* lambdef: 'lambda' [varargslist] ':' test */
4121 n = CHILD(n, 1);
4122 }
4123 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004124 REQ(n, funcdef);
4125 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4126 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004127 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4128 n = CHILD(n, 1);
4129 }
4130 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004131 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004132 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004133 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004134 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4135 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004136 ndefs = 0;
4137 for (i = 0; i < nch; i++) {
4138 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004139 if (TYPE(CHILD(n, i)) == STAR ||
4140 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004141 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004142 i++;
4143 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004144 t = RPAR; /* Anything except EQUAL or COMMA */
4145 else
4146 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004147 if (t == EQUAL) {
4148 i++;
4149 ndefs++;
4150 com_node(c, CHILD(n, i));
4151 i++;
4152 if (i >= nch)
4153 break;
4154 t = TYPE(CHILD(n, i));
4155 }
4156 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004157 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004158 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004159 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004160 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004161 return -1;
4162 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004163 }
4164 if (t != COMMA)
4165 break;
4166 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004167 return ndefs;
4168}
4169
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004170static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004171com_decorator_name(struct compiling *c, node *n)
4172{
4173 /* dotted_name: NAME ('.' NAME)* */
4174
4175 int i, nch;
4176 node *varname;
4177
4178 REQ(n, dotted_name);
4179 nch = NCH(n);
4180 assert(nch >= 1 && nch % 2 == 1);
4181
4182 varname = CHILD(n, 0);
4183 REQ(varname, NAME);
4184 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004185 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004186
4187 for (i = 1; i < nch; i += 2) {
4188 node *attrname;
4189
4190 REQ(CHILD(n, i), DOT);
4191
4192 attrname = CHILD(n, i + 1);
4193 REQ(attrname, NAME);
4194 com_addop_name(c, LOAD_ATTR, STR(attrname));
4195 }
4196}
4197
4198static void
4199com_decorator(struct compiling *c, node *n)
4200{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004201 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004202 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004203 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004204 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004205 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004206 com_decorator_name(c, CHILD(n, 1));
4207
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004208 if (nch > 3) {
4209 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004210 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004211 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004212 com_call_function(c, CHILD(n, 3));
4213 }
4214}
4215
4216static int
4217com_decorators(struct compiling *c, node *n)
4218{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004219 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004220
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004221 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004222 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004223 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004224
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004225 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004226 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004227 REQ(ch, decorator);
4228
4229 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004230 }
4231
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004232 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004233}
4234
4235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004236com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004237{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004238 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004239 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004240
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004241 REQ(n, funcdef);
4242 /* -6 -5 -4 -3 -2 -1
4243 funcdef: [decorators] 'def' NAME parameters ':' suite */
4244
4245 if (NCH(n) == 6)
4246 ndecorators = com_decorators(c, CHILD(n, 0));
4247 else
4248 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004249
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004250 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004251 if (ndefs < 0)
4252 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004253 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004254 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004256 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004257 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004258 c->c_errors++;
4259 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004260 int closure = com_make_closure(c, (PyCodeObject *)co);
4261 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004262 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004263 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004264 if (closure)
4265 com_addoparg(c, MAKE_CLOSURE, ndefs);
4266 else
4267 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004268 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004269
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004270 while (ndecorators > 0) {
4271 com_addoparg(c, CALL_FUNCTION, 1);
4272 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004273 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004274 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004275
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004276 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004277 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004278 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004279 }
4280}
4281
4282static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004283com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004284{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004285 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004286 REQ(n, testlist);
4287 /* testlist: test (',' test)* [','] */
4288 for (i = 0; i < NCH(n); i += 2)
4289 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004290 i = (NCH(n)+1) / 2;
4291 com_addoparg(c, BUILD_TUPLE, i);
4292 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004293}
4294
4295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004296com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004297{
Guido van Rossum25831651993-05-19 14:50:45 +00004298 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004299 PyObject *v;
4300 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004301 char *name;
4302
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004303 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004304 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004305 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004306 c->c_errors++;
4307 return;
4308 }
4309 /* Push the class name on the stack */
4310 i = com_addconst(c, v);
4311 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004312 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004313 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004314 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004315 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004316 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004317 com_push(c, 1);
4318 }
Guido van Rossum25831651993-05-19 14:50:45 +00004319 else
4320 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004321 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004322 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004323 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004324 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004325 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004326 c->c_errors++;
4327 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004328 int closure = com_make_closure(c, co);
4329 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004330 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004331 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004332 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004333 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004334 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004335 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004336 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004337 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004338 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004339 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004341 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004342 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004343 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004344}
4345
4346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004347com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004348{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004349 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004350 if (c->c_errors)
4351 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004352 switch (TYPE(n)) {
4353
4354 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004355
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004356 case funcdef:
4357 com_funcdef(c, n);
4358 break;
4359 case classdef:
4360 com_classdef(c, n);
4361 break;
4362
4363 /* Trivial parse tree nodes */
4364
4365 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004366 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004367 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004368 n = CHILD(n, 0);
4369 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004370
4371 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004372 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004373 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004374 {
4375 int i;
4376 for (i = 0; i < NCH(n)-1; i += 2)
4377 com_node(c, CHILD(n, i));
4378 }
4379 break;
4380
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004381 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004382 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004383 n = CHILD(n, 0);
4384 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004385
4386 /* Statement nodes */
4387
4388 case expr_stmt:
4389 com_expr_stmt(c, n);
4390 break;
4391 case print_stmt:
4392 com_print_stmt(c, n);
4393 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004394 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004395 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004396 break;
4397 case pass_stmt:
4398 break;
4399 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004400 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004401 com_error(c, PyExc_SyntaxError,
4402 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004403 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004404 com_addbyte(c, BREAK_LOOP);
4405 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004406 case continue_stmt:
4407 com_continue_stmt(c, n);
4408 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004409 case return_stmt:
4410 com_return_stmt(c, n);
4411 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004412 case yield_stmt:
4413 com_yield_stmt(c, n);
4414 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004415 case raise_stmt:
4416 com_raise_stmt(c, n);
4417 break;
4418 case import_stmt:
4419 com_import_stmt(c, n);
4420 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004421 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004422 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004423 case exec_stmt:
4424 com_exec_stmt(c, n);
4425 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004426 case assert_stmt:
4427 com_assert_stmt(c, n);
4428 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004429 case if_stmt:
4430 com_if_stmt(c, n);
4431 break;
4432 case while_stmt:
4433 com_while_stmt(c, n);
4434 break;
4435 case for_stmt:
4436 com_for_stmt(c, n);
4437 break;
4438 case try_stmt:
4439 com_try_stmt(c, n);
4440 break;
4441 case suite:
4442 com_suite(c, n);
4443 break;
4444
4445 /* Expression nodes */
4446
4447 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004448 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004449 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004450 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004451 break;
4452 case test:
4453 com_test(c, n);
4454 break;
4455 case and_test:
4456 com_and_test(c, n);
4457 break;
4458 case not_test:
4459 com_not_test(c, n);
4460 break;
4461 case comparison:
4462 com_comparison(c, n);
4463 break;
4464 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004465 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004466 break;
4467 case expr:
4468 com_expr(c, n);
4469 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004470 case xor_expr:
4471 com_xor_expr(c, n);
4472 break;
4473 case and_expr:
4474 com_and_expr(c, n);
4475 break;
4476 case shift_expr:
4477 com_shift_expr(c, n);
4478 break;
4479 case arith_expr:
4480 com_arith_expr(c, n);
4481 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 case term:
4483 com_term(c, n);
4484 break;
4485 case factor:
4486 com_factor(c, n);
4487 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004488 case power:
4489 com_power(c, n);
4490 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004491 case atom:
4492 com_atom(c, n);
4493 break;
4494
4495 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004496 com_error(c, PyExc_SystemError,
4497 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004498 }
4499}
4500
Tim Petersdbd9ba62000-07-09 03:09:57 +00004501static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004502
4503static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004504com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004505{
4506 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4507 if (TYPE(CHILD(n, 0)) == LPAR)
4508 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004509 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004510 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004511 com_pop(c, 1);
4512 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004513}
4514
4515static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004516com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004517{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004518 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004519 if (NCH(n) == 1) {
4520 com_fpdef(c, CHILD(n, 0));
4521 }
4522 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004523 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004524 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004525 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004526 for (i = 0; i < NCH(n); i += 2)
4527 com_fpdef(c, CHILD(n, i));
4528 }
4529}
4530
4531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004532com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004533{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004534 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004535 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004536 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004537 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004538 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004539 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004540 nch = NCH(n);
4541 /* Enter all arguments in table of locals */
4542 for (i = 0, narg = 0; i < nch; i++) {
4543 node *ch = CHILD(n, i);
4544 node *fp;
4545 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004546 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004547 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4548 fp = CHILD(ch, 0);
4549 if (TYPE(fp) != NAME) {
4550 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4551 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004552 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004553 narg++;
4554 /* all name updates handled by symtable */
4555 if (++i >= nch)
4556 break;
4557 ch = CHILD(n, i);
4558 if (TYPE(ch) == EQUAL)
4559 i += 2;
4560 else
4561 REQ(ch, COMMA);
4562 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004563 if (complex) {
4564 /* Generate code for complex arguments only after
4565 having counted the simple arguments */
4566 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004567 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004568 node *ch = CHILD(n, i);
4569 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004570 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004571 break;
4572 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4573 fp = CHILD(ch, 0);
4574 if (TYPE(fp) != NAME) {
4575 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004576 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004577 com_fpdef(c, ch);
4578 }
4579 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004580 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004581 break;
4582 ch = CHILD(n, i);
4583 if (TYPE(ch) == EQUAL)
4584 i += 2;
4585 else
4586 REQ(ch, COMMA);
4587 }
4588 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004589}
4590
4591static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004592com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004593{
4594 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004595 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004596 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004597 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004598 if (doc != NULL) {
4599 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004600 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004601 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004602 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004603 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004604 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004605 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004606 for (i = 0; i < NCH(n); i++) {
4607 node *ch = CHILD(n, i);
4608 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4609 com_node(c, ch);
4610 }
4611}
4612
4613/* Top-level compile-node interface */
4614
4615static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004616compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004617{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004618 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004619 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004620 REQ(n, funcdef);
4621 /* -6 -5 -4 -3 -2 -1
4622 funcdef: [decorators] 'def' NAME parameters ':' suite */
4623 c->c_name = STR(RCHILD(n, -4));
4624 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004625 if (doc != NULL) {
4626 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004627 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004628 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004629 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004630 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004631 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004632 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004633 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004634 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004635 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004636 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004637 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004638 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004639 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4640 com_push(c, 1);
4641 com_addbyte(c, RETURN_VALUE);
4642 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004643}
4644
4645static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004646compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004647{
Guido van Rossum590baa41993-11-30 13:40:46 +00004648 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004649 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004650 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004651
4652 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004653 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004654 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004655 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004656 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004657 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004658 else
4659 ch = CHILD(n, 2);
4660 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004661 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004662 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004663}
4664
4665static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004666compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004667{
4668 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004669 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004670 REQ(n, classdef);
4671 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4672 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004673 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004674 /* Initialize local __module__ from global __name__ */
4675 com_addop_name(c, LOAD_GLOBAL, "__name__");
4676 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004677 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004678 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004679 if (doc != NULL) {
4680 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004681 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004682 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004683 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004684 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004685 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004686 }
4687 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004688 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004689 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004690 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004691 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004692 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004693 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004694 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004695}
4696
4697static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004698compile_generator_expression(struct compiling *c, node *n)
4699{
4700 /* testlist_gexp: test gen_for */
4701 /* argument: test gen_for */
4702 REQ(CHILD(n, 0), test);
4703 REQ(CHILD(n, 1), gen_for);
4704
4705 c->c_name = "<generator expression>";
4706 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4707
4708 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4709 com_push(c, 1);
4710 com_addbyte(c, RETURN_VALUE);
4711 com_pop(c, 1);
4712}
4713
4714static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004715compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004716{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004717 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004718
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004719 switch (TYPE(n)) {
4720
Guido van Rossum4c417781991-01-21 16:09:22 +00004721 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004722 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004723 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004724 n = CHILD(n, 0);
4725 if (TYPE(n) != NEWLINE)
4726 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004727 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004728 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4729 com_push(c, 1);
4730 com_addbyte(c, RETURN_VALUE);
4731 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004732 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004733 break;
4734
Guido van Rossum4c417781991-01-21 16:09:22 +00004735 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004736 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004737 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004738 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4739 com_push(c, 1);
4740 com_addbyte(c, RETURN_VALUE);
4741 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004742 break;
4743
Guido van Rossum590baa41993-11-30 13:40:46 +00004744 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004745 com_node(c, CHILD(n, 0));
4746 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004747 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004748 break;
4749
Guido van Rossum590baa41993-11-30 13:40:46 +00004750 case lambdef: /* anonymous function definition */
4751 compile_lambdef(c, n);
4752 break;
4753
Guido van Rossum4c417781991-01-21 16:09:22 +00004754 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004755 compile_funcdef(c, n);
4756 break;
4757
Guido van Rossum4c417781991-01-21 16:09:22 +00004758 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004759 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004760 break;
4761
Raymond Hettinger354433a2004-05-19 08:20:33 +00004762 case testlist_gexp: /* A generator expression */
4763 case argument: /* A generator expression */
4764 compile_generator_expression(c, n);
4765 break;
4766
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004767 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004768 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004769 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004770 }
4771}
4772
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004773static PyObject *
4774dict_keys_inorder(PyObject *dict, int offset)
4775{
4776 PyObject *tuple, *k, *v;
4777 int i, pos = 0, size = PyDict_Size(dict);
4778
4779 tuple = PyTuple_New(size);
4780 if (tuple == NULL)
4781 return NULL;
4782 while (PyDict_Next(dict, &pos, &k, &v)) {
4783 i = PyInt_AS_LONG(v);
4784 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004785 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004786 PyTuple_SET_ITEM(tuple, i - offset, k);
4787 }
4788 return tuple;
4789}
4790
Guido van Rossum79f25d91997-04-29 20:08:16 +00004791PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004792PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004793{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004794 return PyNode_CompileFlags(n, filename, NULL);
4795}
4796
4797PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004798PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004799{
4800 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004801}
4802
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004803struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004804PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004805{
4806 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004807 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004808
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004809 ff = PyNode_Future(n, filename);
4810 if (ff == NULL)
4811 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004812 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004813 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004814 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004815 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004816 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004817 return st;
4818}
4819
Guido van Rossum79f25d91997-04-29 20:08:16 +00004820static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004821icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004822{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004823 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004824}
4825
Guido van Rossum79f25d91997-04-29 20:08:16 +00004826static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004827jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004828 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004829{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004830 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004831 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004832 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004833 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004834 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4835 sc.c_encoding = "utf-8";
4836 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004837 sc.c_encoding = STR(n);
4838 n = CHILD(n, 0);
4839 } else {
4840 sc.c_encoding = NULL;
4841 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004842 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004843 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004844 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004845 /* c_symtable still points to parent's symbols */
4846 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004847 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004848 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004849 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004850 if (base->c_encoding != NULL) {
4851 assert(sc.c_encoding == NULL);
4852 sc.c_encoding = base->c_encoding;
4853 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004854 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004855 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004856 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004857 if (sc.c_future == NULL) {
4858 com_free(&sc);
4859 return NULL;
4860 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004861 if (flags) {
4862 int merged = sc.c_future->ff_features |
4863 flags->cf_flags;
4864 sc.c_future->ff_features = merged;
4865 flags->cf_flags = merged;
4866 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004867 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4868 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004869 com_free(&sc);
4870 return NULL;
4871 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004872 /* reset symbol table for second pass */
4873 sc.c_symtable->st_nscopes = 1;
4874 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004875 }
4876 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004877 if (symtable_load_symbols(&sc) < 0) {
4878 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004879 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004880 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004881 compile_node(&sc, n);
4882 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004883 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004884 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004885 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004886 consts = PyList_AsTuple(sc.c_consts);
4887 names = PyList_AsTuple(sc.c_names);
4888 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004889 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4890 freevars = dict_keys_inorder(sc.c_freevars,
4891 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004892 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004893 name = PyString_InternFromString(sc.c_name);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00004894 code = optimize_code(sc.c_code, consts, names, sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004895 if (!PyErr_Occurred())
4896 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004897 sc.c_nlocals,
4898 sc.c_maxstacklevel,
4899 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004900 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004901 consts,
4902 names,
4903 varnames,
4904 freevars,
4905 cellvars,
4906 filename,
4907 name,
4908 sc.c_firstlineno,
4909 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004910 Py_XDECREF(consts);
4911 Py_XDECREF(names);
4912 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 Py_XDECREF(freevars);
4914 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004915 Py_XDECREF(filename);
4916 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004917 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004918 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004919 else if (!PyErr_Occurred()) {
4920 /* This could happen if someone called PyErr_Clear() after an
4921 error was reported above. That's not supposed to happen,
4922 but I just plugged one case and I'm not sure there can't be
4923 others. In that case, raise SystemError so that at least
4924 it gets reported instead dumping core. */
4925 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4926 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004927 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004928 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004929 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004930 sc.c_symtable = NULL;
4931 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004932 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004933 return co;
4934}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004935
4936int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004937PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004938{
4939 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004940 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004941 int line = co->co_firstlineno;
4942 int addr = 0;
4943 while (--size >= 0) {
4944 addr += *p++;
4945 if (addr > addrq)
4946 break;
4947 line += *p++;
4948 }
4949 return line;
4950}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004951
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004952/* The test for LOCAL must come before the test for FREE in order to
4953 handle classes where name is both local and free. The local var is
4954 a method and the free var is a free var referenced within a method.
4955*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004956
4957static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004958get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004959{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004960 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004961 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004962
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004963 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4964 return CELL;
4965 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4966 return LOCAL;
4967 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4968 return FREE;
4969 v = PyDict_GetItemString(c->c_globals, name);
4970 if (v) {
4971 if (v == Py_None)
4972 return GLOBAL_EXPLICIT;
4973 else {
4974 return GLOBAL_IMPLICIT;
4975 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004976 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004977 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004978 "unknown scope for %.100s in %.100s(%s) "
4979 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4980 name, c->c_name,
4981 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4982 c->c_filename,
4983 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4984 PyObject_REPR(c->c_locals),
4985 PyObject_REPR(c->c_globals)
4986 );
4987
4988 Py_FatalError(buf);
4989 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004990}
4991
Guido van Rossum207fda62001-03-02 03:30:41 +00004992/* Helper functions to issue warnings */
4993
4994static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004995issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004996{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004997 if (PyErr_Occurred()) {
4998 /* This can happen because symtable_node continues
4999 processing even after raising a SyntaxError.
5000 Calling PyErr_WarnExplicit now would clobber the
5001 pending exception; instead we fail and let that
5002 exception propagate.
5003 */
5004 return -1;
5005 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005006 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5007 lineno, NULL, NULL) < 0) {
5008 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5009 PyErr_SetString(PyExc_SyntaxError, msg);
5010 PyErr_SyntaxLocation(filename, lineno);
5011 }
5012 return -1;
5013 }
5014 return 0;
5015}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005016
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005017static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005018symtable_warn(struct symtable *st, char *msg)
5019{
Guido van Rossum207fda62001-03-02 03:30:41 +00005020 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005021 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005022 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005023 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005024 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005025}
5026
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005027/* Helper function for setting lineno and filename */
5028
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005029static struct symtable *
5030symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005031{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005032 struct symtable *st;
5033
5034 st = symtable_init();
5035 if (st == NULL)
5036 return NULL;
5037 st->st_future = ff;
5038 st->st_filename = filename;
5039 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5040 if (st->st_errors > 0)
5041 goto fail;
5042 symtable_node(st, n);
5043 if (st->st_errors > 0)
5044 goto fail;
5045 return st;
5046 fail:
5047 if (!PyErr_Occurred()) {
5048 /* This could happen because after a syntax error is
5049 detected, the symbol-table-building continues for
5050 a while, and PyErr_Clear() might erroneously be
5051 called during that process. One such case has been
5052 fixed, but there might be more (now or later).
5053 */
5054 PyErr_SetString(PyExc_SystemError, "lost exception");
5055 }
5056 st->st_future = NULL;
5057 st->st_filename = NULL;
5058 PySymtable_Free(st);
5059 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005060}
5061
5062static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005063symtable_init_compiling_symbols(struct compiling *c)
5064{
5065 PyObject *varnames;
5066
5067 varnames = c->c_symtable->st_cur->ste_varnames;
5068 if (varnames == NULL) {
5069 varnames = PyList_New(0);
5070 if (varnames == NULL)
5071 return -1;
5072 c->c_symtable->st_cur->ste_varnames = varnames;
5073 Py_INCREF(varnames);
5074 } else
5075 Py_INCREF(varnames);
5076 c->c_varnames = varnames;
5077
5078 c->c_globals = PyDict_New();
5079 if (c->c_globals == NULL)
5080 return -1;
5081 c->c_freevars = PyDict_New();
5082 if (c->c_freevars == NULL)
5083 return -1;
5084 c->c_cellvars = PyDict_New();
5085 if (c->c_cellvars == NULL)
5086 return -1;
5087 return 0;
5088}
5089
5090struct symbol_info {
5091 int si_nlocals;
5092 int si_ncells;
5093 int si_nfrees;
5094 int si_nimplicit;
5095};
5096
5097static void
5098symtable_init_info(struct symbol_info *si)
5099{
5100 si->si_nlocals = 0;
5101 si->si_ncells = 0;
5102 si->si_nfrees = 0;
5103 si->si_nimplicit = 0;
5104}
5105
5106static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005107symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005108 struct symbol_info *si)
5109{
5110 PyObject *dict, *v;
5111
5112 /* Seperate logic for DEF_FREE. If it occurs in a function,
5113 it indicates a local that we must allocate storage for (a
5114 cell var). If it occurs in a class, then the class has a
5115 method and a free variable with the same name.
5116 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005117 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005118 /* If it isn't declared locally, it can't be a cell. */
5119 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5120 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005121 v = PyInt_FromLong(si->si_ncells++);
5122 dict = c->c_cellvars;
5123 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005124 /* If it is free anyway, then there is no need to do
5125 anything here.
5126 */
5127 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005128 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005129 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005130 v = PyInt_FromLong(si->si_nfrees++);
5131 dict = c->c_freevars;
5132 }
5133 if (v == NULL)
5134 return -1;
5135 if (PyDict_SetItem(dict, name, v) < 0) {
5136 Py_DECREF(v);
5137 return -1;
5138 }
5139 Py_DECREF(v);
5140 return 0;
5141}
5142
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005143/* If a variable is a cell and an argument, make sure that appears in
5144 co_cellvars before any variable to its right in varnames.
5145*/
5146
5147
5148static int
5149symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5150 PyObject *varnames, int flags)
5151{
Tim Petersb39903b2003-03-24 17:22:24 +00005152 PyObject *v = NULL;
5153 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005154 int i, pos;
5155
5156 if (flags & CO_VARARGS)
5157 argcount++;
5158 if (flags & CO_VARKEYWORDS)
5159 argcount++;
5160 for (i = argcount; --i >= 0; ) {
5161 v = PyList_GET_ITEM(varnames, i);
5162 if (PyDict_GetItem(*cellvars, v)) {
5163 if (list == NULL) {
5164 list = PyList_New(1);
5165 if (list == NULL)
5166 return -1;
5167 PyList_SET_ITEM(list, 0, v);
5168 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005169 } else {
5170 if (PyList_Insert(list, 0, v) < 0) {
5171 Py_DECREF(list);
5172 return -1;
5173 }
5174 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005175 }
5176 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005177 if (list == NULL)
5178 return 0;
5179
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005180 /* There are cellvars that are also arguments. Create a dict
5181 to replace cellvars and put the args at the front.
5182 */
5183 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005184 if (d == NULL)
5185 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005186 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5187 v = PyInt_FromLong(i);
5188 if (v == NULL)
5189 goto fail;
5190 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5191 goto fail;
5192 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5193 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005194 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005195 }
5196 pos = 0;
5197 i = PyList_GET_SIZE(list);
5198 Py_DECREF(list);
5199 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5200 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005201 if (w == NULL)
5202 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005203 if (PyDict_SetItem(d, v, w) < 0) {
5204 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005205 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005206 goto fail;
5207 }
5208 Py_DECREF(w);
5209 }
5210 Py_DECREF(*cellvars);
5211 *cellvars = d;
5212 return 1;
5213 fail:
5214 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005215 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005216 return -1;
5217}
5218
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005219static int
5220symtable_freevar_offsets(PyObject *freevars, int offset)
5221{
5222 PyObject *name, *v;
5223 int pos;
5224
5225 /* The cell vars are the first elements of the closure,
5226 followed by the free vars. Update the offsets in
5227 c_freevars to account for number of cellvars. */
5228 pos = 0;
5229 while (PyDict_Next(freevars, &pos, &name, &v)) {
5230 int i = PyInt_AS_LONG(v) + offset;
5231 PyObject *o = PyInt_FromLong(i);
5232 if (o == NULL)
5233 return -1;
5234 if (PyDict_SetItem(freevars, name, o) < 0) {
5235 Py_DECREF(o);
5236 return -1;
5237 }
5238 Py_DECREF(o);
5239 }
5240 return 0;
5241}
5242
5243static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005244symtable_check_unoptimized(struct compiling *c,
5245 PySymtableEntryObject *ste,
5246 struct symbol_info *si)
5247{
5248 char buf[300];
5249
5250 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5251 || (ste->ste_nested && si->si_nimplicit)))
5252 return 0;
5253
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005254#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5255
5256#define ILLEGAL_IS "is a nested function"
5257
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005258#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005259"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005260
5261#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005262"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005263
5264#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005265"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005266"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005267
5268 /* XXX perhaps the linenos for these opt-breaking statements
5269 should be stored so the exception can point to them. */
5270
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005271 if (ste->ste_child_free) {
5272 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005273 PyOS_snprintf(buf, sizeof(buf),
5274 ILLEGAL_IMPORT_STAR,
5275 PyString_AS_STRING(ste->ste_name),
5276 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005277 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005278 PyOS_snprintf(buf, sizeof(buf),
5279 ILLEGAL_BARE_EXEC,
5280 PyString_AS_STRING(ste->ste_name),
5281 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005282 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005283 PyOS_snprintf(buf, sizeof(buf),
5284 ILLEGAL_EXEC_AND_IMPORT_STAR,
5285 PyString_AS_STRING(ste->ste_name),
5286 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005287 }
5288 } else {
5289 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005290 PyOS_snprintf(buf, sizeof(buf),
5291 ILLEGAL_IMPORT_STAR,
5292 PyString_AS_STRING(ste->ste_name),
5293 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005294 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005295 PyOS_snprintf(buf, sizeof(buf),
5296 ILLEGAL_BARE_EXEC,
5297 PyString_AS_STRING(ste->ste_name),
5298 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005299 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005300 PyOS_snprintf(buf, sizeof(buf),
5301 ILLEGAL_EXEC_AND_IMPORT_STAR,
5302 PyString_AS_STRING(ste->ste_name),
5303 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005304 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005305 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005306
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005307 PyErr_SetString(PyExc_SyntaxError, buf);
5308 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5309 ste->ste_opt_lineno);
5310 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005311}
5312
5313static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005314symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5315 struct symbol_info *si)
5316{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005317 if (c->c_future)
5318 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005319 if (ste->ste_generator)
5320 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005321 if (ste->ste_type != TYPE_MODULE)
5322 c->c_flags |= CO_NEWLOCALS;
5323 if (ste->ste_type == TYPE_FUNCTION) {
5324 c->c_nlocals = si->si_nlocals;
5325 if (ste->ste_optimized == 0)
5326 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005327 else if (ste->ste_optimized != OPT_EXEC)
5328 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005329 }
5330 return 0;
5331}
5332
5333static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005334symtable_error(struct symtable *st, int lineno)
5335{
5336 if (lineno == 0)
5337 lineno = st->st_cur->ste_lineno;
5338 PyErr_SyntaxLocation(st->st_filename, lineno);
5339 st->st_errors++;
5340 return -1;
5341}
5342
5343static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005344symtable_load_symbols(struct compiling *c)
5345{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005347 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005348 PyObject *name, *varnames, *v;
5349 int i, flags, pos;
5350 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005351
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005352 v = NULL;
5353
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005354 if (symtable_init_compiling_symbols(c) < 0)
5355 goto fail;
5356 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005357 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005358 si.si_nlocals = PyList_GET_SIZE(varnames);
5359 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005360
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005361 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005363 if (v == NULL)
5364 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005365 if (PyDict_SetItem(c->c_locals,
5366 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005367 goto fail;
5368 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005369 }
5370
5371 /* XXX The cases below define the rules for whether a name is
5372 local or global. The logic could probably be clearer. */
5373 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005374 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5375 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005376
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005377 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005378 /* undo the original DEF_FREE */
5379 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005380
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005381 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005382 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005383 2. Free variables in methods that are also class
5384 variables or declared global.
5385 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005386 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005387 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005388
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005389 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005390 c->c_argcount--;
5391 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005392 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005393 c->c_argcount--;
5394 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005395 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005396 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005397 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005398 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005399 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005400 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005401 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005402 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005403 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005404 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5405 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005406 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005407 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005408 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005409 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005410 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005411 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005412 if (v == NULL)
5413 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005414 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005415 goto fail;
5416 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005417 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005418 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005420 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005421 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005422 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005423 if (v == NULL)
5424 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005425 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005426 goto fail;
5427 Py_DECREF(v);
5428 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005429 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005430 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005431 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005432 goto fail;
5433 if (st->st_nscopes != 1) {
5434 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005435 if (v == NULL)
5436 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005437 if (PyDict_SetItem(st->st_global,
5438 name, v))
5439 goto fail;
5440 Py_DECREF(v);
5441 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005442 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005443 }
5444 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005445 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5446
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005447 if (si.si_ncells > 1) { /* one cell is always in order */
5448 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5449 c->c_varnames, c->c_flags) < 0)
5450 return -1;
5451 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005452 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5453 return -1;
5454 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005455 fail:
5456 /* is this always the right thing to do? */
5457 Py_XDECREF(v);
5458 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459}
5460
5461static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005462symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005463{
5464 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005465
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005466 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005467 if (st == NULL)
5468 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005469 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005470
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005471 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005472 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005473 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005474 goto fail;
5475 if ((st->st_symbols = PyDict_New()) == NULL)
5476 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005477 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005478 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005479 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005480 st->st_private = NULL;
5481 return st;
5482 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005483 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005484 return NULL;
5485}
5486
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005487void
5488PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005489{
5490 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005491 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005492 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005493 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005494}
5495
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005496/* When the compiler exits a scope, it must should update the scope's
5497 free variable information with the list of free variables in its
5498 children.
5499
5500 Variables that are free in children and defined in the current
5501 scope are cellvars.
5502
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005503 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005504 false), free variables in children that are not defined here are
5505 implicit globals.
5506
5507*/
5508
5509static int
5510symtable_update_free_vars(struct symtable *st)
5511{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005512 int i, j, def;
5513 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005515
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005516 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005517 def = DEF_FREE_CLASS;
5518 else
5519 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005520 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005521 int pos = 0;
5522
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005523 if (list && PyList_SetSlice(list, 0,
5524 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005525 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005526 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005527 PyList_GET_ITEM(ste->ste_children, i);
5528 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005529 int flags = PyInt_AS_LONG(o);
5530 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005531 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005532 if (list == NULL) {
5533 list = PyList_New(0);
5534 if (list == NULL)
5535 return -1;
5536 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005537 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005538 if (PyList_Append(list, name) < 0) {
5539 Py_DECREF(list);
5540 return -1;
5541 }
5542 }
5543 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005544 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005545 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005546 v = PyDict_GetItem(ste->ste_symbols, name);
5547 /* If a name N is declared global in scope A and
5548 referenced in scope B contained (perhaps
5549 indirectly) in A and there are no scopes
5550 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005551 is global in B. Unless A is a class scope,
5552 because class scopes are not considered for
5553 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005554 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005555 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005556 int flags = PyInt_AS_LONG(v);
5557 if (flags & DEF_GLOBAL) {
5558 symtable_undo_free(st, child->ste_id,
5559 name);
5560 continue;
5561 }
5562 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005563 if (ste->ste_nested) {
5564 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005565 name, def) < 0) {
5566 Py_DECREF(list);
5567 return -1;
5568 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005569 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005570 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005571 name) < 0) {
5572 Py_DECREF(list);
5573 return -1;
5574 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005575 }
5576 }
5577 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005578
5579 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005580 return 0;
5581}
5582
5583/* If the current scope is a non-nested class or if name is not
5584 defined in the current, non-nested scope, then it is an implicit
5585 global in all nested scopes.
5586*/
5587
5588static int
5589symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5590{
5591 PyObject *o;
5592 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005593 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005594
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005595 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005597 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005598 if (o == NULL)
5599 return symtable_undo_free(st, child, name);
5600 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005601
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005602 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005603 return symtable_undo_free(st, child, name);
5604 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005605 return symtable_add_def_o(st, ste->ste_symbols,
5606 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005607}
5608
5609static int
5610symtable_undo_free(struct symtable *st, PyObject *id,
5611 PyObject *name)
5612{
5613 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005614 PyObject *info;
5615 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005617 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5618 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005620
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005621 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005622 if (info == NULL)
5623 return 0;
5624 v = PyInt_AS_LONG(info);
5625 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005626 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627 DEF_FREE_GLOBAL) < 0)
5628 return -1;
5629 } else
5630 /* If the name is defined here or declared global,
5631 then the recursion stops. */
5632 return 0;
5633
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005634 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5635 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005636 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005637 PyList_GET_ITEM(ste->ste_children, i);
5638 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005639 if (x < 0)
5640 return x;
5641 }
5642 return 0;
5643}
5644
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005645/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5646 This reference is released when the scope is exited, via the DECREF
5647 in symtable_exit_scope().
5648*/
5649
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005650static int
5651symtable_exit_scope(struct symtable *st)
5652{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005653 int end;
5654
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005655 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005656 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005657 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005658 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005659 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5660 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005661 if (PySequence_DelItem(st->st_stack, end) < 0)
5662 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005663 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005664}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005665
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005666static void
5667symtable_enter_scope(struct symtable *st, char *name, int type,
5668 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005670 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005671
5672 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005673 prev = st->st_cur;
5674 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005675 st->st_errors++;
5676 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005677 }
5678 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005679 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005680 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005681 if (st->st_cur == NULL) {
5682 st->st_errors++;
5683 return;
5684 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005685 if (strcmp(name, TOP) == 0)
5686 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005687 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005688 if (PyList_Append(prev->ste_children,
5689 (PyObject *)st->st_cur) < 0)
5690 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005691 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005692}
5693
5694static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005695symtable_lookup(struct symtable *st, char *name)
5696{
5697 char buffer[MANGLE_LEN];
5698 PyObject *v;
5699 int flags;
5700
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005701 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005702 name = buffer;
5703 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5704 if (v == NULL) {
5705 if (PyErr_Occurred())
5706 return -1;
5707 else
5708 return 0;
5709 }
5710
5711 flags = PyInt_AS_LONG(v);
5712 return flags;
5713}
5714
5715static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005717{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005718 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005719 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005720 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005721
Guido van Rossumb7164622002-08-16 02:48:11 +00005722 /* Warn about None, except inside a tuple (where the assignment
5723 code already issues a warning). */
5724 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5725 *name == 'N' && strcmp(name, "None") == 0)
5726 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005727 PyErr_SetString(PyExc_SyntaxError,
5728 "Invalid syntax. Assignment to None.");
5729 symtable_error(st, 0);
5730 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005731 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005732 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733 name = buffer;
5734 if ((s = PyString_InternFromString(name)) == NULL)
5735 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005736 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5737 Py_DECREF(s);
5738 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005739}
5740
5741/* Must only be called with mangled names */
5742
5743static int
5744symtable_add_def_o(struct symtable *st, PyObject *dict,
5745 PyObject *name, int flag)
5746{
5747 PyObject *o;
5748 int val;
5749
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005750 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005751 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005752 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005753 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005754 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005755 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005756 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005757 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005758 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005759 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005760 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005761 if (o == NULL)
5762 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005763 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005764 Py_DECREF(o);
5765 return -1;
5766 }
5767 Py_DECREF(o);
5768
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005770 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005771 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005772 } else if (flag & DEF_GLOBAL) {
5773 /* XXX need to update DEF_GLOBAL for other flags too;
5774 perhaps only DEF_FREE_GLOBAL */
5775 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005777 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005778 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005779 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005780 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005781 if (o == NULL)
5782 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005783 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005784 Py_DECREF(o);
5785 return -1;
5786 }
5787 Py_DECREF(o);
5788 }
5789 return 0;
5790}
5791
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005792#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005793
Tim Peters08a898f2001-06-28 01:52:22 +00005794/* Look for a yield stmt under n. Return 1 if found, else 0.
5795 This hack is used to look inside "if 0:" blocks (which are normally
5796 ignored) in case those are the only places a yield occurs (so that this
5797 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005798static int
5799look_for_yield(node *n)
5800{
5801 int i;
5802
5803 for (i = 0; i < NCH(n); ++i) {
5804 node *kid = CHILD(n, i);
5805
5806 switch (TYPE(kid)) {
5807
5808 case classdef:
5809 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005810 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005811 /* Stuff in nested functions and classes can't make
5812 the parent a generator. */
5813 return 0;
5814
5815 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005816 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005817
5818 default:
5819 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005820 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005821 }
5822 }
5823 return 0;
5824}
5825
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005826static void
5827symtable_node(struct symtable *st, node *n)
5828{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005829 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005830
5831 loop:
5832 switch (TYPE(n)) {
5833 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005834 char *func_name;
5835 if (NCH(n) == 6)
5836 symtable_node(st, CHILD(n, 0));
5837 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005838 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005839 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005840 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005841 symtable_funcdef(st, n);
5842 symtable_exit_scope(st);
5843 break;
5844 }
5845 case lambdef:
5846 if (NCH(n) == 4)
5847 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005848 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005849 symtable_funcdef(st, n);
5850 symtable_exit_scope(st);
5851 break;
5852 case classdef: {
5853 char *tmp, *class_name = STR(CHILD(n, 1));
5854 symtable_add_def(st, class_name, DEF_LOCAL);
5855 if (TYPE(CHILD(n, 2)) == LPAR) {
5856 node *bases = CHILD(n, 3);
5857 int i;
5858 for (i = 0; i < NCH(bases); i += 2) {
5859 symtable_node(st, CHILD(bases, i));
5860 }
5861 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005862 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005863 tmp = st->st_private;
5864 st->st_private = class_name;
5865 symtable_node(st, CHILD(n, NCH(n) - 1));
5866 st->st_private = tmp;
5867 symtable_exit_scope(st);
5868 break;
5869 }
5870 case if_stmt:
5871 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005872 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5873 if (st->st_cur->ste_generator == 0)
5874 st->st_cur->ste_generator =
5875 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005876 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005877 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005878 symtable_node(st, CHILD(n, i + 1));
5879 symtable_node(st, CHILD(n, i + 3));
5880 }
5881 if (i + 2 < NCH(n))
5882 symtable_node(st, CHILD(n, i + 2));
5883 break;
5884 case global_stmt:
5885 symtable_global(st, n);
5886 break;
5887 case import_stmt:
5888 symtable_import(st, n);
5889 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005890 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005891 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005892 symtable_node(st, CHILD(n, 1));
5893 if (NCH(n) > 2)
5894 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005895 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005896 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005897 st->st_cur->ste_opt_lineno = n->n_lineno;
5898 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005899 if (NCH(n) > 4)
5900 symtable_node(st, CHILD(n, 5));
5901 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005902
5903 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005904 case assert_stmt:
5905 if (Py_OptimizeFlag)
5906 return;
5907 if (NCH(n) == 2) {
5908 n = CHILD(n, 1);
5909 goto loop;
5910 } else {
5911 symtable_node(st, CHILD(n, 1));
5912 n = CHILD(n, 3);
5913 goto loop;
5914 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005915 case except_clause:
5916 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005917 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005918 if (NCH(n) > 1) {
5919 n = CHILD(n, 1);
5920 goto loop;
5921 }
5922 break;
5923 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005924 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005925 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005926 case yield_stmt:
5927 st->st_cur->ste_generator = 1;
5928 n = CHILD(n, 1);
5929 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005930 case expr_stmt:
5931 if (NCH(n) == 1)
5932 n = CHILD(n, 0);
5933 else {
5934 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005935 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005936 symtable_node(st, CHILD(n, 2));
5937 break;
5938 } else {
5939 int i;
5940 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005941 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005942 n = CHILD(n, NCH(n) - 1);
5943 }
5944 }
5945 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005946 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005947 /* only occurs when there are multiple for loops
5948 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005949 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005950 if (TYPE(n) == list_for)
5951 symtable_list_for(st, n);
5952 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005953 REQ(n, list_if);
5954 symtable_node(st, CHILD(n, 1));
5955 if (NCH(n) == 3) {
5956 n = CHILD(n, 2);
5957 goto loop;
5958 }
5959 }
5960 break;
5961 case for_stmt:
5962 symtable_assign(st, CHILD(n, 1), 0);
5963 for (i = 3; i < NCH(n); ++i)
5964 if (TYPE(CHILD(n, i)) >= single_input)
5965 symtable_node(st, CHILD(n, i));
5966 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005967 case arglist:
5968 if (NCH(n) > 1)
5969 for (i = 0; i < NCH(n); ++i) {
5970 node *ch = CHILD(n, i);
5971 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5972 TYPE(CHILD(ch, 1)) == gen_for) {
5973 PyErr_SetString(PyExc_SyntaxError,
5974 "invalid syntax");
5975 symtable_error(st, n->n_lineno);
5976 return;
5977 }
5978 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005979 /* The remaining cases fall through to default except in
5980 special circumstances. This requires the individual cases
5981 to be coded with great care, even though they look like
5982 rather innocuous. Each case must double-check TYPE(n).
5983 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005984 case decorator:
5985 if (TYPE(n) == decorator) {
5986 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5987 node *name, *varname;
5988 name = CHILD(n, 1);
5989 REQ(name, dotted_name);
5990 varname = CHILD(name, 0);
5991 REQ(varname, NAME);
5992 symtable_add_use(st, STR(varname));
5993 }
5994 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005995 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005996 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005997 n = CHILD(n, 2);
5998 goto loop;
5999 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006000 else if (TYPE(n) == argument && NCH(n) == 2 &&
6001 TYPE(CHILD(n, 1)) == gen_for) {
6002 symtable_generator_expression(st, n);
6003 break;
6004 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006005 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006006 case listmaker:
6007 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006008 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006009 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006010 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006011 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006012 case testlist_gexp:
6013 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6014 symtable_generator_expression(st, n);
6015 break;
6016 }
6017 /* fall through */
6018
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006019 case atom:
6020 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6021 symtable_add_use(st, STR(CHILD(n, 0)));
6022 break;
6023 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006024 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006025 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006026 /* Walk over every non-token child with a special case
6027 for one child.
6028 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006029 if (NCH(n) == 1) {
6030 n = CHILD(n, 0);
6031 goto loop;
6032 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006033 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006034 if (TYPE(CHILD(n, i)) >= single_input)
6035 symtable_node(st, CHILD(n, i));
6036 }
6037}
6038
6039static void
6040symtable_funcdef(struct symtable *st, node *n)
6041{
6042 node *body;
6043
6044 if (TYPE(n) == lambdef) {
6045 if (NCH(n) == 4)
6046 symtable_params(st, CHILD(n, 1));
6047 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006048 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006049 body = CHILD(n, NCH(n) - 1);
6050 symtable_node(st, body);
6051}
6052
6053/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006054 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006055 which are references in the defining scope. symtable_params()
6056 parses the parameter names, which are defined in the function's
6057 body.
6058
6059 varargslist:
6060 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6061 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6062*/
6063
6064static void
6065symtable_default_args(struct symtable *st, node *n)
6066{
6067 node *c;
6068 int i;
6069
6070 if (TYPE(n) == parameters) {
6071 n = CHILD(n, 1);
6072 if (TYPE(n) == RPAR)
6073 return;
6074 }
6075 REQ(n, varargslist);
6076 for (i = 0; i < NCH(n); i += 2) {
6077 c = CHILD(n, i);
6078 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6079 break;
6080 }
6081 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6082 symtable_node(st, CHILD(n, i));
6083 }
6084}
6085
6086static void
6087symtable_params(struct symtable *st, node *n)
6088{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006089 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006090 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006091
6092 if (TYPE(n) == parameters) {
6093 n = CHILD(n, 1);
6094 if (TYPE(n) == RPAR)
6095 return;
6096 }
6097 REQ(n, varargslist);
6098 for (i = 0; i < NCH(n); i += 2) {
6099 c = CHILD(n, i);
6100 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6101 ext = 1;
6102 break;
6103 }
6104 if (TYPE(c) == test) {
6105 continue;
6106 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006107 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006108 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006109 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006110 char nbuf[30];
6111 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006112 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006113 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006114 }
6115 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006116 if (ext) {
6117 c = CHILD(n, i);
6118 if (TYPE(c) == STAR) {
6119 i++;
6120 symtable_add_def(st, STR(CHILD(n, i)),
6121 DEF_PARAM | DEF_STAR);
6122 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006123 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006124 c = NULL;
6125 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006126 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006127 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006128 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006129 i++;
6130 symtable_add_def(st, STR(CHILD(n, i)),
6131 DEF_PARAM | DEF_DOUBLESTAR);
6132 }
6133 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006134 if (complex >= 0) {
6135 int j;
6136 for (j = 0; j <= complex; j++) {
6137 c = CHILD(n, j);
6138 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006139 c = CHILD(n, ++j);
6140 else if (TYPE(c) == EQUAL)
6141 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006142 if (TYPE(CHILD(c, 0)) == LPAR)
6143 symtable_params_fplist(st, CHILD(c, 1));
6144 }
6145 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006146}
6147
6148static void
6149symtable_params_fplist(struct symtable *st, node *n)
6150{
6151 int i;
6152 node *c;
6153
6154 REQ(n, fplist);
6155 for (i = 0; i < NCH(n); i += 2) {
6156 c = CHILD(n, i);
6157 REQ(c, fpdef);
6158 if (NCH(c) == 1)
6159 symtable_add_def(st, STR(CHILD(c, 0)),
6160 DEF_PARAM | DEF_INTUPLE);
6161 else
6162 symtable_params_fplist(st, CHILD(c, 1));
6163 }
6164
6165}
6166
6167static void
6168symtable_global(struct symtable *st, node *n)
6169{
6170 int i;
6171
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006172 /* XXX It might be helpful to warn about module-level global
6173 statements, but it's hard to tell the difference between
6174 module-level and a string passed to exec.
6175 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006176
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006177 for (i = 1; i < NCH(n); i += 2) {
6178 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006179 int flags;
6180
6181 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006182 if (flags < 0)
6183 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006184 if (flags && flags != DEF_GLOBAL) {
6185 char buf[500];
6186 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006187 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006188 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006189 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006190 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006191 }
6192 else {
6193 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006194 PyOS_snprintf(buf, sizeof(buf),
6195 GLOBAL_AFTER_ASSIGN,
6196 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006197 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006198 PyOS_snprintf(buf, sizeof(buf),
6199 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006200 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006201 }
6202 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006203 symtable_add_def(st, name, DEF_GLOBAL);
6204 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006205}
6206
6207static void
6208symtable_list_comprehension(struct symtable *st, node *n)
6209{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006210 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006211 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006212
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006213 REQ(n, listmaker);
6214 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6215 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006216 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006217 symtable_list_for(st, CHILD(n, 1));
6218 symtable_node(st, CHILD(n, 0));
6219 --st->st_cur->ste_tmpname;
6220}
6221
6222static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006223symtable_generator_expression(struct symtable *st, node *n)
6224{
6225 /* testlist_gexp: test gen_for */
6226 REQ(CHILD(n, 0), test);
6227 REQ(CHILD(n, 1), gen_for);
6228
6229 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6230 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6231
6232 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6233
6234 symtable_gen_for(st, CHILD(n, 1), 1);
6235 symtable_node(st, CHILD(n, 0));
6236 symtable_exit_scope(st);
6237
6238 /* for outmost iterable precomputation */
6239 symtable_node(st, CHILD(CHILD(n, 1), 3));
6240}
6241
6242static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006243symtable_list_for(struct symtable *st, node *n)
6244{
6245 REQ(n, list_for);
6246 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006247 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006248 symtable_node(st, CHILD(n, 3));
6249 if (NCH(n) == 5)
6250 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006251}
6252
6253static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006254symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6255{
6256 REQ(n, gen_for);
6257
6258 /* gen_for: for v in test [gen_iter] */
6259 symtable_assign(st, CHILD(n, 1), 0);
6260 if (is_outmost)
6261 symtable_add_use(st, "[outmost-iterable]");
6262 else
6263 symtable_node(st, CHILD(n, 3));
6264
6265 if (NCH(n) == 5)
6266 symtable_gen_iter(st, CHILD(n, 4));
6267}
6268
6269static void
6270symtable_gen_iter(struct symtable *st, node *n)
6271{
6272 REQ(n, gen_iter);
6273
6274 n = CHILD(n, 0);
6275 if (TYPE(n) == gen_for)
6276 symtable_gen_for(st, n, 0);
6277 else {
6278 REQ(n, gen_if);
6279 symtable_node(st, CHILD(n, 1));
6280
6281 if (NCH(n) == 3)
6282 symtable_gen_iter(st, CHILD(n, 2));
6283 }
6284}
6285
6286static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006287symtable_import(struct symtable *st, node *n)
6288{
6289 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006290 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006291 | 'from' dotted_name 'import'
6292 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006293 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006294 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006295 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006296 node *dotname = CHILD(n, 1);
6297 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6298 /* check for bogus imports */
6299 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6300 PyErr_SetString(PyExc_SyntaxError,
6301 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006302 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006303 return;
6304 }
6305 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006306 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006307 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006308 if (symtable_warn(st,
6309 "import * only allowed at module level") < 0)
6310 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006311 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006312 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006313 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006314 } else {
6315 for (i = 3; i < NCH(n); i += 2) {
6316 node *c = CHILD(n, i);
6317 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006318 symtable_assign(st, CHILD(c, 2),
6319 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006320 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006321 symtable_assign(st, CHILD(c, 0),
6322 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006323 }
6324 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006325 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006326 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006327 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006328 }
6329 }
6330}
6331
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006332/* The third argument to symatble_assign() is a flag to be passed to
6333 symtable_add_def() if it is eventually called. The flag is useful
6334 to specify the particular type of assignment that should be
6335 recorded, e.g. an assignment caused by import.
6336 */
6337
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006338static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006339symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006340{
6341 node *tmp;
6342 int i;
6343
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006344 loop:
6345 switch (TYPE(n)) {
6346 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006347 /* invalid assignment, e.g. lambda x:x=2. The next
6348 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006349 return;
6350 case power:
6351 if (NCH(n) > 2) {
6352 for (i = 2; i < NCH(n); ++i)
6353 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6354 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006355 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006356 if (NCH(n) > 1) {
6357 symtable_node(st, CHILD(n, 0));
6358 symtable_node(st, CHILD(n, 1));
6359 } else {
6360 n = CHILD(n, 0);
6361 goto loop;
6362 }
6363 return;
6364 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006365 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6366 /* XXX This is an error, but the next pass
6367 will catch it. */
6368 return;
6369 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006370 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006371 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006372 }
6373 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006374 case testlist_gexp:
6375 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6376 /* XXX This is an error, but the next pass
6377 will catch it. */
6378 return;
6379 } else {
6380 for (i = 0; i < NCH(n); i += 2)
6381 symtable_assign(st, CHILD(n, i), def_flag);
6382 }
6383 return;
6384
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006385 case exprlist:
6386 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006387 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006388 if (NCH(n) == 1) {
6389 n = CHILD(n, 0);
6390 goto loop;
6391 }
6392 else {
6393 int i;
6394 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006395 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006396 return;
6397 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006398 case atom:
6399 tmp = CHILD(n, 0);
6400 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6401 n = CHILD(n, 1);
6402 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006403 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006404 if (strcmp(STR(tmp), "__debug__") == 0) {
6405 PyErr_SetString(PyExc_SyntaxError,
6406 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006407 symtable_error(st, n->n_lineno);
6408 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006409 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006410 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006411 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006412 return;
6413 case dotted_as_name:
6414 if (NCH(n) == 3)
6415 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006416 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006417 else
6418 symtable_add_def(st,
6419 STR(CHILD(CHILD(n,
6420 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006421 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006422 return;
6423 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006424 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006425 return;
6426 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006427 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006428 return;
6429 default:
6430 if (NCH(n) == 0)
6431 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006432 if (NCH(n) == 1) {
6433 n = CHILD(n, 0);
6434 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006435 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006436 /* Should only occur for errors like x + 1 = 1,
6437 which will be caught in the next pass. */
6438 for (i = 0; i < NCH(n); ++i)
6439 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006440 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006441 }
6442}