blob: 85182de9d7b902f4d19703a668beac47f01fbb77 [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000429 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000430 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000431 unsigned char *codestr = NULL;
432 unsigned char *lineno;
433 int *addrmap = NULL;
434 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000435 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000436 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000438 if (!PyString_Check(code))
439 goto exitUnchanged;
Raymond Hettingera12fa142004-08-24 04:34:16 +0000440
441 /* Avoid situations where jump retargeting could overflow */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000442 codelen = PyString_Size(code);
Raymond Hettingera12fa142004-08-24 04:34:16 +0000443 if (codelen > 32000)
444 goto exitUnchanged;
445
446 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000447 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000448 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000449 goto exitUnchanged;
450 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000451
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000452 /* Mapping to new jump targets after NOPs are removed */
453 addrmap = PyMem_Malloc(codelen * sizeof(int));
454 if (addrmap == NULL)
455 goto exitUnchanged;
456
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000457 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000458 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000459 goto exitUnchanged;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000460 assert(PyTuple_Check(consts));
461
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000462 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
463 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000464 opcode = codestr[i];
465 switch (opcode) {
466
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000467 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000468 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000469 case UNARY_NOT:
470 if (codestr[i+1] != JUMP_IF_FALSE ||
471 codestr[i+4] != POP_TOP ||
472 !ISBASICBLOCK(blocks,i,5))
473 continue;
474 tgt = GETJUMPTGT(codestr, (i+1));
475 if (codestr[tgt] != POP_TOP)
476 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000477 j = GETARG(codestr, i+1) + 1;
478 codestr[i] = JUMP_IF_TRUE;
479 SETARG(codestr, i, j);
480 codestr[i+3] = POP_TOP;
481 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000482 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000483 break;
484
485 /* not a is b --> a is not b
486 not a in b --> a not in b
487 not a is not b --> a is b
488 not a not in b --> a in b */
489 case COMPARE_OP:
490 j = GETARG(codestr, i);
491 if (j < 6 || j > 9 ||
492 codestr[i+3] != UNARY_NOT ||
493 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000494 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000495 SETARG(codestr, i, (j^1));
496 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000497 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000498 break;
499
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000500 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
501 case LOAD_NAME:
502 case LOAD_GLOBAL:
503 j = GETARG(codestr, i);
504 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
505 if (name == NULL || strcmp(name, "None") != 0)
506 continue;
507 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
508 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
509 codestr[i] = LOAD_CONST;
510 SETARG(codestr, i, j);
511 break;
512 }
513 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000514 break;
515
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000516 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 case LOAD_CONST:
518 j = GETARG(codestr, i);
519 if (codestr[i+3] != JUMP_IF_FALSE ||
520 codestr[i+6] != POP_TOP ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000521 !ISBASICBLOCK(blocks,i,7) ||
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000522 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
523 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000524 memset(codestr+i, NOP, 7);
525 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000526 break;
527
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 /* Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
529 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
530 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000531 case BUILD_TUPLE:
532 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000533 j = GETARG(codestr, i);
534 if (codestr[i+3] != UNPACK_SEQUENCE ||
535 !ISBASICBLOCK(blocks,i,6) ||
536 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000538 if (j == 1) {
539 memset(codestr+i, NOP, 6);
540 nops += 6;
541 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000542 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000543 memset(codestr+i+1, NOP, 5);
544 nops += 5;
545 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000546 codestr[i] = ROT_THREE;
547 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000548 memset(codestr+i+2, NOP, 4);
549 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000550 }
551 break;
552
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000553 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000554 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000555 case JUMP_FORWARD:
556 case JUMP_IF_FALSE:
557 case JUMP_IF_TRUE:
558 case JUMP_ABSOLUTE:
559 case CONTINUE_LOOP:
560 case SETUP_LOOP:
561 case SETUP_EXCEPT:
562 case SETUP_FINALLY:
563 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000564 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000565 continue;
566 tgttgt = GETJUMPTGT(codestr, tgt);
567 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
568 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000569 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000570 tgttgt -= i + 3; /* Calc relative jump addr */
571 if (tgttgt < 0) /* No backward relative jumps */
572 continue;
573 codestr[i] = opcode;
574 SETARG(codestr, i, tgttgt);
575 break;
576
577 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000578 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000579
580 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
581 case RETURN_VALUE:
582 if (i+4 >= codelen ||
583 codestr[i+4] != RETURN_VALUE ||
584 !ISBASICBLOCK(blocks,i,5))
585 continue;
586 memset(codestr+i+1, NOP, 4);
587 nops += 4;
588 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000589 }
590 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000591
592 /* Fixup linenotab */
Raymond Hettingera12fa142004-08-24 04:34:16 +0000593 /* XXX make sure this handles intervals > 256 */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000594 assert(PyString_Check(lineno_obj));
595 lineno = PyString_AS_STRING(lineno_obj);
596 tabsiz = PyString_GET_SIZE(lineno_obj);
597 cum_orig_line = 0;
598 last_line = 0;
599 for (i=0 ; i < tabsiz ; i+=2) {
600 cum_orig_line += lineno[i];
601 new_line = addrmap[cum_orig_line];
602 lineno[i] =((unsigned char)(new_line - last_line));
603 last_line = new_line;
604 }
605
606 /* Remove NOPs and fixup jump targets */
607 for (i=0, h=0 ; i<codelen ; ) {
608 opcode = codestr[i];
609 switch (opcode) {
610 case NOP:
611 i++;
612 continue;
613
614 case JUMP_ABSOLUTE:
615 case CONTINUE_LOOP:
616 j = addrmap[GETARG(codestr, i)];
617 SETARG(codestr, i, j);
618 break;
619
620 case FOR_ITER:
621 case JUMP_FORWARD:
622 case JUMP_IF_FALSE:
623 case JUMP_IF_TRUE:
624 case SETUP_LOOP:
625 case SETUP_EXCEPT:
626 case SETUP_FINALLY:
627 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
628 SETARG(codestr, i, j);
629 break;
630 }
631 adj = CODESIZE(opcode);
632 while (adj--)
633 codestr[h++] = codestr[i++];
634 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000635 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000636
637 code = PyString_FromStringAndSize((char *)codestr, h);
638 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000639 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000640 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000641 return code;
642
643exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000644 if (addrmap != NULL)
645 PyMem_Free(addrmap);
646 if (codestr != NULL)
647 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000648 Py_INCREF(code);
649 return code;
650}
651
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653PyCode_New(int argcount, int nlocals, int stacksize, int flags,
654 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000655 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
656 PyObject *filename, PyObject *name, int firstlineno,
657 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000658{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000660 int i;
661 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000662 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000663 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 consts == NULL || !PyTuple_Check(consts) ||
665 names == NULL || !PyTuple_Check(names) ||
666 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000667 freevars == NULL || !PyTuple_Check(freevars) ||
668 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 name == NULL || !PyString_Check(name) ||
670 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000671 lnotab == NULL || !PyString_Check(lnotab) ||
672 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000673 PyErr_BadInternalCall();
674 return NULL;
675 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000676 intern_strings(names);
677 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000678 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000679 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000680 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 for (i = PyTuple_Size(consts); --i >= 0; ) {
682 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000684 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000685 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000686 continue;
687 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000688 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000690 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000691 co->co_argcount = argcount;
692 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000693 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000694 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000695 Py_INCREF(code);
696 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000697 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000698 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000699 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000700 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000702 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000703 Py_INCREF(freevars);
704 co->co_freevars = freevars;
705 Py_INCREF(cellvars);
706 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000708 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000710 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000711 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000713 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000714 if (PyTuple_GET_SIZE(freevars) == 0 &&
715 PyTuple_GET_SIZE(cellvars) == 0)
716 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000717 }
718 return co;
719}
720
721
722/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000723
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000724/* The compiler uses two passes to generate bytecodes. The first pass
725 builds the symbol table. The second pass generates the bytecode.
726
727 The first pass uses a single symtable struct. The second pass uses
728 a compiling struct for each code block. The compiling structs
729 share a reference to the symtable.
730
731 The two passes communicate via symtable_load_symbols() and via
732 is_local() and is_global(). The former initializes several slots
733 in the compiling struct: c_varnames, c_locals, c_nlocals,
734 c_argcount, c_globals, and c_flags.
735*/
736
Tim Peters2a7f3842001-06-09 09:26:21 +0000737/* All about c_lnotab.
738
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000739c_lnotab is an array of unsigned bytes disguised as a Python string. Since
740version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
741mapped to source code line #s via c_lnotab instead.
742
Tim Peters2a7f3842001-06-09 09:26:21 +0000743The array is conceptually a list of
744 (bytecode offset increment, line number increment)
745pairs. The details are important and delicate, best illustrated by example:
746
747 byte code offset source code line number
748 0 1
749 6 2
750 50 7
751 350 307
752 361 308
753
754The first trick is that these numbers aren't stored, only the increments
755from one row to the next (this doesn't really work, but it's a start):
756
757 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
758
759The second trick is that an unsigned byte can't hold negative values, or
760values larger than 255, so (a) there's a deep assumption that byte code
761offsets and their corresponding line #s both increase monotonically, and (b)
762if at least one column jumps by more than 255 from one row to the next, more
763than one pair is written to the table. In case #b, there's no way to know
764from looking at the table later how many were written. That's the delicate
765part. A user of c_lnotab desiring to find the source line number
766corresponding to a bytecode address A should do something like this
767
768 lineno = addr = 0
769 for addr_incr, line_incr in c_lnotab:
770 addr += addr_incr
771 if addr > A:
772 return lineno
773 lineno += line_incr
774
775In order for this to work, when the addr field increments by more than 255,
776the line # increment in each pair generated must be 0 until the remaining addr
777increment is < 256. So, in the example above, com_set_lineno should not (as
778was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
779255, 0, 45, 255, 0, 45.
780*/
781
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000782struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000783 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000785 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000787 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000788 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 PyObject *c_locals; /* dictionary (value=localID) */
790 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000791 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000792 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000793 int c_nlocals; /* index of next local */
794 int c_argcount; /* number of top-level arguments */
795 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000796 int c_nexti; /* index into c_code */
797 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000798 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000799 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000800 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000801 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000802 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000803 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000804 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000805 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000806 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000807 int c_stacklevel; /* Current stack level */
808 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000809 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000811 int c_last_addr; /* last op addr seen and recorded in lnotab */
812 int c_last_line; /* last line seen and recorded in lnotab */
813 int c_lnotab_next; /* current length of lnotab */
814 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000815 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000816 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000817 int c_nested; /* Is block nested funcdef or lamdef? */
818 int c_closure; /* Is nested w/freevars? */
819 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000820 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000821 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000822};
823
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000824static int
825is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000826{
827 if ((v & (USE | DEF_FREE))
828 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
829 return 1;
830 if (v & DEF_FREE_CLASS)
831 return 1;
832 return 0;
833}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000834
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000835static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000836com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000837{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000838 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
839
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000840 if (c == NULL) {
841 /* Error occurred via symtable call to
842 is_constant_false */
843 PyErr_SetString(exc, msg);
844 return;
845 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000846 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000847 if (c->c_lineno < 1 || c->c_interactive) {
848 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000850 return;
851 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000852 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000853 if (v == NULL)
854 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000855
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000856 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000857 if (line == NULL) {
858 Py_INCREF(Py_None);
859 line = Py_None;
860 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000861 if (exc == PyExc_SyntaxError) {
862 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
863 Py_None, line);
864 if (t == NULL)
865 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000866 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000867 if (w == NULL)
868 goto exit;
869 PyErr_SetObject(exc, w);
870 } else {
871 /* Make sure additional exceptions are printed with
872 file and line, also. */
873 PyErr_SetObject(exc, v);
874 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
875 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000876 exit:
877 Py_XDECREF(t);
878 Py_XDECREF(v);
879 Py_XDECREF(w);
880 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000881}
882
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000883/* Interface to the block stack */
884
885static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000886block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000887{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000888 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 com_error(c, PyExc_SystemError,
890 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000891 }
892 else {
893 c->c_block[c->c_nblocks++] = type;
894 }
895}
896
897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000899{
900 if (c->c_nblocks > 0)
901 c->c_nblocks--;
902 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000904 }
905}
906
Guido van Rossum681d79a1995-07-18 14:51:37 +0000907/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000908
Martin v. Löwis95292d62002-12-11 14:04:59 +0000909static int issue_warning(const char *, const char *, int);
910static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000911static void com_free(struct compiling *);
912static void com_push(struct compiling *, int);
913static void com_pop(struct compiling *, int);
914static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000915static void com_node(struct compiling *, node *);
916static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000917static void com_addbyte(struct compiling *, int);
918static void com_addint(struct compiling *, int);
919static void com_addoparg(struct compiling *, int, int);
920static void com_addfwref(struct compiling *, int, int *);
921static void com_backpatch(struct compiling *, int);
922static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
923static int com_addconst(struct compiling *, PyObject *);
924static int com_addname(struct compiling *, PyObject *);
925static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000926static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000927static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000928static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000929static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000930static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000931static void com_assign(struct compiling *, node *, int, node *);
932static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000933static int com_make_closure(struct compiling *c, PyCodeObject *co);
934
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000935static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000936static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000937 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000938static PyObject *parsestrplus(struct compiling*, node *);
939static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000940static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000941
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000942static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000943
944/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000945static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000946static struct symtable *symtable_build(node *, PyFutureFeatures *,
947 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000948static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000949static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000950static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000951static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000952static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000953static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000954
955static void symtable_node(struct symtable *, node *);
956static void symtable_funcdef(struct symtable *, node *);
957static void symtable_default_args(struct symtable *, node *);
958static void symtable_params(struct symtable *, node *);
959static void symtable_params_fplist(struct symtable *, node *n);
960static void symtable_global(struct symtable *, node *);
961static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000962static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000963static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000964static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000965static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000966static void symtable_gen_for(struct symtable *, node *, int);
967static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000968
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000969static int symtable_update_free_vars(struct symtable *);
970static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
971static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
972
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000973/* helper */
974static void
975do_pad(int pad)
976{
977 int i;
978 for (i = 0; i < pad; ++i)
979 fprintf(stderr, " ");
980}
981
982static void
983dump(node *n, int pad, int depth)
984{
985 int i;
986 if (depth == 0)
987 return;
988 do_pad(pad);
989 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
990 if (depth > 0)
991 depth--;
992 for (i = 0; i < NCH(n); ++i)
993 dump(CHILD(n, i), pad + 1, depth);
994}
995
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000996static int
Martin v. Löwis95292d62002-12-11 14:04:59 +0000997com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000998{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000999 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1001 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001002 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001004 goto fail;
1005 if ((c->c_const_dict = PyDict_New()) == NULL)
1006 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001008 goto fail;
1009 if ((c->c_name_dict = PyDict_New()) == NULL)
1010 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001012 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1014 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001015 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001016 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001017 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001018 c->c_freevars = NULL;
1019 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001020 c->c_nlocals = 0;
1021 c->c_argcount = 0;
1022 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001023 c->c_nexti = 0;
1024 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001025 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001026 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001027 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001028 c->c_begin = 0;
1029 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001030 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001031 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001032 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001033 c->c_stacklevel = 0;
1034 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001035 c->c_firstlineno = 0;
1036 c->c_last_addr = 0;
1037 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001038 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001039 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001040 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001041 c->c_nested = 0;
1042 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001043 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001044 return 1;
1045
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001046 fail:
1047 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001048 return 0;
1049}
1050
1051static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001052com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001053{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 Py_XDECREF(c->c_code);
1055 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001056 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001058 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 Py_XDECREF(c->c_globals);
1060 Py_XDECREF(c->c_locals);
1061 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001062 Py_XDECREF(c->c_freevars);
1063 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001065 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001066 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001067}
1068
1069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001071{
1072 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001073 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001074 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001075 /*
1076 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1077 c->c_filename, c->c_name, c->c_lineno,
1078 c->c_nexti, c->c_stacklevel, n);
1079 */
1080 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001081}
1082
1083static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001084com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001085{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001086 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001087 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001088 else
1089 c->c_stacklevel -= n;
1090}
1091
1092static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001093com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001094{
1095 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001097 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001099}
1100
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001101static int
1102com_check_size(PyObject **s, int offset)
1103{
1104 int len = PyString_GET_SIZE(*s);
1105 if (offset >= len)
1106 return _PyString_Resize(s, len * 2);
1107 return 0;
1108}
1109
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001110static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001111com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001112{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001113 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001114 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001115 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001116 if (com_check_size(&c->c_code, c->c_nexti)) {
1117 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001119 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001120 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001121}
1122
1123static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001124com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001125{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001126 com_addbyte(c, x & 0xff);
1127 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001128}
1129
1130static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001131com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001132{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001133 char *p;
1134 if (c->c_lnotab == NULL)
1135 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001136 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1137 c->c_errors++;
1138 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001139 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001140 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001141 *p++ = addr;
1142 *p++ = line;
1143 c->c_lnotab_next += 2;
1144}
1145
1146static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001148{
1149 c->c_lineno = lineno;
1150 if (c->c_firstlineno == 0) {
1151 c->c_firstlineno = c->c_last_line = lineno;
1152 }
1153 else {
1154 int incr_addr = c->c_nexti - c->c_last_addr;
1155 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001156 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001157 while (incr_addr > 255) {
1158 com_add_lnotab(c, 255, 0);
1159 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001160 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001161 while (incr_line > 255) {
1162 com_add_lnotab(c, incr_addr, 255);
1163 incr_line -=255;
1164 incr_addr = 0;
1165 }
1166 if (incr_addr > 0 || incr_line > 0)
1167 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001168 c->c_last_addr = c->c_nexti;
1169 c->c_last_line = lineno;
1170 }
1171}
1172
1173static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001174com_strip_lnotab(struct compiling *c)
1175{
1176 /* strip the last lnotab entry if no opcode were emitted.
1177 * This prevents a line number to be generated on a final
1178 * pass, like in the following example:
1179 *
1180 * if a:
1181 * print 5
1182 * else:
1183 * pass
1184 *
1185 * Without the fix, a line trace event would be generated
1186 * on the pass even if a is true (because of the implicit
1187 * return).
1188 */
1189 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1190 c->c_lnotab_next = c->c_lnotab_last;
1191 }
1192}
1193
1194static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001195com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001196{
Fred Drakeef8ace32000-08-24 00:32:09 +00001197 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001198 if (extended_arg){
1199 com_addbyte(c, EXTENDED_ARG);
1200 com_addint(c, extended_arg);
1201 arg &= 0xffff;
1202 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001203 com_addbyte(c, op);
1204 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001205}
1206
1207static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001208com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001209{
1210 /* Compile a forward reference for backpatching */
1211 int here;
1212 int anchor;
1213 com_addbyte(c, op);
1214 here = c->c_nexti;
1215 anchor = *p_anchor;
1216 *p_anchor = here;
1217 com_addint(c, anchor == 0 ? 0 : here - anchor);
1218}
1219
1220static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001221com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001222{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001223 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001224 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001225 int dist;
1226 int prev;
1227 for (;;) {
1228 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001229 prev = code[anchor] + (code[anchor+1] << 8);
1230 dist = target - (anchor+2);
1231 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001232 dist >>= 8;
1233 code[anchor+1] = dist;
1234 dist >>= 8;
1235 if (dist) {
1236 com_error(c, PyExc_SystemError,
1237 "com_backpatch: offset too large");
1238 break;
1239 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001240 if (!prev)
1241 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001242 anchor -= prev;
1243 }
1244}
1245
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001246/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001247
1248static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001249com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001250{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001251 PyObject *w, *t, *np=NULL;
1252 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001253
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001254 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001255 if (t == NULL)
1256 goto fail;
1257 w = PyDict_GetItem(dict, t);
1258 if (w != NULL) {
1259 n = PyInt_AsLong(w);
1260 } else {
1261 n = PyList_Size(list);
1262 np = PyInt_FromLong(n);
1263 if (np == NULL)
1264 goto fail;
1265 if (PyList_Append(list, v) != 0)
1266 goto fail;
1267 if (PyDict_SetItem(dict, t, np) != 0)
1268 goto fail;
1269 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001270 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001271 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001272 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001273 fail:
1274 Py_XDECREF(np);
1275 Py_XDECREF(t);
1276 c->c_errors++;
1277 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001278}
1279
1280static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001281com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001282{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001283 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001284}
1285
1286static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001287com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001288{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001289 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001290}
1291
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001292int
1293_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001294{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001295 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001296 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001297 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001298 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1299 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001300 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001301 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001302 return 0; /* Don't mangle __extremely_long_names */
1303 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1304 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001305 /* Strip leading underscores from class name */
1306 while (*p == '_')
1307 p++;
1308 if (*p == '\0')
1309 return 0; /* Don't mangle if class is just underscores */
1310 plen = strlen(p);
1311 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001312 plen = maxlen-nlen-2; /* Truncate class name if too long */
1313 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001314 buffer[0] = '_';
1315 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001316 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001317 return 1;
1318}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001319
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001320static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001321com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001322{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001324 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001325 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001326
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001327 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001328 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001329 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001330 c->c_errors++;
1331 i = 255;
1332 }
1333 else {
1334 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001336 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001337 com_addoparg(c, op, i);
1338}
1339
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001340#define NAME_LOCAL 0
1341#define NAME_GLOBAL 1
1342#define NAME_DEFAULT 2
1343#define NAME_CLOSURE 3
1344
1345static int
1346com_lookup_arg(PyObject *dict, PyObject *name)
1347{
1348 PyObject *v = PyDict_GetItem(dict, name);
1349 if (v == NULL)
1350 return -1;
1351 else
1352 return PyInt_AS_LONG(v);
1353}
1354
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001355static int
1356none_assignment_check(struct compiling *c, char *name, int assigning)
1357{
1358 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1359 char *msg;
1360 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001361 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001362 else
1363 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001364 com_error(c, PyExc_SyntaxError, msg);
1365 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001366 }
1367 return 0;
1368}
1369
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001370static void
1371com_addop_varname(struct compiling *c, int kind, char *name)
1372{
1373 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001374 int i, reftype;
1375 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001376 int op = STOP_CODE;
1377 char buffer[MANGLE_LEN];
1378
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001379 if (kind != VAR_LOAD &&
1380 none_assignment_check(c, name, kind == VAR_STORE))
1381 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001382 i = 255;
1383 goto done;
1384 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001385 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001386 name = buffer;
1387 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1388 c->c_errors++;
1389 i = 255;
1390 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001391 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001392
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001393 reftype = get_ref_type(c, name);
1394 switch (reftype) {
1395 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001396 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001397 scope = NAME_LOCAL;
1398 break;
1399 case GLOBAL_EXPLICIT:
1400 scope = NAME_GLOBAL;
1401 break;
1402 case GLOBAL_IMPLICIT:
1403 if (c->c_flags & CO_OPTIMIZED)
1404 scope = NAME_GLOBAL;
1405 break;
1406 case FREE:
1407 case CELL:
1408 scope = NAME_CLOSURE;
1409 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001410 }
1411
1412 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001413 if (scope == NAME_LOCAL)
1414 i = com_lookup_arg(c->c_locals, v);
1415 else if (reftype == FREE)
1416 i = com_lookup_arg(c->c_freevars, v);
1417 else if (reftype == CELL)
1418 i = com_lookup_arg(c->c_cellvars, v);
1419 if (i == -1) {
1420 c->c_errors++; /* XXX no exception set */
1421 i = 255;
1422 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001423 }
1424 Py_DECREF(v);
1425
1426 switch (kind) {
1427 case VAR_LOAD:
1428 switch (scope) {
1429 case NAME_LOCAL:
1430 op = LOAD_FAST;
1431 break;
1432 case NAME_GLOBAL:
1433 op = LOAD_GLOBAL;
1434 break;
1435 case NAME_DEFAULT:
1436 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001437 break;
1438 case NAME_CLOSURE:
1439 op = LOAD_DEREF;
1440 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001441 }
1442 break;
1443 case VAR_STORE:
1444 switch (scope) {
1445 case NAME_LOCAL:
1446 op = STORE_FAST;
1447 break;
1448 case NAME_GLOBAL:
1449 op = STORE_GLOBAL;
1450 break;
1451 case NAME_DEFAULT:
1452 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001453 break;
1454 case NAME_CLOSURE:
1455 op = STORE_DEREF;
1456 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001457 }
1458 break;
1459 case VAR_DELETE:
1460 switch (scope) {
1461 case NAME_LOCAL:
1462 op = DELETE_FAST;
1463 break;
1464 case NAME_GLOBAL:
1465 op = DELETE_GLOBAL;
1466 break;
1467 case NAME_DEFAULT:
1468 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001469 break;
1470 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001471 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001472 PyOS_snprintf(buf, sizeof(buf),
1473 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001474 com_error(c, PyExc_SyntaxError, buf);
1475 i = 255;
1476 break;
1477 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001478 }
1479 break;
1480 }
1481done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001482 com_addoparg(c, op, i);
1483}
1484
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001486com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001487{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001488 char *name;
1489 char buffer[1000];
1490 /* XXX it is possible to write this code without the 1000
1491 chars on the total length of dotted names, I just can't be
1492 bothered right now */
1493 if (TYPE(n) == STAR)
1494 name = "*";
1495 else if (TYPE(n) == dotted_name) {
1496 char *p = buffer;
1497 int i;
1498 name = buffer;
1499 for (i = 0; i < NCH(n); i += 2) {
1500 char *s = STR(CHILD(n, i));
1501 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001503 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001504 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001505 break;
1506 }
1507 if (p != buffer)
1508 *p++ = '.';
1509 strcpy(p, s);
1510 p = strchr(p, '\0');
1511 }
1512 }
1513 else {
1514 REQ(n, NAME);
1515 name = STR(n);
1516 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001517 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001518}
1519
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001521parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001522{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001523 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001524 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001525 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001526#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001527 int imflag;
1528#endif
1529
Guido van Rossum282914b1991-04-04 10:42:56 +00001530 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001531 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001532#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001533 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001534#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001535 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001537 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001539 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001540 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001541 }
1542 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001543 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001545 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001546 if (errno != 0)
1547 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001549 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001550 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001551#ifndef WITHOUT_COMPLEX
1552 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001553 Py_complex z;
1554 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001555 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001556 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001557 PyFPE_END_PROTECT(z)
1558 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001559 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001560 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001561#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001562 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001563 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001564 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001565 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001567 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001568}
1569
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001571decode_utf8(char **sPtr, char *end, char* encoding)
1572{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001573#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001574 Py_FatalError("decode_utf8 should not be called in this build.");
1575 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001576#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001577 PyObject *u, *v;
1578 char *s, *t;
1579 t = s = *sPtr;
1580 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1581 while (s < end && (*s & 0x80)) s++;
1582 *sPtr = s;
1583 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1584 if (u == NULL)
1585 return NULL;
1586 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1587 Py_DECREF(u);
1588 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001589#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001590}
1591
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001592/* compiler.transformer.Transformer.decode_literal depends on what
1593 might seem like minor details of this function -- changes here
1594 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001595static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001596parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001597{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001599 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001600 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001601 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001602 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001603 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001604 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001605
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001606 if (isalpha(quote) || quote == '_') {
1607 if (quote == 'u' || quote == 'U') {
1608 quote = *++s;
1609 unicode = 1;
1610 }
1611 if (quote == 'r' || quote == 'R') {
1612 quote = *++s;
1613 rawmode = 1;
1614 }
1615 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001616 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001618 return NULL;
1619 }
1620 s++;
1621 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001622 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001623 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001624 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001625 return NULL;
1626 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001627 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001629 return NULL;
1630 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001631 if (len >= 4 && s[0] == quote && s[1] == quote) {
1632 s += 2;
1633 len -= 2;
1634 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001636 return NULL;
1637 }
1638 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001639#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001640 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001641 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001642 char *buf;
1643 char *p;
1644 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001645 if (encoding == NULL) {
1646 buf = s;
1647 u = NULL;
1648 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1649 buf = s;
1650 u = NULL;
1651 } else {
1652 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1653 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1654 if (u == NULL)
1655 return NULL;
1656 p = buf = PyString_AsString(u);
1657 end = s + len;
1658 while (s < end) {
1659 if (*s == '\\') {
1660 *p++ = *s++;
1661 if (*s & 0x80) {
1662 strcpy(p, "u005c");
1663 p += 5;
1664 }
1665 }
1666 if (*s & 0x80) { /* XXX inefficient */
1667 char *r;
1668 int rn, i;
1669 w = decode_utf8(&s, end, "utf-16-be");
1670 if (w == NULL) {
1671 Py_DECREF(u);
1672 return NULL;
1673 }
1674 r = PyString_AsString(w);
1675 rn = PyString_Size(w);
1676 assert(rn % 2 == 0);
1677 for (i = 0; i < rn; i += 2) {
1678 sprintf(p, "\\u%02x%02x",
1679 r[i + 0] & 0xFF,
1680 r[i + 1] & 0xFF);
1681 p += 6;
1682 }
1683 Py_DECREF(w);
1684 } else {
1685 *p++ = *s++;
1686 }
1687 }
1688 len = p - buf;
1689 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001690 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001691 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001692 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001693 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1694 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001695 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001696 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001697 return v;
1698
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001699 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001700#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001701 need_encoding = (encoding != NULL &&
1702 strcmp(encoding, "utf-8") != 0 &&
1703 strcmp(encoding, "iso-8859-1") != 0);
1704 if (rawmode || strchr(s, '\\') == NULL) {
1705 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001706#ifndef Py_USING_UNICODE
1707 /* This should not happen - we never see any other
1708 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001709 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001710#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001711 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1712 if (u == NULL)
1713 return NULL;
1714 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1715 Py_DECREF(u);
1716 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001717#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001718 } else {
1719 return PyString_FromStringAndSize(s, len);
1720 }
1721 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001722
1723 v = PyString_DecodeEscape(s, len, NULL, unicode,
1724 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001725 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001726 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001727 return v;
1728}
1729
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001731parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001732{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001734 int i;
1735 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001736 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001737 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001738 for (i = 1; i < NCH(n); i++) {
1739 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001740 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001741 if (s == NULL)
1742 goto onError;
1743 if (PyString_Check(v) && PyString_Check(s)) {
1744 PyString_ConcatAndDel(&v, s);
1745 if (v == NULL)
1746 goto onError;
1747 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001748#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001749 else {
1750 PyObject *temp;
1751 temp = PyUnicode_Concat(v, s);
1752 Py_DECREF(s);
1753 if (temp == NULL)
1754 goto onError;
1755 Py_DECREF(v);
1756 v = temp;
1757 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001758#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001759 }
1760 }
1761 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001762
1763 onError:
1764 Py_XDECREF(v);
1765 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001766}
1767
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001768static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001769com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001770{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001771 int anchor = 0;
1772 int save_begin = c->c_begin;
1773
Raymond Hettinger354433a2004-05-19 08:20:33 +00001774 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001775 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001776 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001777 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001778 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001779 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001780 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001781 c->c_loops++;
1782 com_list_iter(c, n, e, t);
1783 c->c_loops--;
1784 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1785 c->c_begin = save_begin;
1786 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001787 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001788}
1789
1790static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001791com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1792{
1793 int break_anchor = 0;
1794 int anchor = 0;
1795 int save_begin = c->c_begin;
1796
1797 REQ(n, gen_for);
1798 /* gen_for: for v in test [gen_iter] */
1799
1800 com_addfwref(c, SETUP_LOOP, &break_anchor);
1801 block_push(c, SETUP_LOOP);
1802
1803 if (is_outmost) {
1804 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1805 com_push(c, 1);
1806 }
1807 else {
1808 com_node(c, CHILD(n, 3));
1809 com_addbyte(c, GET_ITER);
1810 }
1811
1812 c->c_begin = c->c_nexti;
1813 com_set_lineno(c, c->c_last_line);
1814 com_addfwref(c, FOR_ITER, &anchor);
1815 com_push(c, 1);
1816 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1817
1818 if (NCH(n) == 5)
1819 com_gen_iter(c, CHILD(n, 4), t);
1820 else {
1821 com_test(c, t);
1822 com_addbyte(c, YIELD_VALUE);
1823 com_pop(c, 1);
1824 }
1825
1826 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1827 c->c_begin = save_begin;
1828
1829 com_backpatch(c, anchor);
1830 com_pop(c, 1); /* FOR_ITER has popped this */
1831 com_addbyte(c, POP_BLOCK);
1832 block_pop(c, SETUP_LOOP);
1833 com_backpatch(c, break_anchor);
1834}
1835
1836static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001837com_list_if(struct compiling *c, node *n, node *e, char *t)
1838{
1839 int anchor = 0;
1840 int a = 0;
1841 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001842 com_node(c, CHILD(n, 1));
1843 com_addfwref(c, JUMP_IF_FALSE, &a);
1844 com_addbyte(c, POP_TOP);
1845 com_pop(c, 1);
1846 com_list_iter(c, n, e, t);
1847 com_addfwref(c, JUMP_FORWARD, &anchor);
1848 com_backpatch(c, a);
1849 /* We jump here with an extra entry which we now pop */
1850 com_addbyte(c, POP_TOP);
1851 com_backpatch(c, anchor);
1852}
1853
1854static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001855com_gen_if(struct compiling *c, node *n, node *t)
1856{
1857 /* gen_if: 'if' test [gen_iter] */
1858 int anchor = 0;
1859 int a=0;
1860
1861 com_node(c, CHILD(n, 1));
1862 com_addfwref(c, JUMP_IF_FALSE, &a);
1863 com_addbyte(c, POP_TOP);
1864 com_pop(c, 1);
1865
1866 if (NCH(n) == 3)
1867 com_gen_iter(c, CHILD(n, 2), t);
1868 else {
1869 com_test(c, t);
1870 com_addbyte(c, YIELD_VALUE);
1871 com_pop(c, 1);
1872 }
1873 com_addfwref(c, JUMP_FORWARD, &anchor);
1874 com_backpatch(c, a);
1875 /* We jump here with an extra entry which we now pop */
1876 com_addbyte(c, POP_TOP);
1877 com_backpatch(c, anchor);
1878}
1879
1880static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001881com_list_iter(struct compiling *c,
1882 node *p, /* parent of list_iter node */
1883 node *e, /* element expression node */
1884 char *t /* name of result list temp local */)
1885{
1886 /* list_iter is the last child in a listmaker, list_for, or list_if */
1887 node *n = CHILD(p, NCH(p)-1);
1888 if (TYPE(n) == list_iter) {
1889 n = CHILD(n, 0);
1890 switch (TYPE(n)) {
1891 case list_for:
1892 com_list_for(c, n, e, t);
1893 break;
1894 case list_if:
1895 com_list_if(c, n, e, t);
1896 break;
1897 default:
1898 com_error(c, PyExc_SystemError,
1899 "invalid list_iter node type");
1900 }
1901 }
1902 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001903 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001904 com_push(c, 1);
1905 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001906 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001907 com_pop(c, 2);
1908 }
1909}
1910
1911static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001912com_gen_iter(struct compiling *c, node *n, node *t)
1913{
1914 /* gen_iter: gen_for | gen_if */
1915 node *ch;
1916 REQ(n, gen_iter);
1917
1918 ch = CHILD(n, 0);
1919
1920 switch (TYPE(ch)) {
1921 case gen_for:
1922 com_gen_for(c, ch, t, 0);
1923 break;
1924 case gen_if:
1925 com_gen_if(c, ch, t);
1926 break;
1927 default:
1928 com_error(c, PyExc_SystemError,
1929 "invalid gen_iter node type");
1930 }
1931}
1932
1933static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001934com_list_comprehension(struct compiling *c, node *n)
1935{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001936 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001937 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001938
1939 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001940 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001941 com_addoparg(c, BUILD_LIST, 0);
1942 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1943 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001944 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001945 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001946 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001947 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001948 --c->c_tmpname;
1949}
1950
1951static void
1952com_listmaker(struct compiling *c, node *n)
1953{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001954 /* listmaker: test ( list_for | (',' test)* [','] ) */
1955 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001956 com_list_comprehension(c, n);
1957 else {
1958 int len = 0;
1959 int i;
1960 for (i = 0; i < NCH(n); i += 2, len++)
1961 com_node(c, CHILD(n, i));
1962 com_addoparg(c, BUILD_LIST, len);
1963 com_pop(c, len-1);
1964 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001965}
1966
1967static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001968com_generator_expression(struct compiling *c, node *n)
1969{
1970 /* testlist_gexp: test gen_for */
1971 /* argument: test gen_for */
1972 PyCodeObject *co;
1973
1974 REQ(CHILD(n, 0), test);
1975 REQ(CHILD(n, 1), gen_for);
1976
1977 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
1978 n->n_lineno);
1979 co = icompile(n, c);
1980 symtable_exit_scope(c->c_symtable);
1981
1982 if (co == NULL)
1983 c->c_errors++;
1984 else {
1985 int closure = com_make_closure(c, co);
1986 int i = com_addconst(c, (PyObject *)co);
1987
1988 com_addoparg(c, LOAD_CONST, i);
1989 com_push(c, 1);
1990 if (closure)
1991 com_addoparg(c, MAKE_CLOSURE, 0);
1992 else
1993 com_addoparg(c, MAKE_FUNCTION, 0);
1994
1995 com_test(c, CHILD(CHILD(n, 1), 3));
1996 com_addbyte(c, GET_ITER);
1997 com_addoparg(c, CALL_FUNCTION, 1);
1998 com_pop(c, 1);
1999
2000 Py_DECREF(co);
2001 }
2002}
2003
2004static void
2005com_testlist_gexp(struct compiling *c, node *n)
2006{
2007 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2008 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2009 com_generator_expression(c, n);
2010 else com_list(c, n, 0);
2011}
2012
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002013
Raymond Hettinger354433a2004-05-19 08:20:33 +00002014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002015com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002016{
2017 int i;
2018 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2019 for (i = 0; i+2 < NCH(n); i += 4) {
2020 /* We must arrange things just right for STORE_SUBSCR.
2021 It wants the stack to look like (value) (dict) (key) */
2022 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002023 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002024 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002025 com_node(c, CHILD(n, i+2)); /* value */
2026 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002027 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002028 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002029 }
2030}
2031
2032static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002033com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002034{
2035 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002036 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002037 int i;
2038 REQ(n, atom);
2039 ch = CHILD(n, 0);
2040 switch (TYPE(ch)) {
2041 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002042 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002043 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002044 com_push(c, 1);
2045 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002046 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002047 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002048 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002049 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002050 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002051 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_push(c, 1);
2053 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002054 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002055 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002056 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002057 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002059 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002060 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002061 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002062 break;
2063 case BACKQUOTE:
2064 com_node(c, CHILD(n, 1));
2065 com_addbyte(c, UNARY_CONVERT);
2066 break;
2067 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002068 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002069 i = 255;
2070 }
2071 else {
2072 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002073 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002074 }
2075 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002077 break;
2078 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002079 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002080 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002081 c->c_errors++;
2082 i = 255;
2083 }
2084 else {
2085 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002086 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002087 }
2088 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002089 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002090 break;
2091 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002092 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002093 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002094 break;
2095 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002096 com_error(c, PyExc_SystemError,
2097 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099}
2100
2101static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002102com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002103{
2104 if (NCH(n) == 1) {
2105 com_addbyte(c, op);
2106 }
2107 else if (NCH(n) == 2) {
2108 if (TYPE(CHILD(n, 0)) != COLON) {
2109 com_node(c, CHILD(n, 0));
2110 com_addbyte(c, op+1);
2111 }
2112 else {
2113 com_node(c, CHILD(n, 1));
2114 com_addbyte(c, op+2);
2115 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002116 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002117 }
2118 else {
2119 com_node(c, CHILD(n, 0));
2120 com_node(c, CHILD(n, 2));
2121 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002122 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002123 }
2124}
2125
Guido van Rossum635abd21997-01-06 22:56:52 +00002126static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002127com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2128{
2129 if (NCH(n) == 1) {
2130 com_addbyte(c, DUP_TOP);
2131 com_push(c, 1);
2132 com_addbyte(c, SLICE);
2133 com_node(c, augn);
2134 com_addbyte(c, opcode);
2135 com_pop(c, 1);
2136 com_addbyte(c, ROT_TWO);
2137 com_addbyte(c, STORE_SLICE);
2138 com_pop(c, 2);
2139 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2140 com_node(c, CHILD(n, 0));
2141 com_addoparg(c, DUP_TOPX, 2);
2142 com_push(c, 2);
2143 com_addbyte(c, SLICE+1);
2144 com_pop(c, 1);
2145 com_node(c, augn);
2146 com_addbyte(c, opcode);
2147 com_pop(c, 1);
2148 com_addbyte(c, ROT_THREE);
2149 com_addbyte(c, STORE_SLICE+1);
2150 com_pop(c, 3);
2151 } else if (NCH(n) == 2) {
2152 com_node(c, CHILD(n, 1));
2153 com_addoparg(c, DUP_TOPX, 2);
2154 com_push(c, 2);
2155 com_addbyte(c, SLICE+2);
2156 com_pop(c, 1);
2157 com_node(c, augn);
2158 com_addbyte(c, opcode);
2159 com_pop(c, 1);
2160 com_addbyte(c, ROT_THREE);
2161 com_addbyte(c, STORE_SLICE+2);
2162 com_pop(c, 3);
2163 } else {
2164 com_node(c, CHILD(n, 0));
2165 com_node(c, CHILD(n, 2));
2166 com_addoparg(c, DUP_TOPX, 3);
2167 com_push(c, 3);
2168 com_addbyte(c, SLICE+3);
2169 com_pop(c, 2);
2170 com_node(c, augn);
2171 com_addbyte(c, opcode);
2172 com_pop(c, 1);
2173 com_addbyte(c, ROT_FOUR);
2174 com_addbyte(c, STORE_SLICE+3);
2175 com_pop(c, 4);
2176 }
2177}
2178
2179static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002180com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002181{
2182 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002183 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002184 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002185 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002186 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002187 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002188 }
2189 else {
2190 com_node(c, CHILD(n, 0));
2191 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002192 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002193 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002194 if (NCH(n) == 2) {
2195 com_generator_expression(c, n);
2196 return;
2197 }
2198
Guido van Rossumf10570b1995-07-07 22:53:21 +00002199 m = n;
2200 do {
2201 m = CHILD(m, 0);
2202 } while (NCH(m) == 1);
2203 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002204 /* f(lambda x: x[0] = 3) ends up getting parsed with
2205 * LHS test = lambda x: x[0], and RHS test = 3.
2206 * SF bug 132313 points out that complaining about a keyword
2207 * then is very confusing.
2208 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002209 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002210 TYPE(m) == lambdef ?
2211 "lambda cannot contain assignment" :
2212 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002213 }
2214 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002215 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002216 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002217 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002218 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002219 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002220 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002221 else if (*pkeywords == NULL) {
2222 c->c_errors++;
2223 Py_DECREF(v);
2224 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002225 if (PyDict_GetItem(*pkeywords, v) != NULL)
2226 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002227 "duplicate keyword argument");
2228 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002229 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002230 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002231 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002232 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002234 }
2235 }
2236 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002237}
2238
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002239static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002240com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002241{
2242 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002243 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002244 }
2245 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002246 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002247 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002248 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002249 int star_flag = 0;
2250 int starstar_flag = 0;
2251 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002252 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002253 na = 0;
2254 nk = 0;
2255 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002256 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002257 if (TYPE(ch) == STAR ||
2258 TYPE(ch) == DOUBLESTAR)
2259 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002260 if (ch->n_lineno != lineno) {
2261 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002262 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002263 }
2264 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002265 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002266 na++;
2267 else
2268 nk++;
2269 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002270 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002271 while (i < NCH(n)) {
2272 node *tok = CHILD(n, i);
2273 node *ch = CHILD(n, i+1);
2274 i += 3;
2275 switch (TYPE(tok)) {
2276 case STAR: star_flag = 1; break;
2277 case DOUBLESTAR: starstar_flag = 1; break;
2278 }
2279 com_node(c, ch);
2280 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002281 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002282 com_error(c, PyExc_SyntaxError,
2283 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002284 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002285 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002286 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002287 star_flag + (starstar_flag << 1);
2288 else
2289 opcode = CALL_FUNCTION;
2290 com_addoparg(c, opcode, na | (nk << 8));
2291 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002292 }
2293}
2294
2295static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002296com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002297{
2298 com_addopname(c, LOAD_ATTR, n);
2299}
2300
2301static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002302com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002303{
2304 int i=0;
2305 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002306 node *ch;
2307
2308 /* first argument */
2309 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002311 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002312 i++;
2313 }
2314 else {
2315 com_node(c, CHILD(n,i));
2316 i++;
2317 REQ(CHILD(n,i),COLON);
2318 i++;
2319 }
2320 /* second argument */
2321 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2322 com_node(c, CHILD(n,i));
2323 i++;
2324 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002325 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002326 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002327 com_push(c, 1);
2328 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002329 /* remaining arguments */
2330 for (; i < NCH(n); i++) {
2331 ns++;
2332 ch=CHILD(n,i);
2333 REQ(ch, sliceop);
2334 if (NCH(ch) == 1) {
2335 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002337 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002338 }
2339 else
2340 com_node(c, CHILD(ch,1));
2341 }
2342 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002343 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002344}
2345
2346static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002347com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002348{
2349 node *ch;
2350 REQ(n, subscript);
2351 ch = CHILD(n,0);
2352 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002353 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002354 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002355 com_push(c, 1);
2356 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002357 else {
2358 /* check for slice */
2359 if ((TYPE(ch) == COLON || NCH(n) > 1))
2360 com_sliceobj(c, n);
2361 else {
2362 REQ(ch, test);
2363 com_node(c, ch);
2364 }
2365 }
2366}
2367
2368static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002369com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002370{
2371 int i, op;
2372 REQ(n, subscriptlist);
2373 /* Check to make backward compatible slice behavior for '[i:j]' */
2374 if (NCH(n) == 1) {
2375 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002376 /* 'Basic' slice, should have exactly one colon. */
2377 if ((TYPE(CHILD(sub, 0)) == COLON
2378 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2379 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2380 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002381 switch (assigning) {
2382 case OP_DELETE:
2383 op = DELETE_SLICE;
2384 break;
2385 case OP_ASSIGN:
2386 op = STORE_SLICE;
2387 break;
2388 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002389 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002390 break;
2391 default:
2392 com_augassign_slice(c, sub, assigning, augn);
2393 return;
2394 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002395 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002396 if (op == STORE_SLICE)
2397 com_pop(c, 2);
2398 else if (op == DELETE_SLICE)
2399 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002400 return;
2401 }
2402 }
2403 /* Else normal subscriptlist. Compile each subscript. */
2404 for (i = 0; i < NCH(n); i += 2)
2405 com_subscript(c, CHILD(n, i));
2406 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002407 if (NCH(n) > 1) {
2408 i = (NCH(n)+1) / 2;
2409 com_addoparg(c, BUILD_TUPLE, i);
2410 com_pop(c, i-1);
2411 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002412 switch (assigning) {
2413 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002414 op = DELETE_SUBSCR;
2415 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002416 break;
2417 default:
2418 case OP_ASSIGN:
2419 op = STORE_SUBSCR;
2420 i = 3;
2421 break;
2422 case OP_APPLY:
2423 op = BINARY_SUBSCR;
2424 i = 1;
2425 break;
2426 }
2427 if (assigning > OP_APPLY) {
2428 com_addoparg(c, DUP_TOPX, 2);
2429 com_push(c, 2);
2430 com_addbyte(c, BINARY_SUBSCR);
2431 com_pop(c, 1);
2432 com_node(c, augn);
2433 com_addbyte(c, assigning);
2434 com_pop(c, 1);
2435 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002436 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002437 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002439}
2440
2441static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002442com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002443{
2444 REQ(n, trailer);
2445 switch (TYPE(CHILD(n, 0))) {
2446 case LPAR:
2447 com_call_function(c, CHILD(n, 1));
2448 break;
2449 case DOT:
2450 com_select_member(c, CHILD(n, 1));
2451 break;
2452 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002453 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002454 break;
2455 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002456 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002457 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002458 }
2459}
2460
2461static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002462com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002463{
2464 int i;
2465 REQ(n, power);
2466 com_atom(c, CHILD(n, 0));
2467 for (i = 1; i < NCH(n); i++) {
2468 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2469 com_factor(c, CHILD(n, i+1));
2470 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002471 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002472 break;
2473 }
2474 else
2475 com_apply_trailer(c, CHILD(n, i));
2476 }
2477}
2478
2479static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002480com_invert_constant(struct compiling *c, node *n)
2481{
2482 /* Compute the inverse of int and longs and use them directly,
2483 but be prepared to generate code for all other
2484 possibilities (invalid numbers, floats, complex).
2485 */
2486 PyObject *num, *inv = NULL;
2487 int i;
2488
2489 REQ(n, NUMBER);
2490 num = parsenumber(c, STR(n));
2491 if (num == NULL)
2492 i = 255;
2493 else {
2494 inv = PyNumber_Invert(num);
2495 if (inv == NULL) {
2496 PyErr_Clear();
2497 i = com_addconst(c, num);
2498 } else {
2499 i = com_addconst(c, inv);
2500 Py_DECREF(inv);
2501 }
2502 Py_DECREF(num);
2503 }
2504 com_addoparg(c, LOAD_CONST, i);
2505 com_push(c, 1);
2506 if (num != NULL && inv == NULL)
2507 com_addbyte(c, UNARY_INVERT);
2508}
2509
Tim Peters51e26512001-09-07 08:45:55 +00002510static int
2511is_float_zero(const char *p)
2512{
2513 int found_radix_point = 0;
2514 int ch;
2515 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2516 switch (ch) {
2517 case '0':
2518 /* no reason to believe it's not 0 -- continue */
2519 break;
2520
2521 case 'e': case 'E': case 'j': case 'J':
2522 /* If this was a hex constant, we already would have
2523 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2524 must be an exponent marker, and we haven't yet
2525 seen a non-zero digit, and it doesn't matter what
2526 the exponent is then. For 'j' or 'J' similarly,
2527 except that this is an imaginary 0 then. */
2528 return 1;
2529
2530 case '.':
2531 found_radix_point = 1;
2532 break;
2533
2534 default:
2535 return 0;
2536 }
2537 }
2538 return found_radix_point;
2539}
2540
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002541static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002542com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002543{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002544 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002545 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002546 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002547 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002548 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002549 approriate value as a constant. If the value is negative,
2550 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002551 negative in the 0th position -- unless we're doing unary minus
2552 of a floating zero! In that case the sign is significant, but
2553 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002554 */
2555 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002556 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002557 && TYPE((pfactor = CHILD(n, 1))) == factor
2558 && NCH(pfactor) == 1
2559 && TYPE((ppower = CHILD(pfactor, 0))) == power
2560 && NCH(ppower) == 1
2561 && TYPE((patom = CHILD(ppower, 0))) == atom
2562 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002563 && !(childtype == MINUS &&
2564 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002565 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002566 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002567 return;
2568 }
2569 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002570 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002571 if (s == NULL) {
2572 com_error(c, PyExc_MemoryError, "");
2573 com_addbyte(c, 255);
2574 return;
2575 }
2576 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002577 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002578 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002579 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002580 }
Tim Peters51e26512001-09-07 08:45:55 +00002581 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002582 }
2583 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002584 com_factor(c, CHILD(n, 1));
2585 com_addbyte(c, UNARY_POSITIVE);
2586 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002587 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002588 com_factor(c, CHILD(n, 1));
2589 com_addbyte(c, UNARY_NEGATIVE);
2590 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002591 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002592 com_factor(c, CHILD(n, 1));
2593 com_addbyte(c, UNARY_INVERT);
2594 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002595 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002596 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002597 }
2598}
2599
2600static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002601com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002602{
2603 int i;
2604 int op;
2605 REQ(n, term);
2606 com_factor(c, CHILD(n, 0));
2607 for (i = 2; i < NCH(n); i += 2) {
2608 com_factor(c, CHILD(n, i));
2609 switch (TYPE(CHILD(n, i-1))) {
2610 case STAR:
2611 op = BINARY_MULTIPLY;
2612 break;
2613 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002614 if (c->c_flags & CO_FUTURE_DIVISION)
2615 op = BINARY_TRUE_DIVIDE;
2616 else
2617 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002618 break;
2619 case PERCENT:
2620 op = BINARY_MODULO;
2621 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002622 case DOUBLESLASH:
2623 op = BINARY_FLOOR_DIVIDE;
2624 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002625 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002626 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002627 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002628 op = 255;
2629 }
2630 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002631 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002632 }
2633}
2634
2635static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002636com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002637{
2638 int i;
2639 int op;
2640 REQ(n, arith_expr);
2641 com_term(c, CHILD(n, 0));
2642 for (i = 2; i < NCH(n); i += 2) {
2643 com_term(c, CHILD(n, i));
2644 switch (TYPE(CHILD(n, i-1))) {
2645 case PLUS:
2646 op = BINARY_ADD;
2647 break;
2648 case MINUS:
2649 op = BINARY_SUBTRACT;
2650 break;
2651 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002652 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002653 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002654 op = 255;
2655 }
2656 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002657 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002658 }
2659}
2660
2661static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002662com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002663{
2664 int i;
2665 int op;
2666 REQ(n, shift_expr);
2667 com_arith_expr(c, CHILD(n, 0));
2668 for (i = 2; i < NCH(n); i += 2) {
2669 com_arith_expr(c, CHILD(n, i));
2670 switch (TYPE(CHILD(n, i-1))) {
2671 case LEFTSHIFT:
2672 op = BINARY_LSHIFT;
2673 break;
2674 case RIGHTSHIFT:
2675 op = BINARY_RSHIFT;
2676 break;
2677 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002678 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002679 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002680 op = 255;
2681 }
2682 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002683 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002684 }
2685}
2686
2687static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002688com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002689{
2690 int i;
2691 int op;
2692 REQ(n, and_expr);
2693 com_shift_expr(c, CHILD(n, 0));
2694 for (i = 2; i < NCH(n); i += 2) {
2695 com_shift_expr(c, CHILD(n, i));
2696 if (TYPE(CHILD(n, i-1)) == AMPER) {
2697 op = BINARY_AND;
2698 }
2699 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002700 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002701 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002702 op = 255;
2703 }
2704 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002705 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002706 }
2707}
2708
2709static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002710com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002711{
2712 int i;
2713 int op;
2714 REQ(n, xor_expr);
2715 com_and_expr(c, CHILD(n, 0));
2716 for (i = 2; i < NCH(n); i += 2) {
2717 com_and_expr(c, CHILD(n, i));
2718 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2719 op = BINARY_XOR;
2720 }
2721 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002722 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002723 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002724 op = 255;
2725 }
2726 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002727 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002728 }
2729}
2730
2731static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002732com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002733{
2734 int i;
2735 int op;
2736 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002737 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002738 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002739 com_xor_expr(c, CHILD(n, i));
2740 if (TYPE(CHILD(n, i-1)) == VBAR) {
2741 op = BINARY_OR;
2742 }
2743 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002744 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002745 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002746 op = 255;
2747 }
2748 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002749 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002750 }
2751}
2752
2753static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002754cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002755{
2756 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002757 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002758 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2759 if (NCH(n) == 1) {
2760 n = CHILD(n, 0);
2761 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002762 case LESS: return PyCmp_LT;
2763 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002764 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002765 case LESSEQUAL: return PyCmp_LE;
2766 case GREATEREQUAL: return PyCmp_GE;
2767 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2768 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2769 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 }
2771 }
2772 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002773 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002775 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002776 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002777 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002778 }
2779 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002780 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002781}
2782
2783static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002784com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002785{
2786 int i;
2787 enum cmp_op op;
2788 int anchor;
2789 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2790 com_expr(c, CHILD(n, 0));
2791 if (NCH(n) == 1)
2792 return;
2793
2794 /****************************************************************
2795 The following code is generated for all but the last
2796 comparison in a chain:
2797
2798 label: on stack: opcode: jump to:
2799
2800 a <code to load b>
2801 a, b DUP_TOP
2802 a, b, b ROT_THREE
2803 b, a, b COMPARE_OP
2804 b, 0-or-1 JUMP_IF_FALSE L1
2805 b, 1 POP_TOP
2806 b
2807
2808 We are now ready to repeat this sequence for the next
2809 comparison in the chain.
2810
2811 For the last we generate:
2812
2813 b <code to load c>
2814 b, c COMPARE_OP
2815 0-or-1
2816
2817 If there were any jumps to L1 (i.e., there was more than one
2818 comparison), we generate:
2819
2820 0-or-1 JUMP_FORWARD L2
2821 L1: b, 0 ROT_TWO
2822 0, b POP_TOP
2823 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002824 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002825 ****************************************************************/
2826
2827 anchor = 0;
2828
2829 for (i = 2; i < NCH(n); i += 2) {
2830 com_expr(c, CHILD(n, i));
2831 if (i+2 < NCH(n)) {
2832 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002833 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002834 com_addbyte(c, ROT_THREE);
2835 }
2836 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002837 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002838 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002839 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002840 }
2841 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002842 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002843 if (i+2 < NCH(n)) {
2844 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2845 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002846 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002847 }
2848 }
2849
2850 if (anchor) {
2851 int anchor2 = 0;
2852 com_addfwref(c, JUMP_FORWARD, &anchor2);
2853 com_backpatch(c, anchor);
2854 com_addbyte(c, ROT_TWO);
2855 com_addbyte(c, POP_TOP);
2856 com_backpatch(c, anchor2);
2857 }
2858}
2859
2860static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002861com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002862{
2863 REQ(n, not_test); /* 'not' not_test | comparison */
2864 if (NCH(n) == 1) {
2865 com_comparison(c, CHILD(n, 0));
2866 }
2867 else {
2868 com_not_test(c, CHILD(n, 1));
2869 com_addbyte(c, UNARY_NOT);
2870 }
2871}
2872
2873static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002874com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002875{
2876 int i;
2877 int anchor;
2878 REQ(n, and_test); /* not_test ('and' not_test)* */
2879 anchor = 0;
2880 i = 0;
2881 for (;;) {
2882 com_not_test(c, CHILD(n, i));
2883 if ((i += 2) >= NCH(n))
2884 break;
2885 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2886 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002887 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002888 }
2889 if (anchor)
2890 com_backpatch(c, anchor);
2891}
2892
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002893static int
2894com_make_closure(struct compiling *c, PyCodeObject *co)
2895{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002896 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002897 if (free == 0)
2898 return 0;
2899 for (i = 0; i < free; ++i) {
2900 /* Bypass com_addop_varname because it will generate
2901 LOAD_DEREF but LOAD_CLOSURE is needed.
2902 */
2903 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2904 int arg, reftype;
2905
2906 /* Special case: If a class contains a method with a
2907 free variable that has the same name as a method,
2908 the name will be considered free *and* local in the
2909 class. It should be handled by the closure, as
2910 well as by the normal name loookup logic.
2911 */
2912 reftype = get_ref_type(c, PyString_AS_STRING(name));
2913 if (reftype == CELL)
2914 arg = com_lookup_arg(c->c_cellvars, name);
2915 else /* (reftype == FREE) */
2916 arg = com_lookup_arg(c->c_freevars, name);
2917 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002918 fprintf(stderr, "lookup %s in %s %d %d\n"
2919 "freevars of %s: %s\n",
2920 PyObject_REPR(name),
2921 c->c_name,
2922 reftype, arg,
2923 PyString_AS_STRING(co->co_name),
2924 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002925 Py_FatalError("com_make_closure()");
2926 }
2927 com_addoparg(c, LOAD_CLOSURE, arg);
2928
2929 }
2930 com_push(c, free);
2931 return 1;
2932}
2933
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002934static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002935com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002936{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002937 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002938 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002939 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002940 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002941 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002942 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2943 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002944 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002945 if (co == NULL) {
2946 c->c_errors++;
2947 return;
2948 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002949 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002950 i = com_addconst(c, (PyObject *)co);
2951 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002952 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002953 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002954 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002955 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002956 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002957 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002958 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002959 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002960 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002961 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002962 else {
2963 int anchor = 0;
2964 int i = 0;
2965 for (;;) {
2966 com_and_test(c, CHILD(n, i));
2967 if ((i += 2) >= NCH(n))
2968 break;
2969 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2970 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002971 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002972 }
2973 if (anchor)
2974 com_backpatch(c, anchor);
2975 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002976}
2977
2978static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002979com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002980{
2981 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00002982 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002983 com_node(c, CHILD(n, 0));
2984 }
2985 else {
2986 int i;
2987 int len;
2988 len = (NCH(n) + 1) / 2;
2989 for (i = 0; i < NCH(n); i += 2)
2990 com_node(c, CHILD(n, i));
2991 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002992 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002993 }
2994}
2995
2996
2997/* Begin of assignment compilation */
2998
Thomas Wouters434d0822000-08-24 20:11:32 +00002999
3000static void
3001com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3002{
3003 com_addbyte(c, DUP_TOP);
3004 com_push(c, 1);
3005 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003006 com_node(c, augn);
3007 com_addbyte(c, opcode);
3008 com_pop(c, 1);
3009 com_addbyte(c, ROT_TWO);
3010 com_addopname(c, STORE_ATTR, n);
3011 com_pop(c, 2);
3012}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003013
3014static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003015com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003016{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003017 if (none_assignment_check(c, STR(n), assigning))
3018 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003019 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003020 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003021}
3022
3023static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003024com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003025{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003026 REQ(n, trailer);
3027 switch (TYPE(CHILD(n, 0))) {
3028 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003029 if (assigning == OP_DELETE)
3030 com_error(c, PyExc_SyntaxError,
3031 "can't delete function call");
3032 else
3033 com_error(c, PyExc_SyntaxError,
3034 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003035 break;
3036 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003037 if (assigning > OP_APPLY)
3038 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3039 else
3040 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003041 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003042 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003043 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003044 break;
3045 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003046 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003047 }
3048}
3049
3050static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003051com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003052{
3053 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003054 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3055 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003056 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003057 if (assigning) {
3058 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003059 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003060 com_push(c, i-1);
3061 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003062 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003063 com_assign(c, CHILD(n, i), assigning, NULL);
3064}
3065
3066static void
3067com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3068{
3069 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003070 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003071 com_push(c, 1);
3072 com_node(c, augn);
3073 com_addbyte(c, opcode);
3074 com_pop(c, 1);
3075 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076}
3077
3078static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003079com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080{
3081 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003082 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003083 if (assigning)
3084 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003085}
3086
3087static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003088com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003089{
3090 /* Loop to avoid trivial recursion */
3091 for (;;) {
3092 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003093
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003094 case exprlist:
3095 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003096 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003097 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003098 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003099 if (TYPE(CHILD(n, 1)) == gen_for) {
3100 com_error(c, PyExc_SystemError,
3101 "assign to generator expression not possible");
3102 return;
3103 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003104 if (assigning > OP_APPLY) {
3105 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003106 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003107 return;
3108 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003109 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003110 return;
3111 }
3112 n = CHILD(n, 0);
3113 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003114
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003115 case test:
3116 case and_test:
3117 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003119 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003120 case xor_expr:
3121 case and_expr:
3122 case shift_expr:
3123 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003124 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003125 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003126 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003127 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003128 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003129 return;
3130 }
3131 n = CHILD(n, 0);
3132 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003133
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003134 case power: /* atom trailer* ('**' power)*
3135 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003136 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003137 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003138 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 return;
3140 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003141 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 int i;
3143 com_node(c, CHILD(n, 0));
3144 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003145 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003146 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003147 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003148 return;
3149 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 com_apply_trailer(c, CHILD(n, i));
3151 } /* NB i is still alive */
3152 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003153 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003154 return;
3155 }
3156 n = CHILD(n, 0);
3157 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003158
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003159 case atom:
3160 switch (TYPE(CHILD(n, 0))) {
3161 case LPAR:
3162 n = CHILD(n, 1);
3163 if (TYPE(n) == RPAR) {
3164 /* XXX Should allow () = () ??? */
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 ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003167 return;
3168 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003169 if (assigning > OP_APPLY) {
3170 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003171 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003172 return;
3173 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 break;
3175 case LSQB:
3176 n = CHILD(n, 1);
3177 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003178 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003179 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003180 return;
3181 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003182 if (assigning > OP_APPLY) {
3183 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003184 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003185 return;
3186 }
3187 if (NCH(n) > 1
3188 && TYPE(CHILD(n, 1)) == list_for) {
3189 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003190 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003191 return;
3192 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003193 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003194 return;
3195 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003196 if (assigning > OP_APPLY)
3197 com_augassign_name(c, CHILD(n, 0),
3198 assigning, augn);
3199 else
3200 com_assign_name(c, CHILD(n, 0),
3201 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003202 return;
3203 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003204 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003205 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003206 return;
3207 }
3208 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003209
3210 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003211 com_error(c, PyExc_SyntaxError,
3212 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003213 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003214
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003215 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003216 com_error(c, PyExc_SystemError,
3217 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003219
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003220 }
3221 }
3222}
Guido van Rossum7c531111997-03-11 18:42:21 +00003223
Thomas Wouters434d0822000-08-24 20:11:32 +00003224static void
3225com_augassign(struct compiling *c, node *n)
3226{
3227 int opcode;
3228
3229 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3230 case '+': opcode = INPLACE_ADD; break;
3231 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003232 case '/':
3233 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3234 opcode = INPLACE_FLOOR_DIVIDE;
3235 else if (c->c_flags & CO_FUTURE_DIVISION)
3236 opcode = INPLACE_TRUE_DIVIDE;
3237 else
3238 opcode = INPLACE_DIVIDE;
3239 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003240 case '%': opcode = INPLACE_MODULO; break;
3241 case '<': opcode = INPLACE_LSHIFT; break;
3242 case '>': opcode = INPLACE_RSHIFT; break;
3243 case '&': opcode = INPLACE_AND; break;
3244 case '^': opcode = INPLACE_XOR; break;
3245 case '|': opcode = INPLACE_OR; break;
3246 case '*':
3247 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3248 opcode = INPLACE_POWER;
3249 else
3250 opcode = INPLACE_MULTIPLY;
3251 break;
3252 default:
3253 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3254 return;
3255 }
3256 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3257}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003258
3259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003260com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003261{
Thomas Wouters434d0822000-08-24 20:11:32 +00003262 REQ(n, expr_stmt);
3263 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003264 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003265 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003266 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003267 if (NCH(n) == 1) {
3268 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003269 if (c->c_interactive)
3270 com_addbyte(c, PRINT_EXPR);
3271 else
3272 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003273 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003274 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003275 else if (TYPE(CHILD(n,1)) == augassign)
3276 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003277 else {
3278 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003279 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003280 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003281 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003283 com_push(c, 1);
3284 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003285 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003286 }
3287 }
3288}
3289
3290static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003291com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003292{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003293 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003294 int i;
3295 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003296 if (Py_OptimizeFlag)
3297 return;
3298 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003299
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003300 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003301 raise AssertionError [, <message>]
3302
3303 where <message> is the second test, if present.
3304 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003305 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003306 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003307 com_addbyte(c, POP_TOP);
3308 com_pop(c, 1);
3309 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003310 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003311 com_push(c, 1);
3312 i = NCH(n)/2; /* Either 2 or 4 */
3313 if (i > 1)
3314 com_node(c, CHILD(n, 3));
3315 com_addoparg(c, RAISE_VARARGS, i);
3316 com_pop(c, i);
3317 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003318 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003319 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003320 com_addbyte(c, POP_TOP);
3321}
3322
3323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003324com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003325{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003326 int i = 1;
3327 node* stream = NULL;
3328
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003329 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003330
3331 /* are we using the extended print form? */
3332 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3333 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003334 com_node(c, stream);
3335 /* stack: [...] => [... stream] */
3336 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003337 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3338 i = 4;
3339 else
3340 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003341 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003342 for (; i < NCH(n); i += 2) {
3343 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003344 com_addbyte(c, DUP_TOP);
3345 /* stack: [stream] => [stream stream] */
3346 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003347 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003348 /* stack: [stream stream] => [stream stream obj] */
3349 com_addbyte(c, ROT_TWO);
3350 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003351 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003352 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003353 com_pop(c, 2);
3354 }
3355 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003356 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003357 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003358 com_addbyte(c, PRINT_ITEM);
3359 com_pop(c, 1);
3360 }
3361 }
3362 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003363 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003364 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003365 /* must pop the extra stream object off the stack */
3366 com_addbyte(c, POP_TOP);
3367 /* stack: [... stream] => [...] */
3368 com_pop(c, 1);
3369 }
3370 }
3371 else {
3372 if (stream != NULL) {
3373 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003374 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003375 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003376 com_pop(c, 1);
3377 }
3378 else
3379 com_addbyte(c, PRINT_NEWLINE);
3380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003381}
3382
3383static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003384com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003385{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003386 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003387 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003388 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003389 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003390 if (c->c_flags & CO_GENERATOR) {
3391 if (NCH(n) > 1) {
3392 com_error(c, PyExc_SyntaxError,
3393 "'return' with argument inside generator");
3394 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003395 }
3396 if (NCH(n) < 2) {
3397 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003398 com_push(c, 1);
3399 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003400 else
3401 com_node(c, CHILD(n, 1));
3402 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003403 com_pop(c, 1);
3404}
3405
3406static void
3407com_yield_stmt(struct compiling *c, node *n)
3408{
Tim Peters95c80f82001-06-23 02:07:08 +00003409 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003410 REQ(n, yield_stmt); /* 'yield' testlist */
3411 if (!c->c_infunction) {
3412 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3413 }
Tim Peters95c80f82001-06-23 02:07:08 +00003414
3415 for (i = 0; i < c->c_nblocks; ++i) {
3416 if (c->c_block[i] == SETUP_FINALLY) {
3417 com_error(c, PyExc_SyntaxError,
3418 "'yield' not allowed in a 'try' block "
3419 "with a 'finally' clause");
3420 return;
3421 }
3422 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003423 com_node(c, CHILD(n, 1));
3424 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003425 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003426}
3427
3428static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003429com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003430{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003431 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003432 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3433 if (NCH(n) > 1) {
3434 com_node(c, CHILD(n, 1));
3435 if (NCH(n) > 3) {
3436 com_node(c, CHILD(n, 3));
3437 if (NCH(n) > 5)
3438 com_node(c, CHILD(n, 5));
3439 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003440 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003441 i = NCH(n)/2;
3442 com_addoparg(c, RAISE_VARARGS, i);
3443 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003444}
3445
3446static void
Thomas Wouters52152252000-08-17 22:55:00 +00003447com_from_import(struct compiling *c, node *n)
3448{
3449 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3450 com_push(c, 1);
3451 if (NCH(n) > 1) {
3452 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3453 com_error(c, PyExc_SyntaxError, "invalid syntax");
3454 return;
3455 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003456 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003457 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003458 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003459 com_pop(c, 1);
3460}
3461
3462static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003463com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003464{
3465 int i;
3466 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003467 /* 'import' dotted_name (',' dotted_name)* |
3468 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003469 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003470 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003471 /* 'from' dotted_name 'import' ... */
3472 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003473
3474 if (TYPE(CHILD(n, 3)) == STAR) {
3475 tup = Py_BuildValue("(s)", "*");
3476 } else {
3477 tup = PyTuple_New((NCH(n) - 2)/2);
3478 for (i = 3; i < NCH(n); i += 2) {
3479 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003480 PyString_FromString(STR(
3481 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003482 }
3483 }
3484 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003485 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003486 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003487 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003488 if (TYPE(CHILD(n, 3)) == STAR)
3489 com_addbyte(c, IMPORT_STAR);
3490 else {
3491 for (i = 3; i < NCH(n); i += 2)
3492 com_from_import(c, CHILD(n, i));
3493 com_addbyte(c, POP_TOP);
3494 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003495 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003496 }
3497 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003498 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003499 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003500 node *subn = CHILD(n, i);
3501 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003502 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003503 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003504 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003505 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003506 int j;
3507 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003508 com_error(c, PyExc_SyntaxError,
3509 "invalid syntax");
3510 return;
3511 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003512 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3513 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003514 CHILD(CHILD(subn, 0),
3515 j));
3516 com_addop_varname(c, VAR_STORE,
3517 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003518 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003519 com_addop_varname(c, VAR_STORE,
3520 STR(CHILD(CHILD(subn, 0),
3521 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003522 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 }
3524 }
3525}
3526
3527static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003528com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003529{
3530 REQ(n, exec_stmt);
3531 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3532 com_node(c, CHILD(n, 1));
3533 if (NCH(n) >= 4)
3534 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003535 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003536 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003537 com_push(c, 1);
3538 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003539 if (NCH(n) >= 6)
3540 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003541 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003542 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003543 com_push(c, 1);
3544 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003545 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003547}
3548
Guido van Rossum7c531111997-03-11 18:42:21 +00003549static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003550is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003551{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003552 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003553 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003554 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003555
3556 /* Label to avoid tail recursion */
3557 next:
3558 switch (TYPE(n)) {
3559
3560 case suite:
3561 if (NCH(n) == 1) {
3562 n = CHILD(n, 0);
3563 goto next;
3564 }
3565 /* Fall through */
3566 case file_input:
3567 for (i = 0; i < NCH(n); i++) {
3568 node *ch = CHILD(n, i);
3569 if (TYPE(ch) == stmt) {
3570 n = ch;
3571 goto next;
3572 }
3573 }
3574 break;
3575
3576 case stmt:
3577 case simple_stmt:
3578 case small_stmt:
3579 n = CHILD(n, 0);
3580 goto next;
3581
3582 case expr_stmt:
3583 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003584 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003585 case test:
3586 case and_test:
3587 case not_test:
3588 case comparison:
3589 case expr:
3590 case xor_expr:
3591 case and_expr:
3592 case shift_expr:
3593 case arith_expr:
3594 case term:
3595 case factor:
3596 case power:
3597 case atom:
3598 if (NCH(n) == 1) {
3599 n = CHILD(n, 0);
3600 goto next;
3601 }
3602 break;
3603
3604 case NAME:
3605 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3606 return 1;
3607 break;
3608
3609 case NUMBER:
3610 v = parsenumber(c, STR(n));
3611 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003612 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003613 break;
3614 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003615 i = PyObject_IsTrue(v);
3616 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003617 return i == 0;
3618
3619 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003620 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003621 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003622 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003623 break;
3624 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003625 i = PyObject_IsTrue(v);
3626 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003627 return i == 0;
3628
3629 }
3630 return 0;
3631}
3632
Tim Peters08a898f2001-06-28 01:52:22 +00003633
3634/* Look under n for a return stmt with an expression.
3635 * This hack is used to find illegal returns under "if 0:" blocks in
3636 * functions already known to be generators (as determined by the symtable
3637 * pass).
3638 * Return the offending return node if found, else NULL.
3639 */
3640static node *
3641look_for_offending_return(node *n)
3642{
3643 int i;
3644
3645 for (i = 0; i < NCH(n); ++i) {
3646 node *kid = CHILD(n, i);
3647
3648 switch (TYPE(kid)) {
3649 case classdef:
3650 case funcdef:
3651 case lambdef:
3652 /* Stuff in nested functions & classes doesn't
3653 affect the code block we started in. */
3654 return NULL;
3655
3656 case return_stmt:
3657 if (NCH(kid) > 1)
3658 return kid;
3659 break;
3660
3661 default: {
3662 node *bad = look_for_offending_return(kid);
3663 if (bad != NULL)
3664 return bad;
3665 }
3666 }
3667 }
3668
3669 return NULL;
3670}
3671
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003672static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003673com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003674{
3675 int i;
3676 int anchor = 0;
3677 REQ(n, if_stmt);
3678 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3679 for (i = 0; i+3 < NCH(n); i+=4) {
3680 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003681 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003682 if (is_constant_false(c, ch)) {
3683 /* We're going to skip this block. However, if this
3684 is a generator, we have to check the dead code
3685 anyway to make sure there aren't any return stmts
3686 with expressions, in the same scope. */
3687 if (c->c_flags & CO_GENERATOR) {
3688 node *p = look_for_offending_return(n);
3689 if (p != NULL) {
3690 int savelineno = c->c_lineno;
3691 c->c_lineno = p->n_lineno;
3692 com_error(c, PyExc_SyntaxError,
3693 "'return' with argument "
3694 "inside generator");
3695 c->c_lineno = savelineno;
3696 }
3697 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003698 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003699 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003700 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003701 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003702 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003703 com_addfwref(c, JUMP_IF_FALSE, &a);
3704 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003705 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003706 com_node(c, CHILD(n, i+3));
3707 com_addfwref(c, JUMP_FORWARD, &anchor);
3708 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003709 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003710 com_addbyte(c, POP_TOP);
3711 }
3712 if (i+2 < NCH(n))
3713 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003714 if (anchor)
3715 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003716}
3717
3718static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003719com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003720{
3721 int break_anchor = 0;
3722 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003723 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003724 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3725 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003726 block_push(c, SETUP_LOOP);
3727 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003728 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003729 com_node(c, CHILD(n, 1));
3730 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3731 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003732 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003733 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003735 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003736 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3737 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003738 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003739 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740 com_addbyte(c, POP_TOP);
3741 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003742 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003743 if (NCH(n) > 4)
3744 com_node(c, CHILD(n, 6));
3745 com_backpatch(c, break_anchor);
3746}
3747
3748static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003749com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003750{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003751 int break_anchor = 0;
3752 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003753 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003754 REQ(n, for_stmt);
3755 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3756 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003757 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003759 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003760 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003761 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003762 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003764 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003765 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003766 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003767 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003768 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3769 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003770 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003771 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003772 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003773 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774 if (NCH(n) > 8)
3775 com_node(c, CHILD(n, 8));
3776 com_backpatch(c, break_anchor);
3777}
3778
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003779/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003780
3781 SETUP_FINALLY L
3782 <code for S>
3783 POP_BLOCK
3784 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003785 L: <code for Sf>
3786 END_FINALLY
3787
3788 The special instructions use the block stack. Each block
3789 stack entry contains the instruction that created it (here
3790 SETUP_FINALLY), the level of the value stack at the time the
3791 block stack entry was created, and a label (here L).
3792
3793 SETUP_FINALLY:
3794 Pushes the current value stack level and the label
3795 onto the block stack.
3796 POP_BLOCK:
3797 Pops en entry from the block stack, and pops the value
3798 stack until its level is the same as indicated on the
3799 block stack. (The label is ignored.)
3800 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003801 Pops a variable number of entries from the *value* stack
3802 and re-raises the exception they specify. The number of
3803 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003804
3805 The block stack is unwound when an exception is raised:
3806 when a SETUP_FINALLY entry is found, the exception is pushed
3807 onto the value stack (and the exception condition is cleared),
3808 and the interpreter jumps to the label gotten from the block
3809 stack.
3810
3811 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003812 (The contents of the value stack is shown in [], with the top
3813 at the right; 'tb' is trace-back info, 'val' the exception's
3814 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003815
3816 Value stack Label Instruction Argument
3817 [] SETUP_EXCEPT L1
3818 [] <code for S>
3819 [] POP_BLOCK
3820 [] JUMP_FORWARD L0
3821
Guido van Rossum3f5da241990-12-20 15:06:42 +00003822 [tb, val, exc] L1: DUP )
3823 [tb, val, exc, exc] <evaluate E1> )
3824 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3825 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3826 [tb, val, exc, 1] POP )
3827 [tb, val, exc] POP
3828 [tb, val] <assign to V1> (or POP if no V1)
3829 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003830 [] <code for S1>
3831 JUMP_FORWARD L0
3832
Guido van Rossum3f5da241990-12-20 15:06:42 +00003833 [tb, val, exc, 0] L2: POP
3834 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003835 .............................etc.......................
3836
Guido van Rossum3f5da241990-12-20 15:06:42 +00003837 [tb, val, exc, 0] Ln+1: POP
3838 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003839
3840 [] L0: <next statement>
3841
3842 Of course, parts are not generated if Vi or Ei is not present.
3843*/
3844
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003845static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003846com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003847{
3848 int except_anchor = 0;
3849 int end_anchor = 0;
3850 int else_anchor = 0;
3851 int i;
3852 node *ch;
3853
3854 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3855 block_push(c, SETUP_EXCEPT);
3856 com_node(c, CHILD(n, 2));
3857 com_addbyte(c, POP_BLOCK);
3858 block_pop(c, SETUP_EXCEPT);
3859 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3860 com_backpatch(c, except_anchor);
3861 for (i = 3;
3862 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3863 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003864 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003865 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003866 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003867 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003868 break;
3869 }
3870 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003871 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003872 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003873 if (NCH(ch) > 1) {
3874 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003875 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003876 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003877 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003878 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003879 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3880 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003881 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003882 }
3883 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003884 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003885 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003886 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003887 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003888 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003889 com_pop(c, 1);
3890 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003891 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003892 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003893 com_node(c, CHILD(n, i+2));
3894 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3895 if (except_anchor) {
3896 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003897 /* We come in with [tb, val, exc, 0] on the
3898 stack; one pop and it's the same as
3899 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003900 com_addbyte(c, POP_TOP);
3901 }
3902 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003903 /* We actually come in here with [tb, val, exc] but the
3904 END_FINALLY will zap those and jump around.
3905 The c_stacklevel does not reflect them so we need not pop
3906 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003907 com_addbyte(c, END_FINALLY);
3908 com_backpatch(c, else_anchor);
3909 if (i < NCH(n))
3910 com_node(c, CHILD(n, i+2));
3911 com_backpatch(c, end_anchor);
3912}
3913
3914static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003915com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003916{
3917 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003918 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003919
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003920 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3921 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003922 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003923 com_addbyte(c, POP_BLOCK);
3924 block_pop(c, SETUP_FINALLY);
3925 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003926 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003927 /* While the generated code pushes only one item,
3928 the try-finally handling can enter here with
3929 up to three items. OK, here are the details:
3930 3 for an exception, 2 for RETURN, 1 for BREAK. */
3931 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003932 com_backpatch(c, finally_anchor);
3933 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003934 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003935 com_node(c, ch);
3936 com_addbyte(c, END_FINALLY);
3937 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003938 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003939}
3940
3941static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003942com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003943{
3944 REQ(n, try_stmt);
3945 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3946 | 'try' ':' suite 'finally' ':' suite */
3947 if (TYPE(CHILD(n, 3)) != except_clause)
3948 com_try_finally(c, n);
3949 else
3950 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003951}
3952
Guido van Rossum8b993a91997-01-17 21:04:03 +00003953static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003954get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003955{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003956 int i;
3957
Guido van Rossum8b993a91997-01-17 21:04:03 +00003958 /* Label to avoid tail recursion */
3959 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003960 switch (TYPE(n)) {
3961
3962 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003963 if (NCH(n) == 1) {
3964 n = CHILD(n, 0);
3965 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003966 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003967 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003968 case file_input:
3969 for (i = 0; i < NCH(n); i++) {
3970 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003971 if (TYPE(ch) == stmt) {
3972 n = ch;
3973 goto next;
3974 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003975 }
3976 break;
3977
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003978 case stmt:
3979 case simple_stmt:
3980 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003981 n = CHILD(n, 0);
3982 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003983
3984 case expr_stmt:
3985 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003986 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003987 case test:
3988 case and_test:
3989 case not_test:
3990 case comparison:
3991 case expr:
3992 case xor_expr:
3993 case and_expr:
3994 case shift_expr:
3995 case arith_expr:
3996 case term:
3997 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00003998 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003999 if (NCH(n) == 1) {
4000 n = CHILD(n, 0);
4001 goto next;
4002 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004003 break;
4004
4005 case atom:
4006 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004007 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004008 break;
4009
4010 }
4011 return NULL;
4012}
4013
Guido van Rossum79f25d91997-04-29 20:08:16 +00004014static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004015get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004016{
Guido van Rossum541563e1999-01-28 15:08:09 +00004017 /* Don't generate doc-strings if run with -OO */
4018 if (Py_OptimizeFlag > 1)
4019 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004020 n = get_rawdocstring(n);
4021 if (n == NULL)
4022 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004023 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004024}
4025
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004026static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004027com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004028{
4029 REQ(n, suite);
4030 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4031 if (NCH(n) == 1) {
4032 com_node(c, CHILD(n, 0));
4033 }
4034 else {
4035 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004036 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004037 node *ch = CHILD(n, i);
4038 if (TYPE(ch) == stmt)
4039 com_node(c, ch);
4040 }
4041 }
4042}
4043
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004044/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004045static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004046com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004047{
4048 int i = c->c_nblocks;
4049 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4050 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4051 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004052 else if (i <= 0) {
4053 /* at the outer level */
4054 com_error(c, PyExc_SyntaxError,
4055 "'continue' not properly in loop");
4056 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004057 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004058 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004059 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004060 if (c->c_block[j] == SETUP_LOOP)
4061 break;
4062 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004063 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004064 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004065 for (; i > j; --i) {
4066 if (c->c_block[i] == SETUP_EXCEPT ||
4067 c->c_block[i] == SETUP_FINALLY) {
4068 com_addoparg(c, CONTINUE_LOOP,
4069 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004070 return;
4071 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004072 if (c->c_block[i] == END_FINALLY) {
4073 com_error(c, PyExc_SyntaxError,
4074 "'continue' not supported inside 'finally' clause");
4075 return;
4076 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004077 }
4078 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004079 com_error(c, PyExc_SyntaxError,
4080 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004081 }
4082 /* XXX Could allow it inside a 'finally' clause
4083 XXX if we could pop the exception still on the stack */
4084}
4085
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004086/* Return the number of default values in the argument list.
4087
4088 If a non-default argument follows a default argument, set an
4089 exception and return -1.
4090*/
4091
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004092static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004093com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004094{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004095 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004096 if (TYPE(n) == lambdef) {
4097 /* lambdef: 'lambda' [varargslist] ':' test */
4098 n = CHILD(n, 1);
4099 }
4100 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004101 REQ(n, funcdef);
4102 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4103 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004104 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4105 n = CHILD(n, 1);
4106 }
4107 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004108 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004109 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004110 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004111 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4112 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004113 ndefs = 0;
4114 for (i = 0; i < nch; i++) {
4115 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004116 if (TYPE(CHILD(n, i)) == STAR ||
4117 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004118 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004119 i++;
4120 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004121 t = RPAR; /* Anything except EQUAL or COMMA */
4122 else
4123 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004124 if (t == EQUAL) {
4125 i++;
4126 ndefs++;
4127 com_node(c, CHILD(n, i));
4128 i++;
4129 if (i >= nch)
4130 break;
4131 t = TYPE(CHILD(n, i));
4132 }
4133 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004134 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004135 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004136 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004137 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004138 return -1;
4139 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004140 }
4141 if (t != COMMA)
4142 break;
4143 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004144 return ndefs;
4145}
4146
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004147static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004148com_decorator_name(struct compiling *c, node *n)
4149{
4150 /* dotted_name: NAME ('.' NAME)* */
4151
4152 int i, nch;
4153 node *varname;
4154
4155 REQ(n, dotted_name);
4156 nch = NCH(n);
4157 assert(nch >= 1 && nch % 2 == 1);
4158
4159 varname = CHILD(n, 0);
4160 REQ(varname, NAME);
4161 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004162 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004163
4164 for (i = 1; i < nch; i += 2) {
4165 node *attrname;
4166
4167 REQ(CHILD(n, i), DOT);
4168
4169 attrname = CHILD(n, i + 1);
4170 REQ(attrname, NAME);
4171 com_addop_name(c, LOAD_ATTR, STR(attrname));
4172 }
4173}
4174
4175static void
4176com_decorator(struct compiling *c, node *n)
4177{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004178 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004179 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004180 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004181 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004182 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004183 com_decorator_name(c, CHILD(n, 1));
4184
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004185 if (nch > 3) {
4186 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004187 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004188 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004189 com_call_function(c, CHILD(n, 3));
4190 }
4191}
4192
4193static int
4194com_decorators(struct compiling *c, node *n)
4195{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004196 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004197
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004198 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004199 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004200 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004201
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004202 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004203 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004204 REQ(ch, decorator);
4205
4206 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004207 }
4208
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004209 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004210}
4211
4212static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004213com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004214{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004215 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004216 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004217
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004218 REQ(n, funcdef);
4219 /* -6 -5 -4 -3 -2 -1
4220 funcdef: [decorators] 'def' NAME parameters ':' suite */
4221
4222 if (NCH(n) == 6)
4223 ndecorators = com_decorators(c, CHILD(n, 0));
4224 else
4225 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004226
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004227 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004228 if (ndefs < 0)
4229 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004230 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004231 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004232 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004233 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004234 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004235 c->c_errors++;
4236 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004237 int closure = com_make_closure(c, (PyCodeObject *)co);
4238 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004239 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004240 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004241 if (closure)
4242 com_addoparg(c, MAKE_CLOSURE, ndefs);
4243 else
4244 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004245 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004246
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004247 while (ndecorators > 0) {
4248 com_addoparg(c, CALL_FUNCTION, 1);
4249 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004250 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004251 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004252
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004253 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004254 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004255 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004256 }
4257}
4258
4259static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004260com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004261{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004262 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004263 REQ(n, testlist);
4264 /* testlist: test (',' test)* [','] */
4265 for (i = 0; i < NCH(n); i += 2)
4266 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004267 i = (NCH(n)+1) / 2;
4268 com_addoparg(c, BUILD_TUPLE, i);
4269 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004270}
4271
4272static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004273com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004274{
Guido van Rossum25831651993-05-19 14:50:45 +00004275 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004276 PyObject *v;
4277 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004278 char *name;
4279
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004280 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004281 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004282 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004283 c->c_errors++;
4284 return;
4285 }
4286 /* Push the class name on the stack */
4287 i = com_addconst(c, v);
4288 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004289 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004290 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004291 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004292 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004293 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004294 com_push(c, 1);
4295 }
Guido van Rossum25831651993-05-19 14:50:45 +00004296 else
4297 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004298 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004299 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004300 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004301 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004302 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004303 c->c_errors++;
4304 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004305 int closure = com_make_closure(c, co);
4306 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004307 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004308 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004309 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004310 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004311 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004312 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004313 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004314 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004315 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004316 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004317 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004318 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004319 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004320 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004321}
4322
4323static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004324com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004325{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004326 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004327 if (c->c_errors)
4328 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004329 switch (TYPE(n)) {
4330
4331 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004332
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004333 case funcdef:
4334 com_funcdef(c, n);
4335 break;
4336 case classdef:
4337 com_classdef(c, n);
4338 break;
4339
4340 /* Trivial parse tree nodes */
4341
4342 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004343 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004344 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004345 n = CHILD(n, 0);
4346 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004347
4348 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004349 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004350 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004351 {
4352 int i;
4353 for (i = 0; i < NCH(n)-1; i += 2)
4354 com_node(c, CHILD(n, i));
4355 }
4356 break;
4357
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004358 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004359 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004360 n = CHILD(n, 0);
4361 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004362
4363 /* Statement nodes */
4364
4365 case expr_stmt:
4366 com_expr_stmt(c, n);
4367 break;
4368 case print_stmt:
4369 com_print_stmt(c, n);
4370 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004371 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004372 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004373 break;
4374 case pass_stmt:
4375 break;
4376 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004377 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004378 com_error(c, PyExc_SyntaxError,
4379 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004380 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004381 com_addbyte(c, BREAK_LOOP);
4382 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004383 case continue_stmt:
4384 com_continue_stmt(c, n);
4385 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004386 case return_stmt:
4387 com_return_stmt(c, n);
4388 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004389 case yield_stmt:
4390 com_yield_stmt(c, n);
4391 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004392 case raise_stmt:
4393 com_raise_stmt(c, n);
4394 break;
4395 case import_stmt:
4396 com_import_stmt(c, n);
4397 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004398 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004399 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004400 case exec_stmt:
4401 com_exec_stmt(c, n);
4402 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004403 case assert_stmt:
4404 com_assert_stmt(c, n);
4405 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004406 case if_stmt:
4407 com_if_stmt(c, n);
4408 break;
4409 case while_stmt:
4410 com_while_stmt(c, n);
4411 break;
4412 case for_stmt:
4413 com_for_stmt(c, n);
4414 break;
4415 case try_stmt:
4416 com_try_stmt(c, n);
4417 break;
4418 case suite:
4419 com_suite(c, n);
4420 break;
4421
4422 /* Expression nodes */
4423
4424 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004425 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004426 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004427 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004428 break;
4429 case test:
4430 com_test(c, n);
4431 break;
4432 case and_test:
4433 com_and_test(c, n);
4434 break;
4435 case not_test:
4436 com_not_test(c, n);
4437 break;
4438 case comparison:
4439 com_comparison(c, n);
4440 break;
4441 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004442 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004443 break;
4444 case expr:
4445 com_expr(c, n);
4446 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004447 case xor_expr:
4448 com_xor_expr(c, n);
4449 break;
4450 case and_expr:
4451 com_and_expr(c, n);
4452 break;
4453 case shift_expr:
4454 com_shift_expr(c, n);
4455 break;
4456 case arith_expr:
4457 com_arith_expr(c, n);
4458 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004459 case term:
4460 com_term(c, n);
4461 break;
4462 case factor:
4463 com_factor(c, n);
4464 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004465 case power:
4466 com_power(c, n);
4467 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004468 case atom:
4469 com_atom(c, n);
4470 break;
4471
4472 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004473 com_error(c, PyExc_SystemError,
4474 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004475 }
4476}
4477
Tim Petersdbd9ba62000-07-09 03:09:57 +00004478static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004479
4480static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004481com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004482{
4483 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4484 if (TYPE(CHILD(n, 0)) == LPAR)
4485 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004486 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004487 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004488 com_pop(c, 1);
4489 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004490}
4491
4492static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004493com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004494{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004495 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004496 if (NCH(n) == 1) {
4497 com_fpdef(c, CHILD(n, 0));
4498 }
4499 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004500 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004501 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004502 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503 for (i = 0; i < NCH(n); i += 2)
4504 com_fpdef(c, CHILD(n, i));
4505 }
4506}
4507
4508static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004509com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004510{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004511 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004512 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004513 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004514 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004515 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004516 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004517 nch = NCH(n);
4518 /* Enter all arguments in table of locals */
4519 for (i = 0, narg = 0; i < nch; i++) {
4520 node *ch = CHILD(n, i);
4521 node *fp;
4522 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004523 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004524 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4525 fp = CHILD(ch, 0);
4526 if (TYPE(fp) != NAME) {
4527 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4528 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004529 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004530 narg++;
4531 /* all name updates handled by symtable */
4532 if (++i >= nch)
4533 break;
4534 ch = CHILD(n, i);
4535 if (TYPE(ch) == EQUAL)
4536 i += 2;
4537 else
4538 REQ(ch, COMMA);
4539 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004540 if (complex) {
4541 /* Generate code for complex arguments only after
4542 having counted the simple arguments */
4543 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004544 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004545 node *ch = CHILD(n, i);
4546 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004547 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004548 break;
4549 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4550 fp = CHILD(ch, 0);
4551 if (TYPE(fp) != NAME) {
4552 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004553 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004554 com_fpdef(c, ch);
4555 }
4556 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004557 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004558 break;
4559 ch = CHILD(n, i);
4560 if (TYPE(ch) == EQUAL)
4561 i += 2;
4562 else
4563 REQ(ch, COMMA);
4564 }
4565 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004566}
4567
4568static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004569com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004570{
4571 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004572 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004573 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004574 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004575 if (doc != NULL) {
4576 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004577 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004578 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004579 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004580 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004581 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004582 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004583 for (i = 0; i < NCH(n); i++) {
4584 node *ch = CHILD(n, i);
4585 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4586 com_node(c, ch);
4587 }
4588}
4589
4590/* Top-level compile-node interface */
4591
4592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004593compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004595 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004596 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004597 REQ(n, funcdef);
4598 /* -6 -5 -4 -3 -2 -1
4599 funcdef: [decorators] 'def' NAME parameters ':' suite */
4600 c->c_name = STR(RCHILD(n, -4));
4601 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004602 if (doc != NULL) {
4603 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004604 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004605 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004606 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004607 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004608 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004609 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004610 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004611 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004612 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004613 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004614 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004615 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004616 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4617 com_push(c, 1);
4618 com_addbyte(c, RETURN_VALUE);
4619 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004620}
4621
4622static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004623compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004624{
Guido van Rossum590baa41993-11-30 13:40:46 +00004625 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004626 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004627 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004628
4629 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004630 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004631 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004632 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004633 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004634 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004635 else
4636 ch = CHILD(n, 2);
4637 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004638 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004639 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004640}
4641
4642static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004643compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004644{
4645 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004646 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004647 REQ(n, classdef);
4648 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4649 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004650 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004651 /* Initialize local __module__ from global __name__ */
4652 com_addop_name(c, LOAD_GLOBAL, "__name__");
4653 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004654 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004655 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004656 if (doc != NULL) {
4657 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004658 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004659 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004660 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004661 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004662 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004663 }
4664 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004665 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004666 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004667 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004668 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004669 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004670 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004671 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004672}
4673
4674static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004675compile_generator_expression(struct compiling *c, node *n)
4676{
4677 /* testlist_gexp: test gen_for */
4678 /* argument: test gen_for */
4679 REQ(CHILD(n, 0), test);
4680 REQ(CHILD(n, 1), gen_for);
4681
4682 c->c_name = "<generator expression>";
4683 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4684
4685 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4686 com_push(c, 1);
4687 com_addbyte(c, RETURN_VALUE);
4688 com_pop(c, 1);
4689}
4690
4691static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004692compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004693{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004694 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004695
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004696 switch (TYPE(n)) {
4697
Guido van Rossum4c417781991-01-21 16:09:22 +00004698 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004699 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004700 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004701 n = CHILD(n, 0);
4702 if (TYPE(n) != NEWLINE)
4703 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004704 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004705 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4706 com_push(c, 1);
4707 com_addbyte(c, RETURN_VALUE);
4708 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004709 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004710 break;
4711
Guido van Rossum4c417781991-01-21 16:09:22 +00004712 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004713 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004714 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004715 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4716 com_push(c, 1);
4717 com_addbyte(c, RETURN_VALUE);
4718 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004719 break;
4720
Guido van Rossum590baa41993-11-30 13:40:46 +00004721 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004722 com_node(c, CHILD(n, 0));
4723 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004724 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004725 break;
4726
Guido van Rossum590baa41993-11-30 13:40:46 +00004727 case lambdef: /* anonymous function definition */
4728 compile_lambdef(c, n);
4729 break;
4730
Guido van Rossum4c417781991-01-21 16:09:22 +00004731 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004732 compile_funcdef(c, n);
4733 break;
4734
Guido van Rossum4c417781991-01-21 16:09:22 +00004735 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004736 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004737 break;
4738
Raymond Hettinger354433a2004-05-19 08:20:33 +00004739 case testlist_gexp: /* A generator expression */
4740 case argument: /* A generator expression */
4741 compile_generator_expression(c, n);
4742 break;
4743
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004744 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004745 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004746 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004747 }
4748}
4749
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004750static PyObject *
4751dict_keys_inorder(PyObject *dict, int offset)
4752{
4753 PyObject *tuple, *k, *v;
4754 int i, pos = 0, size = PyDict_Size(dict);
4755
4756 tuple = PyTuple_New(size);
4757 if (tuple == NULL)
4758 return NULL;
4759 while (PyDict_Next(dict, &pos, &k, &v)) {
4760 i = PyInt_AS_LONG(v);
4761 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004762 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004763 PyTuple_SET_ITEM(tuple, i - offset, k);
4764 }
4765 return tuple;
4766}
4767
Guido van Rossum79f25d91997-04-29 20:08:16 +00004768PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004769PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004770{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004771 return PyNode_CompileFlags(n, filename, NULL);
4772}
4773
4774PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004775PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004776{
4777 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004778}
4779
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004780struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004781PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004782{
4783 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004784 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004785
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004786 ff = PyNode_Future(n, filename);
4787 if (ff == NULL)
4788 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004789 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004790 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004791 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004792 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004793 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004794 return st;
4795}
4796
Guido van Rossum79f25d91997-04-29 20:08:16 +00004797static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004798icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004799{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004800 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004801}
4802
Guido van Rossum79f25d91997-04-29 20:08:16 +00004803static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004804jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004805 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004806{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004807 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004808 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004809 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004810 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004811 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4812 sc.c_encoding = "utf-8";
4813 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004814 sc.c_encoding = STR(n);
4815 n = CHILD(n, 0);
4816 } else {
4817 sc.c_encoding = NULL;
4818 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004819 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004820 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004821 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004822 /* c_symtable still points to parent's symbols */
4823 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004824 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004825 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004826 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004827 if (base->c_encoding != NULL) {
4828 assert(sc.c_encoding == NULL);
4829 sc.c_encoding = base->c_encoding;
4830 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004831 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004832 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004833 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004834 if (sc.c_future == NULL) {
4835 com_free(&sc);
4836 return NULL;
4837 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004838 if (flags) {
4839 int merged = sc.c_future->ff_features |
4840 flags->cf_flags;
4841 sc.c_future->ff_features = merged;
4842 flags->cf_flags = merged;
4843 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004844 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4845 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004846 com_free(&sc);
4847 return NULL;
4848 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004849 /* reset symbol table for second pass */
4850 sc.c_symtable->st_nscopes = 1;
4851 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004852 }
4853 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004854 if (symtable_load_symbols(&sc) < 0) {
4855 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004856 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004857 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004858 compile_node(&sc, n);
4859 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004860 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004861 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004862 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004863 consts = PyList_AsTuple(sc.c_consts);
4864 names = PyList_AsTuple(sc.c_names);
4865 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004866 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4867 freevars = dict_keys_inorder(sc.c_freevars,
4868 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004869 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004870 name = PyString_InternFromString(sc.c_name);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00004871 code = optimize_code(sc.c_code, consts, names, sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004872 if (!PyErr_Occurred())
4873 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004874 sc.c_nlocals,
4875 sc.c_maxstacklevel,
4876 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004877 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004878 consts,
4879 names,
4880 varnames,
4881 freevars,
4882 cellvars,
4883 filename,
4884 name,
4885 sc.c_firstlineno,
4886 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004887 Py_XDECREF(consts);
4888 Py_XDECREF(names);
4889 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004890 Py_XDECREF(freevars);
4891 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004892 Py_XDECREF(filename);
4893 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004894 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004895 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004896 else if (!PyErr_Occurred()) {
4897 /* This could happen if someone called PyErr_Clear() after an
4898 error was reported above. That's not supposed to happen,
4899 but I just plugged one case and I'm not sure there can't be
4900 others. In that case, raise SystemError so that at least
4901 it gets reported instead dumping core. */
4902 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4903 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004904 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004905 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004906 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004907 sc.c_symtable = NULL;
4908 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004909 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004910 return co;
4911}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004912
4913int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004914PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004915{
4916 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004917 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004918 int line = co->co_firstlineno;
4919 int addr = 0;
4920 while (--size >= 0) {
4921 addr += *p++;
4922 if (addr > addrq)
4923 break;
4924 line += *p++;
4925 }
4926 return line;
4927}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004929/* The test for LOCAL must come before the test for FREE in order to
4930 handle classes where name is both local and free. The local var is
4931 a method and the free var is a free var referenced within a method.
4932*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004933
4934static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004935get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004936{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004937 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004938 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004939
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004940 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4941 return CELL;
4942 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4943 return LOCAL;
4944 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4945 return FREE;
4946 v = PyDict_GetItemString(c->c_globals, name);
4947 if (v) {
4948 if (v == Py_None)
4949 return GLOBAL_EXPLICIT;
4950 else {
4951 return GLOBAL_IMPLICIT;
4952 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004954 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004955 "unknown scope for %.100s in %.100s(%s) "
4956 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4957 name, c->c_name,
4958 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4959 c->c_filename,
4960 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4961 PyObject_REPR(c->c_locals),
4962 PyObject_REPR(c->c_globals)
4963 );
4964
4965 Py_FatalError(buf);
4966 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004967}
4968
Guido van Rossum207fda62001-03-02 03:30:41 +00004969/* Helper functions to issue warnings */
4970
4971static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004972issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004973{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004974 if (PyErr_Occurred()) {
4975 /* This can happen because symtable_node continues
4976 processing even after raising a SyntaxError.
4977 Calling PyErr_WarnExplicit now would clobber the
4978 pending exception; instead we fail and let that
4979 exception propagate.
4980 */
4981 return -1;
4982 }
Guido van Rossum207fda62001-03-02 03:30:41 +00004983 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
4984 lineno, NULL, NULL) < 0) {
4985 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
4986 PyErr_SetString(PyExc_SyntaxError, msg);
4987 PyErr_SyntaxLocation(filename, lineno);
4988 }
4989 return -1;
4990 }
4991 return 0;
4992}
Guido van Rossumee34ac12001-02-28 22:08:12 +00004993
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004994static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00004995symtable_warn(struct symtable *st, char *msg)
4996{
Guido van Rossum207fda62001-03-02 03:30:41 +00004997 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00004998 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00004999 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005000 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005001 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005002}
5003
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005004/* Helper function for setting lineno and filename */
5005
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005006static struct symtable *
5007symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005008{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005009 struct symtable *st;
5010
5011 st = symtable_init();
5012 if (st == NULL)
5013 return NULL;
5014 st->st_future = ff;
5015 st->st_filename = filename;
5016 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5017 if (st->st_errors > 0)
5018 goto fail;
5019 symtable_node(st, n);
5020 if (st->st_errors > 0)
5021 goto fail;
5022 return st;
5023 fail:
5024 if (!PyErr_Occurred()) {
5025 /* This could happen because after a syntax error is
5026 detected, the symbol-table-building continues for
5027 a while, and PyErr_Clear() might erroneously be
5028 called during that process. One such case has been
5029 fixed, but there might be more (now or later).
5030 */
5031 PyErr_SetString(PyExc_SystemError, "lost exception");
5032 }
5033 st->st_future = NULL;
5034 st->st_filename = NULL;
5035 PySymtable_Free(st);
5036 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005037}
5038
5039static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005040symtable_init_compiling_symbols(struct compiling *c)
5041{
5042 PyObject *varnames;
5043
5044 varnames = c->c_symtable->st_cur->ste_varnames;
5045 if (varnames == NULL) {
5046 varnames = PyList_New(0);
5047 if (varnames == NULL)
5048 return -1;
5049 c->c_symtable->st_cur->ste_varnames = varnames;
5050 Py_INCREF(varnames);
5051 } else
5052 Py_INCREF(varnames);
5053 c->c_varnames = varnames;
5054
5055 c->c_globals = PyDict_New();
5056 if (c->c_globals == NULL)
5057 return -1;
5058 c->c_freevars = PyDict_New();
5059 if (c->c_freevars == NULL)
5060 return -1;
5061 c->c_cellvars = PyDict_New();
5062 if (c->c_cellvars == NULL)
5063 return -1;
5064 return 0;
5065}
5066
5067struct symbol_info {
5068 int si_nlocals;
5069 int si_ncells;
5070 int si_nfrees;
5071 int si_nimplicit;
5072};
5073
5074static void
5075symtable_init_info(struct symbol_info *si)
5076{
5077 si->si_nlocals = 0;
5078 si->si_ncells = 0;
5079 si->si_nfrees = 0;
5080 si->si_nimplicit = 0;
5081}
5082
5083static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005084symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005085 struct symbol_info *si)
5086{
5087 PyObject *dict, *v;
5088
5089 /* Seperate logic for DEF_FREE. If it occurs in a function,
5090 it indicates a local that we must allocate storage for (a
5091 cell var). If it occurs in a class, then the class has a
5092 method and a free variable with the same name.
5093 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005094 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005095 /* If it isn't declared locally, it can't be a cell. */
5096 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5097 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005098 v = PyInt_FromLong(si->si_ncells++);
5099 dict = c->c_cellvars;
5100 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005101 /* If it is free anyway, then there is no need to do
5102 anything here.
5103 */
5104 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005105 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005106 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005107 v = PyInt_FromLong(si->si_nfrees++);
5108 dict = c->c_freevars;
5109 }
5110 if (v == NULL)
5111 return -1;
5112 if (PyDict_SetItem(dict, name, v) < 0) {
5113 Py_DECREF(v);
5114 return -1;
5115 }
5116 Py_DECREF(v);
5117 return 0;
5118}
5119
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005120/* If a variable is a cell and an argument, make sure that appears in
5121 co_cellvars before any variable to its right in varnames.
5122*/
5123
5124
5125static int
5126symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5127 PyObject *varnames, int flags)
5128{
Tim Petersb39903b2003-03-24 17:22:24 +00005129 PyObject *v = NULL;
5130 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005131 int i, pos;
5132
5133 if (flags & CO_VARARGS)
5134 argcount++;
5135 if (flags & CO_VARKEYWORDS)
5136 argcount++;
5137 for (i = argcount; --i >= 0; ) {
5138 v = PyList_GET_ITEM(varnames, i);
5139 if (PyDict_GetItem(*cellvars, v)) {
5140 if (list == NULL) {
5141 list = PyList_New(1);
5142 if (list == NULL)
5143 return -1;
5144 PyList_SET_ITEM(list, 0, v);
5145 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005146 } else {
5147 if (PyList_Insert(list, 0, v) < 0) {
5148 Py_DECREF(list);
5149 return -1;
5150 }
5151 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005152 }
5153 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005154 if (list == NULL)
5155 return 0;
5156
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005157 /* There are cellvars that are also arguments. Create a dict
5158 to replace cellvars and put the args at the front.
5159 */
5160 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005161 if (d == NULL)
5162 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005163 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5164 v = PyInt_FromLong(i);
5165 if (v == NULL)
5166 goto fail;
5167 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5168 goto fail;
5169 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5170 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005171 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005172 }
5173 pos = 0;
5174 i = PyList_GET_SIZE(list);
5175 Py_DECREF(list);
5176 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5177 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005178 if (w == NULL)
5179 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005180 if (PyDict_SetItem(d, v, w) < 0) {
5181 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005182 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005183 goto fail;
5184 }
5185 Py_DECREF(w);
5186 }
5187 Py_DECREF(*cellvars);
5188 *cellvars = d;
5189 return 1;
5190 fail:
5191 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005192 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005193 return -1;
5194}
5195
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005196static int
5197symtable_freevar_offsets(PyObject *freevars, int offset)
5198{
5199 PyObject *name, *v;
5200 int pos;
5201
5202 /* The cell vars are the first elements of the closure,
5203 followed by the free vars. Update the offsets in
5204 c_freevars to account for number of cellvars. */
5205 pos = 0;
5206 while (PyDict_Next(freevars, &pos, &name, &v)) {
5207 int i = PyInt_AS_LONG(v) + offset;
5208 PyObject *o = PyInt_FromLong(i);
5209 if (o == NULL)
5210 return -1;
5211 if (PyDict_SetItem(freevars, name, o) < 0) {
5212 Py_DECREF(o);
5213 return -1;
5214 }
5215 Py_DECREF(o);
5216 }
5217 return 0;
5218}
5219
5220static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005221symtable_check_unoptimized(struct compiling *c,
5222 PySymtableEntryObject *ste,
5223 struct symbol_info *si)
5224{
5225 char buf[300];
5226
5227 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5228 || (ste->ste_nested && si->si_nimplicit)))
5229 return 0;
5230
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005231#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5232
5233#define ILLEGAL_IS "is a nested function"
5234
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005235#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005236"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005237
5238#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005239"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005240
5241#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005242"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005243"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005244
5245 /* XXX perhaps the linenos for these opt-breaking statements
5246 should be stored so the exception can point to them. */
5247
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005248 if (ste->ste_child_free) {
5249 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005250 PyOS_snprintf(buf, sizeof(buf),
5251 ILLEGAL_IMPORT_STAR,
5252 PyString_AS_STRING(ste->ste_name),
5253 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005254 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005255 PyOS_snprintf(buf, sizeof(buf),
5256 ILLEGAL_BARE_EXEC,
5257 PyString_AS_STRING(ste->ste_name),
5258 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005259 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005260 PyOS_snprintf(buf, sizeof(buf),
5261 ILLEGAL_EXEC_AND_IMPORT_STAR,
5262 PyString_AS_STRING(ste->ste_name),
5263 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005264 }
5265 } else {
5266 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005267 PyOS_snprintf(buf, sizeof(buf),
5268 ILLEGAL_IMPORT_STAR,
5269 PyString_AS_STRING(ste->ste_name),
5270 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005271 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005272 PyOS_snprintf(buf, sizeof(buf),
5273 ILLEGAL_BARE_EXEC,
5274 PyString_AS_STRING(ste->ste_name),
5275 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005276 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005277 PyOS_snprintf(buf, sizeof(buf),
5278 ILLEGAL_EXEC_AND_IMPORT_STAR,
5279 PyString_AS_STRING(ste->ste_name),
5280 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005281 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005282 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005283
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005284 PyErr_SetString(PyExc_SyntaxError, buf);
5285 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5286 ste->ste_opt_lineno);
5287 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005288}
5289
5290static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005291symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5292 struct symbol_info *si)
5293{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005294 if (c->c_future)
5295 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005296 if (ste->ste_generator)
5297 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005298 if (ste->ste_type != TYPE_MODULE)
5299 c->c_flags |= CO_NEWLOCALS;
5300 if (ste->ste_type == TYPE_FUNCTION) {
5301 c->c_nlocals = si->si_nlocals;
5302 if (ste->ste_optimized == 0)
5303 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005304 else if (ste->ste_optimized != OPT_EXEC)
5305 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005306 }
5307 return 0;
5308}
5309
5310static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005311symtable_error(struct symtable *st, int lineno)
5312{
5313 if (lineno == 0)
5314 lineno = st->st_cur->ste_lineno;
5315 PyErr_SyntaxLocation(st->st_filename, lineno);
5316 st->st_errors++;
5317 return -1;
5318}
5319
5320static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005321symtable_load_symbols(struct compiling *c)
5322{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005323 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005324 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005325 PyObject *name, *varnames, *v;
5326 int i, flags, pos;
5327 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005328
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005329 v = NULL;
5330
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005331 if (symtable_init_compiling_symbols(c) < 0)
5332 goto fail;
5333 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005334 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005335 si.si_nlocals = PyList_GET_SIZE(varnames);
5336 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005337
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005338 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005339 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005340 if (v == NULL)
5341 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005342 if (PyDict_SetItem(c->c_locals,
5343 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005344 goto fail;
5345 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005346 }
5347
5348 /* XXX The cases below define the rules for whether a name is
5349 local or global. The logic could probably be clearer. */
5350 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005351 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5352 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005353
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005354 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005355 /* undo the original DEF_FREE */
5356 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005357
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005358 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005359 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005360 2. Free variables in methods that are also class
5361 variables or declared global.
5362 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005363 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005364 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005365
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005366 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005367 c->c_argcount--;
5368 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005369 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370 c->c_argcount--;
5371 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005372 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005373 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005374 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005375 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005376 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005377 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005378 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005379 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5382 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005383 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005384 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005385 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005386 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005387 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005388 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005389 if (v == NULL)
5390 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005391 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005392 goto fail;
5393 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005394 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005395 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005396 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005397 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005398 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005399 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005400 if (v == NULL)
5401 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005402 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 goto fail;
5404 Py_DECREF(v);
5405 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005406 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005407 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005408 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005409 goto fail;
5410 if (st->st_nscopes != 1) {
5411 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005412 if (v == NULL)
5413 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005414 if (PyDict_SetItem(st->st_global,
5415 name, v))
5416 goto fail;
5417 Py_DECREF(v);
5418 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005419 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005420 }
5421 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005422 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5423
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005424 if (si.si_ncells > 1) { /* one cell is always in order */
5425 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5426 c->c_varnames, c->c_flags) < 0)
5427 return -1;
5428 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005429 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5430 return -1;
5431 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005432 fail:
5433 /* is this always the right thing to do? */
5434 Py_XDECREF(v);
5435 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005436}
5437
5438static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005439symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005440{
5441 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005442
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005443 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005444 if (st == NULL)
5445 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005446 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005447
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005448 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005449 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005450 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005451 goto fail;
5452 if ((st->st_symbols = PyDict_New()) == NULL)
5453 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005454 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005455 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005456 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005457 st->st_private = NULL;
5458 return st;
5459 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005460 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005461 return NULL;
5462}
5463
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005464void
5465PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466{
5467 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005468 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005469 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005470 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005471}
5472
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005473/* When the compiler exits a scope, it must should update the scope's
5474 free variable information with the list of free variables in its
5475 children.
5476
5477 Variables that are free in children and defined in the current
5478 scope are cellvars.
5479
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005480 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005481 false), free variables in children that are not defined here are
5482 implicit globals.
5483
5484*/
5485
5486static int
5487symtable_update_free_vars(struct symtable *st)
5488{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005489 int i, j, def;
5490 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005491 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005493 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005494 def = DEF_FREE_CLASS;
5495 else
5496 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005497 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005498 int pos = 0;
5499
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005500 if (list && PyList_SetSlice(list, 0,
5501 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005502 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005503 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 PyList_GET_ITEM(ste->ste_children, i);
5505 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005506 int flags = PyInt_AS_LONG(o);
5507 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005508 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005509 if (list == NULL) {
5510 list = PyList_New(0);
5511 if (list == NULL)
5512 return -1;
5513 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005514 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005515 if (PyList_Append(list, name) < 0) {
5516 Py_DECREF(list);
5517 return -1;
5518 }
5519 }
5520 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005521 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005522 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005523 v = PyDict_GetItem(ste->ste_symbols, name);
5524 /* If a name N is declared global in scope A and
5525 referenced in scope B contained (perhaps
5526 indirectly) in A and there are no scopes
5527 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005528 is global in B. Unless A is a class scope,
5529 because class scopes are not considered for
5530 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005531 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005532 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005533 int flags = PyInt_AS_LONG(v);
5534 if (flags & DEF_GLOBAL) {
5535 symtable_undo_free(st, child->ste_id,
5536 name);
5537 continue;
5538 }
5539 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005540 if (ste->ste_nested) {
5541 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005542 name, def) < 0) {
5543 Py_DECREF(list);
5544 return -1;
5545 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005546 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005547 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005548 name) < 0) {
5549 Py_DECREF(list);
5550 return -1;
5551 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005552 }
5553 }
5554 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005555
5556 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005557 return 0;
5558}
5559
5560/* If the current scope is a non-nested class or if name is not
5561 defined in the current, non-nested scope, then it is an implicit
5562 global in all nested scopes.
5563*/
5564
5565static int
5566symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5567{
5568 PyObject *o;
5569 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005570 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005571
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005572 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005573 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005574 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005575 if (o == NULL)
5576 return symtable_undo_free(st, child, name);
5577 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005578
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005579 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005580 return symtable_undo_free(st, child, name);
5581 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005582 return symtable_add_def_o(st, ste->ste_symbols,
5583 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005584}
5585
5586static int
5587symtable_undo_free(struct symtable *st, PyObject *id,
5588 PyObject *name)
5589{
5590 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005591 PyObject *info;
5592 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005593
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005594 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5595 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005596 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005597
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005598 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005599 if (info == NULL)
5600 return 0;
5601 v = PyInt_AS_LONG(info);
5602 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005603 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 DEF_FREE_GLOBAL) < 0)
5605 return -1;
5606 } else
5607 /* If the name is defined here or declared global,
5608 then the recursion stops. */
5609 return 0;
5610
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005611 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5612 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005613 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005614 PyList_GET_ITEM(ste->ste_children, i);
5615 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005616 if (x < 0)
5617 return x;
5618 }
5619 return 0;
5620}
5621
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005622/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5623 This reference is released when the scope is exited, via the DECREF
5624 in symtable_exit_scope().
5625*/
5626
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005627static int
5628symtable_exit_scope(struct symtable *st)
5629{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005630 int end;
5631
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005632 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005633 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005634 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005635 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005636 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5637 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005638 if (PySequence_DelItem(st->st_stack, end) < 0)
5639 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005640 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005641}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005642
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005643static void
5644symtable_enter_scope(struct symtable *st, char *name, int type,
5645 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005646{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005647 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005648
5649 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005650 prev = st->st_cur;
5651 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005652 st->st_errors++;
5653 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005654 }
5655 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005656 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005657 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005658 if (st->st_cur == NULL) {
5659 st->st_errors++;
5660 return;
5661 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005662 if (strcmp(name, TOP) == 0)
5663 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005664 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005665 if (PyList_Append(prev->ste_children,
5666 (PyObject *)st->st_cur) < 0)
5667 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005668 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005669}
5670
5671static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005672symtable_lookup(struct symtable *st, char *name)
5673{
5674 char buffer[MANGLE_LEN];
5675 PyObject *v;
5676 int flags;
5677
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005678 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005679 name = buffer;
5680 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5681 if (v == NULL) {
5682 if (PyErr_Occurred())
5683 return -1;
5684 else
5685 return 0;
5686 }
5687
5688 flags = PyInt_AS_LONG(v);
5689 return flags;
5690}
5691
5692static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005693symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005694{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005695 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005696 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005697 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005698
Guido van Rossumb7164622002-08-16 02:48:11 +00005699 /* Warn about None, except inside a tuple (where the assignment
5700 code already issues a warning). */
5701 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5702 *name == 'N' && strcmp(name, "None") == 0)
5703 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005704 PyErr_SetString(PyExc_SyntaxError,
5705 "Invalid syntax. Assignment to None.");
5706 symtable_error(st, 0);
5707 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005708 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005709 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005710 name = buffer;
5711 if ((s = PyString_InternFromString(name)) == NULL)
5712 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005713 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5714 Py_DECREF(s);
5715 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005716}
5717
5718/* Must only be called with mangled names */
5719
5720static int
5721symtable_add_def_o(struct symtable *st, PyObject *dict,
5722 PyObject *name, int flag)
5723{
5724 PyObject *o;
5725 int val;
5726
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005727 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005728 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005729 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005730 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005731 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005732 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005733 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005734 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005735 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005736 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005737 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005738 if (o == NULL)
5739 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005740 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005741 Py_DECREF(o);
5742 return -1;
5743 }
5744 Py_DECREF(o);
5745
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005746 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005747 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005748 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005749 } else if (flag & DEF_GLOBAL) {
5750 /* XXX need to update DEF_GLOBAL for other flags too;
5751 perhaps only DEF_FREE_GLOBAL */
5752 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005753 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005754 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005755 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005756 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005757 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005758 if (o == NULL)
5759 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 Py_DECREF(o);
5762 return -1;
5763 }
5764 Py_DECREF(o);
5765 }
5766 return 0;
5767}
5768
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005769#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005770
Tim Peters08a898f2001-06-28 01:52:22 +00005771/* Look for a yield stmt under n. Return 1 if found, else 0.
5772 This hack is used to look inside "if 0:" blocks (which are normally
5773 ignored) in case those are the only places a yield occurs (so that this
5774 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005775static int
5776look_for_yield(node *n)
5777{
5778 int i;
5779
5780 for (i = 0; i < NCH(n); ++i) {
5781 node *kid = CHILD(n, i);
5782
5783 switch (TYPE(kid)) {
5784
5785 case classdef:
5786 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005787 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005788 /* Stuff in nested functions and classes can't make
5789 the parent a generator. */
5790 return 0;
5791
5792 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005793 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005794
5795 default:
5796 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005797 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005798 }
5799 }
5800 return 0;
5801}
5802
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005803static void
5804symtable_node(struct symtable *st, node *n)
5805{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005806 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005807
5808 loop:
5809 switch (TYPE(n)) {
5810 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005811 char *func_name;
5812 if (NCH(n) == 6)
5813 symtable_node(st, CHILD(n, 0));
5814 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005815 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005816 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005817 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005818 symtable_funcdef(st, n);
5819 symtable_exit_scope(st);
5820 break;
5821 }
5822 case lambdef:
5823 if (NCH(n) == 4)
5824 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005825 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005826 symtable_funcdef(st, n);
5827 symtable_exit_scope(st);
5828 break;
5829 case classdef: {
5830 char *tmp, *class_name = STR(CHILD(n, 1));
5831 symtable_add_def(st, class_name, DEF_LOCAL);
5832 if (TYPE(CHILD(n, 2)) == LPAR) {
5833 node *bases = CHILD(n, 3);
5834 int i;
5835 for (i = 0; i < NCH(bases); i += 2) {
5836 symtable_node(st, CHILD(bases, i));
5837 }
5838 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005839 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005840 tmp = st->st_private;
5841 st->st_private = class_name;
5842 symtable_node(st, CHILD(n, NCH(n) - 1));
5843 st->st_private = tmp;
5844 symtable_exit_scope(st);
5845 break;
5846 }
5847 case if_stmt:
5848 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005849 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5850 if (st->st_cur->ste_generator == 0)
5851 st->st_cur->ste_generator =
5852 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005853 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005854 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005855 symtable_node(st, CHILD(n, i + 1));
5856 symtable_node(st, CHILD(n, i + 3));
5857 }
5858 if (i + 2 < NCH(n))
5859 symtable_node(st, CHILD(n, i + 2));
5860 break;
5861 case global_stmt:
5862 symtable_global(st, n);
5863 break;
5864 case import_stmt:
5865 symtable_import(st, n);
5866 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005867 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005868 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005869 symtable_node(st, CHILD(n, 1));
5870 if (NCH(n) > 2)
5871 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005872 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005873 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005874 st->st_cur->ste_opt_lineno = n->n_lineno;
5875 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005876 if (NCH(n) > 4)
5877 symtable_node(st, CHILD(n, 5));
5878 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005879
5880 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005881 case assert_stmt:
5882 if (Py_OptimizeFlag)
5883 return;
5884 if (NCH(n) == 2) {
5885 n = CHILD(n, 1);
5886 goto loop;
5887 } else {
5888 symtable_node(st, CHILD(n, 1));
5889 n = CHILD(n, 3);
5890 goto loop;
5891 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005892 case except_clause:
5893 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005894 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005895 if (NCH(n) > 1) {
5896 n = CHILD(n, 1);
5897 goto loop;
5898 }
5899 break;
5900 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005901 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005902 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005903 case yield_stmt:
5904 st->st_cur->ste_generator = 1;
5905 n = CHILD(n, 1);
5906 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005907 case expr_stmt:
5908 if (NCH(n) == 1)
5909 n = CHILD(n, 0);
5910 else {
5911 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005912 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005913 symtable_node(st, CHILD(n, 2));
5914 break;
5915 } else {
5916 int i;
5917 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005918 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005919 n = CHILD(n, NCH(n) - 1);
5920 }
5921 }
5922 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005923 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005924 /* only occurs when there are multiple for loops
5925 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005926 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005927 if (TYPE(n) == list_for)
5928 symtable_list_for(st, n);
5929 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005930 REQ(n, list_if);
5931 symtable_node(st, CHILD(n, 1));
5932 if (NCH(n) == 3) {
5933 n = CHILD(n, 2);
5934 goto loop;
5935 }
5936 }
5937 break;
5938 case for_stmt:
5939 symtable_assign(st, CHILD(n, 1), 0);
5940 for (i = 3; i < NCH(n); ++i)
5941 if (TYPE(CHILD(n, i)) >= single_input)
5942 symtable_node(st, CHILD(n, i));
5943 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005944 case arglist:
5945 if (NCH(n) > 1)
5946 for (i = 0; i < NCH(n); ++i) {
5947 node *ch = CHILD(n, i);
5948 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5949 TYPE(CHILD(ch, 1)) == gen_for) {
5950 PyErr_SetString(PyExc_SyntaxError,
5951 "invalid syntax");
5952 symtable_error(st, n->n_lineno);
5953 return;
5954 }
5955 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005956 /* The remaining cases fall through to default except in
5957 special circumstances. This requires the individual cases
5958 to be coded with great care, even though they look like
5959 rather innocuous. Each case must double-check TYPE(n).
5960 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005961 case decorator:
5962 if (TYPE(n) == decorator) {
5963 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5964 node *name, *varname;
5965 name = CHILD(n, 1);
5966 REQ(name, dotted_name);
5967 varname = CHILD(name, 0);
5968 REQ(varname, NAME);
5969 symtable_add_use(st, STR(varname));
5970 }
5971 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005972 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005973 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005974 n = CHILD(n, 2);
5975 goto loop;
5976 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00005977 else if (TYPE(n) == argument && NCH(n) == 2 &&
5978 TYPE(CHILD(n, 1)) == gen_for) {
5979 symtable_generator_expression(st, n);
5980 break;
5981 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005982 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005983 case listmaker:
5984 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005985 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005986 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005987 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005988 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00005989 case testlist_gexp:
5990 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
5991 symtable_generator_expression(st, n);
5992 break;
5993 }
5994 /* fall through */
5995
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005996 case atom:
5997 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
5998 symtable_add_use(st, STR(CHILD(n, 0)));
5999 break;
6000 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006001 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006002 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006003 /* Walk over every non-token child with a special case
6004 for one child.
6005 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006006 if (NCH(n) == 1) {
6007 n = CHILD(n, 0);
6008 goto loop;
6009 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006010 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 if (TYPE(CHILD(n, i)) >= single_input)
6012 symtable_node(st, CHILD(n, i));
6013 }
6014}
6015
6016static void
6017symtable_funcdef(struct symtable *st, node *n)
6018{
6019 node *body;
6020
6021 if (TYPE(n) == lambdef) {
6022 if (NCH(n) == 4)
6023 symtable_params(st, CHILD(n, 1));
6024 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006025 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 body = CHILD(n, NCH(n) - 1);
6027 symtable_node(st, body);
6028}
6029
6030/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006031 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006032 which are references in the defining scope. symtable_params()
6033 parses the parameter names, which are defined in the function's
6034 body.
6035
6036 varargslist:
6037 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6038 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6039*/
6040
6041static void
6042symtable_default_args(struct symtable *st, node *n)
6043{
6044 node *c;
6045 int i;
6046
6047 if (TYPE(n) == parameters) {
6048 n = CHILD(n, 1);
6049 if (TYPE(n) == RPAR)
6050 return;
6051 }
6052 REQ(n, varargslist);
6053 for (i = 0; i < NCH(n); i += 2) {
6054 c = CHILD(n, i);
6055 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6056 break;
6057 }
6058 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6059 symtable_node(st, CHILD(n, i));
6060 }
6061}
6062
6063static void
6064symtable_params(struct symtable *st, node *n)
6065{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006066 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006067 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006068
6069 if (TYPE(n) == parameters) {
6070 n = CHILD(n, 1);
6071 if (TYPE(n) == RPAR)
6072 return;
6073 }
6074 REQ(n, varargslist);
6075 for (i = 0; i < NCH(n); i += 2) {
6076 c = CHILD(n, i);
6077 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6078 ext = 1;
6079 break;
6080 }
6081 if (TYPE(c) == test) {
6082 continue;
6083 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006084 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006085 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006086 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006087 char nbuf[30];
6088 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006089 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006090 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006091 }
6092 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006093 if (ext) {
6094 c = CHILD(n, i);
6095 if (TYPE(c) == STAR) {
6096 i++;
6097 symtable_add_def(st, STR(CHILD(n, i)),
6098 DEF_PARAM | DEF_STAR);
6099 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006100 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006101 c = NULL;
6102 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006103 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006104 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006105 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006106 i++;
6107 symtable_add_def(st, STR(CHILD(n, i)),
6108 DEF_PARAM | DEF_DOUBLESTAR);
6109 }
6110 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006111 if (complex >= 0) {
6112 int j;
6113 for (j = 0; j <= complex; j++) {
6114 c = CHILD(n, j);
6115 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006116 c = CHILD(n, ++j);
6117 else if (TYPE(c) == EQUAL)
6118 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006119 if (TYPE(CHILD(c, 0)) == LPAR)
6120 symtable_params_fplist(st, CHILD(c, 1));
6121 }
6122 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006123}
6124
6125static void
6126symtable_params_fplist(struct symtable *st, node *n)
6127{
6128 int i;
6129 node *c;
6130
6131 REQ(n, fplist);
6132 for (i = 0; i < NCH(n); i += 2) {
6133 c = CHILD(n, i);
6134 REQ(c, fpdef);
6135 if (NCH(c) == 1)
6136 symtable_add_def(st, STR(CHILD(c, 0)),
6137 DEF_PARAM | DEF_INTUPLE);
6138 else
6139 symtable_params_fplist(st, CHILD(c, 1));
6140 }
6141
6142}
6143
6144static void
6145symtable_global(struct symtable *st, node *n)
6146{
6147 int i;
6148
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006149 /* XXX It might be helpful to warn about module-level global
6150 statements, but it's hard to tell the difference between
6151 module-level and a string passed to exec.
6152 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006153
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006154 for (i = 1; i < NCH(n); i += 2) {
6155 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006156 int flags;
6157
6158 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006159 if (flags < 0)
6160 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006161 if (flags && flags != DEF_GLOBAL) {
6162 char buf[500];
6163 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006164 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006165 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006166 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006167 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006168 }
6169 else {
6170 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006171 PyOS_snprintf(buf, sizeof(buf),
6172 GLOBAL_AFTER_ASSIGN,
6173 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006174 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006175 PyOS_snprintf(buf, sizeof(buf),
6176 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006177 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006178 }
6179 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006180 symtable_add_def(st, name, DEF_GLOBAL);
6181 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006182}
6183
6184static void
6185symtable_list_comprehension(struct symtable *st, node *n)
6186{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006187 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006188 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006189
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006190 REQ(n, listmaker);
6191 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6192 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006193 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006194 symtable_list_for(st, CHILD(n, 1));
6195 symtable_node(st, CHILD(n, 0));
6196 --st->st_cur->ste_tmpname;
6197}
6198
6199static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006200symtable_generator_expression(struct symtable *st, node *n)
6201{
6202 /* testlist_gexp: test gen_for */
6203 REQ(CHILD(n, 0), test);
6204 REQ(CHILD(n, 1), gen_for);
6205
6206 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6207 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6208
6209 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6210
6211 symtable_gen_for(st, CHILD(n, 1), 1);
6212 symtable_node(st, CHILD(n, 0));
6213 symtable_exit_scope(st);
6214
6215 /* for outmost iterable precomputation */
6216 symtable_node(st, CHILD(CHILD(n, 1), 3));
6217}
6218
6219static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006220symtable_list_for(struct symtable *st, node *n)
6221{
6222 REQ(n, list_for);
6223 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006224 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006225 symtable_node(st, CHILD(n, 3));
6226 if (NCH(n) == 5)
6227 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006228}
6229
6230static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006231symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6232{
6233 REQ(n, gen_for);
6234
6235 /* gen_for: for v in test [gen_iter] */
6236 symtable_assign(st, CHILD(n, 1), 0);
6237 if (is_outmost)
6238 symtable_add_use(st, "[outmost-iterable]");
6239 else
6240 symtable_node(st, CHILD(n, 3));
6241
6242 if (NCH(n) == 5)
6243 symtable_gen_iter(st, CHILD(n, 4));
6244}
6245
6246static void
6247symtable_gen_iter(struct symtable *st, node *n)
6248{
6249 REQ(n, gen_iter);
6250
6251 n = CHILD(n, 0);
6252 if (TYPE(n) == gen_for)
6253 symtable_gen_for(st, n, 0);
6254 else {
6255 REQ(n, gen_if);
6256 symtable_node(st, CHILD(n, 1));
6257
6258 if (NCH(n) == 3)
6259 symtable_gen_iter(st, CHILD(n, 2));
6260 }
6261}
6262
6263static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006264symtable_import(struct symtable *st, node *n)
6265{
6266 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006267 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006268 | 'from' dotted_name 'import'
6269 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006270 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006271 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006272 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006273 node *dotname = CHILD(n, 1);
6274 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6275 /* check for bogus imports */
6276 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6277 PyErr_SetString(PyExc_SyntaxError,
6278 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006279 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006280 return;
6281 }
6282 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006283 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006284 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006285 if (symtable_warn(st,
6286 "import * only allowed at module level") < 0)
6287 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006288 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006289 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006290 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006291 } else {
6292 for (i = 3; i < NCH(n); i += 2) {
6293 node *c = CHILD(n, i);
6294 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006295 symtable_assign(st, CHILD(c, 2),
6296 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006297 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006298 symtable_assign(st, CHILD(c, 0),
6299 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006300 }
6301 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006302 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006303 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006304 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006305 }
6306 }
6307}
6308
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006309/* The third argument to symatble_assign() is a flag to be passed to
6310 symtable_add_def() if it is eventually called. The flag is useful
6311 to specify the particular type of assignment that should be
6312 recorded, e.g. an assignment caused by import.
6313 */
6314
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006315static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006316symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006317{
6318 node *tmp;
6319 int i;
6320
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006321 loop:
6322 switch (TYPE(n)) {
6323 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006324 /* invalid assignment, e.g. lambda x:x=2. The next
6325 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006326 return;
6327 case power:
6328 if (NCH(n) > 2) {
6329 for (i = 2; i < NCH(n); ++i)
6330 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6331 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006332 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006333 if (NCH(n) > 1) {
6334 symtable_node(st, CHILD(n, 0));
6335 symtable_node(st, CHILD(n, 1));
6336 } else {
6337 n = CHILD(n, 0);
6338 goto loop;
6339 }
6340 return;
6341 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006342 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6343 /* XXX This is an error, but the next pass
6344 will catch it. */
6345 return;
6346 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006347 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006348 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006349 }
6350 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006351 case testlist_gexp:
6352 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6353 /* XXX This is an error, but the next pass
6354 will catch it. */
6355 return;
6356 } else {
6357 for (i = 0; i < NCH(n); i += 2)
6358 symtable_assign(st, CHILD(n, i), def_flag);
6359 }
6360 return;
6361
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006362 case exprlist:
6363 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006364 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006365 if (NCH(n) == 1) {
6366 n = CHILD(n, 0);
6367 goto loop;
6368 }
6369 else {
6370 int i;
6371 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006372 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006373 return;
6374 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006375 case atom:
6376 tmp = CHILD(n, 0);
6377 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6378 n = CHILD(n, 1);
6379 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006380 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006381 if (strcmp(STR(tmp), "__debug__") == 0) {
6382 PyErr_SetString(PyExc_SyntaxError,
6383 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006384 symtable_error(st, n->n_lineno);
6385 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006386 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006387 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006388 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006389 return;
6390 case dotted_as_name:
6391 if (NCH(n) == 3)
6392 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006393 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006394 else
6395 symtable_add_def(st,
6396 STR(CHILD(CHILD(n,
6397 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006398 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006399 return;
6400 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006401 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006402 return;
6403 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006404 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006405 return;
6406 default:
6407 if (NCH(n) == 0)
6408 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006409 if (NCH(n) == 1) {
6410 n = CHILD(n, 0);
6411 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006412 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006413 /* Should only occur for errors like x + 1 = 1,
6414 which will be caught in the next pass. */
6415 for (i = 0; i < NCH(n); ++i)
6416 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006417 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006418 }
6419}