blob: e8f4d67d173de4061a477958ac977665a958ea15 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000429 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000430 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000431 unsigned char *codestr = NULL;
432 unsigned char *lineno;
433 int *addrmap = NULL;
434 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000435 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000436 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000438 /* Bypass optimization when the lineno table is too complex */
439 assert(PyString_Check(lineno_obj));
440 lineno = PyString_AS_STRING(lineno_obj);
441 tabsiz = PyString_GET_SIZE(lineno_obj);
442 if (memchr(lineno, 255, tabsiz) != NULL)
443 goto exitUnchanged;
444
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000445 if (!PyString_Check(code))
446 goto exitUnchanged;
Raymond Hettingera12fa142004-08-24 04:34:16 +0000447
448 /* Avoid situations where jump retargeting could overflow */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000449 codelen = PyString_Size(code);
Raymond Hettingera12fa142004-08-24 04:34:16 +0000450 if (codelen > 32000)
451 goto exitUnchanged;
452
453 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000454 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000455 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000456 goto exitUnchanged;
457 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000458
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000459 /* Mapping to new jump targets after NOPs are removed */
460 addrmap = PyMem_Malloc(codelen * sizeof(int));
461 if (addrmap == NULL)
462 goto exitUnchanged;
463
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000464 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000465 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000466 goto exitUnchanged;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000467 assert(PyTuple_Check(consts));
468
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000469 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
470 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000471 opcode = codestr[i];
472 switch (opcode) {
473
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000474 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000475 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000476 case UNARY_NOT:
477 if (codestr[i+1] != JUMP_IF_FALSE ||
478 codestr[i+4] != POP_TOP ||
479 !ISBASICBLOCK(blocks,i,5))
480 continue;
481 tgt = GETJUMPTGT(codestr, (i+1));
482 if (codestr[tgt] != POP_TOP)
483 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000484 j = GETARG(codestr, i+1) + 1;
485 codestr[i] = JUMP_IF_TRUE;
486 SETARG(codestr, i, j);
487 codestr[i+3] = POP_TOP;
488 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000489 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000490 break;
491
492 /* not a is b --> a is not b
493 not a in b --> a not in b
494 not a is not b --> a is b
495 not a not in b --> a in b */
496 case COMPARE_OP:
497 j = GETARG(codestr, i);
498 if (j < 6 || j > 9 ||
499 codestr[i+3] != UNARY_NOT ||
500 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000501 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000502 SETARG(codestr, i, (j^1));
503 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000504 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000505 break;
506
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000507 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
508 case LOAD_NAME:
509 case LOAD_GLOBAL:
510 j = GETARG(codestr, i);
511 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
512 if (name == NULL || strcmp(name, "None") != 0)
513 continue;
514 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
515 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
516 codestr[i] = LOAD_CONST;
517 SETARG(codestr, i, j);
518 break;
519 }
520 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000521 break;
522
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000523 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000524 case LOAD_CONST:
525 j = GETARG(codestr, i);
526 if (codestr[i+3] != JUMP_IF_FALSE ||
527 codestr[i+6] != POP_TOP ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 !ISBASICBLOCK(blocks,i,7) ||
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000529 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
530 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000531 memset(codestr+i, NOP, 7);
532 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000533 break;
534
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000535 /* Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
536 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
537 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000538 case BUILD_TUPLE:
539 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000540 j = GETARG(codestr, i);
541 if (codestr[i+3] != UNPACK_SEQUENCE ||
542 !ISBASICBLOCK(blocks,i,6) ||
543 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000544 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000545 if (j == 1) {
546 memset(codestr+i, NOP, 6);
547 nops += 6;
548 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000549 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000550 memset(codestr+i+1, NOP, 5);
551 nops += 5;
552 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000553 codestr[i] = ROT_THREE;
554 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000555 memset(codestr+i+2, NOP, 4);
556 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000557 }
558 break;
559
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000560 /* Simplify conditional jump to conditional jump where the
561 result of the first test implies the success of a similar
562 test or the failure of the opposite test.
563 Arises in code like:
564 "a and b or c"
565 "a and b and c"
566 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000567 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
568 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000569 */
570 case JUMP_IF_FALSE:
571 case JUMP_IF_TRUE:
572 tgt = GETJUMPTGT(codestr, i);
573 j = codestr[tgt];
574 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
575 if (j == opcode) {
576 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
577 SETARG(codestr, i, tgttgt);
578 } else {
579 tgt -= i;
580 SETARG(codestr, i, tgt);
581 }
582 break;
583 }
584 /* Intentional fallthrough */
585
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000586 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000587 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000588 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000589 case JUMP_ABSOLUTE:
590 case CONTINUE_LOOP:
591 case SETUP_LOOP:
592 case SETUP_EXCEPT:
593 case SETUP_FINALLY:
594 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000595 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000596 continue;
597 tgttgt = GETJUMPTGT(codestr, tgt);
598 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
599 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000600 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000601 tgttgt -= i + 3; /* Calc relative jump addr */
602 if (tgttgt < 0) /* No backward relative jumps */
603 continue;
604 codestr[i] = opcode;
605 SETARG(codestr, i, tgttgt);
606 break;
607
608 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000609 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000610
611 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
612 case RETURN_VALUE:
613 if (i+4 >= codelen ||
614 codestr[i+4] != RETURN_VALUE ||
615 !ISBASICBLOCK(blocks,i,5))
616 continue;
617 memset(codestr+i+1, NOP, 4);
618 nops += 4;
619 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000620 }
621 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000622
623 /* Fixup linenotab */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000624 cum_orig_line = 0;
625 last_line = 0;
626 for (i=0 ; i < tabsiz ; i+=2) {
627 cum_orig_line += lineno[i];
628 new_line = addrmap[cum_orig_line];
Raymond Hettinger1792bfb2004-08-25 17:19:38 +0000629 assert (new_line - last_line < 255);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000630 lineno[i] =((unsigned char)(new_line - last_line));
631 last_line = new_line;
632 }
633
634 /* Remove NOPs and fixup jump targets */
635 for (i=0, h=0 ; i<codelen ; ) {
636 opcode = codestr[i];
637 switch (opcode) {
638 case NOP:
639 i++;
640 continue;
641
642 case JUMP_ABSOLUTE:
643 case CONTINUE_LOOP:
644 j = addrmap[GETARG(codestr, i)];
645 SETARG(codestr, i, j);
646 break;
647
648 case FOR_ITER:
649 case JUMP_FORWARD:
650 case JUMP_IF_FALSE:
651 case JUMP_IF_TRUE:
652 case SETUP_LOOP:
653 case SETUP_EXCEPT:
654 case SETUP_FINALLY:
655 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
656 SETARG(codestr, i, j);
657 break;
658 }
659 adj = CODESIZE(opcode);
660 while (adj--)
661 codestr[h++] = codestr[i++];
662 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000663 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000664
665 code = PyString_FromStringAndSize((char *)codestr, h);
666 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000667 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000668 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000669 return code;
670
671exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000672 if (addrmap != NULL)
673 PyMem_Free(addrmap);
674 if (codestr != NULL)
675 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000676 Py_INCREF(code);
677 return code;
678}
679
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000681PyCode_New(int argcount, int nlocals, int stacksize, int flags,
682 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000683 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
684 PyObject *filename, PyObject *name, int firstlineno,
685 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000686{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000687 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688 int i;
689 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000690 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000691 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 consts == NULL || !PyTuple_Check(consts) ||
693 names == NULL || !PyTuple_Check(names) ||
694 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000695 freevars == NULL || !PyTuple_Check(freevars) ||
696 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 name == NULL || !PyString_Check(name) ||
698 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000699 lnotab == NULL || !PyString_Check(lnotab) ||
700 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000701 PyErr_BadInternalCall();
702 return NULL;
703 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000704 intern_strings(names);
705 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000706 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000707 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000708 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 for (i = PyTuple_Size(consts); --i >= 0; ) {
710 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000712 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000713 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000714 continue;
715 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000718 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000719 co->co_argcount = argcount;
720 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000721 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000722 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000723 Py_INCREF(code);
724 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000726 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000728 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000730 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000731 Py_INCREF(freevars);
732 co->co_freevars = freevars;
733 Py_INCREF(cellvars);
734 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000736 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000738 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000739 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000741 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000742 if (PyTuple_GET_SIZE(freevars) == 0 &&
743 PyTuple_GET_SIZE(cellvars) == 0)
744 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000745 }
746 return co;
747}
748
749
750/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000751
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000752/* The compiler uses two passes to generate bytecodes. The first pass
753 builds the symbol table. The second pass generates the bytecode.
754
755 The first pass uses a single symtable struct. The second pass uses
756 a compiling struct for each code block. The compiling structs
757 share a reference to the symtable.
758
759 The two passes communicate via symtable_load_symbols() and via
760 is_local() and is_global(). The former initializes several slots
761 in the compiling struct: c_varnames, c_locals, c_nlocals,
762 c_argcount, c_globals, and c_flags.
763*/
764
Tim Peters2a7f3842001-06-09 09:26:21 +0000765/* All about c_lnotab.
766
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000767c_lnotab is an array of unsigned bytes disguised as a Python string. Since
768version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
769mapped to source code line #s via c_lnotab instead.
770
Tim Peters2a7f3842001-06-09 09:26:21 +0000771The array is conceptually a list of
772 (bytecode offset increment, line number increment)
773pairs. The details are important and delicate, best illustrated by example:
774
775 byte code offset source code line number
776 0 1
777 6 2
778 50 7
779 350 307
780 361 308
781
782The first trick is that these numbers aren't stored, only the increments
783from one row to the next (this doesn't really work, but it's a start):
784
785 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
786
787The second trick is that an unsigned byte can't hold negative values, or
788values larger than 255, so (a) there's a deep assumption that byte code
789offsets and their corresponding line #s both increase monotonically, and (b)
790if at least one column jumps by more than 255 from one row to the next, more
791than one pair is written to the table. In case #b, there's no way to know
792from looking at the table later how many were written. That's the delicate
793part. A user of c_lnotab desiring to find the source line number
794corresponding to a bytecode address A should do something like this
795
796 lineno = addr = 0
797 for addr_incr, line_incr in c_lnotab:
798 addr += addr_incr
799 if addr > A:
800 return lineno
801 lineno += line_incr
802
803In order for this to work, when the addr field increments by more than 255,
804the line # increment in each pair generated must be 0 until the remaining addr
805increment is < 256. So, in the example above, com_set_lineno should not (as
806was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
807255, 0, 45, 255, 0, 45.
808*/
809
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000810struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000811 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000813 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000815 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000816 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 PyObject *c_locals; /* dictionary (value=localID) */
818 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000819 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000820 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000821 int c_nlocals; /* index of next local */
822 int c_argcount; /* number of top-level arguments */
823 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000824 int c_nexti; /* index into c_code */
825 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000826 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000827 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000828 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000829 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000830 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000831 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000832 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000834 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000835 int c_stacklevel; /* Current stack level */
836 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000837 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000839 int c_last_addr; /* last op addr seen and recorded in lnotab */
840 int c_last_line; /* last line seen and recorded in lnotab */
841 int c_lnotab_next; /* current length of lnotab */
842 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000843 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000844 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000845 int c_nested; /* Is block nested funcdef or lamdef? */
846 int c_closure; /* Is nested w/freevars? */
847 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000848 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000849 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000850};
851
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000852static int
853is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000854{
855 if ((v & (USE | DEF_FREE))
856 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
857 return 1;
858 if (v & DEF_FREE_CLASS)
859 return 1;
860 return 0;
861}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000862
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000863static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000864com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000865{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000866 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
867
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000868 if (c == NULL) {
869 /* Error occurred via symtable call to
870 is_constant_false */
871 PyErr_SetString(exc, msg);
872 return;
873 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000874 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000875 if (c->c_lineno < 1 || c->c_interactive) {
876 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000878 return;
879 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000880 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000881 if (v == NULL)
882 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000883
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000884 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000885 if (line == NULL) {
886 Py_INCREF(Py_None);
887 line = Py_None;
888 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000889 if (exc == PyExc_SyntaxError) {
890 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
891 Py_None, line);
892 if (t == NULL)
893 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000894 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000895 if (w == NULL)
896 goto exit;
897 PyErr_SetObject(exc, w);
898 } else {
899 /* Make sure additional exceptions are printed with
900 file and line, also. */
901 PyErr_SetObject(exc, v);
902 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
903 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000904 exit:
905 Py_XDECREF(t);
906 Py_XDECREF(v);
907 Py_XDECREF(w);
908 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000909}
910
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000911/* Interface to the block stack */
912
913static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000914block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000915{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000916 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 com_error(c, PyExc_SystemError,
918 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000919 }
920 else {
921 c->c_block[c->c_nblocks++] = type;
922 }
923}
924
925static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000927{
928 if (c->c_nblocks > 0)
929 c->c_nblocks--;
930 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000932 }
933}
934
Guido van Rossum681d79a1995-07-18 14:51:37 +0000935/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000936
Martin v. Löwis95292d62002-12-11 14:04:59 +0000937static int issue_warning(const char *, const char *, int);
938static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000939static void com_free(struct compiling *);
940static void com_push(struct compiling *, int);
941static void com_pop(struct compiling *, int);
942static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000943static void com_node(struct compiling *, node *);
944static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000945static void com_addbyte(struct compiling *, int);
946static void com_addint(struct compiling *, int);
947static void com_addoparg(struct compiling *, int, int);
948static void com_addfwref(struct compiling *, int, int *);
949static void com_backpatch(struct compiling *, int);
950static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
951static int com_addconst(struct compiling *, PyObject *);
952static int com_addname(struct compiling *, PyObject *);
953static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000954static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000955static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000956static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000957static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000958static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000959static void com_assign(struct compiling *, node *, int, node *);
960static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000961static int com_make_closure(struct compiling *c, PyCodeObject *co);
962
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000964static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000965 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000966static PyObject *parsestrplus(struct compiling*, node *);
967static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000968static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000969
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000970static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000971
972/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000973static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000974static struct symtable *symtable_build(node *, PyFutureFeatures *,
975 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000977static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000978static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000979static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000980static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000981static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000982
983static void symtable_node(struct symtable *, node *);
984static void symtable_funcdef(struct symtable *, node *);
985static void symtable_default_args(struct symtable *, node *);
986static void symtable_params(struct symtable *, node *);
987static void symtable_params_fplist(struct symtable *, node *n);
988static void symtable_global(struct symtable *, node *);
989static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000990static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000991static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000992static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000993static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000994static void symtable_gen_for(struct symtable *, node *, int);
995static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000996
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000997static int symtable_update_free_vars(struct symtable *);
998static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
999static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
1000
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001001/* helper */
1002static void
1003do_pad(int pad)
1004{
1005 int i;
1006 for (i = 0; i < pad; ++i)
1007 fprintf(stderr, " ");
1008}
1009
1010static void
1011dump(node *n, int pad, int depth)
1012{
1013 int i;
1014 if (depth == 0)
1015 return;
1016 do_pad(pad);
1017 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1018 if (depth > 0)
1019 depth--;
1020 for (i = 0; i < NCH(n); ++i)
1021 dump(CHILD(n, i), pad + 1, depth);
1022}
1023
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001024static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001025com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001026{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001027 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1029 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001030 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001032 goto fail;
1033 if ((c->c_const_dict = PyDict_New()) == NULL)
1034 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001036 goto fail;
1037 if ((c->c_name_dict = PyDict_New()) == NULL)
1038 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001040 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1042 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001043 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001044 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001045 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001046 c->c_freevars = NULL;
1047 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001048 c->c_nlocals = 0;
1049 c->c_argcount = 0;
1050 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001051 c->c_nexti = 0;
1052 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001053 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001054 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001055 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001056 c->c_begin = 0;
1057 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001059 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001060 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001061 c->c_stacklevel = 0;
1062 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001063 c->c_firstlineno = 0;
1064 c->c_last_addr = 0;
1065 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001066 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001067 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001068 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001069 c->c_nested = 0;
1070 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001071 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 return 1;
1073
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001074 fail:
1075 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001076 return 0;
1077}
1078
1079static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001080com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001081{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 Py_XDECREF(c->c_code);
1083 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001084 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001086 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 Py_XDECREF(c->c_globals);
1088 Py_XDECREF(c->c_locals);
1089 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001090 Py_XDECREF(c->c_freevars);
1091 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001093 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001094 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001095}
1096
1097static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001098com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001099{
1100 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001101 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001102 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001103 /*
1104 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1105 c->c_filename, c->c_name, c->c_lineno,
1106 c->c_nexti, c->c_stacklevel, n);
1107 */
1108 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001109}
1110
1111static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001112com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001113{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001114 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001115 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001116 else
1117 c->c_stacklevel -= n;
1118}
1119
1120static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001121com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001122{
1123 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001125 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001127}
1128
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001129static int
1130com_check_size(PyObject **s, int offset)
1131{
1132 int len = PyString_GET_SIZE(*s);
1133 if (offset >= len)
1134 return _PyString_Resize(s, len * 2);
1135 return 0;
1136}
1137
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001138static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001139com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001140{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001141 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001142 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001143 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001144 if (com_check_size(&c->c_code, c->c_nexti)) {
1145 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001146 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001147 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001148 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149}
1150
1151static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001152com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001153{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001154 com_addbyte(c, x & 0xff);
1155 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001156}
1157
1158static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001159com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001160{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001161 char *p;
1162 if (c->c_lnotab == NULL)
1163 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001164 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1165 c->c_errors++;
1166 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001167 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001168 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001169 *p++ = addr;
1170 *p++ = line;
1171 c->c_lnotab_next += 2;
1172}
1173
1174static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001175com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001176{
1177 c->c_lineno = lineno;
1178 if (c->c_firstlineno == 0) {
1179 c->c_firstlineno = c->c_last_line = lineno;
1180 }
1181 else {
1182 int incr_addr = c->c_nexti - c->c_last_addr;
1183 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001184 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001185 while (incr_addr > 255) {
1186 com_add_lnotab(c, 255, 0);
1187 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001188 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001189 while (incr_line > 255) {
1190 com_add_lnotab(c, incr_addr, 255);
1191 incr_line -=255;
1192 incr_addr = 0;
1193 }
1194 if (incr_addr > 0 || incr_line > 0)
1195 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001196 c->c_last_addr = c->c_nexti;
1197 c->c_last_line = lineno;
1198 }
1199}
1200
1201static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001202com_strip_lnotab(struct compiling *c)
1203{
1204 /* strip the last lnotab entry if no opcode were emitted.
1205 * This prevents a line number to be generated on a final
1206 * pass, like in the following example:
1207 *
1208 * if a:
1209 * print 5
1210 * else:
1211 * pass
1212 *
1213 * Without the fix, a line trace event would be generated
1214 * on the pass even if a is true (because of the implicit
1215 * return).
1216 */
1217 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1218 c->c_lnotab_next = c->c_lnotab_last;
1219 }
1220}
1221
1222static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001223com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224{
Fred Drakeef8ace32000-08-24 00:32:09 +00001225 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001226 if (extended_arg){
1227 com_addbyte(c, EXTENDED_ARG);
1228 com_addint(c, extended_arg);
1229 arg &= 0xffff;
1230 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001231 com_addbyte(c, op);
1232 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233}
1234
1235static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001236com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001237{
1238 /* Compile a forward reference for backpatching */
1239 int here;
1240 int anchor;
1241 com_addbyte(c, op);
1242 here = c->c_nexti;
1243 anchor = *p_anchor;
1244 *p_anchor = here;
1245 com_addint(c, anchor == 0 ? 0 : here - anchor);
1246}
1247
1248static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001249com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001251 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001252 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001253 int dist;
1254 int prev;
1255 for (;;) {
1256 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001257 prev = code[anchor] + (code[anchor+1] << 8);
1258 dist = target - (anchor+2);
1259 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001260 dist >>= 8;
1261 code[anchor+1] = dist;
1262 dist >>= 8;
1263 if (dist) {
1264 com_error(c, PyExc_SystemError,
1265 "com_backpatch: offset too large");
1266 break;
1267 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001268 if (!prev)
1269 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001270 anchor -= prev;
1271 }
1272}
1273
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001274/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001275
1276static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001277com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001279 PyObject *w, *t, *np=NULL;
1280 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001281
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001282 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001283 if (t == NULL)
1284 goto fail;
1285 w = PyDict_GetItem(dict, t);
1286 if (w != NULL) {
1287 n = PyInt_AsLong(w);
1288 } else {
1289 n = PyList_Size(list);
1290 np = PyInt_FromLong(n);
1291 if (np == NULL)
1292 goto fail;
1293 if (PyList_Append(list, v) != 0)
1294 goto fail;
1295 if (PyDict_SetItem(dict, t, np) != 0)
1296 goto fail;
1297 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001298 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001299 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001300 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001301 fail:
1302 Py_XDECREF(np);
1303 Py_XDECREF(t);
1304 c->c_errors++;
1305 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306}
1307
1308static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001309com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001310{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001311 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312}
1313
1314static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001316{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001317 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001318}
1319
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001320int
1321_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001322{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001323 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001324 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001325 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001326 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1327 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001328 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001329 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001330 return 0; /* Don't mangle __extremely_long_names */
1331 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1332 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001333 /* Strip leading underscores from class name */
1334 while (*p == '_')
1335 p++;
1336 if (*p == '\0')
1337 return 0; /* Don't mangle if class is just underscores */
1338 plen = strlen(p);
1339 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001340 plen = maxlen-nlen-2; /* Truncate class name if too long */
1341 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001342 buffer[0] = '_';
1343 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001344 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001345 return 1;
1346}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001347
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001349com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001350{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001352 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001353 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001354
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001355 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001356 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001357 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001358 c->c_errors++;
1359 i = 255;
1360 }
1361 else {
1362 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001364 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001365 com_addoparg(c, op, i);
1366}
1367
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001368#define NAME_LOCAL 0
1369#define NAME_GLOBAL 1
1370#define NAME_DEFAULT 2
1371#define NAME_CLOSURE 3
1372
1373static int
1374com_lookup_arg(PyObject *dict, PyObject *name)
1375{
1376 PyObject *v = PyDict_GetItem(dict, name);
1377 if (v == NULL)
1378 return -1;
1379 else
1380 return PyInt_AS_LONG(v);
1381}
1382
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001383static int
1384none_assignment_check(struct compiling *c, char *name, int assigning)
1385{
1386 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1387 char *msg;
1388 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001389 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001390 else
1391 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001392 com_error(c, PyExc_SyntaxError, msg);
1393 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001394 }
1395 return 0;
1396}
1397
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001398static void
1399com_addop_varname(struct compiling *c, int kind, char *name)
1400{
1401 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001402 int i, reftype;
1403 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001404 int op = STOP_CODE;
1405 char buffer[MANGLE_LEN];
1406
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001407 if (kind != VAR_LOAD &&
1408 none_assignment_check(c, name, kind == VAR_STORE))
1409 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001410 i = 255;
1411 goto done;
1412 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001413 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001414 name = buffer;
1415 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1416 c->c_errors++;
1417 i = 255;
1418 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001419 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001420
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001421 reftype = get_ref_type(c, name);
1422 switch (reftype) {
1423 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001424 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001425 scope = NAME_LOCAL;
1426 break;
1427 case GLOBAL_EXPLICIT:
1428 scope = NAME_GLOBAL;
1429 break;
1430 case GLOBAL_IMPLICIT:
1431 if (c->c_flags & CO_OPTIMIZED)
1432 scope = NAME_GLOBAL;
1433 break;
1434 case FREE:
1435 case CELL:
1436 scope = NAME_CLOSURE;
1437 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001438 }
1439
1440 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001441 if (scope == NAME_LOCAL)
1442 i = com_lookup_arg(c->c_locals, v);
1443 else if (reftype == FREE)
1444 i = com_lookup_arg(c->c_freevars, v);
1445 else if (reftype == CELL)
1446 i = com_lookup_arg(c->c_cellvars, v);
1447 if (i == -1) {
1448 c->c_errors++; /* XXX no exception set */
1449 i = 255;
1450 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001451 }
1452 Py_DECREF(v);
1453
1454 switch (kind) {
1455 case VAR_LOAD:
1456 switch (scope) {
1457 case NAME_LOCAL:
1458 op = LOAD_FAST;
1459 break;
1460 case NAME_GLOBAL:
1461 op = LOAD_GLOBAL;
1462 break;
1463 case NAME_DEFAULT:
1464 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001465 break;
1466 case NAME_CLOSURE:
1467 op = LOAD_DEREF;
1468 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001469 }
1470 break;
1471 case VAR_STORE:
1472 switch (scope) {
1473 case NAME_LOCAL:
1474 op = STORE_FAST;
1475 break;
1476 case NAME_GLOBAL:
1477 op = STORE_GLOBAL;
1478 break;
1479 case NAME_DEFAULT:
1480 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001481 break;
1482 case NAME_CLOSURE:
1483 op = STORE_DEREF;
1484 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001485 }
1486 break;
1487 case VAR_DELETE:
1488 switch (scope) {
1489 case NAME_LOCAL:
1490 op = DELETE_FAST;
1491 break;
1492 case NAME_GLOBAL:
1493 op = DELETE_GLOBAL;
1494 break;
1495 case NAME_DEFAULT:
1496 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001497 break;
1498 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001499 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001500 PyOS_snprintf(buf, sizeof(buf),
1501 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001502 com_error(c, PyExc_SyntaxError, buf);
1503 i = 255;
1504 break;
1505 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001506 }
1507 break;
1508 }
1509done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001510 com_addoparg(c, op, i);
1511}
1512
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001513static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001514com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001515{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001516 char *name;
1517 char buffer[1000];
1518 /* XXX it is possible to write this code without the 1000
1519 chars on the total length of dotted names, I just can't be
1520 bothered right now */
1521 if (TYPE(n) == STAR)
1522 name = "*";
1523 else if (TYPE(n) == dotted_name) {
1524 char *p = buffer;
1525 int i;
1526 name = buffer;
1527 for (i = 0; i < NCH(n); i += 2) {
1528 char *s = STR(CHILD(n, i));
1529 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001531 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001532 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001533 break;
1534 }
1535 if (p != buffer)
1536 *p++ = '.';
1537 strcpy(p, s);
1538 p = strchr(p, '\0');
1539 }
1540 }
1541 else {
1542 REQ(n, NAME);
1543 name = STR(n);
1544 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001545 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001546}
1547
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001549parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001550{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001551 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001552 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001553 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001554#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001555 int imflag;
1556#endif
1557
Guido van Rossum282914b1991-04-04 10:42:56 +00001558 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001559 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001560#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001561 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001562#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001563 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001565 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001567 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001568 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001569 }
1570 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001571 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001573 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001574 if (errno != 0)
1575 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001577 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001578 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001579#ifndef WITHOUT_COMPLEX
1580 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001581 Py_complex z;
1582 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001583 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001584 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001585 PyFPE_END_PROTECT(z)
1586 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001587 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001588 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001589#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001590 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001591 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001592 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001593 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001595 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001596}
1597
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001599decode_utf8(char **sPtr, char *end, char* encoding)
1600{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001601#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001602 Py_FatalError("decode_utf8 should not be called in this build.");
1603 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001604#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001605 PyObject *u, *v;
1606 char *s, *t;
1607 t = s = *sPtr;
1608 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1609 while (s < end && (*s & 0x80)) s++;
1610 *sPtr = s;
1611 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1612 if (u == NULL)
1613 return NULL;
1614 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1615 Py_DECREF(u);
1616 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001617#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001618}
1619
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001620/* compiler.transformer.Transformer.decode_literal depends on what
1621 might seem like minor details of this function -- changes here
1622 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001623static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001624parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001625{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001627 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001628 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001629 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001630 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001631 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001632 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001633
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001634 if (isalpha(quote) || quote == '_') {
1635 if (quote == 'u' || quote == 'U') {
1636 quote = *++s;
1637 unicode = 1;
1638 }
1639 if (quote == 'r' || quote == 'R') {
1640 quote = *++s;
1641 rawmode = 1;
1642 }
1643 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001644 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001646 return NULL;
1647 }
1648 s++;
1649 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001650 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001651 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001652 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001653 return NULL;
1654 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001655 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001656 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001657 return NULL;
1658 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001659 if (len >= 4 && s[0] == quote && s[1] == quote) {
1660 s += 2;
1661 len -= 2;
1662 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001664 return NULL;
1665 }
1666 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001667#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001668 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001669 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001670 char *buf;
1671 char *p;
1672 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001673 if (encoding == NULL) {
1674 buf = s;
1675 u = NULL;
1676 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1677 buf = s;
1678 u = NULL;
1679 } else {
1680 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1681 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1682 if (u == NULL)
1683 return NULL;
1684 p = buf = PyString_AsString(u);
1685 end = s + len;
1686 while (s < end) {
1687 if (*s == '\\') {
1688 *p++ = *s++;
1689 if (*s & 0x80) {
1690 strcpy(p, "u005c");
1691 p += 5;
1692 }
1693 }
1694 if (*s & 0x80) { /* XXX inefficient */
1695 char *r;
1696 int rn, i;
1697 w = decode_utf8(&s, end, "utf-16-be");
1698 if (w == NULL) {
1699 Py_DECREF(u);
1700 return NULL;
1701 }
1702 r = PyString_AsString(w);
1703 rn = PyString_Size(w);
1704 assert(rn % 2 == 0);
1705 for (i = 0; i < rn; i += 2) {
1706 sprintf(p, "\\u%02x%02x",
1707 r[i + 0] & 0xFF,
1708 r[i + 1] & 0xFF);
1709 p += 6;
1710 }
1711 Py_DECREF(w);
1712 } else {
1713 *p++ = *s++;
1714 }
1715 }
1716 len = p - buf;
1717 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001718 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001719 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001720 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001721 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1722 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001723 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001724 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001725 return v;
1726
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001727 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001728#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001729 need_encoding = (encoding != NULL &&
1730 strcmp(encoding, "utf-8") != 0 &&
1731 strcmp(encoding, "iso-8859-1") != 0);
1732 if (rawmode || strchr(s, '\\') == NULL) {
1733 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001734#ifndef Py_USING_UNICODE
1735 /* This should not happen - we never see any other
1736 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001737 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001738#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001739 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1740 if (u == NULL)
1741 return NULL;
1742 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1743 Py_DECREF(u);
1744 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001745#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001746 } else {
1747 return PyString_FromStringAndSize(s, len);
1748 }
1749 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001750
1751 v = PyString_DecodeEscape(s, len, NULL, unicode,
1752 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001753 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001754 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001755 return v;
1756}
1757
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001759parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001760{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001762 int i;
1763 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001764 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001765 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001766 for (i = 1; i < NCH(n); i++) {
1767 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001768 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001769 if (s == NULL)
1770 goto onError;
1771 if (PyString_Check(v) && PyString_Check(s)) {
1772 PyString_ConcatAndDel(&v, s);
1773 if (v == NULL)
1774 goto onError;
1775 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001776#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001777 else {
1778 PyObject *temp;
1779 temp = PyUnicode_Concat(v, s);
1780 Py_DECREF(s);
1781 if (temp == NULL)
1782 goto onError;
1783 Py_DECREF(v);
1784 v = temp;
1785 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001786#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001787 }
1788 }
1789 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001790
1791 onError:
1792 Py_XDECREF(v);
1793 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001794}
1795
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001796static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001797com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001798{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001799 int anchor = 0;
1800 int save_begin = c->c_begin;
1801
Raymond Hettinger354433a2004-05-19 08:20:33 +00001802 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001803 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001804 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001805 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001806 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001807 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001808 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001809 c->c_loops++;
1810 com_list_iter(c, n, e, t);
1811 c->c_loops--;
1812 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1813 c->c_begin = save_begin;
1814 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001815 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001816}
1817
1818static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001819com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1820{
1821 int break_anchor = 0;
1822 int anchor = 0;
1823 int save_begin = c->c_begin;
1824
1825 REQ(n, gen_for);
1826 /* gen_for: for v in test [gen_iter] */
1827
1828 com_addfwref(c, SETUP_LOOP, &break_anchor);
1829 block_push(c, SETUP_LOOP);
1830
1831 if (is_outmost) {
1832 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1833 com_push(c, 1);
1834 }
1835 else {
1836 com_node(c, CHILD(n, 3));
1837 com_addbyte(c, GET_ITER);
1838 }
1839
1840 c->c_begin = c->c_nexti;
1841 com_set_lineno(c, c->c_last_line);
1842 com_addfwref(c, FOR_ITER, &anchor);
1843 com_push(c, 1);
1844 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1845
1846 if (NCH(n) == 5)
1847 com_gen_iter(c, CHILD(n, 4), t);
1848 else {
1849 com_test(c, t);
1850 com_addbyte(c, YIELD_VALUE);
1851 com_pop(c, 1);
1852 }
1853
1854 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1855 c->c_begin = save_begin;
1856
1857 com_backpatch(c, anchor);
1858 com_pop(c, 1); /* FOR_ITER has popped this */
1859 com_addbyte(c, POP_BLOCK);
1860 block_pop(c, SETUP_LOOP);
1861 com_backpatch(c, break_anchor);
1862}
1863
1864static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001865com_list_if(struct compiling *c, node *n, node *e, char *t)
1866{
1867 int anchor = 0;
1868 int a = 0;
1869 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001870 com_node(c, CHILD(n, 1));
1871 com_addfwref(c, JUMP_IF_FALSE, &a);
1872 com_addbyte(c, POP_TOP);
1873 com_pop(c, 1);
1874 com_list_iter(c, n, e, t);
1875 com_addfwref(c, JUMP_FORWARD, &anchor);
1876 com_backpatch(c, a);
1877 /* We jump here with an extra entry which we now pop */
1878 com_addbyte(c, POP_TOP);
1879 com_backpatch(c, anchor);
1880}
1881
1882static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001883com_gen_if(struct compiling *c, node *n, node *t)
1884{
1885 /* gen_if: 'if' test [gen_iter] */
1886 int anchor = 0;
1887 int a=0;
1888
1889 com_node(c, CHILD(n, 1));
1890 com_addfwref(c, JUMP_IF_FALSE, &a);
1891 com_addbyte(c, POP_TOP);
1892 com_pop(c, 1);
1893
1894 if (NCH(n) == 3)
1895 com_gen_iter(c, CHILD(n, 2), t);
1896 else {
1897 com_test(c, t);
1898 com_addbyte(c, YIELD_VALUE);
1899 com_pop(c, 1);
1900 }
1901 com_addfwref(c, JUMP_FORWARD, &anchor);
1902 com_backpatch(c, a);
1903 /* We jump here with an extra entry which we now pop */
1904 com_addbyte(c, POP_TOP);
1905 com_backpatch(c, anchor);
1906}
1907
1908static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001909com_list_iter(struct compiling *c,
1910 node *p, /* parent of list_iter node */
1911 node *e, /* element expression node */
1912 char *t /* name of result list temp local */)
1913{
1914 /* list_iter is the last child in a listmaker, list_for, or list_if */
1915 node *n = CHILD(p, NCH(p)-1);
1916 if (TYPE(n) == list_iter) {
1917 n = CHILD(n, 0);
1918 switch (TYPE(n)) {
1919 case list_for:
1920 com_list_for(c, n, e, t);
1921 break;
1922 case list_if:
1923 com_list_if(c, n, e, t);
1924 break;
1925 default:
1926 com_error(c, PyExc_SystemError,
1927 "invalid list_iter node type");
1928 }
1929 }
1930 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001931 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001932 com_push(c, 1);
1933 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001934 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001935 com_pop(c, 2);
1936 }
1937}
1938
1939static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001940com_gen_iter(struct compiling *c, node *n, node *t)
1941{
1942 /* gen_iter: gen_for | gen_if */
1943 node *ch;
1944 REQ(n, gen_iter);
1945
1946 ch = CHILD(n, 0);
1947
1948 switch (TYPE(ch)) {
1949 case gen_for:
1950 com_gen_for(c, ch, t, 0);
1951 break;
1952 case gen_if:
1953 com_gen_if(c, ch, t);
1954 break;
1955 default:
1956 com_error(c, PyExc_SystemError,
1957 "invalid gen_iter node type");
1958 }
1959}
1960
1961static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001962com_list_comprehension(struct compiling *c, node *n)
1963{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001964 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001965 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001966
1967 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001968 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001969 com_addoparg(c, BUILD_LIST, 0);
1970 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1971 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001972 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001973 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001974 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001975 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001976 --c->c_tmpname;
1977}
1978
1979static void
1980com_listmaker(struct compiling *c, node *n)
1981{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001982 /* listmaker: test ( list_for | (',' test)* [','] ) */
1983 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001984 com_list_comprehension(c, n);
1985 else {
1986 int len = 0;
1987 int i;
1988 for (i = 0; i < NCH(n); i += 2, len++)
1989 com_node(c, CHILD(n, i));
1990 com_addoparg(c, BUILD_LIST, len);
1991 com_pop(c, len-1);
1992 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001993}
1994
1995static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001996com_generator_expression(struct compiling *c, node *n)
1997{
1998 /* testlist_gexp: test gen_for */
1999 /* argument: test gen_for */
2000 PyCodeObject *co;
2001
2002 REQ(CHILD(n, 0), test);
2003 REQ(CHILD(n, 1), gen_for);
2004
2005 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2006 n->n_lineno);
2007 co = icompile(n, c);
2008 symtable_exit_scope(c->c_symtable);
2009
2010 if (co == NULL)
2011 c->c_errors++;
2012 else {
2013 int closure = com_make_closure(c, co);
2014 int i = com_addconst(c, (PyObject *)co);
2015
2016 com_addoparg(c, LOAD_CONST, i);
2017 com_push(c, 1);
2018 if (closure)
2019 com_addoparg(c, MAKE_CLOSURE, 0);
2020 else
2021 com_addoparg(c, MAKE_FUNCTION, 0);
2022
2023 com_test(c, CHILD(CHILD(n, 1), 3));
2024 com_addbyte(c, GET_ITER);
2025 com_addoparg(c, CALL_FUNCTION, 1);
2026 com_pop(c, 1);
2027
2028 Py_DECREF(co);
2029 }
2030}
2031
2032static void
2033com_testlist_gexp(struct compiling *c, node *n)
2034{
2035 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2036 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2037 com_generator_expression(c, n);
2038 else com_list(c, n, 0);
2039}
2040
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002041
Raymond Hettinger354433a2004-05-19 08:20:33 +00002042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002043com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002044{
2045 int i;
2046 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2047 for (i = 0; i+2 < NCH(n); i += 4) {
2048 /* We must arrange things just right for STORE_SUBSCR.
2049 It wants the stack to look like (value) (dict) (key) */
2050 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002051 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002052 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002053 com_node(c, CHILD(n, i+2)); /* value */
2054 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002055 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002056 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002057 }
2058}
2059
2060static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002061com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062{
2063 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002064 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002065 int i;
2066 REQ(n, atom);
2067 ch = CHILD(n, 0);
2068 switch (TYPE(ch)) {
2069 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002070 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002071 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002072 com_push(c, 1);
2073 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002075 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002076 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002077 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002078 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002079 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002080 com_push(c, 1);
2081 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002083 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002084 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002085 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002087 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002088 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002089 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 break;
2091 case BACKQUOTE:
2092 com_node(c, CHILD(n, 1));
2093 com_addbyte(c, UNARY_CONVERT);
2094 break;
2095 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002096 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002097 i = 255;
2098 }
2099 else {
2100 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002101 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002102 }
2103 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002104 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 break;
2106 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002107 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002108 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002109 c->c_errors++;
2110 i = 255;
2111 }
2112 else {
2113 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002114 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002115 }
2116 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 break;
2119 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002120 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002121 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 break;
2123 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002124 com_error(c, PyExc_SystemError,
2125 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002126 }
2127}
2128
2129static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002130com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002131{
2132 if (NCH(n) == 1) {
2133 com_addbyte(c, op);
2134 }
2135 else if (NCH(n) == 2) {
2136 if (TYPE(CHILD(n, 0)) != COLON) {
2137 com_node(c, CHILD(n, 0));
2138 com_addbyte(c, op+1);
2139 }
2140 else {
2141 com_node(c, CHILD(n, 1));
2142 com_addbyte(c, op+2);
2143 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002144 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002145 }
2146 else {
2147 com_node(c, CHILD(n, 0));
2148 com_node(c, CHILD(n, 2));
2149 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002150 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002151 }
2152}
2153
Guido van Rossum635abd21997-01-06 22:56:52 +00002154static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002155com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2156{
2157 if (NCH(n) == 1) {
2158 com_addbyte(c, DUP_TOP);
2159 com_push(c, 1);
2160 com_addbyte(c, SLICE);
2161 com_node(c, augn);
2162 com_addbyte(c, opcode);
2163 com_pop(c, 1);
2164 com_addbyte(c, ROT_TWO);
2165 com_addbyte(c, STORE_SLICE);
2166 com_pop(c, 2);
2167 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2168 com_node(c, CHILD(n, 0));
2169 com_addoparg(c, DUP_TOPX, 2);
2170 com_push(c, 2);
2171 com_addbyte(c, SLICE+1);
2172 com_pop(c, 1);
2173 com_node(c, augn);
2174 com_addbyte(c, opcode);
2175 com_pop(c, 1);
2176 com_addbyte(c, ROT_THREE);
2177 com_addbyte(c, STORE_SLICE+1);
2178 com_pop(c, 3);
2179 } else if (NCH(n) == 2) {
2180 com_node(c, CHILD(n, 1));
2181 com_addoparg(c, DUP_TOPX, 2);
2182 com_push(c, 2);
2183 com_addbyte(c, SLICE+2);
2184 com_pop(c, 1);
2185 com_node(c, augn);
2186 com_addbyte(c, opcode);
2187 com_pop(c, 1);
2188 com_addbyte(c, ROT_THREE);
2189 com_addbyte(c, STORE_SLICE+2);
2190 com_pop(c, 3);
2191 } else {
2192 com_node(c, CHILD(n, 0));
2193 com_node(c, CHILD(n, 2));
2194 com_addoparg(c, DUP_TOPX, 3);
2195 com_push(c, 3);
2196 com_addbyte(c, SLICE+3);
2197 com_pop(c, 2);
2198 com_node(c, augn);
2199 com_addbyte(c, opcode);
2200 com_pop(c, 1);
2201 com_addbyte(c, ROT_FOUR);
2202 com_addbyte(c, STORE_SLICE+3);
2203 com_pop(c, 4);
2204 }
2205}
2206
2207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002208com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002209{
2210 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002211 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002212 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002213 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002214 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002215 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002216 }
2217 else {
2218 com_node(c, CHILD(n, 0));
2219 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002220 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002221 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002222 if (NCH(n) == 2) {
2223 com_generator_expression(c, n);
2224 return;
2225 }
2226
Guido van Rossumf10570b1995-07-07 22:53:21 +00002227 m = n;
2228 do {
2229 m = CHILD(m, 0);
2230 } while (NCH(m) == 1);
2231 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002232 /* f(lambda x: x[0] = 3) ends up getting parsed with
2233 * LHS test = lambda x: x[0], and RHS test = 3.
2234 * SF bug 132313 points out that complaining about a keyword
2235 * then is very confusing.
2236 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002237 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002238 TYPE(m) == lambdef ?
2239 "lambda cannot contain assignment" :
2240 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002241 }
2242 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002243 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002244 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002245 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002247 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002248 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002249 else if (*pkeywords == NULL) {
2250 c->c_errors++;
2251 Py_DECREF(v);
2252 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 if (PyDict_GetItem(*pkeywords, v) != NULL)
2254 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002255 "duplicate keyword argument");
2256 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002257 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002258 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002259 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002260 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002261 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002262 }
2263 }
2264 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002265}
2266
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002267static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002268com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002269{
2270 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002271 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002272 }
2273 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002274 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002275 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002276 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002277 int star_flag = 0;
2278 int starstar_flag = 0;
2279 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002280 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002281 na = 0;
2282 nk = 0;
2283 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002284 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002285 if (TYPE(ch) == STAR ||
2286 TYPE(ch) == DOUBLESTAR)
2287 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002288 if (ch->n_lineno != lineno) {
2289 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002290 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002291 }
2292 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002293 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002294 na++;
2295 else
2296 nk++;
2297 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002299 while (i < NCH(n)) {
2300 node *tok = CHILD(n, i);
2301 node *ch = CHILD(n, i+1);
2302 i += 3;
2303 switch (TYPE(tok)) {
2304 case STAR: star_flag = 1; break;
2305 case DOUBLESTAR: starstar_flag = 1; break;
2306 }
2307 com_node(c, ch);
2308 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002309 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_error(c, PyExc_SyntaxError,
2311 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002312 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002313 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002314 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002315 star_flag + (starstar_flag << 1);
2316 else
2317 opcode = CALL_FUNCTION;
2318 com_addoparg(c, opcode, na | (nk << 8));
2319 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002320 }
2321}
2322
2323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002324com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002325{
2326 com_addopname(c, LOAD_ATTR, n);
2327}
2328
2329static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002330com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002331{
2332 int i=0;
2333 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002334 node *ch;
2335
2336 /* first argument */
2337 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002339 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002340 i++;
2341 }
2342 else {
2343 com_node(c, CHILD(n,i));
2344 i++;
2345 REQ(CHILD(n,i),COLON);
2346 i++;
2347 }
2348 /* second argument */
2349 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2350 com_node(c, CHILD(n,i));
2351 i++;
2352 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_push(c, 1);
2356 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002357 /* remaining arguments */
2358 for (; i < NCH(n); i++) {
2359 ns++;
2360 ch=CHILD(n,i);
2361 REQ(ch, sliceop);
2362 if (NCH(ch) == 1) {
2363 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002365 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002366 }
2367 else
2368 com_node(c, CHILD(ch,1));
2369 }
2370 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002371 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002372}
2373
2374static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002375com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002376{
2377 node *ch;
2378 REQ(n, subscript);
2379 ch = CHILD(n,0);
2380 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002381 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002382 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002383 com_push(c, 1);
2384 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002385 else {
2386 /* check for slice */
2387 if ((TYPE(ch) == COLON || NCH(n) > 1))
2388 com_sliceobj(c, n);
2389 else {
2390 REQ(ch, test);
2391 com_node(c, ch);
2392 }
2393 }
2394}
2395
2396static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002397com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002398{
2399 int i, op;
2400 REQ(n, subscriptlist);
2401 /* Check to make backward compatible slice behavior for '[i:j]' */
2402 if (NCH(n) == 1) {
2403 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002404 /* 'Basic' slice, should have exactly one colon. */
2405 if ((TYPE(CHILD(sub, 0)) == COLON
2406 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2407 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2408 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002409 switch (assigning) {
2410 case OP_DELETE:
2411 op = DELETE_SLICE;
2412 break;
2413 case OP_ASSIGN:
2414 op = STORE_SLICE;
2415 break;
2416 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002417 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002418 break;
2419 default:
2420 com_augassign_slice(c, sub, assigning, augn);
2421 return;
2422 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002423 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002424 if (op == STORE_SLICE)
2425 com_pop(c, 2);
2426 else if (op == DELETE_SLICE)
2427 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002428 return;
2429 }
2430 }
2431 /* Else normal subscriptlist. Compile each subscript. */
2432 for (i = 0; i < NCH(n); i += 2)
2433 com_subscript(c, CHILD(n, i));
2434 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002435 if (NCH(n) > 1) {
2436 i = (NCH(n)+1) / 2;
2437 com_addoparg(c, BUILD_TUPLE, i);
2438 com_pop(c, i-1);
2439 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002440 switch (assigning) {
2441 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002442 op = DELETE_SUBSCR;
2443 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002444 break;
2445 default:
2446 case OP_ASSIGN:
2447 op = STORE_SUBSCR;
2448 i = 3;
2449 break;
2450 case OP_APPLY:
2451 op = BINARY_SUBSCR;
2452 i = 1;
2453 break;
2454 }
2455 if (assigning > OP_APPLY) {
2456 com_addoparg(c, DUP_TOPX, 2);
2457 com_push(c, 2);
2458 com_addbyte(c, BINARY_SUBSCR);
2459 com_pop(c, 1);
2460 com_node(c, augn);
2461 com_addbyte(c, assigning);
2462 com_pop(c, 1);
2463 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002464 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002465 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002466 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002467}
2468
2469static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002470com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002471{
2472 REQ(n, trailer);
2473 switch (TYPE(CHILD(n, 0))) {
2474 case LPAR:
2475 com_call_function(c, CHILD(n, 1));
2476 break;
2477 case DOT:
2478 com_select_member(c, CHILD(n, 1));
2479 break;
2480 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002481 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 break;
2483 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002484 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002485 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002486 }
2487}
2488
2489static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002490com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002491{
2492 int i;
2493 REQ(n, power);
2494 com_atom(c, CHILD(n, 0));
2495 for (i = 1; i < NCH(n); i++) {
2496 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2497 com_factor(c, CHILD(n, i+1));
2498 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002499 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002500 break;
2501 }
2502 else
2503 com_apply_trailer(c, CHILD(n, i));
2504 }
2505}
2506
2507static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002508com_invert_constant(struct compiling *c, node *n)
2509{
2510 /* Compute the inverse of int and longs and use them directly,
2511 but be prepared to generate code for all other
2512 possibilities (invalid numbers, floats, complex).
2513 */
2514 PyObject *num, *inv = NULL;
2515 int i;
2516
2517 REQ(n, NUMBER);
2518 num = parsenumber(c, STR(n));
2519 if (num == NULL)
2520 i = 255;
2521 else {
2522 inv = PyNumber_Invert(num);
2523 if (inv == NULL) {
2524 PyErr_Clear();
2525 i = com_addconst(c, num);
2526 } else {
2527 i = com_addconst(c, inv);
2528 Py_DECREF(inv);
2529 }
2530 Py_DECREF(num);
2531 }
2532 com_addoparg(c, LOAD_CONST, i);
2533 com_push(c, 1);
2534 if (num != NULL && inv == NULL)
2535 com_addbyte(c, UNARY_INVERT);
2536}
2537
Tim Peters51e26512001-09-07 08:45:55 +00002538static int
2539is_float_zero(const char *p)
2540{
2541 int found_radix_point = 0;
2542 int ch;
2543 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2544 switch (ch) {
2545 case '0':
2546 /* no reason to believe it's not 0 -- continue */
2547 break;
2548
2549 case 'e': case 'E': case 'j': case 'J':
2550 /* If this was a hex constant, we already would have
2551 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2552 must be an exponent marker, and we haven't yet
2553 seen a non-zero digit, and it doesn't matter what
2554 the exponent is then. For 'j' or 'J' similarly,
2555 except that this is an imaginary 0 then. */
2556 return 1;
2557
2558 case '.':
2559 found_radix_point = 1;
2560 break;
2561
2562 default:
2563 return 0;
2564 }
2565 }
2566 return found_radix_point;
2567}
2568
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002569static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002570com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002571{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002572 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002573 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002574 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002575 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002576 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002577 approriate value as a constant. If the value is negative,
2578 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002579 negative in the 0th position -- unless we're doing unary minus
2580 of a floating zero! In that case the sign is significant, but
2581 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002582 */
2583 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002584 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002585 && TYPE((pfactor = CHILD(n, 1))) == factor
2586 && NCH(pfactor) == 1
2587 && TYPE((ppower = CHILD(pfactor, 0))) == power
2588 && NCH(ppower) == 1
2589 && TYPE((patom = CHILD(ppower, 0))) == atom
2590 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002591 && !(childtype == MINUS &&
2592 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002593 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002594 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002595 return;
2596 }
2597 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002598 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002599 if (s == NULL) {
2600 com_error(c, PyExc_MemoryError, "");
2601 com_addbyte(c, 255);
2602 return;
2603 }
2604 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002605 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002606 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002607 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002608 }
Tim Peters51e26512001-09-07 08:45:55 +00002609 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002610 }
2611 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 com_factor(c, CHILD(n, 1));
2613 com_addbyte(c, UNARY_POSITIVE);
2614 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002615 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002616 com_factor(c, CHILD(n, 1));
2617 com_addbyte(c, UNARY_NEGATIVE);
2618 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002619 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002620 com_factor(c, CHILD(n, 1));
2621 com_addbyte(c, UNARY_INVERT);
2622 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002623 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002624 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 }
2626}
2627
2628static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002629com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002630{
2631 int i;
2632 int op;
2633 REQ(n, term);
2634 com_factor(c, CHILD(n, 0));
2635 for (i = 2; i < NCH(n); i += 2) {
2636 com_factor(c, CHILD(n, i));
2637 switch (TYPE(CHILD(n, i-1))) {
2638 case STAR:
2639 op = BINARY_MULTIPLY;
2640 break;
2641 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002642 if (c->c_flags & CO_FUTURE_DIVISION)
2643 op = BINARY_TRUE_DIVIDE;
2644 else
2645 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002646 break;
2647 case PERCENT:
2648 op = BINARY_MODULO;
2649 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002650 case DOUBLESLASH:
2651 op = BINARY_FLOOR_DIVIDE;
2652 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002653 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002654 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002655 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002656 op = 255;
2657 }
2658 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002659 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002660 }
2661}
2662
2663static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002664com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002665{
2666 int i;
2667 int op;
2668 REQ(n, arith_expr);
2669 com_term(c, CHILD(n, 0));
2670 for (i = 2; i < NCH(n); i += 2) {
2671 com_term(c, CHILD(n, i));
2672 switch (TYPE(CHILD(n, i-1))) {
2673 case PLUS:
2674 op = BINARY_ADD;
2675 break;
2676 case MINUS:
2677 op = BINARY_SUBTRACT;
2678 break;
2679 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002680 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002681 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002682 op = 255;
2683 }
2684 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002685 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002686 }
2687}
2688
2689static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002690com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002691{
2692 int i;
2693 int op;
2694 REQ(n, shift_expr);
2695 com_arith_expr(c, CHILD(n, 0));
2696 for (i = 2; i < NCH(n); i += 2) {
2697 com_arith_expr(c, CHILD(n, i));
2698 switch (TYPE(CHILD(n, i-1))) {
2699 case LEFTSHIFT:
2700 op = BINARY_LSHIFT;
2701 break;
2702 case RIGHTSHIFT:
2703 op = BINARY_RSHIFT;
2704 break;
2705 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002706 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002707 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002708 op = 255;
2709 }
2710 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002711 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002712 }
2713}
2714
2715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002716com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002717{
2718 int i;
2719 int op;
2720 REQ(n, and_expr);
2721 com_shift_expr(c, CHILD(n, 0));
2722 for (i = 2; i < NCH(n); i += 2) {
2723 com_shift_expr(c, CHILD(n, i));
2724 if (TYPE(CHILD(n, i-1)) == AMPER) {
2725 op = BINARY_AND;
2726 }
2727 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002728 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002729 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002730 op = 255;
2731 }
2732 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002733 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002734 }
2735}
2736
2737static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002738com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002739{
2740 int i;
2741 int op;
2742 REQ(n, xor_expr);
2743 com_and_expr(c, CHILD(n, 0));
2744 for (i = 2; i < NCH(n); i += 2) {
2745 com_and_expr(c, CHILD(n, i));
2746 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2747 op = BINARY_XOR;
2748 }
2749 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002750 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002751 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 op = 255;
2753 }
2754 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002755 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002756 }
2757}
2758
2759static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002760com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002761{
2762 int i;
2763 int op;
2764 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002765 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002766 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002767 com_xor_expr(c, CHILD(n, i));
2768 if (TYPE(CHILD(n, i-1)) == VBAR) {
2769 op = BINARY_OR;
2770 }
2771 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002772 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002773 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 op = 255;
2775 }
2776 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002777 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 }
2779}
2780
2781static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002782cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002783{
2784 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002785 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002786 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2787 if (NCH(n) == 1) {
2788 n = CHILD(n, 0);
2789 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002790 case LESS: return PyCmp_LT;
2791 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002792 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002793 case LESSEQUAL: return PyCmp_LE;
2794 case GREATEREQUAL: return PyCmp_GE;
2795 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2796 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2797 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 }
2799 }
2800 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002801 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002803 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002804 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002805 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002806 }
2807 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002808 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809}
2810
2811static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002812com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002813{
2814 int i;
2815 enum cmp_op op;
2816 int anchor;
2817 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2818 com_expr(c, CHILD(n, 0));
2819 if (NCH(n) == 1)
2820 return;
2821
2822 /****************************************************************
2823 The following code is generated for all but the last
2824 comparison in a chain:
2825
2826 label: on stack: opcode: jump to:
2827
2828 a <code to load b>
2829 a, b DUP_TOP
2830 a, b, b ROT_THREE
2831 b, a, b COMPARE_OP
2832 b, 0-or-1 JUMP_IF_FALSE L1
2833 b, 1 POP_TOP
2834 b
2835
2836 We are now ready to repeat this sequence for the next
2837 comparison in the chain.
2838
2839 For the last we generate:
2840
2841 b <code to load c>
2842 b, c COMPARE_OP
2843 0-or-1
2844
2845 If there were any jumps to L1 (i.e., there was more than one
2846 comparison), we generate:
2847
2848 0-or-1 JUMP_FORWARD L2
2849 L1: b, 0 ROT_TWO
2850 0, b POP_TOP
2851 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002852 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002853 ****************************************************************/
2854
2855 anchor = 0;
2856
2857 for (i = 2; i < NCH(n); i += 2) {
2858 com_expr(c, CHILD(n, i));
2859 if (i+2 < NCH(n)) {
2860 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002861 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862 com_addbyte(c, ROT_THREE);
2863 }
2864 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002865 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002866 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002867 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002868 }
2869 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 if (i+2 < NCH(n)) {
2872 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2873 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002874 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875 }
2876 }
2877
2878 if (anchor) {
2879 int anchor2 = 0;
2880 com_addfwref(c, JUMP_FORWARD, &anchor2);
2881 com_backpatch(c, anchor);
2882 com_addbyte(c, ROT_TWO);
2883 com_addbyte(c, POP_TOP);
2884 com_backpatch(c, anchor2);
2885 }
2886}
2887
2888static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002889com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002890{
2891 REQ(n, not_test); /* 'not' not_test | comparison */
2892 if (NCH(n) == 1) {
2893 com_comparison(c, CHILD(n, 0));
2894 }
2895 else {
2896 com_not_test(c, CHILD(n, 1));
2897 com_addbyte(c, UNARY_NOT);
2898 }
2899}
2900
2901static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002902com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002903{
2904 int i;
2905 int anchor;
2906 REQ(n, and_test); /* not_test ('and' not_test)* */
2907 anchor = 0;
2908 i = 0;
2909 for (;;) {
2910 com_not_test(c, CHILD(n, i));
2911 if ((i += 2) >= NCH(n))
2912 break;
2913 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2914 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002915 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002916 }
2917 if (anchor)
2918 com_backpatch(c, anchor);
2919}
2920
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002921static int
2922com_make_closure(struct compiling *c, PyCodeObject *co)
2923{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002924 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002925 if (free == 0)
2926 return 0;
2927 for (i = 0; i < free; ++i) {
2928 /* Bypass com_addop_varname because it will generate
2929 LOAD_DEREF but LOAD_CLOSURE is needed.
2930 */
2931 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2932 int arg, reftype;
2933
2934 /* Special case: If a class contains a method with a
2935 free variable that has the same name as a method,
2936 the name will be considered free *and* local in the
2937 class. It should be handled by the closure, as
2938 well as by the normal name loookup logic.
2939 */
2940 reftype = get_ref_type(c, PyString_AS_STRING(name));
2941 if (reftype == CELL)
2942 arg = com_lookup_arg(c->c_cellvars, name);
2943 else /* (reftype == FREE) */
2944 arg = com_lookup_arg(c->c_freevars, name);
2945 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002946 fprintf(stderr, "lookup %s in %s %d %d\n"
2947 "freevars of %s: %s\n",
2948 PyObject_REPR(name),
2949 c->c_name,
2950 reftype, arg,
2951 PyString_AS_STRING(co->co_name),
2952 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002953 Py_FatalError("com_make_closure()");
2954 }
2955 com_addoparg(c, LOAD_CLOSURE, arg);
2956
2957 }
2958 com_push(c, free);
2959 return 1;
2960}
2961
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002962static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002963com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002964{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002965 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002966 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002967 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002968 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002969 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002970 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2971 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002972 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002973 if (co == NULL) {
2974 c->c_errors++;
2975 return;
2976 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002977 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002978 i = com_addconst(c, (PyObject *)co);
2979 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002980 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002981 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002982 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002983 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002984 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002985 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002986 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002987 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002988 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002989 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002990 else {
2991 int anchor = 0;
2992 int i = 0;
2993 for (;;) {
2994 com_and_test(c, CHILD(n, i));
2995 if ((i += 2) >= NCH(n))
2996 break;
2997 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2998 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002999 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00003000 }
3001 if (anchor)
3002 com_backpatch(c, anchor);
3003 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004}
3005
3006static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003007com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003008{
3009 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003010 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003011 com_node(c, CHILD(n, 0));
3012 }
3013 else {
3014 int i;
3015 int len;
3016 len = (NCH(n) + 1) / 2;
3017 for (i = 0; i < NCH(n); i += 2)
3018 com_node(c, CHILD(n, i));
3019 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021 }
3022}
3023
3024
3025/* Begin of assignment compilation */
3026
Thomas Wouters434d0822000-08-24 20:11:32 +00003027
3028static void
3029com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3030{
3031 com_addbyte(c, DUP_TOP);
3032 com_push(c, 1);
3033 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003034 com_node(c, augn);
3035 com_addbyte(c, opcode);
3036 com_pop(c, 1);
3037 com_addbyte(c, ROT_TWO);
3038 com_addopname(c, STORE_ATTR, n);
3039 com_pop(c, 2);
3040}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041
3042static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003043com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003045 if (none_assignment_check(c, STR(n), assigning))
3046 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003048 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049}
3050
3051static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003052com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003053{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003054 REQ(n, trailer);
3055 switch (TYPE(CHILD(n, 0))) {
3056 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003057 if (assigning == OP_DELETE)
3058 com_error(c, PyExc_SyntaxError,
3059 "can't delete function call");
3060 else
3061 com_error(c, PyExc_SyntaxError,
3062 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003063 break;
3064 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003065 if (assigning > OP_APPLY)
3066 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3067 else
3068 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003069 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003070 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003071 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003072 break;
3073 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003074 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003075 }
3076}
3077
3078static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003079com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080{
3081 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003082 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3083 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003084 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003085 if (assigning) {
3086 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003087 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003088 com_push(c, i-1);
3089 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003090 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003091 com_assign(c, CHILD(n, i), assigning, NULL);
3092}
3093
3094static void
3095com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3096{
3097 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003098 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003099 com_push(c, 1);
3100 com_node(c, augn);
3101 com_addbyte(c, opcode);
3102 com_pop(c, 1);
3103 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104}
3105
3106static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003107com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003108{
3109 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003110 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003111 if (assigning)
3112 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113}
3114
3115static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003116com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003117{
3118 /* Loop to avoid trivial recursion */
3119 for (;;) {
3120 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003121
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 case exprlist:
3123 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003124 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003125 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003127 if (TYPE(CHILD(n, 1)) == gen_for) {
3128 com_error(c, PyExc_SystemError,
3129 "assign to generator expression not possible");
3130 return;
3131 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003132 if (assigning > OP_APPLY) {
3133 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003134 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003135 return;
3136 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003137 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003138 return;
3139 }
3140 n = CHILD(n, 0);
3141 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003142
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 case test:
3144 case and_test:
3145 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003146 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003147 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003148 case xor_expr:
3149 case and_expr:
3150 case shift_expr:
3151 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003152 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003153 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003155 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003156 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003157 return;
3158 }
3159 n = CHILD(n, 0);
3160 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003161
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003162 case power: /* atom trailer* ('**' power)*
3163 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003164 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003165 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003166 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 return;
3168 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003169 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003170 int i;
3171 com_node(c, CHILD(n, 0));
3172 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003173 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003174 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003175 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003176 return;
3177 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 com_apply_trailer(c, CHILD(n, i));
3179 } /* NB i is still alive */
3180 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003181 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003182 return;
3183 }
3184 n = CHILD(n, 0);
3185 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003186
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003187 case atom:
3188 switch (TYPE(CHILD(n, 0))) {
3189 case LPAR:
3190 n = CHILD(n, 1);
3191 if (TYPE(n) == RPAR) {
3192 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003193 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003194 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003195 return;
3196 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003197 if (assigning > OP_APPLY) {
3198 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003199 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003200 return;
3201 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 break;
3203 case LSQB:
3204 n = CHILD(n, 1);
3205 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003206 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003207 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003208 return;
3209 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003210 if (assigning > OP_APPLY) {
3211 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003212 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003213 return;
3214 }
3215 if (NCH(n) > 1
3216 && TYPE(CHILD(n, 1)) == list_for) {
3217 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003218 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003219 return;
3220 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003221 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003222 return;
3223 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003224 if (assigning > OP_APPLY)
3225 com_augassign_name(c, CHILD(n, 0),
3226 assigning, augn);
3227 else
3228 com_assign_name(c, CHILD(n, 0),
3229 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 return;
3231 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003232 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003233 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003234 return;
3235 }
3236 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003237
3238 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003239 com_error(c, PyExc_SyntaxError,
3240 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003241 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003242
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003243 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003244 com_error(c, PyExc_SystemError,
3245 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003246 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003247
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003248 }
3249 }
3250}
Guido van Rossum7c531111997-03-11 18:42:21 +00003251
Thomas Wouters434d0822000-08-24 20:11:32 +00003252static void
3253com_augassign(struct compiling *c, node *n)
3254{
3255 int opcode;
3256
3257 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3258 case '+': opcode = INPLACE_ADD; break;
3259 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003260 case '/':
3261 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3262 opcode = INPLACE_FLOOR_DIVIDE;
3263 else if (c->c_flags & CO_FUTURE_DIVISION)
3264 opcode = INPLACE_TRUE_DIVIDE;
3265 else
3266 opcode = INPLACE_DIVIDE;
3267 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003268 case '%': opcode = INPLACE_MODULO; break;
3269 case '<': opcode = INPLACE_LSHIFT; break;
3270 case '>': opcode = INPLACE_RSHIFT; break;
3271 case '&': opcode = INPLACE_AND; break;
3272 case '^': opcode = INPLACE_XOR; break;
3273 case '|': opcode = INPLACE_OR; break;
3274 case '*':
3275 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3276 opcode = INPLACE_POWER;
3277 else
3278 opcode = INPLACE_MULTIPLY;
3279 break;
3280 default:
3281 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3282 return;
3283 }
3284 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3285}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286
3287static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003288com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003289{
Thomas Wouters434d0822000-08-24 20:11:32 +00003290 REQ(n, expr_stmt);
3291 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003292 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003293 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003294 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003295 if (NCH(n) == 1) {
3296 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003297 if (c->c_interactive)
3298 com_addbyte(c, PRINT_EXPR);
3299 else
3300 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003301 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003302 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003303 else if (TYPE(CHILD(n,1)) == augassign)
3304 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003305 else {
3306 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003307 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003308 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003309 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003311 com_push(c, 1);
3312 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003313 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003314 }
3315 }
3316}
3317
3318static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003319com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003320{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003321 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003322 int i;
3323 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003324 if (Py_OptimizeFlag)
3325 return;
3326 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003327
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003328 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003329 raise AssertionError [, <message>]
3330
3331 where <message> is the second test, if present.
3332 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003333 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003334 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003335 com_addbyte(c, POP_TOP);
3336 com_pop(c, 1);
3337 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003338 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003339 com_push(c, 1);
3340 i = NCH(n)/2; /* Either 2 or 4 */
3341 if (i > 1)
3342 com_node(c, CHILD(n, 3));
3343 com_addoparg(c, RAISE_VARARGS, i);
3344 com_pop(c, i);
3345 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003346 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003347 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003348 com_addbyte(c, POP_TOP);
3349}
3350
3351static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003352com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003353{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003354 int i = 1;
3355 node* stream = NULL;
3356
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003357 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003358
3359 /* are we using the extended print form? */
3360 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3361 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003362 com_node(c, stream);
3363 /* stack: [...] => [... stream] */
3364 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003365 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3366 i = 4;
3367 else
3368 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003369 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003370 for (; i < NCH(n); i += 2) {
3371 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003372 com_addbyte(c, DUP_TOP);
3373 /* stack: [stream] => [stream stream] */
3374 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003375 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003376 /* stack: [stream stream] => [stream stream obj] */
3377 com_addbyte(c, ROT_TWO);
3378 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003379 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003380 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003381 com_pop(c, 2);
3382 }
3383 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003384 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003385 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003386 com_addbyte(c, PRINT_ITEM);
3387 com_pop(c, 1);
3388 }
3389 }
3390 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003391 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003392 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003393 /* must pop the extra stream object off the stack */
3394 com_addbyte(c, POP_TOP);
3395 /* stack: [... stream] => [...] */
3396 com_pop(c, 1);
3397 }
3398 }
3399 else {
3400 if (stream != NULL) {
3401 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003402 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003403 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003404 com_pop(c, 1);
3405 }
3406 else
3407 com_addbyte(c, PRINT_NEWLINE);
3408 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409}
3410
3411static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003412com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003413{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003414 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003415 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003416 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003417 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003418 if (c->c_flags & CO_GENERATOR) {
3419 if (NCH(n) > 1) {
3420 com_error(c, PyExc_SyntaxError,
3421 "'return' with argument inside generator");
3422 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003423 }
3424 if (NCH(n) < 2) {
3425 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003426 com_push(c, 1);
3427 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003428 else
3429 com_node(c, CHILD(n, 1));
3430 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003431 com_pop(c, 1);
3432}
3433
3434static void
3435com_yield_stmt(struct compiling *c, node *n)
3436{
Tim Peters95c80f82001-06-23 02:07:08 +00003437 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003438 REQ(n, yield_stmt); /* 'yield' testlist */
3439 if (!c->c_infunction) {
3440 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3441 }
Tim Peters95c80f82001-06-23 02:07:08 +00003442
3443 for (i = 0; i < c->c_nblocks; ++i) {
3444 if (c->c_block[i] == SETUP_FINALLY) {
3445 com_error(c, PyExc_SyntaxError,
3446 "'yield' not allowed in a 'try' block "
3447 "with a 'finally' clause");
3448 return;
3449 }
3450 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003451 com_node(c, CHILD(n, 1));
3452 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003453 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454}
3455
3456static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003457com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003458{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003459 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003460 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3461 if (NCH(n) > 1) {
3462 com_node(c, CHILD(n, 1));
3463 if (NCH(n) > 3) {
3464 com_node(c, CHILD(n, 3));
3465 if (NCH(n) > 5)
3466 com_node(c, CHILD(n, 5));
3467 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003468 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003469 i = NCH(n)/2;
3470 com_addoparg(c, RAISE_VARARGS, i);
3471 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003472}
3473
3474static void
Thomas Wouters52152252000-08-17 22:55:00 +00003475com_from_import(struct compiling *c, node *n)
3476{
3477 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3478 com_push(c, 1);
3479 if (NCH(n) > 1) {
3480 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3481 com_error(c, PyExc_SyntaxError, "invalid syntax");
3482 return;
3483 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003484 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003485 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003486 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003487 com_pop(c, 1);
3488}
3489
3490static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003491com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003492{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003493 node *nn;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003494 int i;
3495 REQ(n, import_stmt);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003496 n = CHILD(n, 0);
3497 /* import_stmt: import_name | import_from */
3498 if (TYPE(n) == import_from) {
3499 /* 'from' dotted_name 'import' ('*' |
3500 '(' import_as_names ')' | import_as_names) */
Guido van Rossum83fb0732000-11-27 22:22:36 +00003501 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003502 REQ(CHILD(n, 1), dotted_name);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003503 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
3504 if (TYPE(nn) == STAR)
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003505 tup = Py_BuildValue("(s)", "*");
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003506 else {
3507 if (TYPE(CHILD(nn, NCH(nn) - 1)) == COMMA &&
3508 TYPE(CHILD(n, 3)) != LPAR) {
3509 com_error(c, PyExc_SyntaxError,
3510 "trailing comma not allowed "
3511 "without surrounding parentheses");
3512 return;
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003513 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003514 REQ(nn, import_as_names);
3515 tup = PyTuple_New((NCH(nn) + 1) / 2);
3516 for (i = 0; i < NCH(nn); i += 2)
3517 PyTuple_SET_ITEM(tup, i / 2,
3518 PyString_FromString(STR(
3519 CHILD(CHILD(nn, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003520 }
3521 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003522 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003523 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003524 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003525 if (TYPE(nn) == STAR)
Thomas Wouters52152252000-08-17 22:55:00 +00003526 com_addbyte(c, IMPORT_STAR);
3527 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003528 for (i = 0; i < NCH(nn); i += 2)
3529 com_from_import(c, CHILD(nn, i));
Thomas Wouters52152252000-08-17 22:55:00 +00003530 com_addbyte(c, POP_TOP);
3531 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003532 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003533 }
3534 else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00003535 /* 'import' dotted_as_names */
3536 nn = CHILD(n, 1);
3537 REQ(nn, dotted_as_names);
3538 for (i = 0; i < NCH(nn); i += 2) {
3539 node *subn = CHILD(nn, i);
Thomas Wouters52152252000-08-17 22:55:00 +00003540 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003541 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003542 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003543 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003544 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003545 int j;
3546 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003547 com_error(c, PyExc_SyntaxError,
3548 "invalid syntax");
3549 return;
3550 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003551 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3552 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003553 CHILD(CHILD(subn, 0),
3554 j));
3555 com_addop_varname(c, VAR_STORE,
3556 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003557 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003558 com_addop_varname(c, VAR_STORE,
3559 STR(CHILD(CHILD(subn, 0),
3560 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003562 }
3563 }
3564}
3565
3566static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003567com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003568{
3569 REQ(n, exec_stmt);
3570 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3571 com_node(c, CHILD(n, 1));
3572 if (NCH(n) >= 4)
3573 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003574 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003575 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003576 com_push(c, 1);
3577 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003578 if (NCH(n) >= 6)
3579 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003580 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003581 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003582 com_push(c, 1);
3583 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003584 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003585 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003586}
3587
Guido van Rossum7c531111997-03-11 18:42:21 +00003588static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003589is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003590{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003591 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003592 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003593 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003594
3595 /* Label to avoid tail recursion */
3596 next:
3597 switch (TYPE(n)) {
3598
3599 case suite:
3600 if (NCH(n) == 1) {
3601 n = CHILD(n, 0);
3602 goto next;
3603 }
3604 /* Fall through */
3605 case file_input:
3606 for (i = 0; i < NCH(n); i++) {
3607 node *ch = CHILD(n, i);
3608 if (TYPE(ch) == stmt) {
3609 n = ch;
3610 goto next;
3611 }
3612 }
3613 break;
3614
3615 case stmt:
3616 case simple_stmt:
3617 case small_stmt:
3618 n = CHILD(n, 0);
3619 goto next;
3620
3621 case expr_stmt:
3622 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003623 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003624 case test:
3625 case and_test:
3626 case not_test:
3627 case comparison:
3628 case expr:
3629 case xor_expr:
3630 case and_expr:
3631 case shift_expr:
3632 case arith_expr:
3633 case term:
3634 case factor:
3635 case power:
3636 case atom:
3637 if (NCH(n) == 1) {
3638 n = CHILD(n, 0);
3639 goto next;
3640 }
3641 break;
3642
3643 case NAME:
3644 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3645 return 1;
3646 break;
3647
3648 case NUMBER:
3649 v = parsenumber(c, STR(n));
3650 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003651 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003652 break;
3653 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003654 i = PyObject_IsTrue(v);
3655 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003656 return i == 0;
3657
3658 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003659 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003660 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003661 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003662 break;
3663 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003664 i = PyObject_IsTrue(v);
3665 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003666 return i == 0;
3667
3668 }
3669 return 0;
3670}
3671
Tim Peters08a898f2001-06-28 01:52:22 +00003672
3673/* Look under n for a return stmt with an expression.
3674 * This hack is used to find illegal returns under "if 0:" blocks in
3675 * functions already known to be generators (as determined by the symtable
3676 * pass).
3677 * Return the offending return node if found, else NULL.
3678 */
3679static node *
3680look_for_offending_return(node *n)
3681{
3682 int i;
3683
3684 for (i = 0; i < NCH(n); ++i) {
3685 node *kid = CHILD(n, i);
3686
3687 switch (TYPE(kid)) {
3688 case classdef:
3689 case funcdef:
3690 case lambdef:
3691 /* Stuff in nested functions & classes doesn't
3692 affect the code block we started in. */
3693 return NULL;
3694
3695 case return_stmt:
3696 if (NCH(kid) > 1)
3697 return kid;
3698 break;
3699
3700 default: {
3701 node *bad = look_for_offending_return(kid);
3702 if (bad != NULL)
3703 return bad;
3704 }
3705 }
3706 }
3707
3708 return NULL;
3709}
3710
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003712com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003713{
3714 int i;
3715 int anchor = 0;
3716 REQ(n, if_stmt);
3717 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3718 for (i = 0; i+3 < NCH(n); i+=4) {
3719 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003720 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003721 if (is_constant_false(c, ch)) {
3722 /* We're going to skip this block. However, if this
3723 is a generator, we have to check the dead code
3724 anyway to make sure there aren't any return stmts
3725 with expressions, in the same scope. */
3726 if (c->c_flags & CO_GENERATOR) {
3727 node *p = look_for_offending_return(n);
3728 if (p != NULL) {
3729 int savelineno = c->c_lineno;
3730 c->c_lineno = p->n_lineno;
3731 com_error(c, PyExc_SyntaxError,
3732 "'return' with argument "
3733 "inside generator");
3734 c->c_lineno = savelineno;
3735 }
3736 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003737 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003738 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003739 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003740 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003741 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003742 com_addfwref(c, JUMP_IF_FALSE, &a);
3743 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003744 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003745 com_node(c, CHILD(n, i+3));
3746 com_addfwref(c, JUMP_FORWARD, &anchor);
3747 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003748 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003749 com_addbyte(c, POP_TOP);
3750 }
3751 if (i+2 < NCH(n))
3752 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003753 if (anchor)
3754 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003755}
3756
3757static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003758com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003759{
3760 int break_anchor = 0;
3761 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003762 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003763 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3764 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003765 block_push(c, SETUP_LOOP);
3766 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003767 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003768 com_node(c, CHILD(n, 1));
3769 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3770 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003771 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003772 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003773 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003774 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003775 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3776 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003777 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003778 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003779 com_addbyte(c, POP_TOP);
3780 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003781 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 if (NCH(n) > 4)
3783 com_node(c, CHILD(n, 6));
3784 com_backpatch(c, break_anchor);
3785}
3786
3787static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003788com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003789{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 int break_anchor = 0;
3791 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003792 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003793 REQ(n, for_stmt);
3794 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3795 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003796 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003797 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003798 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003799 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003800 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003801 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003802 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003803 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003804 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003805 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003806 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003807 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3808 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003809 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003810 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003811 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003812 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003813 if (NCH(n) > 8)
3814 com_node(c, CHILD(n, 8));
3815 com_backpatch(c, break_anchor);
3816}
3817
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003818/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003819
3820 SETUP_FINALLY L
3821 <code for S>
3822 POP_BLOCK
3823 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003824 L: <code for Sf>
3825 END_FINALLY
3826
3827 The special instructions use the block stack. Each block
3828 stack entry contains the instruction that created it (here
3829 SETUP_FINALLY), the level of the value stack at the time the
3830 block stack entry was created, and a label (here L).
3831
3832 SETUP_FINALLY:
3833 Pushes the current value stack level and the label
3834 onto the block stack.
3835 POP_BLOCK:
3836 Pops en entry from the block stack, and pops the value
3837 stack until its level is the same as indicated on the
3838 block stack. (The label is ignored.)
3839 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003840 Pops a variable number of entries from the *value* stack
3841 and re-raises the exception they specify. The number of
3842 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003843
3844 The block stack is unwound when an exception is raised:
3845 when a SETUP_FINALLY entry is found, the exception is pushed
3846 onto the value stack (and the exception condition is cleared),
3847 and the interpreter jumps to the label gotten from the block
3848 stack.
3849
3850 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003851 (The contents of the value stack is shown in [], with the top
3852 at the right; 'tb' is trace-back info, 'val' the exception's
3853 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003854
3855 Value stack Label Instruction Argument
3856 [] SETUP_EXCEPT L1
3857 [] <code for S>
3858 [] POP_BLOCK
3859 [] JUMP_FORWARD L0
3860
Guido van Rossum3f5da241990-12-20 15:06:42 +00003861 [tb, val, exc] L1: DUP )
3862 [tb, val, exc, exc] <evaluate E1> )
3863 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3864 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3865 [tb, val, exc, 1] POP )
3866 [tb, val, exc] POP
3867 [tb, val] <assign to V1> (or POP if no V1)
3868 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003869 [] <code for S1>
3870 JUMP_FORWARD L0
3871
Guido van Rossum3f5da241990-12-20 15:06:42 +00003872 [tb, val, exc, 0] L2: POP
3873 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003874 .............................etc.......................
3875
Guido van Rossum3f5da241990-12-20 15:06:42 +00003876 [tb, val, exc, 0] Ln+1: POP
3877 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003878
3879 [] L0: <next statement>
3880
3881 Of course, parts are not generated if Vi or Ei is not present.
3882*/
3883
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003885com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003886{
3887 int except_anchor = 0;
3888 int end_anchor = 0;
3889 int else_anchor = 0;
3890 int i;
3891 node *ch;
3892
3893 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3894 block_push(c, SETUP_EXCEPT);
3895 com_node(c, CHILD(n, 2));
3896 com_addbyte(c, POP_BLOCK);
3897 block_pop(c, SETUP_EXCEPT);
3898 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3899 com_backpatch(c, except_anchor);
3900 for (i = 3;
3901 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3902 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003904 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003905 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003906 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003907 break;
3908 }
3909 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003910 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003911 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003912 if (NCH(ch) > 1) {
3913 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003914 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003915 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003916 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003917 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003918 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3919 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003920 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003921 }
3922 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003923 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003924 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003925 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003926 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003927 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003928 com_pop(c, 1);
3929 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003930 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003931 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003932 com_node(c, CHILD(n, i+2));
3933 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3934 if (except_anchor) {
3935 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003936 /* We come in with [tb, val, exc, 0] on the
3937 stack; one pop and it's the same as
3938 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003939 com_addbyte(c, POP_TOP);
3940 }
3941 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003942 /* We actually come in here with [tb, val, exc] but the
3943 END_FINALLY will zap those and jump around.
3944 The c_stacklevel does not reflect them so we need not pop
3945 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003946 com_addbyte(c, END_FINALLY);
3947 com_backpatch(c, else_anchor);
3948 if (i < NCH(n))
3949 com_node(c, CHILD(n, i+2));
3950 com_backpatch(c, end_anchor);
3951}
3952
3953static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003954com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003955{
3956 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003957 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003958
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003959 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3960 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003961 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003962 com_addbyte(c, POP_BLOCK);
3963 block_pop(c, SETUP_FINALLY);
3964 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003965 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003966 /* While the generated code pushes only one item,
3967 the try-finally handling can enter here with
3968 up to three items. OK, here are the details:
3969 3 for an exception, 2 for RETURN, 1 for BREAK. */
3970 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003971 com_backpatch(c, finally_anchor);
3972 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003973 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003974 com_node(c, ch);
3975 com_addbyte(c, END_FINALLY);
3976 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003977 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003978}
3979
3980static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003981com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003982{
3983 REQ(n, try_stmt);
3984 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3985 | 'try' ':' suite 'finally' ':' suite */
3986 if (TYPE(CHILD(n, 3)) != except_clause)
3987 com_try_finally(c, n);
3988 else
3989 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003990}
3991
Guido van Rossum8b993a91997-01-17 21:04:03 +00003992static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003993get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003994{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003995 int i;
3996
Guido van Rossum8b993a91997-01-17 21:04:03 +00003997 /* Label to avoid tail recursion */
3998 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003999 switch (TYPE(n)) {
4000
4001 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004002 if (NCH(n) == 1) {
4003 n = CHILD(n, 0);
4004 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004005 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00004006 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004007 case file_input:
4008 for (i = 0; i < NCH(n); i++) {
4009 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004010 if (TYPE(ch) == stmt) {
4011 n = ch;
4012 goto next;
4013 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00004014 }
4015 break;
4016
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004017 case stmt:
4018 case simple_stmt:
4019 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 n = CHILD(n, 0);
4021 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004022
4023 case expr_stmt:
4024 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004025 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004026 case test:
4027 case and_test:
4028 case not_test:
4029 case comparison:
4030 case expr:
4031 case xor_expr:
4032 case and_expr:
4033 case shift_expr:
4034 case arith_expr:
4035 case term:
4036 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004037 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004038 if (NCH(n) == 1) {
4039 n = CHILD(n, 0);
4040 goto next;
4041 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004042 break;
4043
4044 case atom:
4045 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004046 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004047 break;
4048
4049 }
4050 return NULL;
4051}
4052
Guido van Rossum79f25d91997-04-29 20:08:16 +00004053static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004054get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004055{
Guido van Rossum541563e1999-01-28 15:08:09 +00004056 /* Don't generate doc-strings if run with -OO */
4057 if (Py_OptimizeFlag > 1)
4058 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004059 n = get_rawdocstring(n);
4060 if (n == NULL)
4061 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004062 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004063}
4064
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004065static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004066com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004067{
4068 REQ(n, suite);
4069 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4070 if (NCH(n) == 1) {
4071 com_node(c, CHILD(n, 0));
4072 }
4073 else {
4074 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004075 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004076 node *ch = CHILD(n, i);
4077 if (TYPE(ch) == stmt)
4078 com_node(c, ch);
4079 }
4080 }
4081}
4082
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004083/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004084static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004085com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004086{
4087 int i = c->c_nblocks;
4088 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4089 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4090 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004091 else if (i <= 0) {
4092 /* at the outer level */
4093 com_error(c, PyExc_SyntaxError,
4094 "'continue' not properly in loop");
4095 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004096 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004097 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004098 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004099 if (c->c_block[j] == SETUP_LOOP)
4100 break;
4101 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004102 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004103 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004104 for (; i > j; --i) {
4105 if (c->c_block[i] == SETUP_EXCEPT ||
4106 c->c_block[i] == SETUP_FINALLY) {
4107 com_addoparg(c, CONTINUE_LOOP,
4108 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004109 return;
4110 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004111 if (c->c_block[i] == END_FINALLY) {
4112 com_error(c, PyExc_SyntaxError,
4113 "'continue' not supported inside 'finally' clause");
4114 return;
4115 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004116 }
4117 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004118 com_error(c, PyExc_SyntaxError,
4119 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004120 }
4121 /* XXX Could allow it inside a 'finally' clause
4122 XXX if we could pop the exception still on the stack */
4123}
4124
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004125/* Return the number of default values in the argument list.
4126
4127 If a non-default argument follows a default argument, set an
4128 exception and return -1.
4129*/
4130
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004131static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004132com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004133{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004134 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004135 if (TYPE(n) == lambdef) {
4136 /* lambdef: 'lambda' [varargslist] ':' test */
4137 n = CHILD(n, 1);
4138 }
4139 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004140 REQ(n, funcdef);
4141 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4142 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004143 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4144 n = CHILD(n, 1);
4145 }
4146 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004147 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004148 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004149 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004150 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4151 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004152 ndefs = 0;
4153 for (i = 0; i < nch; i++) {
4154 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004155 if (TYPE(CHILD(n, i)) == STAR ||
4156 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004157 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004158 i++;
4159 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004160 t = RPAR; /* Anything except EQUAL or COMMA */
4161 else
4162 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004163 if (t == EQUAL) {
4164 i++;
4165 ndefs++;
4166 com_node(c, CHILD(n, i));
4167 i++;
4168 if (i >= nch)
4169 break;
4170 t = TYPE(CHILD(n, i));
4171 }
4172 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004173 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004174 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004175 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004176 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004177 return -1;
4178 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004179 }
4180 if (t != COMMA)
4181 break;
4182 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004183 return ndefs;
4184}
4185
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004186static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004187com_decorator_name(struct compiling *c, node *n)
4188{
4189 /* dotted_name: NAME ('.' NAME)* */
4190
4191 int i, nch;
4192 node *varname;
4193
4194 REQ(n, dotted_name);
4195 nch = NCH(n);
4196 assert(nch >= 1 && nch % 2 == 1);
4197
4198 varname = CHILD(n, 0);
4199 REQ(varname, NAME);
4200 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004201 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004202
4203 for (i = 1; i < nch; i += 2) {
4204 node *attrname;
4205
4206 REQ(CHILD(n, i), DOT);
4207
4208 attrname = CHILD(n, i + 1);
4209 REQ(attrname, NAME);
4210 com_addop_name(c, LOAD_ATTR, STR(attrname));
4211 }
4212}
4213
4214static void
4215com_decorator(struct compiling *c, node *n)
4216{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004217 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004218 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004219 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004220 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004221 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004222 com_decorator_name(c, CHILD(n, 1));
4223
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004224 if (nch > 3) {
4225 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004226 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004227 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004228 com_call_function(c, CHILD(n, 3));
4229 }
4230}
4231
4232static int
4233com_decorators(struct compiling *c, node *n)
4234{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004235 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004236
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004237 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004238 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004239 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004240
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004241 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004242 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004243 REQ(ch, decorator);
4244
4245 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004246 }
4247
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004248 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004249}
4250
4251static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004252com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004253{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004254 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004255 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004256
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004257 REQ(n, funcdef);
4258 /* -6 -5 -4 -3 -2 -1
4259 funcdef: [decorators] 'def' NAME parameters ':' suite */
4260
4261 if (NCH(n) == 6)
4262 ndecorators = com_decorators(c, CHILD(n, 0));
4263 else
4264 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004265
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004266 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004267 if (ndefs < 0)
4268 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004269 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004270 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004271 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004272 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004273 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004274 c->c_errors++;
4275 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004276 int closure = com_make_closure(c, (PyCodeObject *)co);
4277 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004278 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004279 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004280 if (closure)
4281 com_addoparg(c, MAKE_CLOSURE, ndefs);
4282 else
4283 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004284 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004285
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004286 while (ndecorators > 0) {
4287 com_addoparg(c, CALL_FUNCTION, 1);
4288 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004289 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004290 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004291
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004292 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004293 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004294 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004295 }
4296}
4297
4298static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004299com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004300{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004301 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004302 REQ(n, testlist);
4303 /* testlist: test (',' test)* [','] */
4304 for (i = 0; i < NCH(n); i += 2)
4305 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004306 i = (NCH(n)+1) / 2;
4307 com_addoparg(c, BUILD_TUPLE, i);
4308 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004309}
4310
4311static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004312com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004313{
Guido van Rossum25831651993-05-19 14:50:45 +00004314 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004315 PyObject *v;
4316 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004317 char *name;
4318
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004319 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004320 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004321 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004322 c->c_errors++;
4323 return;
4324 }
4325 /* Push the class name on the stack */
4326 i = com_addconst(c, v);
4327 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004328 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004329 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004330 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004331 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004332 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004333 com_push(c, 1);
4334 }
Guido van Rossum25831651993-05-19 14:50:45 +00004335 else
4336 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004337 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004338 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004339 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004340 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004341 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004342 c->c_errors++;
4343 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004344 int closure = com_make_closure(c, co);
4345 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004346 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004347 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004348 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004349 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004350 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004351 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004352 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004353 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004354 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004355 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004356 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004357 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004358 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004359 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004360}
4361
4362static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004363com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004364{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004365 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004366 if (c->c_errors)
4367 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368 switch (TYPE(n)) {
4369
4370 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004371
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004372 case funcdef:
4373 com_funcdef(c, n);
4374 break;
4375 case classdef:
4376 com_classdef(c, n);
4377 break;
4378
4379 /* Trivial parse tree nodes */
4380
4381 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004382 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004383 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384 n = CHILD(n, 0);
4385 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004386
4387 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004388 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004389 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004390 {
4391 int i;
4392 for (i = 0; i < NCH(n)-1; i += 2)
4393 com_node(c, CHILD(n, i));
4394 }
4395 break;
4396
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004397 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004398 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004399 n = CHILD(n, 0);
4400 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004401
4402 /* Statement nodes */
4403
4404 case expr_stmt:
4405 com_expr_stmt(c, n);
4406 break;
4407 case print_stmt:
4408 com_print_stmt(c, n);
4409 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004410 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004411 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004412 break;
4413 case pass_stmt:
4414 break;
4415 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004416 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004417 com_error(c, PyExc_SyntaxError,
4418 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004419 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004420 com_addbyte(c, BREAK_LOOP);
4421 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004422 case continue_stmt:
4423 com_continue_stmt(c, n);
4424 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004425 case return_stmt:
4426 com_return_stmt(c, n);
4427 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004428 case yield_stmt:
4429 com_yield_stmt(c, n);
4430 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004431 case raise_stmt:
4432 com_raise_stmt(c, n);
4433 break;
4434 case import_stmt:
4435 com_import_stmt(c, n);
4436 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004437 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004438 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004439 case exec_stmt:
4440 com_exec_stmt(c, n);
4441 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004442 case assert_stmt:
4443 com_assert_stmt(c, n);
4444 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004445 case if_stmt:
4446 com_if_stmt(c, n);
4447 break;
4448 case while_stmt:
4449 com_while_stmt(c, n);
4450 break;
4451 case for_stmt:
4452 com_for_stmt(c, n);
4453 break;
4454 case try_stmt:
4455 com_try_stmt(c, n);
4456 break;
4457 case suite:
4458 com_suite(c, n);
4459 break;
4460
4461 /* Expression nodes */
4462
4463 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004464 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004465 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004466 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004467 break;
4468 case test:
4469 com_test(c, n);
4470 break;
4471 case and_test:
4472 com_and_test(c, n);
4473 break;
4474 case not_test:
4475 com_not_test(c, n);
4476 break;
4477 case comparison:
4478 com_comparison(c, n);
4479 break;
4480 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004481 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482 break;
4483 case expr:
4484 com_expr(c, n);
4485 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004486 case xor_expr:
4487 com_xor_expr(c, n);
4488 break;
4489 case and_expr:
4490 com_and_expr(c, n);
4491 break;
4492 case shift_expr:
4493 com_shift_expr(c, n);
4494 break;
4495 case arith_expr:
4496 com_arith_expr(c, n);
4497 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004498 case term:
4499 com_term(c, n);
4500 break;
4501 case factor:
4502 com_factor(c, n);
4503 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004504 case power:
4505 com_power(c, n);
4506 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004507 case atom:
4508 com_atom(c, n);
4509 break;
4510
4511 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004512 com_error(c, PyExc_SystemError,
4513 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004514 }
4515}
4516
Tim Petersdbd9ba62000-07-09 03:09:57 +00004517static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004518
4519static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004520com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004521{
4522 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4523 if (TYPE(CHILD(n, 0)) == LPAR)
4524 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004525 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004526 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004527 com_pop(c, 1);
4528 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004529}
4530
4531static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004532com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004533{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004534 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004535 if (NCH(n) == 1) {
4536 com_fpdef(c, CHILD(n, 0));
4537 }
4538 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004539 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004540 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004541 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004542 for (i = 0; i < NCH(n); i += 2)
4543 com_fpdef(c, CHILD(n, i));
4544 }
4545}
4546
4547static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004548com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004549{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004550 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004551 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004552 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004553 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004554 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004555 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004556 nch = NCH(n);
4557 /* Enter all arguments in table of locals */
4558 for (i = 0, narg = 0; i < nch; i++) {
4559 node *ch = CHILD(n, i);
4560 node *fp;
4561 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004562 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004563 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4564 fp = CHILD(ch, 0);
4565 if (TYPE(fp) != NAME) {
4566 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4567 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004568 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004569 narg++;
4570 /* all name updates handled by symtable */
4571 if (++i >= nch)
4572 break;
4573 ch = CHILD(n, i);
4574 if (TYPE(ch) == EQUAL)
4575 i += 2;
4576 else
4577 REQ(ch, COMMA);
4578 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004579 if (complex) {
4580 /* Generate code for complex arguments only after
4581 having counted the simple arguments */
4582 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004583 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004584 node *ch = CHILD(n, i);
4585 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004586 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004587 break;
4588 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4589 fp = CHILD(ch, 0);
4590 if (TYPE(fp) != NAME) {
4591 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004592 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004593 com_fpdef(c, ch);
4594 }
4595 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004596 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004597 break;
4598 ch = CHILD(n, i);
4599 if (TYPE(ch) == EQUAL)
4600 i += 2;
4601 else
4602 REQ(ch, COMMA);
4603 }
4604 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004605}
4606
4607static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004608com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004609{
4610 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004611 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004612 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004613 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004614 if (doc != NULL) {
4615 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004616 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004617 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004618 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004619 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004620 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004621 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004622 for (i = 0; i < NCH(n); i++) {
4623 node *ch = CHILD(n, i);
4624 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4625 com_node(c, ch);
4626 }
4627}
4628
4629/* Top-level compile-node interface */
4630
4631static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004632compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004633{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004634 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004635 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004636 REQ(n, funcdef);
4637 /* -6 -5 -4 -3 -2 -1
4638 funcdef: [decorators] 'def' NAME parameters ':' suite */
4639 c->c_name = STR(RCHILD(n, -4));
4640 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004641 if (doc != NULL) {
4642 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004643 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004644 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004645 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004646 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004647 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004648 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004649 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004650 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004651 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004652 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004653 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004654 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004655 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4656 com_push(c, 1);
4657 com_addbyte(c, RETURN_VALUE);
4658 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004659}
4660
4661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004662compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004663{
Guido van Rossum590baa41993-11-30 13:40:46 +00004664 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004665 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004666 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004667
4668 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004669 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004670 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004671 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004672 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004673 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004674 else
4675 ch = CHILD(n, 2);
4676 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004677 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004678 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004679}
4680
4681static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004682compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004683{
4684 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004685 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004686 REQ(n, classdef);
4687 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4688 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004689 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004690 /* Initialize local __module__ from global __name__ */
4691 com_addop_name(c, LOAD_GLOBAL, "__name__");
4692 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004693 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004694 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004695 if (doc != NULL) {
4696 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004697 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004698 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004699 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004700 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004701 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004702 }
4703 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004704 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004705 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004706 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004707 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004708 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004709 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004710 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004711}
4712
4713static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004714compile_generator_expression(struct compiling *c, node *n)
4715{
4716 /* testlist_gexp: test gen_for */
4717 /* argument: test gen_for */
4718 REQ(CHILD(n, 0), test);
4719 REQ(CHILD(n, 1), gen_for);
4720
4721 c->c_name = "<generator expression>";
4722 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4723
4724 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4725 com_push(c, 1);
4726 com_addbyte(c, RETURN_VALUE);
4727 com_pop(c, 1);
4728}
4729
4730static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004731compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004732{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004733 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004734
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004735 switch (TYPE(n)) {
4736
Guido van Rossum4c417781991-01-21 16:09:22 +00004737 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004738 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004739 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004740 n = CHILD(n, 0);
4741 if (TYPE(n) != NEWLINE)
4742 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004743 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004744 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4745 com_push(c, 1);
4746 com_addbyte(c, RETURN_VALUE);
4747 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004748 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004749 break;
4750
Guido van Rossum4c417781991-01-21 16:09:22 +00004751 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004752 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004753 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004754 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4755 com_push(c, 1);
4756 com_addbyte(c, RETURN_VALUE);
4757 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004758 break;
4759
Guido van Rossum590baa41993-11-30 13:40:46 +00004760 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004761 com_node(c, CHILD(n, 0));
4762 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004763 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004764 break;
4765
Guido van Rossum590baa41993-11-30 13:40:46 +00004766 case lambdef: /* anonymous function definition */
4767 compile_lambdef(c, n);
4768 break;
4769
Guido van Rossum4c417781991-01-21 16:09:22 +00004770 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004771 compile_funcdef(c, n);
4772 break;
4773
Guido van Rossum4c417781991-01-21 16:09:22 +00004774 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004775 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004776 break;
4777
Raymond Hettinger354433a2004-05-19 08:20:33 +00004778 case testlist_gexp: /* A generator expression */
4779 case argument: /* A generator expression */
4780 compile_generator_expression(c, n);
4781 break;
4782
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004783 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004784 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004785 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004786 }
4787}
4788
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004789static PyObject *
4790dict_keys_inorder(PyObject *dict, int offset)
4791{
4792 PyObject *tuple, *k, *v;
4793 int i, pos = 0, size = PyDict_Size(dict);
4794
4795 tuple = PyTuple_New(size);
4796 if (tuple == NULL)
4797 return NULL;
4798 while (PyDict_Next(dict, &pos, &k, &v)) {
4799 i = PyInt_AS_LONG(v);
4800 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004801 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004802 PyTuple_SET_ITEM(tuple, i - offset, k);
4803 }
4804 return tuple;
4805}
4806
Guido van Rossum79f25d91997-04-29 20:08:16 +00004807PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004808PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004809{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004810 return PyNode_CompileFlags(n, filename, NULL);
4811}
4812
4813PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004814PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004815{
4816 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004817}
4818
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004819struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004820PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004821{
4822 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004823 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004824
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004825 ff = PyNode_Future(n, filename);
4826 if (ff == NULL)
4827 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004828 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004829 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004830 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004831 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004832 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004833 return st;
4834}
4835
Guido van Rossum79f25d91997-04-29 20:08:16 +00004836static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004837icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004838{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004839 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004840}
4841
Guido van Rossum79f25d91997-04-29 20:08:16 +00004842static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004843jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004844 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004845{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004846 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004847 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004848 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004849 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004850 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4851 sc.c_encoding = "utf-8";
4852 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004853 sc.c_encoding = STR(n);
4854 n = CHILD(n, 0);
4855 } else {
4856 sc.c_encoding = NULL;
4857 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004858 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004859 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004860 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 /* c_symtable still points to parent's symbols */
4862 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004863 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004864 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004865 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004866 if (base->c_encoding != NULL) {
4867 assert(sc.c_encoding == NULL);
4868 sc.c_encoding = base->c_encoding;
4869 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004871 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004872 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004873 if (sc.c_future == NULL) {
4874 com_free(&sc);
4875 return NULL;
4876 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004877 if (flags) {
4878 int merged = sc.c_future->ff_features |
4879 flags->cf_flags;
4880 sc.c_future->ff_features = merged;
4881 flags->cf_flags = merged;
4882 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004883 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4884 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004885 com_free(&sc);
4886 return NULL;
4887 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004888 /* reset symbol table for second pass */
4889 sc.c_symtable->st_nscopes = 1;
4890 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004891 }
4892 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004893 if (symtable_load_symbols(&sc) < 0) {
4894 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004895 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004896 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004897 compile_node(&sc, n);
4898 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004899 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004900 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004901 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004902 consts = PyList_AsTuple(sc.c_consts);
4903 names = PyList_AsTuple(sc.c_names);
4904 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004905 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4906 freevars = dict_keys_inorder(sc.c_freevars,
4907 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004908 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004909 name = PyString_InternFromString(sc.c_name);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00004910 code = optimize_code(sc.c_code, consts, names, sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004911 if (!PyErr_Occurred())
4912 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004913 sc.c_nlocals,
4914 sc.c_maxstacklevel,
4915 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004916 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004917 consts,
4918 names,
4919 varnames,
4920 freevars,
4921 cellvars,
4922 filename,
4923 name,
4924 sc.c_firstlineno,
4925 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004926 Py_XDECREF(consts);
4927 Py_XDECREF(names);
4928 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004929 Py_XDECREF(freevars);
4930 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004931 Py_XDECREF(filename);
4932 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004933 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004934 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004935 else if (!PyErr_Occurred()) {
4936 /* This could happen if someone called PyErr_Clear() after an
4937 error was reported above. That's not supposed to happen,
4938 but I just plugged one case and I'm not sure there can't be
4939 others. In that case, raise SystemError so that at least
4940 it gets reported instead dumping core. */
4941 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4942 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004943 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004944 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004945 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004946 sc.c_symtable = NULL;
4947 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004948 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004949 return co;
4950}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004951
4952int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004953PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004954{
4955 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004956 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004957 int line = co->co_firstlineno;
4958 int addr = 0;
4959 while (--size >= 0) {
4960 addr += *p++;
4961 if (addr > addrq)
4962 break;
4963 line += *p++;
4964 }
4965 return line;
4966}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004968/* The test for LOCAL must come before the test for FREE in order to
4969 handle classes where name is both local and free. The local var is
4970 a method and the free var is a free var referenced within a method.
4971*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004972
4973static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004974get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004975{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004976 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004977 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004978
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004979 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4980 return CELL;
4981 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4982 return LOCAL;
4983 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4984 return FREE;
4985 v = PyDict_GetItemString(c->c_globals, name);
4986 if (v) {
4987 if (v == Py_None)
4988 return GLOBAL_EXPLICIT;
4989 else {
4990 return GLOBAL_IMPLICIT;
4991 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004992 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004993 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004994 "unknown scope for %.100s in %.100s(%s) "
4995 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4996 name, c->c_name,
4997 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4998 c->c_filename,
4999 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
5000 PyObject_REPR(c->c_locals),
5001 PyObject_REPR(c->c_globals)
5002 );
5003
5004 Py_FatalError(buf);
5005 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005006}
5007
Guido van Rossum207fda62001-03-02 03:30:41 +00005008/* Helper functions to issue warnings */
5009
5010static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00005011issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00005012{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005013 if (PyErr_Occurred()) {
5014 /* This can happen because symtable_node continues
5015 processing even after raising a SyntaxError.
5016 Calling PyErr_WarnExplicit now would clobber the
5017 pending exception; instead we fail and let that
5018 exception propagate.
5019 */
5020 return -1;
5021 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005022 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5023 lineno, NULL, NULL) < 0) {
5024 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5025 PyErr_SetString(PyExc_SyntaxError, msg);
5026 PyErr_SyntaxLocation(filename, lineno);
5027 }
5028 return -1;
5029 }
5030 return 0;
5031}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005032
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005033static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005034symtable_warn(struct symtable *st, char *msg)
5035{
Guido van Rossum207fda62001-03-02 03:30:41 +00005036 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005037 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005038 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005039 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005040 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005041}
5042
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005043/* Helper function for setting lineno and filename */
5044
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005045static struct symtable *
5046symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005047{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005048 struct symtable *st;
5049
5050 st = symtable_init();
5051 if (st == NULL)
5052 return NULL;
5053 st->st_future = ff;
5054 st->st_filename = filename;
5055 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5056 if (st->st_errors > 0)
5057 goto fail;
5058 symtable_node(st, n);
5059 if (st->st_errors > 0)
5060 goto fail;
5061 return st;
5062 fail:
5063 if (!PyErr_Occurred()) {
5064 /* This could happen because after a syntax error is
5065 detected, the symbol-table-building continues for
5066 a while, and PyErr_Clear() might erroneously be
5067 called during that process. One such case has been
5068 fixed, but there might be more (now or later).
5069 */
5070 PyErr_SetString(PyExc_SystemError, "lost exception");
5071 }
5072 st->st_future = NULL;
5073 st->st_filename = NULL;
5074 PySymtable_Free(st);
5075 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005076}
5077
5078static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005079symtable_init_compiling_symbols(struct compiling *c)
5080{
5081 PyObject *varnames;
5082
5083 varnames = c->c_symtable->st_cur->ste_varnames;
5084 if (varnames == NULL) {
5085 varnames = PyList_New(0);
5086 if (varnames == NULL)
5087 return -1;
5088 c->c_symtable->st_cur->ste_varnames = varnames;
5089 Py_INCREF(varnames);
5090 } else
5091 Py_INCREF(varnames);
5092 c->c_varnames = varnames;
5093
5094 c->c_globals = PyDict_New();
5095 if (c->c_globals == NULL)
5096 return -1;
5097 c->c_freevars = PyDict_New();
5098 if (c->c_freevars == NULL)
5099 return -1;
5100 c->c_cellvars = PyDict_New();
5101 if (c->c_cellvars == NULL)
5102 return -1;
5103 return 0;
5104}
5105
5106struct symbol_info {
5107 int si_nlocals;
5108 int si_ncells;
5109 int si_nfrees;
5110 int si_nimplicit;
5111};
5112
5113static void
5114symtable_init_info(struct symbol_info *si)
5115{
5116 si->si_nlocals = 0;
5117 si->si_ncells = 0;
5118 si->si_nfrees = 0;
5119 si->si_nimplicit = 0;
5120}
5121
5122static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005123symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005124 struct symbol_info *si)
5125{
5126 PyObject *dict, *v;
5127
5128 /* Seperate logic for DEF_FREE. If it occurs in a function,
5129 it indicates a local that we must allocate storage for (a
5130 cell var). If it occurs in a class, then the class has a
5131 method and a free variable with the same name.
5132 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005133 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005134 /* If it isn't declared locally, it can't be a cell. */
5135 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5136 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005137 v = PyInt_FromLong(si->si_ncells++);
5138 dict = c->c_cellvars;
5139 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005140 /* If it is free anyway, then there is no need to do
5141 anything here.
5142 */
5143 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005144 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005145 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005146 v = PyInt_FromLong(si->si_nfrees++);
5147 dict = c->c_freevars;
5148 }
5149 if (v == NULL)
5150 return -1;
5151 if (PyDict_SetItem(dict, name, v) < 0) {
5152 Py_DECREF(v);
5153 return -1;
5154 }
5155 Py_DECREF(v);
5156 return 0;
5157}
5158
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005159/* If a variable is a cell and an argument, make sure that appears in
5160 co_cellvars before any variable to its right in varnames.
5161*/
5162
5163
5164static int
5165symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5166 PyObject *varnames, int flags)
5167{
Tim Petersb39903b2003-03-24 17:22:24 +00005168 PyObject *v = NULL;
5169 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005170 int i, pos;
5171
5172 if (flags & CO_VARARGS)
5173 argcount++;
5174 if (flags & CO_VARKEYWORDS)
5175 argcount++;
5176 for (i = argcount; --i >= 0; ) {
5177 v = PyList_GET_ITEM(varnames, i);
5178 if (PyDict_GetItem(*cellvars, v)) {
5179 if (list == NULL) {
5180 list = PyList_New(1);
5181 if (list == NULL)
5182 return -1;
5183 PyList_SET_ITEM(list, 0, v);
5184 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005185 } else {
5186 if (PyList_Insert(list, 0, v) < 0) {
5187 Py_DECREF(list);
5188 return -1;
5189 }
5190 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005191 }
5192 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005193 if (list == NULL)
5194 return 0;
5195
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005196 /* There are cellvars that are also arguments. Create a dict
5197 to replace cellvars and put the args at the front.
5198 */
5199 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005200 if (d == NULL)
5201 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005202 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5203 v = PyInt_FromLong(i);
5204 if (v == NULL)
5205 goto fail;
5206 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5207 goto fail;
5208 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5209 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005210 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005211 }
5212 pos = 0;
5213 i = PyList_GET_SIZE(list);
5214 Py_DECREF(list);
5215 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5216 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005217 if (w == NULL)
5218 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005219 if (PyDict_SetItem(d, v, w) < 0) {
5220 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005221 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005222 goto fail;
5223 }
5224 Py_DECREF(w);
5225 }
5226 Py_DECREF(*cellvars);
5227 *cellvars = d;
5228 return 1;
5229 fail:
5230 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005231 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005232 return -1;
5233}
5234
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005235static int
5236symtable_freevar_offsets(PyObject *freevars, int offset)
5237{
5238 PyObject *name, *v;
5239 int pos;
5240
5241 /* The cell vars are the first elements of the closure,
5242 followed by the free vars. Update the offsets in
5243 c_freevars to account for number of cellvars. */
5244 pos = 0;
5245 while (PyDict_Next(freevars, &pos, &name, &v)) {
5246 int i = PyInt_AS_LONG(v) + offset;
5247 PyObject *o = PyInt_FromLong(i);
5248 if (o == NULL)
5249 return -1;
5250 if (PyDict_SetItem(freevars, name, o) < 0) {
5251 Py_DECREF(o);
5252 return -1;
5253 }
5254 Py_DECREF(o);
5255 }
5256 return 0;
5257}
5258
5259static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005260symtable_check_unoptimized(struct compiling *c,
5261 PySymtableEntryObject *ste,
5262 struct symbol_info *si)
5263{
5264 char buf[300];
5265
5266 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5267 || (ste->ste_nested && si->si_nimplicit)))
5268 return 0;
5269
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005270#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5271
5272#define ILLEGAL_IS "is a nested function"
5273
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005274#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005275"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005276
5277#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005278"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005279
5280#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005281"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005282"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005283
5284 /* XXX perhaps the linenos for these opt-breaking statements
5285 should be stored so the exception can point to them. */
5286
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005287 if (ste->ste_child_free) {
5288 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005289 PyOS_snprintf(buf, sizeof(buf),
5290 ILLEGAL_IMPORT_STAR,
5291 PyString_AS_STRING(ste->ste_name),
5292 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005293 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005294 PyOS_snprintf(buf, sizeof(buf),
5295 ILLEGAL_BARE_EXEC,
5296 PyString_AS_STRING(ste->ste_name),
5297 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005298 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005299 PyOS_snprintf(buf, sizeof(buf),
5300 ILLEGAL_EXEC_AND_IMPORT_STAR,
5301 PyString_AS_STRING(ste->ste_name),
5302 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005303 }
5304 } else {
5305 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005306 PyOS_snprintf(buf, sizeof(buf),
5307 ILLEGAL_IMPORT_STAR,
5308 PyString_AS_STRING(ste->ste_name),
5309 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005310 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005311 PyOS_snprintf(buf, sizeof(buf),
5312 ILLEGAL_BARE_EXEC,
5313 PyString_AS_STRING(ste->ste_name),
5314 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005315 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005316 PyOS_snprintf(buf, sizeof(buf),
5317 ILLEGAL_EXEC_AND_IMPORT_STAR,
5318 PyString_AS_STRING(ste->ste_name),
5319 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005320 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005321 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005322
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005323 PyErr_SetString(PyExc_SyntaxError, buf);
5324 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5325 ste->ste_opt_lineno);
5326 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005327}
5328
5329static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005330symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5331 struct symbol_info *si)
5332{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005333 if (c->c_future)
5334 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005335 if (ste->ste_generator)
5336 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005337 if (ste->ste_type != TYPE_MODULE)
5338 c->c_flags |= CO_NEWLOCALS;
5339 if (ste->ste_type == TYPE_FUNCTION) {
5340 c->c_nlocals = si->si_nlocals;
5341 if (ste->ste_optimized == 0)
5342 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005343 else if (ste->ste_optimized != OPT_EXEC)
5344 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005345 }
5346 return 0;
5347}
5348
5349static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005350symtable_error(struct symtable *st, int lineno)
5351{
5352 if (lineno == 0)
5353 lineno = st->st_cur->ste_lineno;
5354 PyErr_SyntaxLocation(st->st_filename, lineno);
5355 st->st_errors++;
5356 return -1;
5357}
5358
5359static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005360symtable_load_symbols(struct compiling *c)
5361{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005362 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005363 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005364 PyObject *name, *varnames, *v;
5365 int i, flags, pos;
5366 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005368 v = NULL;
5369
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005370 if (symtable_init_compiling_symbols(c) < 0)
5371 goto fail;
5372 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005373 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005374 si.si_nlocals = PyList_GET_SIZE(varnames);
5375 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005376
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005377 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005378 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005379 if (v == NULL)
5380 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005381 if (PyDict_SetItem(c->c_locals,
5382 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005383 goto fail;
5384 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005385 }
5386
5387 /* XXX The cases below define the rules for whether a name is
5388 local or global. The logic could probably be clearer. */
5389 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005390 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5391 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005392
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005393 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005394 /* undo the original DEF_FREE */
5395 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005396
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005397 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005398 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005399 2. Free variables in methods that are also class
5400 variables or declared global.
5401 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005402 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005403 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005404
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005405 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005406 c->c_argcount--;
5407 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005408 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005409 c->c_argcount--;
5410 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005411 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005412 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005413 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005414 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005415 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005416 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005417 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005418 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5421 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005422 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005423 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005424 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005425 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005426 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005427 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005428 if (v == NULL)
5429 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005430 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005431 goto fail;
5432 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005433 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005434 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005435 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005436 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005437 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005438 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005439 if (v == NULL)
5440 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005441 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005442 goto fail;
5443 Py_DECREF(v);
5444 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005445 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005446 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005447 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005448 goto fail;
5449 if (st->st_nscopes != 1) {
5450 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005451 if (v == NULL)
5452 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005453 if (PyDict_SetItem(st->st_global,
5454 name, v))
5455 goto fail;
5456 Py_DECREF(v);
5457 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005458 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005459 }
5460 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005461 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5462
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005463 if (si.si_ncells > 1) { /* one cell is always in order */
5464 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5465 c->c_varnames, c->c_flags) < 0)
5466 return -1;
5467 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005468 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5469 return -1;
5470 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005471 fail:
5472 /* is this always the right thing to do? */
5473 Py_XDECREF(v);
5474 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475}
5476
5477static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005478symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005479{
5480 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005482 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005483 if (st == NULL)
5484 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005485 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005486
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005487 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005488 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005489 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490 goto fail;
5491 if ((st->st_symbols = PyDict_New()) == NULL)
5492 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005493 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005494 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005495 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005496 st->st_private = NULL;
5497 return st;
5498 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005499 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005500 return NULL;
5501}
5502
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005503void
5504PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005505{
5506 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005507 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005508 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005509 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005510}
5511
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005512/* When the compiler exits a scope, it must should update the scope's
5513 free variable information with the list of free variables in its
5514 children.
5515
5516 Variables that are free in children and defined in the current
5517 scope are cellvars.
5518
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005519 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005520 false), free variables in children that are not defined here are
5521 implicit globals.
5522
5523*/
5524
5525static int
5526symtable_update_free_vars(struct symtable *st)
5527{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005528 int i, j, def;
5529 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005530 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005531
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005532 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005533 def = DEF_FREE_CLASS;
5534 else
5535 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005536 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005537 int pos = 0;
5538
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005539 if (list && PyList_SetSlice(list, 0,
5540 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005541 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005542 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005543 PyList_GET_ITEM(ste->ste_children, i);
5544 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005545 int flags = PyInt_AS_LONG(o);
5546 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005547 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005548 if (list == NULL) {
5549 list = PyList_New(0);
5550 if (list == NULL)
5551 return -1;
5552 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005553 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005554 if (PyList_Append(list, name) < 0) {
5555 Py_DECREF(list);
5556 return -1;
5557 }
5558 }
5559 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005560 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005561 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005562 v = PyDict_GetItem(ste->ste_symbols, name);
5563 /* If a name N is declared global in scope A and
5564 referenced in scope B contained (perhaps
5565 indirectly) in A and there are no scopes
5566 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005567 is global in B. Unless A is a class scope,
5568 because class scopes are not considered for
5569 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005570 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005571 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005572 int flags = PyInt_AS_LONG(v);
5573 if (flags & DEF_GLOBAL) {
5574 symtable_undo_free(st, child->ste_id,
5575 name);
5576 continue;
5577 }
5578 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005579 if (ste->ste_nested) {
5580 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005581 name, def) < 0) {
5582 Py_DECREF(list);
5583 return -1;
5584 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005585 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005586 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005587 name) < 0) {
5588 Py_DECREF(list);
5589 return -1;
5590 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005591 }
5592 }
5593 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005594
5595 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596 return 0;
5597}
5598
5599/* If the current scope is a non-nested class or if name is not
5600 defined in the current, non-nested scope, then it is an implicit
5601 global in all nested scopes.
5602*/
5603
5604static int
5605symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5606{
5607 PyObject *o;
5608 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005609 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005610
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005611 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005612 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005613 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005614 if (o == NULL)
5615 return symtable_undo_free(st, child, name);
5616 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005617
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005618 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005619 return symtable_undo_free(st, child, name);
5620 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005621 return symtable_add_def_o(st, ste->ste_symbols,
5622 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623}
5624
5625static int
5626symtable_undo_free(struct symtable *st, PyObject *id,
5627 PyObject *name)
5628{
5629 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005630 PyObject *info;
5631 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005632
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005633 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5634 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005636
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005637 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 if (info == NULL)
5639 return 0;
5640 v = PyInt_AS_LONG(info);
5641 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005642 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005643 DEF_FREE_GLOBAL) < 0)
5644 return -1;
5645 } else
5646 /* If the name is defined here or declared global,
5647 then the recursion stops. */
5648 return 0;
5649
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005650 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5651 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005652 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005653 PyList_GET_ITEM(ste->ste_children, i);
5654 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005655 if (x < 0)
5656 return x;
5657 }
5658 return 0;
5659}
5660
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005661/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5662 This reference is released when the scope is exited, via the DECREF
5663 in symtable_exit_scope().
5664*/
5665
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005666static int
5667symtable_exit_scope(struct symtable *st)
5668{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005669 int end;
5670
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005671 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005673 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005674 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005675 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5676 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005677 if (PySequence_DelItem(st->st_stack, end) < 0)
5678 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005679 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005680}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005681
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005682static void
5683symtable_enter_scope(struct symtable *st, char *name, int type,
5684 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005685{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005686 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005687
5688 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 prev = st->st_cur;
5690 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005691 st->st_errors++;
5692 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005693 }
5694 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005695 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005696 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005697 if (st->st_cur == NULL) {
5698 st->st_errors++;
5699 return;
5700 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005701 if (strcmp(name, TOP) == 0)
5702 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005703 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005704 if (PyList_Append(prev->ste_children,
5705 (PyObject *)st->st_cur) < 0)
5706 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005707 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005708}
5709
5710static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005711symtable_lookup(struct symtable *st, char *name)
5712{
5713 char buffer[MANGLE_LEN];
5714 PyObject *v;
5715 int flags;
5716
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005717 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005718 name = buffer;
5719 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5720 if (v == NULL) {
5721 if (PyErr_Occurred())
5722 return -1;
5723 else
5724 return 0;
5725 }
5726
5727 flags = PyInt_AS_LONG(v);
5728 return flags;
5729}
5730
5731static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005732symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005735 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005736 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737
Guido van Rossumb7164622002-08-16 02:48:11 +00005738 /* Warn about None, except inside a tuple (where the assignment
5739 code already issues a warning). */
5740 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5741 *name == 'N' && strcmp(name, "None") == 0)
5742 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005743 PyErr_SetString(PyExc_SyntaxError,
5744 "Invalid syntax. Assignment to None.");
5745 symtable_error(st, 0);
5746 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005747 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005748 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005749 name = buffer;
5750 if ((s = PyString_InternFromString(name)) == NULL)
5751 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005752 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5753 Py_DECREF(s);
5754 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005755}
5756
5757/* Must only be called with mangled names */
5758
5759static int
5760symtable_add_def_o(struct symtable *st, PyObject *dict,
5761 PyObject *name, int flag)
5762{
5763 PyObject *o;
5764 int val;
5765
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005766 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005767 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005768 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005769 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005770 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005771 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005772 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005774 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005775 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005776 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005777 if (o == NULL)
5778 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005779 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005780 Py_DECREF(o);
5781 return -1;
5782 }
5783 Py_DECREF(o);
5784
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005785 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005786 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005787 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005788 } else if (flag & DEF_GLOBAL) {
5789 /* XXX need to update DEF_GLOBAL for other flags too;
5790 perhaps only DEF_FREE_GLOBAL */
5791 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005792 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005793 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005794 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005795 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005796 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005797 if (o == NULL)
5798 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005799 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005800 Py_DECREF(o);
5801 return -1;
5802 }
5803 Py_DECREF(o);
5804 }
5805 return 0;
5806}
5807
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005808#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005809
Tim Peters08a898f2001-06-28 01:52:22 +00005810/* Look for a yield stmt under n. Return 1 if found, else 0.
5811 This hack is used to look inside "if 0:" blocks (which are normally
5812 ignored) in case those are the only places a yield occurs (so that this
5813 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005814static int
5815look_for_yield(node *n)
5816{
5817 int i;
5818
5819 for (i = 0; i < NCH(n); ++i) {
5820 node *kid = CHILD(n, i);
5821
5822 switch (TYPE(kid)) {
5823
5824 case classdef:
5825 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005826 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005827 /* Stuff in nested functions and classes can't make
5828 the parent a generator. */
5829 return 0;
5830
5831 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005832 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005833
5834 default:
5835 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005836 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005837 }
5838 }
5839 return 0;
5840}
5841
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842static void
5843symtable_node(struct symtable *st, node *n)
5844{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005845 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005846
5847 loop:
5848 switch (TYPE(n)) {
5849 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005850 char *func_name;
5851 if (NCH(n) == 6)
5852 symtable_node(st, CHILD(n, 0));
5853 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005854 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005855 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005856 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005857 symtable_funcdef(st, n);
5858 symtable_exit_scope(st);
5859 break;
5860 }
5861 case lambdef:
5862 if (NCH(n) == 4)
5863 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005864 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005865 symtable_funcdef(st, n);
5866 symtable_exit_scope(st);
5867 break;
5868 case classdef: {
5869 char *tmp, *class_name = STR(CHILD(n, 1));
5870 symtable_add_def(st, class_name, DEF_LOCAL);
5871 if (TYPE(CHILD(n, 2)) == LPAR) {
5872 node *bases = CHILD(n, 3);
5873 int i;
5874 for (i = 0; i < NCH(bases); i += 2) {
5875 symtable_node(st, CHILD(bases, i));
5876 }
5877 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005878 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005879 tmp = st->st_private;
5880 st->st_private = class_name;
5881 symtable_node(st, CHILD(n, NCH(n) - 1));
5882 st->st_private = tmp;
5883 symtable_exit_scope(st);
5884 break;
5885 }
5886 case if_stmt:
5887 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005888 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5889 if (st->st_cur->ste_generator == 0)
5890 st->st_cur->ste_generator =
5891 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005892 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005893 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005894 symtable_node(st, CHILD(n, i + 1));
5895 symtable_node(st, CHILD(n, i + 3));
5896 }
5897 if (i + 2 < NCH(n))
5898 symtable_node(st, CHILD(n, i + 2));
5899 break;
5900 case global_stmt:
5901 symtable_global(st, n);
5902 break;
5903 case import_stmt:
5904 symtable_import(st, n);
5905 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005906 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005907 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005908 symtable_node(st, CHILD(n, 1));
5909 if (NCH(n) > 2)
5910 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005911 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005912 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005913 st->st_cur->ste_opt_lineno = n->n_lineno;
5914 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005915 if (NCH(n) > 4)
5916 symtable_node(st, CHILD(n, 5));
5917 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005918
5919 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005920 case assert_stmt:
5921 if (Py_OptimizeFlag)
5922 return;
5923 if (NCH(n) == 2) {
5924 n = CHILD(n, 1);
5925 goto loop;
5926 } else {
5927 symtable_node(st, CHILD(n, 1));
5928 n = CHILD(n, 3);
5929 goto loop;
5930 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931 case except_clause:
5932 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005933 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005934 if (NCH(n) > 1) {
5935 n = CHILD(n, 1);
5936 goto loop;
5937 }
5938 break;
5939 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005940 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005941 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005942 case yield_stmt:
5943 st->st_cur->ste_generator = 1;
5944 n = CHILD(n, 1);
5945 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005946 case expr_stmt:
5947 if (NCH(n) == 1)
5948 n = CHILD(n, 0);
5949 else {
5950 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005951 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005952 symtable_node(st, CHILD(n, 2));
5953 break;
5954 } else {
5955 int i;
5956 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005957 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005958 n = CHILD(n, NCH(n) - 1);
5959 }
5960 }
5961 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005962 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005963 /* only occurs when there are multiple for loops
5964 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005965 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005966 if (TYPE(n) == list_for)
5967 symtable_list_for(st, n);
5968 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005969 REQ(n, list_if);
5970 symtable_node(st, CHILD(n, 1));
5971 if (NCH(n) == 3) {
5972 n = CHILD(n, 2);
5973 goto loop;
5974 }
5975 }
5976 break;
5977 case for_stmt:
5978 symtable_assign(st, CHILD(n, 1), 0);
5979 for (i = 3; i < NCH(n); ++i)
5980 if (TYPE(CHILD(n, i)) >= single_input)
5981 symtable_node(st, CHILD(n, i));
5982 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005983 case arglist:
5984 if (NCH(n) > 1)
5985 for (i = 0; i < NCH(n); ++i) {
5986 node *ch = CHILD(n, i);
5987 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5988 TYPE(CHILD(ch, 1)) == gen_for) {
5989 PyErr_SetString(PyExc_SyntaxError,
5990 "invalid syntax");
5991 symtable_error(st, n->n_lineno);
5992 return;
5993 }
5994 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005995 /* The remaining cases fall through to default except in
5996 special circumstances. This requires the individual cases
5997 to be coded with great care, even though they look like
5998 rather innocuous. Each case must double-check TYPE(n).
5999 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006000 case decorator:
6001 if (TYPE(n) == decorator) {
6002 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
6003 node *name, *varname;
6004 name = CHILD(n, 1);
6005 REQ(name, dotted_name);
6006 varname = CHILD(name, 0);
6007 REQ(varname, NAME);
6008 symtable_add_use(st, STR(varname));
6009 }
6010 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006011 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006012 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006013 n = CHILD(n, 2);
6014 goto loop;
6015 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006016 else if (TYPE(n) == argument && NCH(n) == 2 &&
6017 TYPE(CHILD(n, 1)) == gen_for) {
6018 symtable_generator_expression(st, n);
6019 break;
6020 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006021 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006022 case listmaker:
6023 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006024 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006025 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006027 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006028 case testlist_gexp:
6029 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6030 symtable_generator_expression(st, n);
6031 break;
6032 }
6033 /* fall through */
6034
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006035 case atom:
6036 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6037 symtable_add_use(st, STR(CHILD(n, 0)));
6038 break;
6039 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006040 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006041 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006042 /* Walk over every non-token child with a special case
6043 for one child.
6044 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006045 if (NCH(n) == 1) {
6046 n = CHILD(n, 0);
6047 goto loop;
6048 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006049 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050 if (TYPE(CHILD(n, i)) >= single_input)
6051 symtable_node(st, CHILD(n, i));
6052 }
6053}
6054
6055static void
6056symtable_funcdef(struct symtable *st, node *n)
6057{
6058 node *body;
6059
6060 if (TYPE(n) == lambdef) {
6061 if (NCH(n) == 4)
6062 symtable_params(st, CHILD(n, 1));
6063 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006064 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006065 body = CHILD(n, NCH(n) - 1);
6066 symtable_node(st, body);
6067}
6068
6069/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006070 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006071 which are references in the defining scope. symtable_params()
6072 parses the parameter names, which are defined in the function's
6073 body.
6074
6075 varargslist:
6076 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6077 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6078*/
6079
6080static void
6081symtable_default_args(struct symtable *st, node *n)
6082{
6083 node *c;
6084 int i;
6085
6086 if (TYPE(n) == parameters) {
6087 n = CHILD(n, 1);
6088 if (TYPE(n) == RPAR)
6089 return;
6090 }
6091 REQ(n, varargslist);
6092 for (i = 0; i < NCH(n); i += 2) {
6093 c = CHILD(n, i);
6094 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6095 break;
6096 }
6097 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6098 symtable_node(st, CHILD(n, i));
6099 }
6100}
6101
6102static void
6103symtable_params(struct symtable *st, node *n)
6104{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006105 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006106 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006107
6108 if (TYPE(n) == parameters) {
6109 n = CHILD(n, 1);
6110 if (TYPE(n) == RPAR)
6111 return;
6112 }
6113 REQ(n, varargslist);
6114 for (i = 0; i < NCH(n); i += 2) {
6115 c = CHILD(n, i);
6116 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6117 ext = 1;
6118 break;
6119 }
6120 if (TYPE(c) == test) {
6121 continue;
6122 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006123 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006124 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006125 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006126 char nbuf[30];
6127 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006129 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006130 }
6131 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006132 if (ext) {
6133 c = CHILD(n, i);
6134 if (TYPE(c) == STAR) {
6135 i++;
6136 symtable_add_def(st, STR(CHILD(n, i)),
6137 DEF_PARAM | DEF_STAR);
6138 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006139 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006140 c = NULL;
6141 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006142 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006143 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006144 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006145 i++;
6146 symtable_add_def(st, STR(CHILD(n, i)),
6147 DEF_PARAM | DEF_DOUBLESTAR);
6148 }
6149 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006150 if (complex >= 0) {
6151 int j;
6152 for (j = 0; j <= complex; j++) {
6153 c = CHILD(n, j);
6154 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006155 c = CHILD(n, ++j);
6156 else if (TYPE(c) == EQUAL)
6157 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006158 if (TYPE(CHILD(c, 0)) == LPAR)
6159 symtable_params_fplist(st, CHILD(c, 1));
6160 }
6161 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006162}
6163
6164static void
6165symtable_params_fplist(struct symtable *st, node *n)
6166{
6167 int i;
6168 node *c;
6169
6170 REQ(n, fplist);
6171 for (i = 0; i < NCH(n); i += 2) {
6172 c = CHILD(n, i);
6173 REQ(c, fpdef);
6174 if (NCH(c) == 1)
6175 symtable_add_def(st, STR(CHILD(c, 0)),
6176 DEF_PARAM | DEF_INTUPLE);
6177 else
6178 symtable_params_fplist(st, CHILD(c, 1));
6179 }
6180
6181}
6182
6183static void
6184symtable_global(struct symtable *st, node *n)
6185{
6186 int i;
6187
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006188 /* XXX It might be helpful to warn about module-level global
6189 statements, but it's hard to tell the difference between
6190 module-level and a string passed to exec.
6191 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006192
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006193 for (i = 1; i < NCH(n); i += 2) {
6194 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006195 int flags;
6196
6197 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006198 if (flags < 0)
6199 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006200 if (flags && flags != DEF_GLOBAL) {
6201 char buf[500];
6202 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006203 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006204 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006205 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006206 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006207 }
6208 else {
6209 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006210 PyOS_snprintf(buf, sizeof(buf),
6211 GLOBAL_AFTER_ASSIGN,
6212 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006213 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006214 PyOS_snprintf(buf, sizeof(buf),
6215 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006216 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006217 }
6218 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006219 symtable_add_def(st, name, DEF_GLOBAL);
6220 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006221}
6222
6223static void
6224symtable_list_comprehension(struct symtable *st, node *n)
6225{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006226 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006227 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006228
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006229 REQ(n, listmaker);
6230 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6231 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006232 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006233 symtable_list_for(st, CHILD(n, 1));
6234 symtable_node(st, CHILD(n, 0));
6235 --st->st_cur->ste_tmpname;
6236}
6237
6238static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006239symtable_generator_expression(struct symtable *st, node *n)
6240{
6241 /* testlist_gexp: test gen_for */
6242 REQ(CHILD(n, 0), test);
6243 REQ(CHILD(n, 1), gen_for);
6244
6245 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6246 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6247
6248 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6249
6250 symtable_gen_for(st, CHILD(n, 1), 1);
6251 symtable_node(st, CHILD(n, 0));
6252 symtable_exit_scope(st);
6253
6254 /* for outmost iterable precomputation */
6255 symtable_node(st, CHILD(CHILD(n, 1), 3));
6256}
6257
6258static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006259symtable_list_for(struct symtable *st, node *n)
6260{
6261 REQ(n, list_for);
6262 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006263 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006264 symtable_node(st, CHILD(n, 3));
6265 if (NCH(n) == 5)
6266 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006267}
6268
6269static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006270symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6271{
6272 REQ(n, gen_for);
6273
6274 /* gen_for: for v in test [gen_iter] */
6275 symtable_assign(st, CHILD(n, 1), 0);
6276 if (is_outmost)
6277 symtable_add_use(st, "[outmost-iterable]");
6278 else
6279 symtable_node(st, CHILD(n, 3));
6280
6281 if (NCH(n) == 5)
6282 symtable_gen_iter(st, CHILD(n, 4));
6283}
6284
6285static void
6286symtable_gen_iter(struct symtable *st, node *n)
6287{
6288 REQ(n, gen_iter);
6289
6290 n = CHILD(n, 0);
6291 if (TYPE(n) == gen_for)
6292 symtable_gen_for(st, n, 0);
6293 else {
6294 REQ(n, gen_if);
6295 symtable_node(st, CHILD(n, 1));
6296
6297 if (NCH(n) == 3)
6298 symtable_gen_iter(st, CHILD(n, 2));
6299 }
6300}
6301
6302static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006303symtable_import(struct symtable *st, node *n)
6304{
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006305 node *nn;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006306 int i;
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006307 /* import_stmt: import_name | import_from */
6308 n = CHILD(n, 0);
6309 if (TYPE(n) == import_from) {
6310 /* import_from: 'from' dotted_name 'import' ('*' |
6311 | '(' import_as_names ')' | import_as_names) */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006312 node *dotname = CHILD(n, 1);
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006313 REQ(dotname, dotted_name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006314 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6315 /* check for bogus imports */
6316 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6317 PyErr_SetString(PyExc_SyntaxError,
6318 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006319 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006320 return;
6321 }
6322 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006323 nn = CHILD(n, 3 + (TYPE(CHILD(n, 3)) == LPAR));
6324 if (TYPE(nn) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006325 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006326 if (symtable_warn(st,
6327 "import * only allowed at module level") < 0)
6328 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006329 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006330 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006331 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006332 } else {
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006333 REQ(nn, import_as_names);
6334 for (i = 0; i < NCH(nn); i += 2) {
6335 node *c = CHILD(nn, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006336 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006337 symtable_assign(st, CHILD(c, 2),
6338 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006339 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006340 symtable_assign(st, CHILD(c, 0),
6341 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006342 }
6343 }
Anthony Baxter1a4ddae2004-08-31 10:07:13 +00006344 } else {
6345 /* 'import' dotted_as_names */
6346 nn = CHILD(n, 1);
6347 REQ(nn, dotted_as_names);
6348 for (i = 0; i < NCH(nn); i += 2)
6349 symtable_assign(st, CHILD(nn, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006350 }
6351}
6352
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006353/* The third argument to symatble_assign() is a flag to be passed to
6354 symtable_add_def() if it is eventually called. The flag is useful
6355 to specify the particular type of assignment that should be
6356 recorded, e.g. an assignment caused by import.
6357 */
6358
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006359static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006360symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006361{
6362 node *tmp;
6363 int i;
6364
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006365 loop:
6366 switch (TYPE(n)) {
6367 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006368 /* invalid assignment, e.g. lambda x:x=2. The next
6369 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006370 return;
6371 case power:
6372 if (NCH(n) > 2) {
6373 for (i = 2; i < NCH(n); ++i)
6374 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6375 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006376 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006377 if (NCH(n) > 1) {
6378 symtable_node(st, CHILD(n, 0));
6379 symtable_node(st, CHILD(n, 1));
6380 } else {
6381 n = CHILD(n, 0);
6382 goto loop;
6383 }
6384 return;
6385 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006386 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6387 /* XXX This is an error, but the next pass
6388 will catch it. */
6389 return;
6390 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006391 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006392 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006393 }
6394 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006395 case testlist_gexp:
6396 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6397 /* XXX This is an error, but the next pass
6398 will catch it. */
6399 return;
6400 } else {
6401 for (i = 0; i < NCH(n); i += 2)
6402 symtable_assign(st, CHILD(n, i), def_flag);
6403 }
6404 return;
6405
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006406 case exprlist:
6407 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006408 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006409 if (NCH(n) == 1) {
6410 n = CHILD(n, 0);
6411 goto loop;
6412 }
6413 else {
6414 int i;
6415 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006416 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006417 return;
6418 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006419 case atom:
6420 tmp = CHILD(n, 0);
6421 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6422 n = CHILD(n, 1);
6423 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006424 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006425 if (strcmp(STR(tmp), "__debug__") == 0) {
6426 PyErr_SetString(PyExc_SyntaxError,
6427 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006428 symtable_error(st, n->n_lineno);
6429 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006430 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006431 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006432 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006433 return;
6434 case dotted_as_name:
6435 if (NCH(n) == 3)
6436 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006437 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006438 else
6439 symtable_add_def(st,
6440 STR(CHILD(CHILD(n,
6441 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006442 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006443 return;
6444 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006445 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006446 return;
6447 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006448 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006449 return;
6450 default:
6451 if (NCH(n) == 0)
6452 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006453 if (NCH(n) == 1) {
6454 n = CHILD(n, 0);
6455 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006456 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006457 /* Should only occur for errors like x + 1 = 1,
6458 which will be caught in the next pass. */
6459 for (i = 0; i < NCH(n); ++i)
6460 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006461 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006462 }
6463}