blob: 1de249f6c597cafe5d7a6de2b230d0353718c36b [file] [log] [blame]
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001/* Compile an expression node to intermediate code */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003/* XXX TO DO:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004 XXX add __doc__ attribute == co_doc to code object attributes?
5 XXX (it's currently the first item of the co_const tuple)
Guido van Rossum3f5da241990-12-20 15:06:42 +00006 XXX Generate simple jump for break/return outside 'try...finally'
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00007 XXX Allow 'continue' inside finally clause of try-finally
Guido van Rossum8b993a91997-01-17 21:04:03 +00008 XXX New opcode for loading the initial index for a for loop
Guido van Rossum681d79a1995-07-18 14:51:37 +00009 XXX other JAR tricks?
Guido van Rossum3f5da241990-12-20 15:06:42 +000010*/
Guido van Rossum10dc2e81990-11-18 17:27:39 +000011
Guido van Rossum79f25d91997-04-29 20:08:16 +000012#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000013
Guido van Rossum10dc2e81990-11-18 17:27:39 +000014#include "node.h"
15#include "token.h"
16#include "graminit.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000017#include "compile.h"
Jeremy Hylton4b38da62001-02-02 18:19:15 +000018#include "symtable.h"
Guido van Rossum10dc2e81990-11-18 17:27:39 +000019#include "opcode.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000020#include "structmember.h"
21
22#include <ctype.h>
Guido van Rossum282914b1991-04-04 10:42:56 +000023
Guido van Rossumb05a5c71997-05-07 17:46:13 +000024/* Three symbols from graminit.h are also defined in Python.h, with
25 Py_ prefixes to their names. Python.h can't include graminit.h
26 (which defines too many confusing symbols), but we can check here
27 that they haven't changed (which is very unlikely, but possible). */
28#if Py_single_input != single_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000029 #error "single_input has changed -- update Py_single_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000030#endif
31#if Py_file_input != file_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000032 #error "file_input has changed -- update Py_file_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000033#endif
34#if Py_eval_input != eval_input
Guido van Rossum2f75b291997-05-20 22:18:48 +000035 #error "eval_input has changed -- update Py_eval_input in Python.h"
Guido van Rossumb05a5c71997-05-07 17:46:13 +000036#endif
37
Guido van Rossum8e793d91997-03-03 19:13:14 +000038int Py_OptimizeFlag = 0;
39
Guido van Rossum8861b741996-07-30 16:49:37 +000040#define OP_DELETE 0
41#define OP_ASSIGN 1
42#define OP_APPLY 2
43
Jeremy Hyltone36f7782001-01-19 03:21:30 +000044#define VAR_LOAD 0
45#define VAR_STORE 1
46#define VAR_DELETE 2
47
Jeremy Hylton64949cb2001-01-25 20:06:59 +000048#define DEL_CLOSURE_ERROR \
Jeremy Hyltoneab156f2001-01-30 01:24:43 +000049"can not delete variable '%.400s' referenced in nested scope"
50
51#define DUPLICATE_ARGUMENT \
52"duplicate argument '%s' in function definition"
53
Jeremy Hylton29906ee2001-02-27 04:23:34 +000054#define GLOBAL_AFTER_ASSIGN \
55"name '%.400s' is assigned to before global declaration"
56
57#define GLOBAL_AFTER_USE \
58"name '%.400s' is used prior to global declaration"
59
Martin v. Löwisdd7eb142003-10-18 22:05:25 +000060#define PARAM_GLOBAL \
Neal Norwitz2a47c0f2002-01-29 00:53:41 +000061"name '%.400s' is a function parameter and declared global"
Jeremy Hylton29906ee2001-02-27 04:23:34 +000062
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +000063#define LATE_FUTURE \
64"from __future__ imports must occur at the beginning of the file"
65
Jeremy Hylton897b8212001-03-23 14:08:38 +000066#define ASSIGN_DEBUG \
67"can not assign to __debug__"
68
Jeremy Hyltone36f7782001-01-19 03:21:30 +000069#define MANGLE_LEN 256
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071#define OFF(x) offsetof(PyCodeObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000072
Guido van Rossum6f799372001-09-20 20:46:19 +000073static PyMemberDef code_memberlist[] = {
Guido van Rossum681d79a1995-07-18 14:51:37 +000074 {"co_argcount", T_INT, OFF(co_argcount), READONLY},
75 {"co_nlocals", T_INT, OFF(co_nlocals), READONLY},
Guido van Rossum8b993a91997-01-17 21:04:03 +000076 {"co_stacksize",T_INT, OFF(co_stacksize), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000077 {"co_flags", T_INT, OFF(co_flags), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000078 {"co_code", T_OBJECT, OFF(co_code), READONLY},
79 {"co_consts", T_OBJECT, OFF(co_consts), READONLY},
80 {"co_names", T_OBJECT, OFF(co_names), READONLY},
Guido van Rossum681d79a1995-07-18 14:51:37 +000081 {"co_varnames", T_OBJECT, OFF(co_varnames), READONLY},
Jeremy Hylton64949cb2001-01-25 20:06:59 +000082 {"co_freevars", T_OBJECT, OFF(co_freevars), READONLY},
83 {"co_cellvars", T_OBJECT, OFF(co_cellvars), READONLY},
Guido van Rossum39d942d1992-01-12 02:30:05 +000084 {"co_filename", T_OBJECT, OFF(co_filename), READONLY},
Guido van Rossum9bfef441993-03-29 10:43:31 +000085 {"co_name", T_OBJECT, OFF(co_name), READONLY},
Guido van Rossumda4eb5c1997-01-24 03:43:35 +000086 {"co_firstlineno", T_INT, OFF(co_firstlineno), READONLY},
87 {"co_lnotab", T_OBJECT, OFF(co_lnotab), READONLY},
Guido van Rossum3f5da241990-12-20 15:06:42 +000088 {NULL} /* Sentinel */
89};
90
Michael W. Hudson60934622004-08-12 17:56:29 +000091/* Helper for code_new: return a shallow copy of a tuple that is
92 guaranteed to contain exact strings, by converting string subclasses
93 to exact strings and complaining if a non-string is found. */
94static PyObject*
95validate_and_copy_tuple(PyObject *tup)
96{
97 PyObject *newtuple;
98 PyObject *item;
99 int i, len;
100
101 len = PyTuple_GET_SIZE(tup);
102 newtuple = PyTuple_New(len);
103 if (newtuple == NULL)
104 return NULL;
105
106 for (i = 0; i < len; i++) {
107 item = PyTuple_GET_ITEM(tup, i);
108 if (PyString_CheckExact(item)) {
109 Py_INCREF(item);
110 }
111 else if (!PyString_Check(item)) {
112 PyErr_Format(
113 PyExc_TypeError,
114 "name tuples must contain only "
115 "strings, not '%.500s'",
116 item->ob_type->tp_name);
117 Py_DECREF(newtuple);
118 return NULL;
119 }
120 else {
121 item = PyString_FromStringAndSize(
122 PyString_AS_STRING(item),
123 PyString_GET_SIZE(item));
124 if (item == NULL) {
125 Py_DECREF(newtuple);
126 return NULL;
127 }
128 }
129 PyTuple_SET_ITEM(newtuple, i, item);
130 }
131
132 return newtuple;
133}
134
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000135PyDoc_STRVAR(code_doc,
136"code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
137 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
138\n\
139Create a code object. Not for the faint of heart.");
140
141static PyObject *
142code_new(PyTypeObject *type, PyObject *args, PyObject *kw)
143{
144 int argcount;
145 int nlocals;
146 int stacksize;
147 int flags;
Tim Petersd459f532004-08-12 18:16:43 +0000148 PyObject *co = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000149 PyObject *code;
150 PyObject *consts;
Michael W. Hudson60934622004-08-12 17:56:29 +0000151 PyObject *names, *ournames = NULL;
152 PyObject *varnames, *ourvarnames = NULL;
153 PyObject *freevars = NULL, *ourfreevars = NULL;
154 PyObject *cellvars = NULL, *ourcellvars = NULL;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000155 PyObject *filename;
156 PyObject *name;
157 int firstlineno;
158 PyObject *lnotab;
159
160 if (!PyArg_ParseTuple(args, "iiiiSO!O!O!SSiS|O!O!:code",
161 &argcount, &nlocals, &stacksize, &flags,
162 &code,
163 &PyTuple_Type, &consts,
164 &PyTuple_Type, &names,
165 &PyTuple_Type, &varnames,
166 &filename, &name,
167 &firstlineno, &lnotab,
168 &PyTuple_Type, &freevars,
169 &PyTuple_Type, &cellvars))
170 return NULL;
171
Michael W. Hudson60934622004-08-12 17:56:29 +0000172 if (argcount < 0) {
173 PyErr_SetString(
174 PyExc_ValueError,
175 "code: argcount must not be negative");
176 goto cleanup;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000177 }
178
Michael W. Hudson60934622004-08-12 17:56:29 +0000179 if (nlocals < 0) {
180 PyErr_SetString(
181 PyExc_ValueError,
182 "code: nlocals must not be negative");
183 goto cleanup;
Raymond Hettingercc1798e2003-09-16 04:27:52 +0000184 }
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000185
Michael W. Hudson60934622004-08-12 17:56:29 +0000186 ournames = validate_and_copy_tuple(names);
187 if (ournames == NULL)
188 goto cleanup;
189 ourvarnames = validate_and_copy_tuple(varnames);
190 if (ourvarnames == NULL)
191 goto cleanup;
192 if (freevars)
193 ourfreevars = validate_and_copy_tuple(freevars);
194 else
195 ourfreevars = PyTuple_New(0);
196 if (ourfreevars == NULL)
197 goto cleanup;
198 if (cellvars)
199 ourcellvars = validate_and_copy_tuple(cellvars);
200 else
201 ourcellvars = PyTuple_New(0);
202 if (ourcellvars == NULL)
203 goto cleanup;
204
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000205 co = (PyObject *) PyCode_New(argcount, nlocals, stacksize, flags,
Michael W. Hudson60934622004-08-12 17:56:29 +0000206 code, consts, ournames, ourvarnames,
207 ourfreevars, ourcellvars, filename,
208 name, firstlineno, lnotab);
209 cleanup:
210 Py_XDECREF(ournames);
211 Py_XDECREF(ourvarnames);
212 Py_XDECREF(ourfreevars);
213 Py_XDECREF(ourcellvars);
Raymond Hettinger37a724d2003-09-15 21:43:16 +0000214 return co;
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000215}
216
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000217static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000218code_dealloc(PyCodeObject *co)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000219{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 Py_XDECREF(co->co_code);
221 Py_XDECREF(co->co_consts);
222 Py_XDECREF(co->co_names);
Guido van Rossum275558c1997-07-25 20:13:49 +0000223 Py_XDECREF(co->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000224 Py_XDECREF(co->co_freevars);
225 Py_XDECREF(co->co_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_XDECREF(co->co_filename);
227 Py_XDECREF(co->co_name);
Guido van Rossum275558c1997-07-25 20:13:49 +0000228 Py_XDECREF(co->co_lnotab);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000230}
231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000233code_repr(PyCodeObject *co)
Guido van Rossum2dff9911992-09-03 20:50:59 +0000234{
235 char buf[500];
236 int lineno = -1;
Guido van Rossum2dff9911992-09-03 20:50:59 +0000237 char *filename = "???";
Guido van Rossum9bfef441993-03-29 10:43:31 +0000238 char *name = "???";
Guido van Rossumd076c731998-10-07 19:42:25 +0000239
Guido van Rossuma396a882000-04-07 01:21:36 +0000240 if (co->co_firstlineno != 0)
241 lineno = co->co_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (co->co_filename && PyString_Check(co->co_filename))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000243 filename = PyString_AS_STRING(co->co_filename);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 if (co->co_name && PyString_Check(co->co_name))
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000245 name = PyString_AS_STRING(co->co_name);
Barry Warsaw8f6d8682001-11-28 21:10:39 +0000246 PyOS_snprintf(buf, sizeof(buf),
247 "<code object %.100s at %p, file \"%.300s\", line %d>",
248 name, co, filename, lineno);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 return PyString_FromString(buf);
Guido van Rossum2dff9911992-09-03 20:50:59 +0000250}
251
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000252static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000253code_compare(PyCodeObject *co, PyCodeObject *cp)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000254{
255 int cmp;
Guido van Rossum44679592000-04-10 16:20:31 +0000256 cmp = PyObject_Compare(co->co_name, cp->co_name);
257 if (cmp) return cmp;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000258 cmp = co->co_argcount - cp->co_argcount;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000259 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000260 cmp = co->co_nlocals - cp->co_nlocals;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000261 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumbeef8aa1997-08-29 17:12:43 +0000262 cmp = co->co_flags - cp->co_flags;
Michael W. Hudson3ae33152002-10-03 09:50:47 +0000263 if (cmp) return (cmp<0)?-1:1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000264 cmp = PyObject_Compare(co->co_code, cp->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000265 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 cmp = PyObject_Compare(co->co_consts, cp->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000267 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 cmp = PyObject_Compare(co->co_names, cp->co_names);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000269 if (cmp) return cmp;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 cmp = PyObject_Compare(co->co_varnames, cp->co_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000271 if (cmp) return cmp;
272 cmp = PyObject_Compare(co->co_freevars, cp->co_freevars);
273 if (cmp) return cmp;
274 cmp = PyObject_Compare(co->co_cellvars, cp->co_cellvars);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000275 return cmp;
276}
277
278static long
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000279code_hash(PyCodeObject *co)
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000280{
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000281 long h, h0, h1, h2, h3, h4, h5, h6;
Guido van Rossum44679592000-04-10 16:20:31 +0000282 h0 = PyObject_Hash(co->co_name);
283 if (h0 == -1) return -1;
Guido van Rossumd076c731998-10-07 19:42:25 +0000284 h1 = PyObject_Hash(co->co_code);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000285 if (h1 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 h2 = PyObject_Hash(co->co_consts);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000287 if (h2 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288 h3 = PyObject_Hash(co->co_names);
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000289 if (h3 == -1) return -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 h4 = PyObject_Hash(co->co_varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000291 if (h4 == -1) return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000292 h5 = PyObject_Hash(co->co_freevars);
293 if (h5 == -1) return -1;
294 h6 = PyObject_Hash(co->co_cellvars);
295 if (h6 == -1) return -1;
296 h = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^
Guido van Rossum681d79a1995-07-18 14:51:37 +0000297 co->co_argcount ^ co->co_nlocals ^ co->co_flags;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000298 if (h == -1) h = -2;
299 return h;
300}
301
Jeremy Hylton78891072001-03-01 06:09:34 +0000302/* XXX code objects need to participate in GC? */
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304PyTypeObject PyCode_Type = {
305 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000306 0,
307 "code",
Guido van Rossum79f25d91997-04-29 20:08:16 +0000308 sizeof(PyCodeObject),
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000309 0,
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000310 (destructor)code_dealloc, /* tp_dealloc */
311 0, /* tp_print */
312 0, /* tp_getattr */
313 0, /* tp_setattr */
314 (cmpfunc)code_compare, /* tp_compare */
315 (reprfunc)code_repr, /* tp_repr */
316 0, /* tp_as_number */
317 0, /* tp_as_sequence */
318 0, /* tp_as_mapping */
319 (hashfunc)code_hash, /* tp_hash */
320 0, /* tp_call */
321 0, /* tp_str */
322 PyObject_GenericGetAttr, /* tp_getattro */
323 0, /* tp_setattro */
324 0, /* tp_as_buffer */
325 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000326 code_doc, /* tp_doc */
Jeremy Hyltonc785f482001-09-14 20:08:07 +0000327 0, /* tp_traverse */
328 0, /* tp_clear */
329 0, /* tp_richcompare */
330 0, /* tp_weaklistoffset */
331 0, /* tp_iter */
332 0, /* tp_iternext */
333 0, /* tp_methods */
334 code_memberlist, /* tp_members */
335 0, /* tp_getset */
336 0, /* tp_base */
337 0, /* tp_dict */
338 0, /* tp_descr_get */
339 0, /* tp_descr_set */
340 0, /* tp_dictoffset */
341 0, /* tp_init */
342 0, /* tp_alloc */
Guido van Rossumbea18cc2002-06-14 20:41:17 +0000343 code_new, /* tp_new */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000344};
345
Guido van Rossum644a12b1997-04-09 19:24:53 +0000346#define NAME_CHARS \
347 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
348
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000349/* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
350
351static int
352all_name_chars(unsigned char *s)
353{
Guido van Rossumcd90c202001-02-09 15:06:42 +0000354 static char ok_name_char[256];
355 static unsigned char *name_chars = (unsigned char *)NAME_CHARS;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000356
Guido van Rossumcd90c202001-02-09 15:06:42 +0000357 if (ok_name_char[*name_chars] == 0) {
358 unsigned char *p;
359 for (p = name_chars; *p; p++)
360 ok_name_char[*p] = 1;
361 }
362 while (*s) {
363 if (ok_name_char[*s++] == 0)
364 return 0;
365 }
366 return 1;
Guido van Rossumfc5ce612001-01-19 00:24:06 +0000367}
368
Michael W. Hudson60934622004-08-12 17:56:29 +0000369static void
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000370intern_strings(PyObject *tuple)
371{
372 int i;
373
374 for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) {
375 PyObject *v = PyTuple_GET_ITEM(tuple, i);
Michael W. Hudson60934622004-08-12 17:56:29 +0000376 if (v == NULL || !PyString_CheckExact(v)) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000377 Py_FatalError("non-string found in code slot");
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000378 }
379 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple, i));
380 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000381}
382
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000383#define GETARG(arr, i) ((int)((arr[i+2]<<8) + arr[i+1]))
384#define UNCONDITIONAL_JUMP(op) (op==JUMP_ABSOLUTE || op==JUMP_FORWARD)
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000385#define ABSOLUTE_JUMP(op) (op==JUMP_ABSOLUTE || op==CONTINUE_LOOP)
386#define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000387#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000388#define CODESIZE(op) (HAS_ARG(op) ? 3 : 1)
389#define ISBASICBLOCK(blocks, start, bytes) (blocks[start]==blocks[start+bytes-1])
390
391static unsigned int *
392markblocks(unsigned char *code, int len)
393{
394 unsigned int *blocks = PyMem_Malloc(len*sizeof(int));
395 int i,j, opcode, oldblock, newblock, blockcnt = 0;
396
397 if (blocks == NULL)
398 return NULL;
399 memset(blocks, 0, len*sizeof(int));
400 for (i=0 ; i<len ; i+=CODESIZE(opcode)) {
401 opcode = code[i];
402 switch (opcode) {
403 case FOR_ITER:
404 case JUMP_FORWARD:
405 case JUMP_IF_FALSE:
406 case JUMP_IF_TRUE:
407 case JUMP_ABSOLUTE:
408 case CONTINUE_LOOP:
409 case SETUP_LOOP:
410 case SETUP_EXCEPT:
411 case SETUP_FINALLY:
412 j = GETJUMPTGT(code, i);
413 oldblock = blocks[j];
414 newblock = ++blockcnt;
415 for (; j<len ; j++) {
416 if (blocks[j] != (unsigned)oldblock)
417 break;
418 blocks[j] = newblock;
419 }
420 break;
421 }
422 }
423 return blocks;
424}
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000425
426static PyObject *
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000427optimize_code(PyObject *code, PyObject* consts, PyObject *names, PyObject *lineno_obj)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000428{
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000429 int i, j, codelen, nops, h, adj;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000430 int tgt, tgttgt, opcode;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000431 unsigned char *codestr = NULL;
432 unsigned char *lineno;
433 int *addrmap = NULL;
434 int new_line, cum_orig_line, last_line, tabsiz;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000435 unsigned int *blocks;
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000436 char *name;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000437
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000438 if (!PyString_Check(code))
439 goto exitUnchanged;
Raymond Hettingera12fa142004-08-24 04:34:16 +0000440
441 /* Avoid situations where jump retargeting could overflow */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000442 codelen = PyString_Size(code);
Raymond Hettingera12fa142004-08-24 04:34:16 +0000443 if (codelen > 32000)
444 goto exitUnchanged;
445
446 /* Make a modifiable copy of the code string */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000447 codestr = PyMem_Malloc(codelen);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000448 if (codestr == NULL)
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000449 goto exitUnchanged;
450 codestr = memcpy(codestr, PyString_AS_STRING(code), codelen);
Raymond Hettinger98bd1812004-08-06 19:46:34 +0000451
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000452 /* Mapping to new jump targets after NOPs are removed */
453 addrmap = PyMem_Malloc(codelen * sizeof(int));
454 if (addrmap == NULL)
455 goto exitUnchanged;
456
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000457 blocks = markblocks(codestr, codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000458 if (blocks == NULL)
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000459 goto exitUnchanged;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000460 assert(PyTuple_Check(consts));
461
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000462 for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) {
463 addrmap[i] = i - nops;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000464 opcode = codestr[i];
465 switch (opcode) {
466
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000467 /* Replace UNARY_NOT JUMP_IF_FALSE POP_TOP with
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000468 with JUMP_IF_TRUE POP_TOP */
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000469 case UNARY_NOT:
470 if (codestr[i+1] != JUMP_IF_FALSE ||
471 codestr[i+4] != POP_TOP ||
472 !ISBASICBLOCK(blocks,i,5))
473 continue;
474 tgt = GETJUMPTGT(codestr, (i+1));
475 if (codestr[tgt] != POP_TOP)
476 continue;
Raymond Hettinger43ea47f2004-06-24 09:25:39 +0000477 j = GETARG(codestr, i+1) + 1;
478 codestr[i] = JUMP_IF_TRUE;
479 SETARG(codestr, i, j);
480 codestr[i+3] = POP_TOP;
481 codestr[i+4] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000482 nops++;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000483 break;
484
485 /* not a is b --> a is not b
486 not a in b --> a not in b
487 not a is not b --> a is b
488 not a not in b --> a in b */
489 case COMPARE_OP:
490 j = GETARG(codestr, i);
491 if (j < 6 || j > 9 ||
492 codestr[i+3] != UNARY_NOT ||
493 !ISBASICBLOCK(blocks,i,4))
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000494 continue;
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000495 SETARG(codestr, i, (j^1));
496 codestr[i+3] = NOP;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000497 nops++;
Tim Petersdb5860b2004-07-17 05:00:52 +0000498 break;
499
Raymond Hettinger76d962d2004-07-16 12:16:48 +0000500 /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */
501 case LOAD_NAME:
502 case LOAD_GLOBAL:
503 j = GETARG(codestr, i);
504 name = PyString_AsString(PyTuple_GET_ITEM(names, j));
505 if (name == NULL || strcmp(name, "None") != 0)
506 continue;
507 for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) {
508 if (PyTuple_GET_ITEM(consts, j) == Py_None) {
509 codestr[i] = LOAD_CONST;
510 SETARG(codestr, i, j);
511 break;
512 }
513 }
Raymond Hettinger9c18e812004-06-21 16:31:15 +0000514 break;
515
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000516 /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP */
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000517 case LOAD_CONST:
518 j = GETARG(codestr, i);
519 if (codestr[i+3] != JUMP_IF_FALSE ||
520 codestr[i+6] != POP_TOP ||
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000521 !ISBASICBLOCK(blocks,i,7) ||
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000522 !PyObject_IsTrue(PyTuple_GET_ITEM(consts, j)))
523 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000524 memset(codestr+i, NOP, 7);
525 nops += 7;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000526 break;
527
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000528 /* Skip over BUILD_SEQN 1 UNPACK_SEQN 1.
529 Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2.
530 Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000531 case BUILD_TUPLE:
532 case BUILD_LIST:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000533 j = GETARG(codestr, i);
534 if (codestr[i+3] != UNPACK_SEQUENCE ||
535 !ISBASICBLOCK(blocks,i,6) ||
536 j != GETARG(codestr, i+3))
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000537 continue;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000538 if (j == 1) {
539 memset(codestr+i, NOP, 6);
540 nops += 6;
541 } else if (j == 2) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000542 codestr[i] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000543 memset(codestr+i+1, NOP, 5);
544 nops += 5;
545 } else if (j == 3) {
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000546 codestr[i] = ROT_THREE;
547 codestr[i+1] = ROT_TWO;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000548 memset(codestr+i+2, NOP, 4);
549 nops += 4;
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000550 }
551 break;
552
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000553 /* Simplify conditional jump to conditional jump where the
554 result of the first test implies the success of a similar
555 test or the failure of the opposite test.
556 Arises in code like:
557 "a and b or c"
558 "a and b and c"
559 x:JUMP_IF_FALSE y y:JUMP_IF_FALSE z --> x:JUMP_IF_FALSE z
Raymond Hettinger65d3c052004-08-25 15:15:56 +0000560 x:JUMP_IF_FALSE y y:JUMP_IF_TRUE z --> x:JUMP_IF_FALSE y+3
561 where y+3 is the instruction following the second test.
Raymond Hettingeref0a82b2004-08-25 03:18:29 +0000562 */
563 case JUMP_IF_FALSE:
564 case JUMP_IF_TRUE:
565 tgt = GETJUMPTGT(codestr, i);
566 j = codestr[tgt];
567 if (j == JUMP_IF_FALSE || j == JUMP_IF_TRUE) {
568 if (j == opcode) {
569 tgttgt = GETJUMPTGT(codestr, tgt) - i - 3;
570 SETARG(codestr, i, tgttgt);
571 } else {
572 tgt -= i;
573 SETARG(codestr, i, tgt);
574 }
575 break;
576 }
577 /* Intentional fallthrough */
578
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000579 /* Replace jumps to unconditional jumps */
Raymond Hettinger255a3d02003-04-15 10:35:07 +0000580 case FOR_ITER:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000581 case JUMP_FORWARD:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000582 case JUMP_ABSOLUTE:
583 case CONTINUE_LOOP:
584 case SETUP_LOOP:
585 case SETUP_EXCEPT:
586 case SETUP_FINALLY:
587 tgt = GETJUMPTGT(codestr, i);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000588 if (!UNCONDITIONAL_JUMP(codestr[tgt]))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000589 continue;
590 tgttgt = GETJUMPTGT(codestr, tgt);
591 if (opcode == JUMP_FORWARD) /* JMP_ABS can go backwards */
592 opcode = JUMP_ABSOLUTE;
Raymond Hettinger5b75c382003-03-28 12:05:00 +0000593 if (!ABSOLUTE_JUMP(opcode))
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000594 tgttgt -= i + 3; /* Calc relative jump addr */
595 if (tgttgt < 0) /* No backward relative jumps */
596 continue;
597 codestr[i] = opcode;
598 SETARG(codestr, i, tgttgt);
599 break;
600
601 case EXTENDED_ARG:
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000602 goto exitUnchanged;
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000603
604 /* Replace RETURN LOAD_CONST None RETURN with just RETURN */
605 case RETURN_VALUE:
606 if (i+4 >= codelen ||
607 codestr[i+4] != RETURN_VALUE ||
608 !ISBASICBLOCK(blocks,i,5))
609 continue;
610 memset(codestr+i+1, NOP, 4);
611 nops += 4;
612 break;
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000613 }
614 }
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000615
616 /* Fixup linenotab */
Raymond Hettingera12fa142004-08-24 04:34:16 +0000617 /* XXX make sure this handles intervals > 256 */
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000618 assert(PyString_Check(lineno_obj));
619 lineno = PyString_AS_STRING(lineno_obj);
620 tabsiz = PyString_GET_SIZE(lineno_obj);
621 cum_orig_line = 0;
622 last_line = 0;
623 for (i=0 ; i < tabsiz ; i+=2) {
624 cum_orig_line += lineno[i];
625 new_line = addrmap[cum_orig_line];
626 lineno[i] =((unsigned char)(new_line - last_line));
627 last_line = new_line;
628 }
629
630 /* Remove NOPs and fixup jump targets */
631 for (i=0, h=0 ; i<codelen ; ) {
632 opcode = codestr[i];
633 switch (opcode) {
634 case NOP:
635 i++;
636 continue;
637
638 case JUMP_ABSOLUTE:
639 case CONTINUE_LOOP:
640 j = addrmap[GETARG(codestr, i)];
641 SETARG(codestr, i, j);
642 break;
643
644 case FOR_ITER:
645 case JUMP_FORWARD:
646 case JUMP_IF_FALSE:
647 case JUMP_IF_TRUE:
648 case SETUP_LOOP:
649 case SETUP_EXCEPT:
650 case SETUP_FINALLY:
651 j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;
652 SETARG(codestr, i, j);
653 break;
654 }
655 adj = CODESIZE(opcode);
656 while (adj--)
657 codestr[h++] = codestr[i++];
658 }
Raymond Hettingera12fa142004-08-24 04:34:16 +0000659 assert(h + nops == codelen);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000660
661 code = PyString_FromStringAndSize((char *)codestr, h);
662 PyMem_Free(addrmap);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000663 PyMem_Free(codestr);
Raymond Hettingerff5bc502004-03-21 15:12:00 +0000664 PyMem_Free(blocks);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000665 return code;
666
667exitUnchanged:
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +0000668 if (addrmap != NULL)
669 PyMem_Free(addrmap);
670 if (codestr != NULL)
671 PyMem_Free(codestr);
Raymond Hettingerf6f575a2003-03-26 01:07:54 +0000672 Py_INCREF(code);
673 return code;
674}
675
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000677PyCode_New(int argcount, int nlocals, int stacksize, int flags,
678 PyObject *code, PyObject *consts, PyObject *names,
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000679 PyObject *varnames, PyObject *freevars, PyObject *cellvars,
680 PyObject *filename, PyObject *name, int firstlineno,
681 PyObject *lnotab)
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000682{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 PyCodeObject *co;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000684 int i;
685 /* Check argument types */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000686 if (argcount < 0 || nlocals < 0 ||
Guido van Rossumd076c731998-10-07 19:42:25 +0000687 code == NULL ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000688 consts == NULL || !PyTuple_Check(consts) ||
689 names == NULL || !PyTuple_Check(names) ||
690 varnames == NULL || !PyTuple_Check(varnames) ||
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000691 freevars == NULL || !PyTuple_Check(freevars) ||
692 cellvars == NULL || !PyTuple_Check(cellvars) ||
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 name == NULL || !PyString_Check(name) ||
694 filename == NULL || !PyString_Check(filename) ||
Jeremy Hylton9f64caa2001-11-09 22:02:48 +0000695 lnotab == NULL || !PyString_Check(lnotab) ||
696 !PyObject_CheckReadBuffer(code)) {
Guido van Rossumd076c731998-10-07 19:42:25 +0000697 PyErr_BadInternalCall();
698 return NULL;
699 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000700 intern_strings(names);
701 intern_strings(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000702 intern_strings(freevars);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000703 intern_strings(cellvars);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000704 /* Intern selected string constants */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 for (i = PyTuple_Size(consts); --i >= 0; ) {
706 PyObject *v = PyTuple_GetItem(consts, i);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000707 if (!PyString_Check(v))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000708 continue;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000709 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v)))
Guido van Rossum7b89b6a1997-01-18 08:02:57 +0000710 continue;
711 PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i));
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000712 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000713 co = PyObject_NEW(PyCodeObject, &PyCode_Type);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000714 if (co != NULL) {
Guido van Rossum681d79a1995-07-18 14:51:37 +0000715 co->co_argcount = argcount;
716 co->co_nlocals = nlocals;
Guido van Rossum8b993a91997-01-17 21:04:03 +0000717 co->co_stacksize = stacksize;
Guido van Rossum681d79a1995-07-18 14:51:37 +0000718 co->co_flags = flags;
Raymond Hettinger1a789292004-08-18 05:22:06 +0000719 Py_INCREF(code);
720 co->co_code = code;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_INCREF(consts);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000722 co->co_consts = consts;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 Py_INCREF(names);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000724 co->co_names = names;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 Py_INCREF(varnames);
Guido van Rossum681d79a1995-07-18 14:51:37 +0000726 co->co_varnames = varnames;
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000727 Py_INCREF(freevars);
728 co->co_freevars = freevars;
729 Py_INCREF(cellvars);
730 co->co_cellvars = cellvars;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 Py_INCREF(filename);
Guido van Rossuma082ce41991-06-04 19:41:56 +0000732 co->co_filename = filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000733 Py_INCREF(name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000734 co->co_name = name;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000735 co->co_firstlineno = firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736 Py_INCREF(lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000737 co->co_lnotab = lnotab;
Jeremy Hylton985eba52003-02-05 23:13:00 +0000738 if (PyTuple_GET_SIZE(freevars) == 0 &&
739 PyTuple_GET_SIZE(cellvars) == 0)
740 co->co_flags |= CO_NOFREE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000741 }
742 return co;
743}
744
745
746/* Data structure used internally */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000747
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000748/* The compiler uses two passes to generate bytecodes. The first pass
749 builds the symbol table. The second pass generates the bytecode.
750
751 The first pass uses a single symtable struct. The second pass uses
752 a compiling struct for each code block. The compiling structs
753 share a reference to the symtable.
754
755 The two passes communicate via symtable_load_symbols() and via
756 is_local() and is_global(). The former initializes several slots
757 in the compiling struct: c_varnames, c_locals, c_nlocals,
758 c_argcount, c_globals, and c_flags.
759*/
760
Tim Peters2a7f3842001-06-09 09:26:21 +0000761/* All about c_lnotab.
762
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000763c_lnotab is an array of unsigned bytes disguised as a Python string. Since
764version 2.3, SET_LINENO opcodes are never generated and bytecode offsets are
765mapped to source code line #s via c_lnotab instead.
766
Tim Peters2a7f3842001-06-09 09:26:21 +0000767The array is conceptually a list of
768 (bytecode offset increment, line number increment)
769pairs. The details are important and delicate, best illustrated by example:
770
771 byte code offset source code line number
772 0 1
773 6 2
774 50 7
775 350 307
776 361 308
777
778The first trick is that these numbers aren't stored, only the increments
779from one row to the next (this doesn't really work, but it's a start):
780
781 0, 1, 6, 1, 44, 5, 300, 300, 11, 1
782
783The second trick is that an unsigned byte can't hold negative values, or
784values larger than 255, so (a) there's a deep assumption that byte code
785offsets and their corresponding line #s both increase monotonically, and (b)
786if at least one column jumps by more than 255 from one row to the next, more
787than one pair is written to the table. In case #b, there's no way to know
788from looking at the table later how many were written. That's the delicate
789part. A user of c_lnotab desiring to find the source line number
790corresponding to a bytecode address A should do something like this
791
792 lineno = addr = 0
793 for addr_incr, line_incr in c_lnotab:
794 addr += addr_incr
795 if addr > A:
796 return lineno
797 lineno += line_incr
798
799In order for this to work, when the addr field increments by more than 255,
800the line # increment in each pair generated must be 0 until the remaining addr
801increment is < 256. So, in the example above, com_set_lineno should not (as
802was actually done until 2.2) expand 300, 300 to 255, 255, 45, 45, but to
803255, 0, 45, 255, 0, 45.
804*/
805
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000806struct compiling {
Fred Drakefd1f1be2000-09-08 16:31:24 +0000807 PyObject *c_code; /* string */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 PyObject *c_consts; /* list of objects */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000809 PyObject *c_const_dict; /* inverse of c_consts */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 PyObject *c_names; /* list of strings (names) */
Guido van Rossuma2ace6a2000-04-28 16:42:25 +0000811 PyObject *c_name_dict; /* inverse of c_names */
Neal Norwitz06982222002-12-18 01:18:44 +0000812 PyObject *c_globals; /* dictionary (value=None or True) */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 PyObject *c_locals; /* dictionary (value=localID) */
814 PyObject *c_varnames; /* list (inverse of c_locals) */
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000815 PyObject *c_freevars; /* dictionary (value=None) */
Brett Cannon31f83502004-08-15 01:15:01 +0000816 PyObject *c_cellvars; /* dictionary */
Guido van Rossum681d79a1995-07-18 14:51:37 +0000817 int c_nlocals; /* index of next local */
818 int c_argcount; /* number of top-level arguments */
819 int c_flags; /* same as co_flags */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000820 int c_nexti; /* index into c_code */
821 int c_errors; /* counts errors occurred */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000822 int c_infunction; /* set when compiling a function */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +0000823 int c_interactive; /* generating code for interactive command */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000824 int c_loops; /* counts nested loops */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000825 int c_begin; /* begin of current loop, for 'continue' */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000826 int c_block[CO_MAXBLOCKS]; /* stack of block types */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000827 int c_nblocks; /* current block stack level */
Martin v. Löwis95292d62002-12-11 14:04:59 +0000828 const char *c_filename; /* filename of current node */
Guido van Rossum9bfef441993-03-29 10:43:31 +0000829 char *c_name; /* name of object (e.g. function) */
Guido van Rossum452a9831996-09-17 14:32:04 +0000830 int c_lineno; /* Current line number */
Guido van Rossum8b993a91997-01-17 21:04:03 +0000831 int c_stacklevel; /* Current stack level */
832 int c_maxstacklevel; /* Maximum stack level */
Guido van Rossumda4eb5c1997-01-24 03:43:35 +0000833 int c_firstlineno;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 PyObject *c_lnotab; /* Table mapping address to line number */
Armin Rigo80d937e2004-03-22 17:52:53 +0000835 int c_last_addr; /* last op addr seen and recorded in lnotab */
836 int c_last_line; /* last line seen and recorded in lnotab */
837 int c_lnotab_next; /* current length of lnotab */
838 int c_lnotab_last; /* start of last lnotab record added */
Guido van Rossum8ff077b1996-08-24 06:21:31 +0000839 char *c_private; /* for private name mangling */
Skip Montanaro803d6e52000-08-12 18:09:51 +0000840 int c_tmpname; /* temporary local name counter */
Guido van Rossumcd90c202001-02-09 15:06:42 +0000841 int c_nested; /* Is block nested funcdef or lamdef? */
842 int c_closure; /* Is nested w/freevars? */
843 struct symtable *c_symtable; /* pointer to module symbol table */
Jeremy Hylton4db62b12001-02-27 19:07:02 +0000844 PyFutureFeatures *c_future; /* pointer to module's __future__ */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +0000845 char *c_encoding; /* source encoding (a borrowed reference) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000846};
847
Guido van Rossumf68d8e52001-04-14 17:55:09 +0000848static int
849is_free(int v)
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000850{
851 if ((v & (USE | DEF_FREE))
852 && !(v & (DEF_LOCAL | DEF_PARAM | DEF_GLOBAL)))
853 return 1;
854 if (v & DEF_FREE_CLASS)
855 return 1;
856 return 0;
857}
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000858
Jeremy Hylton5acc0c02001-02-02 20:01:10 +0000859static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000860com_error(struct compiling *c, PyObject *exc, char *msg)
Guido van Rossum452a9831996-09-17 14:32:04 +0000861{
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000862 PyObject *t = NULL, *v = NULL, *w = NULL, *line = NULL;
863
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000864 if (c == NULL) {
865 /* Error occurred via symtable call to
866 is_constant_false */
867 PyErr_SetString(exc, msg);
868 return;
869 }
Guido van Rossum635abd21997-01-06 22:56:52 +0000870 c->c_errors++;
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000871 if (c->c_lineno < 1 || c->c_interactive) {
872 /* Unknown line number or interactive input */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 PyErr_SetString(exc, msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000874 return;
875 }
Fred Drakedcf08e02000-08-15 15:49:44 +0000876 v = PyString_FromString(msg);
Guido van Rossum452a9831996-09-17 14:32:04 +0000877 if (v == NULL)
878 return; /* MemoryError, too bad */
Fred Drakedcf08e02000-08-15 15:49:44 +0000879
Jeremy Hyltonad3d3f22001-02-28 17:47:12 +0000880 line = PyErr_ProgramText(c->c_filename, c->c_lineno);
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000881 if (line == NULL) {
882 Py_INCREF(Py_None);
883 line = Py_None;
884 }
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000885 if (exc == PyExc_SyntaxError) {
886 t = Py_BuildValue("(ziOO)", c->c_filename, c->c_lineno,
887 Py_None, line);
888 if (t == NULL)
889 goto exit;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000890 w = PyTuple_Pack(2, v, t);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +0000891 if (w == NULL)
892 goto exit;
893 PyErr_SetObject(exc, w);
894 } else {
895 /* Make sure additional exceptions are printed with
896 file and line, also. */
897 PyErr_SetObject(exc, v);
898 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
899 }
Jeremy Hylton9f1b9932001-02-28 07:07:43 +0000900 exit:
901 Py_XDECREF(t);
902 Py_XDECREF(v);
903 Py_XDECREF(w);
904 Py_XDECREF(line);
Guido van Rossum452a9831996-09-17 14:32:04 +0000905}
906
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000907/* Interface to the block stack */
908
909static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000910block_push(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000911{
Guido van Rossum8b993a91997-01-17 21:04:03 +0000912 if (c->c_nblocks >= CO_MAXBLOCKS) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 com_error(c, PyExc_SystemError,
914 "too many statically nested blocks");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000915 }
916 else {
917 c->c_block[c->c_nblocks++] = type;
918 }
919}
920
921static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000922block_pop(struct compiling *c, int type)
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000923{
924 if (c->c_nblocks > 0)
925 c->c_nblocks--;
926 if (c->c_block[c->c_nblocks] != type && c->c_errors == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927 com_error(c, PyExc_SystemError, "bad block pop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000928 }
929}
930
Guido van Rossum681d79a1995-07-18 14:51:37 +0000931/* Prototype forward declarations */
Guido van Rossum4bad92c1991-07-27 21:34:52 +0000932
Martin v. Löwis95292d62002-12-11 14:04:59 +0000933static int issue_warning(const char *, const char *, int);
934static int com_init(struct compiling *, const char *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000935static void com_free(struct compiling *);
936static void com_push(struct compiling *, int);
937static void com_pop(struct compiling *, int);
938static void com_done(struct compiling *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000939static void com_node(struct compiling *, node *);
940static void com_factor(struct compiling *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000941static void com_addbyte(struct compiling *, int);
942static void com_addint(struct compiling *, int);
943static void com_addoparg(struct compiling *, int, int);
944static void com_addfwref(struct compiling *, int, int *);
945static void com_backpatch(struct compiling *, int);
946static int com_add(struct compiling *, PyObject *, PyObject *, PyObject *);
947static int com_addconst(struct compiling *, PyObject *);
948static int com_addname(struct compiling *, PyObject *);
949static void com_addopname(struct compiling *, int, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000950static void com_test(struct compiling *c, node *n);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000951static void com_list(struct compiling *, node *, int);
Skip Montanaro803d6e52000-08-12 18:09:51 +0000952static void com_list_iter(struct compiling *, node *, node *, char *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000953static void com_gen_iter(struct compiling *, node *, node *);
Tim Petersdbd9ba62000-07-09 03:09:57 +0000954static int com_argdefs(struct compiling *, node *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000955static void com_assign(struct compiling *, node *, int, node *);
956static void com_assign_name(struct compiling *, node *, int);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000957static int com_make_closure(struct compiling *c, PyCodeObject *co);
958
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000959static PyCodeObject *icompile(node *, struct compiling *);
Martin v. Löwis95292d62002-12-11 14:04:59 +0000960static PyCodeObject *jcompile(node *, const char *, struct compiling *,
Jeremy Hylton9f324e92001-03-01 22:59:14 +0000961 PyCompilerFlags *);
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000962static PyObject *parsestrplus(struct compiling*, node *);
963static PyObject *parsestr(struct compiling *, char *);
Thomas Wouters434d0822000-08-24 20:11:32 +0000964static node *get_rawdocstring(node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +0000965
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000966static int get_ref_type(struct compiling *, char *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000967
968/* symtable operations */
Raymond Hettinger354433a2004-05-19 08:20:33 +0000969static int symtable_lookup(struct symtable *st, char *name);
Jeremy Hylton1955fcf2003-07-15 20:23:26 +0000970static struct symtable *symtable_build(node *, PyFutureFeatures *,
971 const char *filename);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000972static int symtable_load_symbols(struct compiling *);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000973static struct symtable *symtable_init(void);
Jeremy Hylton4b38da62001-02-02 18:19:15 +0000974static void symtable_enter_scope(struct symtable *, char *, int, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000975static int symtable_exit_scope(struct symtable *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000976static int symtable_add_def(struct symtable *, char *, int);
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000977static int symtable_add_def_o(struct symtable *, PyObject *, PyObject *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000978
979static void symtable_node(struct symtable *, node *);
980static void symtable_funcdef(struct symtable *, node *);
981static void symtable_default_args(struct symtable *, node *);
982static void symtable_params(struct symtable *, node *);
983static void symtable_params_fplist(struct symtable *, node *n);
984static void symtable_global(struct symtable *, node *);
985static void symtable_import(struct symtable *, node *);
Jeremy Hyltoneab156f2001-01-30 01:24:43 +0000986static void symtable_assign(struct symtable *, node *, int);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000987static void symtable_list_comprehension(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000988static void symtable_generator_expression(struct symtable *, node *);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +0000989static void symtable_list_for(struct symtable *, node *);
Raymond Hettinger354433a2004-05-19 08:20:33 +0000990static void symtable_gen_for(struct symtable *, node *, int);
991static void symtable_gen_iter(struct symtable *, node *);
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000992
Jeremy Hylton64949cb2001-01-25 20:06:59 +0000993static int symtable_update_free_vars(struct symtable *);
994static int symtable_undo_free(struct symtable *, PyObject *, PyObject *);
995static int symtable_check_global(struct symtable *, PyObject *, PyObject *);
996
Jeremy Hyltone36f7782001-01-19 03:21:30 +0000997/* helper */
998static void
999do_pad(int pad)
1000{
1001 int i;
1002 for (i = 0; i < pad; ++i)
1003 fprintf(stderr, " ");
1004}
1005
1006static void
1007dump(node *n, int pad, int depth)
1008{
1009 int i;
1010 if (depth == 0)
1011 return;
1012 do_pad(pad);
1013 fprintf(stderr, "%d: %s\n", TYPE(n), STR(n));
1014 if (depth > 0)
1015 depth--;
1016 for (i = 0; i < NCH(n); ++i)
1017 dump(CHILD(n, i), pad + 1, depth);
1018}
1019
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001020static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00001021com_init(struct compiling *c, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001022{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001023 memset((void *)c, '\0', sizeof(struct compiling));
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 if ((c->c_code = PyString_FromStringAndSize((char *)NULL,
1025 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001026 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 if ((c->c_consts = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001028 goto fail;
1029 if ((c->c_const_dict = PyDict_New()) == NULL)
1030 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 if ((c->c_names = PyList_New(0)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001032 goto fail;
1033 if ((c->c_name_dict = PyDict_New()) == NULL)
1034 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 if ((c->c_locals = PyDict_New()) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001036 goto fail;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if ((c->c_lnotab = PyString_FromStringAndSize((char *)NULL,
1038 1000)) == NULL)
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001039 goto fail;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001040 c->c_globals = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001041 c->c_varnames = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001042 c->c_freevars = NULL;
1043 c->c_cellvars = NULL;
Guido van Rossum681d79a1995-07-18 14:51:37 +00001044 c->c_nlocals = 0;
1045 c->c_argcount = 0;
1046 c->c_flags = 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001047 c->c_nexti = 0;
1048 c->c_errors = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001049 c->c_infunction = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001050 c->c_interactive = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051 c->c_loops = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00001052 c->c_begin = 0;
1053 c->c_nblocks = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001054 c->c_filename = filename;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001055 c->c_name = "?";
Guido van Rossum452a9831996-09-17 14:32:04 +00001056 c->c_lineno = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001057 c->c_stacklevel = 0;
1058 c->c_maxstacklevel = 0;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001059 c->c_firstlineno = 0;
1060 c->c_last_addr = 0;
1061 c->c_last_line = 0;
Barry Warsaw174e8012001-01-22 04:35:57 +00001062 c->c_lnotab_next = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00001063 c->c_lnotab_last = 0;
Skip Montanaro803d6e52000-08-12 18:09:51 +00001064 c->c_tmpname = 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001065 c->c_nested = 0;
1066 c->c_closure = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001067 c->c_symtable = NULL;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001068 return 1;
1069
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001070 fail:
1071 com_free(c);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001072 return 0;
1073}
1074
1075static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001076com_free(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001077{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 Py_XDECREF(c->c_code);
1079 Py_XDECREF(c->c_consts);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001080 Py_XDECREF(c->c_const_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 Py_XDECREF(c->c_names);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001082 Py_XDECREF(c->c_name_dict);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 Py_XDECREF(c->c_globals);
1084 Py_XDECREF(c->c_locals);
1085 Py_XDECREF(c->c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001086 Py_XDECREF(c->c_freevars);
1087 Py_XDECREF(c->c_cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 Py_XDECREF(c->c_lnotab);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00001089 if (c->c_future)
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00001090 PyObject_FREE((void *)c->c_future);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001091}
1092
1093static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001094com_push(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001095{
1096 c->c_stacklevel += n;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001097 if (c->c_stacklevel > c->c_maxstacklevel) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00001098 c->c_maxstacklevel = c->c_stacklevel;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001099 /*
1100 fprintf(stderr, "%s:%s:%d max stack nexti=%d level=%d n=%d\n",
1101 c->c_filename, c->c_name, c->c_lineno,
1102 c->c_nexti, c->c_stacklevel, n);
1103 */
1104 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00001105}
1106
1107static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001108com_pop(struct compiling *c, int n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001109{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001110 if (c->c_stacklevel < n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00001111 c->c_stacklevel = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00001112 else
1113 c->c_stacklevel -= n;
1114}
1115
1116static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001117com_done(struct compiling *c)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001118{
1119 if (c->c_code != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 _PyString_Resize(&c->c_code, c->c_nexti);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001121 if (c->c_lnotab != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 _PyString_Resize(&c->c_lnotab, c->c_lnotab_next);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001123}
1124
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001125static int
1126com_check_size(PyObject **s, int offset)
1127{
1128 int len = PyString_GET_SIZE(*s);
1129 if (offset >= len)
1130 return _PyString_Resize(s, len * 2);
1131 return 0;
1132}
1133
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001134static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001135com_addbyte(struct compiling *c, int byte)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001136{
Guido van Rossum681d79a1995-07-18 14:51:37 +00001137 /*fprintf(stderr, "%3d: %3d\n", c->c_nexti, byte);*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001138 assert(byte >= 0 && byte <= 255);
Martin v. Löwis7198a522002-01-01 19:59:11 +00001139 assert(c->c_code != 0);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001140 if (com_check_size(&c->c_code, c->c_nexti)) {
1141 c->c_errors++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001142 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001143 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001144 PyString_AS_STRING(c->c_code)[c->c_nexti++] = byte;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001145}
1146
1147static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001148com_addint(struct compiling *c, int x)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001149{
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001150 com_addbyte(c, x & 0xff);
1151 com_addbyte(c, x >> 8); /* XXX x should be positive */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001152}
1153
1154static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001155com_add_lnotab(struct compiling *c, int addr, int line)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001156{
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001157 char *p;
1158 if (c->c_lnotab == NULL)
1159 return;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001160 if (com_check_size(&c->c_lnotab, c->c_lnotab_next + 2)) {
1161 c->c_errors++;
1162 return;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001163 }
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001164 p = PyString_AS_STRING(c->c_lnotab) + c->c_lnotab_next;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001165 *p++ = addr;
1166 *p++ = line;
1167 c->c_lnotab_next += 2;
1168}
1169
1170static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001171com_set_lineno(struct compiling *c, int lineno)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001172{
1173 c->c_lineno = lineno;
1174 if (c->c_firstlineno == 0) {
1175 c->c_firstlineno = c->c_last_line = lineno;
1176 }
1177 else {
1178 int incr_addr = c->c_nexti - c->c_last_addr;
1179 int incr_line = lineno - c->c_last_line;
Armin Rigo80d937e2004-03-22 17:52:53 +00001180 c->c_lnotab_last = c->c_lnotab_next;
Tim Peters2a7f3842001-06-09 09:26:21 +00001181 while (incr_addr > 255) {
1182 com_add_lnotab(c, 255, 0);
1183 incr_addr -= 255;
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001184 }
Tim Peters2a7f3842001-06-09 09:26:21 +00001185 while (incr_line > 255) {
1186 com_add_lnotab(c, incr_addr, 255);
1187 incr_line -=255;
1188 incr_addr = 0;
1189 }
1190 if (incr_addr > 0 || incr_line > 0)
1191 com_add_lnotab(c, incr_addr, incr_line);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00001192 c->c_last_addr = c->c_nexti;
1193 c->c_last_line = lineno;
1194 }
1195}
1196
1197static void
Armin Rigo80d937e2004-03-22 17:52:53 +00001198com_strip_lnotab(struct compiling *c)
1199{
1200 /* strip the last lnotab entry if no opcode were emitted.
1201 * This prevents a line number to be generated on a final
1202 * pass, like in the following example:
1203 *
1204 * if a:
1205 * print 5
1206 * else:
1207 * pass
1208 *
1209 * Without the fix, a line trace event would be generated
1210 * on the pass even if a is true (because of the implicit
1211 * return).
1212 */
1213 if (c->c_nexti == c->c_last_addr && c->c_lnotab_last > 0) {
1214 c->c_lnotab_next = c->c_lnotab_last;
1215 }
1216}
1217
1218static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001219com_addoparg(struct compiling *c, int op, int arg)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001220{
Fred Drakeef8ace32000-08-24 00:32:09 +00001221 int extended_arg = arg >> 16;
Fred Drakeef8ace32000-08-24 00:32:09 +00001222 if (extended_arg){
1223 com_addbyte(c, EXTENDED_ARG);
1224 com_addint(c, extended_arg);
1225 arg &= 0xffff;
1226 }
Guido van Rossum8e793d91997-03-03 19:13:14 +00001227 com_addbyte(c, op);
1228 com_addint(c, arg);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001229}
1230
1231static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001232com_addfwref(struct compiling *c, int op, int *p_anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001233{
1234 /* Compile a forward reference for backpatching */
1235 int here;
1236 int anchor;
1237 com_addbyte(c, op);
1238 here = c->c_nexti;
1239 anchor = *p_anchor;
1240 *p_anchor = here;
1241 com_addint(c, anchor == 0 ? 0 : here - anchor);
1242}
1243
1244static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001245com_backpatch(struct compiling *c, int anchor)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001246{
Jeremy Hylton93a569d2001-10-17 13:22:22 +00001247 unsigned char *code = (unsigned char *) PyString_AS_STRING(c->c_code);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001248 int target = c->c_nexti;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001249 int dist;
1250 int prev;
1251 for (;;) {
1252 /* Make the JUMP instruction at anchor point to target */
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001253 prev = code[anchor] + (code[anchor+1] << 8);
1254 dist = target - (anchor+2);
1255 code[anchor] = dist & 0xff;
Fred Drakeef8ace32000-08-24 00:32:09 +00001256 dist >>= 8;
1257 code[anchor+1] = dist;
1258 dist >>= 8;
1259 if (dist) {
1260 com_error(c, PyExc_SystemError,
1261 "com_backpatch: offset too large");
1262 break;
1263 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001264 if (!prev)
1265 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001266 anchor -= prev;
1267 }
1268}
1269
Guido van Rossuma9df32a1991-12-31 13:13:35 +00001270/* Handle literals and names uniformly */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001271
1272static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001273com_add(struct compiling *c, PyObject *list, PyObject *dict, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001274{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001275 PyObject *w, *t, *np=NULL;
1276 long n;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001277
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001278 t = PyTuple_Pack(2, v, v->ob_type);
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001279 if (t == NULL)
1280 goto fail;
1281 w = PyDict_GetItem(dict, t);
1282 if (w != NULL) {
1283 n = PyInt_AsLong(w);
1284 } else {
1285 n = PyList_Size(list);
1286 np = PyInt_FromLong(n);
1287 if (np == NULL)
1288 goto fail;
1289 if (PyList_Append(list, v) != 0)
1290 goto fail;
1291 if (PyDict_SetItem(dict, t, np) != 0)
1292 goto fail;
1293 Py_DECREF(np);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001294 }
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001295 Py_DECREF(t);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00001296 return n;
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001297 fail:
1298 Py_XDECREF(np);
1299 Py_XDECREF(t);
1300 c->c_errors++;
1301 return 0;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001302}
1303
1304static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001305com_addconst(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001306{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001307 return com_add(c, c->c_consts, c->c_const_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001308}
1309
1310static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001311com_addname(struct compiling *c, PyObject *v)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001312{
Guido van Rossuma2ace6a2000-04-28 16:42:25 +00001313 return com_add(c, c->c_names, c->c_name_dict, v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001314}
1315
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001316int
1317_Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001318{
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001319 /* Name mangling: __private becomes _classname__private.
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001320 This is independent from how the name is used. */
Guido van Rossum582acec2000-06-28 22:07:35 +00001321 size_t nlen, plen;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001322 if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
1323 return 0;
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001324 nlen = strlen(name);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001325 if (nlen+2 >= maxlen)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001326 return 0; /* Don't mangle __extremely_long_names */
1327 if (name[nlen-1] == '_' && name[nlen-2] == '_')
1328 return 0; /* Don't mangle __whatever__ */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001329 /* Strip leading underscores from class name */
1330 while (*p == '_')
1331 p++;
1332 if (*p == '\0')
1333 return 0; /* Don't mangle if class is just underscores */
1334 plen = strlen(p);
1335 if (plen + nlen >= maxlen)
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001336 plen = maxlen-nlen-2; /* Truncate class name if too long */
1337 /* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001338 buffer[0] = '_';
1339 strncpy(buffer+1, p, plen);
Guido van Rossumd8a6d1c1996-08-24 07:54:27 +00001340 strcpy(buffer+1+plen, name);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001341 return 1;
1342}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001343
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001344static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001345com_addop_name(struct compiling *c, int op, char *name)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001346{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001347 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001348 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001349 char buffer[MANGLE_LEN];
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001350
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001351 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Guido van Rossum8ff077b1996-08-24 06:21:31 +00001352 name = buffer;
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00001353 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001354 c->c_errors++;
1355 i = 255;
1356 }
1357 else {
1358 i = com_addname(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001360 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001361 com_addoparg(c, op, i);
1362}
1363
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001364#define NAME_LOCAL 0
1365#define NAME_GLOBAL 1
1366#define NAME_DEFAULT 2
1367#define NAME_CLOSURE 3
1368
1369static int
1370com_lookup_arg(PyObject *dict, PyObject *name)
1371{
1372 PyObject *v = PyDict_GetItem(dict, name);
1373 if (v == NULL)
1374 return -1;
1375 else
1376 return PyInt_AS_LONG(v);
1377}
1378
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001379static int
1380none_assignment_check(struct compiling *c, char *name, int assigning)
1381{
1382 if (name[0] == 'N' && strcmp(name, "None") == 0) {
1383 char *msg;
1384 if (assigning)
Michael W. Hudson976249b2003-01-16 15:39:07 +00001385 msg = "assignment to None";
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001386 else
1387 msg = "deleting None";
Raymond Hettinger11a70c72004-07-17 21:46:25 +00001388 com_error(c, PyExc_SyntaxError, msg);
1389 return -1;
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001390 }
1391 return 0;
1392}
1393
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001394static void
1395com_addop_varname(struct compiling *c, int kind, char *name)
1396{
1397 PyObject *v;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001398 int i, reftype;
1399 int scope = NAME_DEFAULT;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001400 int op = STOP_CODE;
1401 char buffer[MANGLE_LEN];
1402
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001403 if (kind != VAR_LOAD &&
1404 none_assignment_check(c, name, kind == VAR_STORE))
1405 {
Guido van Rossum3ac99d42002-08-16 02:13:49 +00001406 i = 255;
1407 goto done;
1408 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001409 if (_Py_Mangle(c->c_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001410 name = buffer;
1411 if (name == NULL || (v = PyString_InternFromString(name)) == NULL) {
1412 c->c_errors++;
1413 i = 255;
1414 goto done;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001415 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001416
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001417 reftype = get_ref_type(c, name);
1418 switch (reftype) {
1419 case LOCAL:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001420 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001421 scope = NAME_LOCAL;
1422 break;
1423 case GLOBAL_EXPLICIT:
1424 scope = NAME_GLOBAL;
1425 break;
1426 case GLOBAL_IMPLICIT:
1427 if (c->c_flags & CO_OPTIMIZED)
1428 scope = NAME_GLOBAL;
1429 break;
1430 case FREE:
1431 case CELL:
1432 scope = NAME_CLOSURE;
1433 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001434 }
1435
1436 i = com_addname(c, v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001437 if (scope == NAME_LOCAL)
1438 i = com_lookup_arg(c->c_locals, v);
1439 else if (reftype == FREE)
1440 i = com_lookup_arg(c->c_freevars, v);
1441 else if (reftype == CELL)
1442 i = com_lookup_arg(c->c_cellvars, v);
1443 if (i == -1) {
1444 c->c_errors++; /* XXX no exception set */
1445 i = 255;
1446 goto done;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001447 }
1448 Py_DECREF(v);
1449
1450 switch (kind) {
1451 case VAR_LOAD:
1452 switch (scope) {
1453 case NAME_LOCAL:
1454 op = LOAD_FAST;
1455 break;
1456 case NAME_GLOBAL:
1457 op = LOAD_GLOBAL;
1458 break;
1459 case NAME_DEFAULT:
1460 op = LOAD_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001461 break;
1462 case NAME_CLOSURE:
1463 op = LOAD_DEREF;
1464 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001465 }
1466 break;
1467 case VAR_STORE:
1468 switch (scope) {
1469 case NAME_LOCAL:
1470 op = STORE_FAST;
1471 break;
1472 case NAME_GLOBAL:
1473 op = STORE_GLOBAL;
1474 break;
1475 case NAME_DEFAULT:
1476 op = STORE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001477 break;
1478 case NAME_CLOSURE:
1479 op = STORE_DEREF;
1480 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001481 }
1482 break;
1483 case VAR_DELETE:
1484 switch (scope) {
1485 case NAME_LOCAL:
1486 op = DELETE_FAST;
1487 break;
1488 case NAME_GLOBAL:
1489 op = DELETE_GLOBAL;
1490 break;
1491 case NAME_DEFAULT:
1492 op = DELETE_NAME;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001493 break;
1494 case NAME_CLOSURE: {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00001495 char buf[500];
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001496 PyOS_snprintf(buf, sizeof(buf),
1497 DEL_CLOSURE_ERROR, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00001498 com_error(c, PyExc_SyntaxError, buf);
1499 i = 255;
1500 break;
1501 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001502 }
1503 break;
1504 }
1505done:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001506 com_addoparg(c, op, i);
1507}
1508
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001509static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510com_addopname(struct compiling *c, int op, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001511{
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001512 char *name;
1513 char buffer[1000];
1514 /* XXX it is possible to write this code without the 1000
1515 chars on the total length of dotted names, I just can't be
1516 bothered right now */
1517 if (TYPE(n) == STAR)
1518 name = "*";
1519 else if (TYPE(n) == dotted_name) {
1520 char *p = buffer;
1521 int i;
1522 name = buffer;
1523 for (i = 0; i < NCH(n); i += 2) {
1524 char *s = STR(CHILD(n, i));
1525 if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001526 com_error(c, PyExc_MemoryError,
Guido van Rossum452a9831996-09-17 14:32:04 +00001527 "dotted_name too long");
Guido van Rossumd9dfaf51995-02-17 15:04:57 +00001528 name = NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001529 break;
1530 }
1531 if (p != buffer)
1532 *p++ = '.';
1533 strcpy(p, s);
1534 p = strchr(p, '\0');
1535 }
1536 }
1537 else {
1538 REQ(n, NAME);
1539 name = STR(n);
1540 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001541 com_addop_name(c, op, name);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001542}
1543
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001545parsenumber(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001546{
Guido van Rossumc5e96291991-12-10 13:53:51 +00001547 char *end;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001548 long x;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001549 double dx;
Guido van Rossum50564e81996-01-12 01:13:16 +00001550#ifndef WITHOUT_COMPLEX
Guido van Rossum50564e81996-01-12 01:13:16 +00001551 int imflag;
1552#endif
1553
Guido van Rossum282914b1991-04-04 10:42:56 +00001554 errno = 0;
Guido van Rossumc5e96291991-12-10 13:53:51 +00001555 end = s + strlen(s) - 1;
Guido van Rossum50564e81996-01-12 01:13:16 +00001556#ifndef WITHOUT_COMPLEX
Guido van Rossum15ad9a61996-01-26 20:53:56 +00001557 imflag = *end == 'j' || *end == 'J';
Guido van Rossum50564e81996-01-12 01:13:16 +00001558#endif
Guido van Rossumf1aeab71992-03-27 17:28:26 +00001559 if (*end == 'l' || *end == 'L')
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001561 if (s[0] == '0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562 x = (long) PyOS_strtoul(s, &end, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001563 if (x < 0 && errno == 0) {
Guido van Rossum6c9e1302003-11-29 23:52:13 +00001564 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum078151d2002-08-11 04:24:12 +00001565 }
1566 }
Guido van Rossumacbefef1992-01-19 16:33:51 +00001567 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 x = PyOS_strtol(s, &end, 0);
Guido van Rossum282914b1991-04-04 10:42:56 +00001569 if (*end == '\0') {
Jeremy Hylton71b6af92001-08-27 19:45:25 +00001570 if (errno != 0)
1571 return PyLong_FromString(s, (char **)0, 0);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572 return PyInt_FromLong(x);
Guido van Rossum282914b1991-04-04 10:42:56 +00001573 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001574 /* XXX Huge floats may silently fail */
Guido van Rossum50564e81996-01-12 01:13:16 +00001575#ifndef WITHOUT_COMPLEX
1576 if (imflag) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001577 Py_complex z;
1578 z.real = 0.;
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001579 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001580 z.imag = PyOS_ascii_atof(s);
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001581 PyFPE_END_PROTECT(z)
1582 return PyComplex_FromCComplex(z);
Guido van Rossum50564e81996-01-12 01:13:16 +00001583 }
Guido van Rossumac1fc951997-10-08 15:23:55 +00001584 else
Guido van Rossum50564e81996-01-12 01:13:16 +00001585#endif
Guido van Rossumac1fc951997-10-08 15:23:55 +00001586 {
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001587 PyFPE_START_PROTECT("atof", return 0)
Martin v. Löwis737ea822004-06-08 18:52:54 +00001588 dx = PyOS_ascii_atof(s);
Guido van Rossum45b83911997-03-14 04:32:50 +00001589 PyFPE_END_PROTECT(dx)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 return PyFloat_FromDouble(dx);
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001591 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001592}
1593
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594static PyObject *
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001595decode_utf8(char **sPtr, char *end, char* encoding)
1596{
Martin v. Löwis019934b2002-08-07 12:33:18 +00001597#ifndef Py_USING_UNICODE
Martin v. Löwis2863c102002-08-07 15:18:57 +00001598 Py_FatalError("decode_utf8 should not be called in this build.");
1599 return NULL;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001600#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001601 PyObject *u, *v;
1602 char *s, *t;
1603 t = s = *sPtr;
1604 /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
1605 while (s < end && (*s & 0x80)) s++;
1606 *sPtr = s;
1607 u = PyUnicode_DecodeUTF8(t, s - t, NULL);
1608 if (u == NULL)
1609 return NULL;
1610 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1611 Py_DECREF(u);
1612 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001613#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001614}
1615
Jeremy Hyltonaccb62b2002-12-31 18:17:44 +00001616/* compiler.transformer.Transformer.decode_literal depends on what
1617 might seem like minor details of this function -- changes here
1618 must be reflected there. */
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001619static PyObject *
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001620parsestr(struct compiling *c, char *s)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001621{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 PyObject *v;
Guido van Rossum582acec2000-06-28 22:07:35 +00001623 size_t len;
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001624 int quote = *s;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001625 int rawmode = 0;
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001626 char* encoding = ((c == NULL) ? NULL : c->c_encoding);
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001627 int need_encoding;
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001628 int unicode = 0;
Guido van Rossum05459c52002-05-28 18:47:29 +00001629
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001630 if (isalpha(quote) || quote == '_') {
1631 if (quote == 'u' || quote == 'U') {
1632 quote = *++s;
1633 unicode = 1;
1634 }
1635 if (quote == 'r' || quote == 'R') {
1636 quote = *++s;
1637 rawmode = 1;
1638 }
1639 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001640 if (quote != '\'' && quote != '\"') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001641 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001642 return NULL;
1643 }
1644 s++;
1645 len = strlen(s);
Guido van Rossum582acec2000-06-28 22:07:35 +00001646 if (len > INT_MAX) {
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001647 com_error(c, PyExc_OverflowError,
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001648 "string to parse is too long");
Guido van Rossum582acec2000-06-28 22:07:35 +00001649 return NULL;
1650 }
Guido van Rossum8054fad1993-10-26 15:19:44 +00001651 if (s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001652 PyErr_BadInternalCall();
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001653 return NULL;
1654 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001655 if (len >= 4 && s[0] == quote && s[1] == quote) {
1656 s += 2;
1657 len -= 2;
1658 if (s[--len] != quote || s[--len] != quote) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659 PyErr_BadInternalCall();
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00001660 return NULL;
1661 }
1662 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001663#ifdef Py_USING_UNICODE
Guido van Rossumfdc8bdb2000-05-01 17:54:56 +00001664 if (unicode || Py_UnicodeFlag) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001665 PyObject *u, *w;
Walter Dörwald4c6c7652002-11-21 20:13:40 +00001666 char *buf;
1667 char *p;
1668 char *end;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001669 if (encoding == NULL) {
1670 buf = s;
1671 u = NULL;
1672 } else if (strcmp(encoding, "iso-8859-1") == 0) {
1673 buf = s;
1674 u = NULL;
1675 } else {
1676 /* "\XX" may become "\u005c\uHHLL" (12 bytes) */
1677 u = PyString_FromStringAndSize((char *)NULL, len * 4);
1678 if (u == NULL)
1679 return NULL;
1680 p = buf = PyString_AsString(u);
1681 end = s + len;
1682 while (s < end) {
1683 if (*s == '\\') {
1684 *p++ = *s++;
1685 if (*s & 0x80) {
1686 strcpy(p, "u005c");
1687 p += 5;
1688 }
1689 }
1690 if (*s & 0x80) { /* XXX inefficient */
1691 char *r;
1692 int rn, i;
1693 w = decode_utf8(&s, end, "utf-16-be");
1694 if (w == NULL) {
1695 Py_DECREF(u);
1696 return NULL;
1697 }
1698 r = PyString_AsString(w);
1699 rn = PyString_Size(w);
1700 assert(rn % 2 == 0);
1701 for (i = 0; i < rn; i += 2) {
1702 sprintf(p, "\\u%02x%02x",
1703 r[i + 0] & 0xFF,
1704 r[i + 1] & 0xFF);
1705 p += 6;
1706 }
1707 Py_DECREF(w);
1708 } else {
1709 *p++ = *s++;
1710 }
1711 }
1712 len = p - buf;
1713 }
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001714 if (rawmode)
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001715 v = PyUnicode_DecodeRawUnicodeEscape(buf, len, NULL);
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001716 else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001717 v = PyUnicode_DecodeUnicodeEscape(buf, len, NULL);
1718 Py_XDECREF(u);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001719 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001720 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Martin v. Löwiscfeb3b62002-03-03 21:30:27 +00001721 return v;
1722
Guido van Rossum5aa88f02000-03-10 23:01:36 +00001723 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001724#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001725 need_encoding = (encoding != NULL &&
1726 strcmp(encoding, "utf-8") != 0 &&
1727 strcmp(encoding, "iso-8859-1") != 0);
1728 if (rawmode || strchr(s, '\\') == NULL) {
1729 if (need_encoding) {
Martin v. Löwis019934b2002-08-07 12:33:18 +00001730#ifndef Py_USING_UNICODE
1731 /* This should not happen - we never see any other
1732 encoding. */
Martin v. Löwis2863c102002-08-07 15:18:57 +00001733 Py_FatalError("cannot deal with encodings in this build.");
Martin v. Löwis019934b2002-08-07 12:33:18 +00001734#else
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001735 PyObject* u = PyUnicode_DecodeUTF8(s, len, NULL);
1736 if (u == NULL)
1737 return NULL;
1738 v = PyUnicode_AsEncodedString(u, encoding, NULL);
1739 Py_DECREF(u);
1740 return v;
Martin v. Löwis019934b2002-08-07 12:33:18 +00001741#endif
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00001742 } else {
1743 return PyString_FromStringAndSize(s, len);
1744 }
1745 }
Martin v. Löwis8a8da792002-08-14 07:46:28 +00001746
1747 v = PyString_DecodeEscape(s, len, NULL, unicode,
1748 need_encoding ? encoding : NULL);
Fredrik Lundh1fa0b892000-09-02 20:11:27 +00001749 if (v == NULL)
Guido van Rossumb081e0c2002-08-16 01:57:32 +00001750 PyErr_SyntaxLocation(c->c_filename, c->c_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001751 return v;
1752}
1753
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001755parsestrplus(struct compiling* c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001756{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757 PyObject *v;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001758 int i;
1759 REQ(CHILD(n, 0), STRING);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001760 if ((v = parsestr(c, STR(CHILD(n, 0)))) != NULL) {
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001761 /* String literal concatenation */
Fred Drake4e998bc2000-04-13 14:10:44 +00001762 for (i = 1; i < NCH(n); i++) {
1763 PyObject *s;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001764 s = parsestr(c, STR(CHILD(n, i)));
Fred Drake4e998bc2000-04-13 14:10:44 +00001765 if (s == NULL)
1766 goto onError;
1767 if (PyString_Check(v) && PyString_Check(s)) {
1768 PyString_ConcatAndDel(&v, s);
1769 if (v == NULL)
1770 goto onError;
1771 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001772#ifdef Py_USING_UNICODE
Fred Drake4e998bc2000-04-13 14:10:44 +00001773 else {
1774 PyObject *temp;
1775 temp = PyUnicode_Concat(v, s);
1776 Py_DECREF(s);
1777 if (temp == NULL)
1778 goto onError;
1779 Py_DECREF(v);
1780 v = temp;
1781 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001782#endif
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001783 }
1784 }
1785 return v;
Fred Drake4e998bc2000-04-13 14:10:44 +00001786
1787 onError:
1788 Py_XDECREF(v);
1789 return NULL;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00001790}
1791
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001792static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001793com_list_for(struct compiling *c, node *n, node *e, char *t)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001794{
Skip Montanaro803d6e52000-08-12 18:09:51 +00001795 int anchor = 0;
1796 int save_begin = c->c_begin;
1797
Raymond Hettinger354433a2004-05-19 08:20:33 +00001798 /* list_for: for v in expr [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001799 com_node(c, CHILD(n, 3)); /* expr */
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001800 com_addbyte(c, GET_ITER);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001801 c->c_begin = c->c_nexti;
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001802 com_addfwref(c, FOR_ITER, &anchor);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001803 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00001804 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001805 c->c_loops++;
1806 com_list_iter(c, n, e, t);
1807 c->c_loops--;
1808 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1809 c->c_begin = save_begin;
1810 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001811 com_pop(c, 1); /* FOR_ITER has popped this */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001812}
1813
1814static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001815com_gen_for(struct compiling *c, node *n, node *t, int is_outmost)
1816{
1817 int break_anchor = 0;
1818 int anchor = 0;
1819 int save_begin = c->c_begin;
1820
1821 REQ(n, gen_for);
1822 /* gen_for: for v in test [gen_iter] */
1823
1824 com_addfwref(c, SETUP_LOOP, &break_anchor);
1825 block_push(c, SETUP_LOOP);
1826
1827 if (is_outmost) {
1828 com_addop_varname(c, VAR_LOAD, "[outmost-iterable]");
1829 com_push(c, 1);
1830 }
1831 else {
1832 com_node(c, CHILD(n, 3));
1833 com_addbyte(c, GET_ITER);
1834 }
1835
1836 c->c_begin = c->c_nexti;
1837 com_set_lineno(c, c->c_last_line);
1838 com_addfwref(c, FOR_ITER, &anchor);
1839 com_push(c, 1);
1840 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
1841
1842 if (NCH(n) == 5)
1843 com_gen_iter(c, CHILD(n, 4), t);
1844 else {
1845 com_test(c, t);
1846 com_addbyte(c, YIELD_VALUE);
1847 com_pop(c, 1);
1848 }
1849
1850 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
1851 c->c_begin = save_begin;
1852
1853 com_backpatch(c, anchor);
1854 com_pop(c, 1); /* FOR_ITER has popped this */
1855 com_addbyte(c, POP_BLOCK);
1856 block_pop(c, SETUP_LOOP);
1857 com_backpatch(c, break_anchor);
1858}
1859
1860static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001861com_list_if(struct compiling *c, node *n, node *e, char *t)
1862{
1863 int anchor = 0;
1864 int a = 0;
1865 /* list_iter: 'if' test [list_iter] */
Skip Montanaro803d6e52000-08-12 18:09:51 +00001866 com_node(c, CHILD(n, 1));
1867 com_addfwref(c, JUMP_IF_FALSE, &a);
1868 com_addbyte(c, POP_TOP);
1869 com_pop(c, 1);
1870 com_list_iter(c, n, e, t);
1871 com_addfwref(c, JUMP_FORWARD, &anchor);
1872 com_backpatch(c, a);
1873 /* We jump here with an extra entry which we now pop */
1874 com_addbyte(c, POP_TOP);
1875 com_backpatch(c, anchor);
1876}
1877
1878static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001879com_gen_if(struct compiling *c, node *n, node *t)
1880{
1881 /* gen_if: 'if' test [gen_iter] */
1882 int anchor = 0;
1883 int a=0;
1884
1885 com_node(c, CHILD(n, 1));
1886 com_addfwref(c, JUMP_IF_FALSE, &a);
1887 com_addbyte(c, POP_TOP);
1888 com_pop(c, 1);
1889
1890 if (NCH(n) == 3)
1891 com_gen_iter(c, CHILD(n, 2), t);
1892 else {
1893 com_test(c, t);
1894 com_addbyte(c, YIELD_VALUE);
1895 com_pop(c, 1);
1896 }
1897 com_addfwref(c, JUMP_FORWARD, &anchor);
1898 com_backpatch(c, a);
1899 /* We jump here with an extra entry which we now pop */
1900 com_addbyte(c, POP_TOP);
1901 com_backpatch(c, anchor);
1902}
1903
1904static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001905com_list_iter(struct compiling *c,
1906 node *p, /* parent of list_iter node */
1907 node *e, /* element expression node */
1908 char *t /* name of result list temp local */)
1909{
1910 /* list_iter is the last child in a listmaker, list_for, or list_if */
1911 node *n = CHILD(p, NCH(p)-1);
1912 if (TYPE(n) == list_iter) {
1913 n = CHILD(n, 0);
1914 switch (TYPE(n)) {
1915 case list_for:
1916 com_list_for(c, n, e, t);
1917 break;
1918 case list_if:
1919 com_list_if(c, n, e, t);
1920 break;
1921 default:
1922 com_error(c, PyExc_SystemError,
1923 "invalid list_iter node type");
1924 }
1925 }
1926 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001927 com_addop_varname(c, VAR_LOAD, t);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001928 com_push(c, 1);
1929 com_node(c, e);
Raymond Hettingerdd80f762004-03-07 07:31:06 +00001930 com_addbyte(c, LIST_APPEND);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001931 com_pop(c, 2);
1932 }
1933}
1934
1935static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001936com_gen_iter(struct compiling *c, node *n, node *t)
1937{
1938 /* gen_iter: gen_for | gen_if */
1939 node *ch;
1940 REQ(n, gen_iter);
1941
1942 ch = CHILD(n, 0);
1943
1944 switch (TYPE(ch)) {
1945 case gen_for:
1946 com_gen_for(c, ch, t, 0);
1947 break;
1948 case gen_if:
1949 com_gen_if(c, ch, t);
1950 break;
1951 default:
1952 com_error(c, PyExc_SystemError,
1953 "invalid gen_iter node type");
1954 }
1955}
1956
1957static void
Skip Montanaro803d6e52000-08-12 18:09:51 +00001958com_list_comprehension(struct compiling *c, node *n)
1959{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001960 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001961 char tmpname[30];
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00001962
1963 REQ(n, listmaker);
Barry Warsaw8f6d8682001-11-28 21:10:39 +00001964 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]", ++c->c_tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001965 com_addoparg(c, BUILD_LIST, 0);
1966 com_addbyte(c, DUP_TOP); /* leave the result on the stack */
1967 com_push(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001968 com_addop_varname(c, VAR_STORE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001969 com_pop(c, 1);
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001970 com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00001971 com_addop_varname(c, VAR_DELETE, tmpname);
Skip Montanaro803d6e52000-08-12 18:09:51 +00001972 --c->c_tmpname;
1973}
1974
1975static void
1976com_listmaker(struct compiling *c, node *n)
1977{
Skip Montanaro46dfa5f2000-08-22 02:43:07 +00001978 /* listmaker: test ( list_for | (',' test)* [','] ) */
1979 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for)
Skip Montanaro803d6e52000-08-12 18:09:51 +00001980 com_list_comprehension(c, n);
1981 else {
1982 int len = 0;
1983 int i;
1984 for (i = 0; i < NCH(n); i += 2, len++)
1985 com_node(c, CHILD(n, i));
1986 com_addoparg(c, BUILD_LIST, len);
1987 com_pop(c, len-1);
1988 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00001989}
1990
1991static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00001992com_generator_expression(struct compiling *c, node *n)
1993{
1994 /* testlist_gexp: test gen_for */
1995 /* argument: test gen_for */
1996 PyCodeObject *co;
1997
1998 REQ(CHILD(n, 0), test);
1999 REQ(CHILD(n, 1), gen_for);
2000
2001 symtable_enter_scope(c->c_symtable, "<genexpr>", TYPE(n),
2002 n->n_lineno);
2003 co = icompile(n, c);
2004 symtable_exit_scope(c->c_symtable);
2005
2006 if (co == NULL)
2007 c->c_errors++;
2008 else {
2009 int closure = com_make_closure(c, co);
2010 int i = com_addconst(c, (PyObject *)co);
2011
2012 com_addoparg(c, LOAD_CONST, i);
2013 com_push(c, 1);
2014 if (closure)
2015 com_addoparg(c, MAKE_CLOSURE, 0);
2016 else
2017 com_addoparg(c, MAKE_FUNCTION, 0);
2018
2019 com_test(c, CHILD(CHILD(n, 1), 3));
2020 com_addbyte(c, GET_ITER);
2021 com_addoparg(c, CALL_FUNCTION, 1);
2022 com_pop(c, 1);
2023
2024 Py_DECREF(co);
2025 }
2026}
2027
2028static void
2029com_testlist_gexp(struct compiling *c, node *n)
2030{
2031 /* testlist_gexp: test ( gen_for | (',' test)* [','] ) */
2032 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for)
2033 com_generator_expression(c, n);
2034 else com_list(c, n, 0);
2035}
2036
Anthony Baxterc2a5a632004-08-02 06:10:11 +00002037
Raymond Hettinger354433a2004-05-19 08:20:33 +00002038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002039com_dictmaker(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002040{
2041 int i;
2042 /* dictmaker: test ':' test (',' test ':' value)* [','] */
2043 for (i = 0; i+2 < NCH(n); i += 4) {
2044 /* We must arrange things just right for STORE_SUBSCR.
2045 It wants the stack to look like (value) (dict) (key) */
2046 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002047 com_push(c, 1);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002048 com_node(c, CHILD(n, i)); /* key */
Gustavo Niemeyer78429a62002-12-16 13:54:02 +00002049 com_node(c, CHILD(n, i+2)); /* value */
2050 com_addbyte(c, ROT_THREE);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002051 com_addbyte(c, STORE_SUBSCR);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002052 com_pop(c, 3);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002053 }
2054}
2055
2056static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002057com_atom(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002058{
2059 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002060 PyObject *v;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002061 int i;
2062 REQ(n, atom);
2063 ch = CHILD(n, 0);
2064 switch (TYPE(ch)) {
2065 case LPAR:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002066 if (TYPE(CHILD(n, 1)) == RPAR) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002067 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002068 com_push(c, 1);
2069 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002070 else
Raymond Hettinger354433a2004-05-19 08:20:33 +00002071 com_testlist_gexp(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002072 break;
Skip Montanaro803d6e52000-08-12 18:09:51 +00002073 case LSQB: /* '[' [listmaker] ']' */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002074 if (TYPE(CHILD(n, 1)) == RSQB) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002075 com_addoparg(c, BUILD_LIST, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002076 com_push(c, 1);
2077 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002078 else
Skip Montanaro803d6e52000-08-12 18:09:51 +00002079 com_listmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002080 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002081 case LBRACE: /* '{' [dictmaker] '}' */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002082 com_addoparg(c, BUILD_MAP, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002083 com_push(c, 1);
Skip Montanaro803d6e52000-08-12 18:09:51 +00002084 if (TYPE(CHILD(n, 1)) == dictmaker)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00002085 com_dictmaker(c, CHILD(n, 1));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002086 break;
2087 case BACKQUOTE:
2088 com_node(c, CHILD(n, 1));
2089 com_addbyte(c, UNARY_CONVERT);
2090 break;
2091 case NUMBER:
Guido van Rossum452a9831996-09-17 14:32:04 +00002092 if ((v = parsenumber(c, STR(ch))) == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002093 i = 255;
2094 }
2095 else {
2096 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002097 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002098 }
2099 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002100 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002101 break;
2102 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00002103 v = parsestrplus(c, n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00002104 if (v == NULL) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002105 c->c_errors++;
2106 i = 255;
2107 }
2108 else {
2109 i = com_addconst(c, v);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002110 Py_DECREF(v);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002111 }
2112 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002113 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002114 break;
2115 case NAME:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002116 com_addop_varname(c, VAR_LOAD, STR(ch));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002117 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002118 break;
2119 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002120 com_error(c, PyExc_SystemError,
2121 "com_atom: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002122 }
2123}
2124
2125static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002126com_slice(struct compiling *c, node *n, int op)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002127{
2128 if (NCH(n) == 1) {
2129 com_addbyte(c, op);
2130 }
2131 else if (NCH(n) == 2) {
2132 if (TYPE(CHILD(n, 0)) != COLON) {
2133 com_node(c, CHILD(n, 0));
2134 com_addbyte(c, op+1);
2135 }
2136 else {
2137 com_node(c, CHILD(n, 1));
2138 com_addbyte(c, op+2);
2139 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002140 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002141 }
2142 else {
2143 com_node(c, CHILD(n, 0));
2144 com_node(c, CHILD(n, 2));
2145 com_addbyte(c, op+3);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002146 com_pop(c, 2);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002147 }
2148}
2149
Guido van Rossum635abd21997-01-06 22:56:52 +00002150static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002151com_augassign_slice(struct compiling *c, node *n, int opcode, node *augn)
2152{
2153 if (NCH(n) == 1) {
2154 com_addbyte(c, DUP_TOP);
2155 com_push(c, 1);
2156 com_addbyte(c, SLICE);
2157 com_node(c, augn);
2158 com_addbyte(c, opcode);
2159 com_pop(c, 1);
2160 com_addbyte(c, ROT_TWO);
2161 com_addbyte(c, STORE_SLICE);
2162 com_pop(c, 2);
2163 } else if (NCH(n) == 2 && TYPE(CHILD(n, 0)) != COLON) {
2164 com_node(c, CHILD(n, 0));
2165 com_addoparg(c, DUP_TOPX, 2);
2166 com_push(c, 2);
2167 com_addbyte(c, SLICE+1);
2168 com_pop(c, 1);
2169 com_node(c, augn);
2170 com_addbyte(c, opcode);
2171 com_pop(c, 1);
2172 com_addbyte(c, ROT_THREE);
2173 com_addbyte(c, STORE_SLICE+1);
2174 com_pop(c, 3);
2175 } else if (NCH(n) == 2) {
2176 com_node(c, CHILD(n, 1));
2177 com_addoparg(c, DUP_TOPX, 2);
2178 com_push(c, 2);
2179 com_addbyte(c, SLICE+2);
2180 com_pop(c, 1);
2181 com_node(c, augn);
2182 com_addbyte(c, opcode);
2183 com_pop(c, 1);
2184 com_addbyte(c, ROT_THREE);
2185 com_addbyte(c, STORE_SLICE+2);
2186 com_pop(c, 3);
2187 } else {
2188 com_node(c, CHILD(n, 0));
2189 com_node(c, CHILD(n, 2));
2190 com_addoparg(c, DUP_TOPX, 3);
2191 com_push(c, 3);
2192 com_addbyte(c, SLICE+3);
2193 com_pop(c, 2);
2194 com_node(c, augn);
2195 com_addbyte(c, opcode);
2196 com_pop(c, 1);
2197 com_addbyte(c, ROT_FOUR);
2198 com_addbyte(c, STORE_SLICE+3);
2199 com_pop(c, 4);
2200 }
2201}
2202
2203static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002204com_argument(struct compiling *c, node *n, PyObject **pkeywords)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002205{
2206 node *m;
Raymond Hettinger354433a2004-05-19 08:20:33 +00002207 REQ(n, argument); /* [test '='] test [gen_for]; really [keyword '='] test */
Guido van Rossumf10570b1995-07-07 22:53:21 +00002208 if (NCH(n) == 1) {
Guido van Rossum635abd21997-01-06 22:56:52 +00002209 if (*pkeywords != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002210 com_error(c, PyExc_SyntaxError,
Fred Drakedcf08e02000-08-15 15:49:44 +00002211 "non-keyword arg after keyword arg");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002212 }
2213 else {
2214 com_node(c, CHILD(n, 0));
2215 }
Guido van Rossum635abd21997-01-06 22:56:52 +00002216 return;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002217 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00002218 if (NCH(n) == 2) {
2219 com_generator_expression(c, n);
2220 return;
2221 }
2222
Guido van Rossumf10570b1995-07-07 22:53:21 +00002223 m = n;
2224 do {
2225 m = CHILD(m, 0);
2226 } while (NCH(m) == 1);
2227 if (TYPE(m) != NAME) {
Tim Peters4e303782001-02-18 04:45:10 +00002228 /* f(lambda x: x[0] = 3) ends up getting parsed with
2229 * LHS test = lambda x: x[0], and RHS test = 3.
2230 * SF bug 132313 points out that complaining about a keyword
2231 * then is very confusing.
2232 */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002233 com_error(c, PyExc_SyntaxError,
Tim Peters4e303782001-02-18 04:45:10 +00002234 TYPE(m) == lambdef ?
2235 "lambda cannot contain assignment" :
2236 "keyword can't be an expression");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002237 }
2238 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002239 PyObject *v = PyString_InternFromString(STR(m));
Guido van Rossum63dd79a2002-08-16 02:24:56 +00002240 (void) none_assignment_check(c, STR(m), 1);
Guido van Rossum635abd21997-01-06 22:56:52 +00002241 if (v != NULL && *pkeywords == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002242 *pkeywords = PyDict_New();
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002243 if (v == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002244 c->c_errors++;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00002245 else if (*pkeywords == NULL) {
2246 c->c_errors++;
2247 Py_DECREF(v);
2248 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002249 if (PyDict_GetItem(*pkeywords, v) != NULL)
2250 com_error(c, PyExc_SyntaxError,
Guido van Rossum635abd21997-01-06 22:56:52 +00002251 "duplicate keyword argument");
2252 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002253 if (PyDict_SetItem(*pkeywords, v, v) != 0)
Guido van Rossum635abd21997-01-06 22:56:52 +00002254 c->c_errors++;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002255 com_addoparg(c, LOAD_CONST, com_addconst(c, v));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002256 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00002257 Py_DECREF(v);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002258 }
2259 }
2260 com_node(c, CHILD(n, 2));
Guido van Rossumf10570b1995-07-07 22:53:21 +00002261}
2262
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002263static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002264com_call_function(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002265{
2266 if (TYPE(n) == RPAR) {
Guido van Rossumf10570b1995-07-07 22:53:21 +00002267 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002268 }
2269 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002270 PyObject *keywords = NULL;
Guido van Rossum635abd21997-01-06 22:56:52 +00002271 int i, na, nk;
Guido van Rossumca906051998-12-10 16:56:22 +00002272 int lineno = n->n_lineno;
Jeremy Hylton76901512000-03-28 23:49:17 +00002273 int star_flag = 0;
2274 int starstar_flag = 0;
2275 int opcode;
Guido van Rossumf10570b1995-07-07 22:53:21 +00002276 REQ(n, arglist);
Guido van Rossumf10570b1995-07-07 22:53:21 +00002277 na = 0;
2278 nk = 0;
2279 for (i = 0; i < NCH(n); i += 2) {
Guido van Rossumca906051998-12-10 16:56:22 +00002280 node *ch = CHILD(n, i);
Jeremy Hylton76901512000-03-28 23:49:17 +00002281 if (TYPE(ch) == STAR ||
2282 TYPE(ch) == DOUBLESTAR)
2283 break;
Guido van Rossumca906051998-12-10 16:56:22 +00002284 if (ch->n_lineno != lineno) {
2285 lineno = ch->n_lineno;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00002286 com_set_lineno(c, lineno);
Guido van Rossumca906051998-12-10 16:56:22 +00002287 }
2288 com_argument(c, ch, &keywords);
Guido van Rossum635abd21997-01-06 22:56:52 +00002289 if (keywords == NULL)
Guido van Rossumf10570b1995-07-07 22:53:21 +00002290 na++;
2291 else
2292 nk++;
2293 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 Py_XDECREF(keywords);
Jeremy Hylton76901512000-03-28 23:49:17 +00002295 while (i < NCH(n)) {
2296 node *tok = CHILD(n, i);
2297 node *ch = CHILD(n, i+1);
2298 i += 3;
2299 switch (TYPE(tok)) {
2300 case STAR: star_flag = 1; break;
2301 case DOUBLESTAR: starstar_flag = 1; break;
2302 }
2303 com_node(c, ch);
2304 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00002305 if (na > 255 || nk > 255) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002306 com_error(c, PyExc_SyntaxError,
2307 "more than 255 arguments");
Guido van Rossumf10570b1995-07-07 22:53:21 +00002308 }
Jeremy Hylton76901512000-03-28 23:49:17 +00002309 if (star_flag || starstar_flag)
Jeremy Hyltone4fb9582000-03-29 00:10:44 +00002310 opcode = CALL_FUNCTION_VAR - 1 +
Jeremy Hylton76901512000-03-28 23:49:17 +00002311 star_flag + (starstar_flag << 1);
2312 else
2313 opcode = CALL_FUNCTION;
2314 com_addoparg(c, opcode, na | (nk << 8));
2315 com_pop(c, na + 2*nk + star_flag + starstar_flag);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002316 }
2317}
2318
2319static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002320com_select_member(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002321{
2322 com_addopname(c, LOAD_ATTR, n);
2323}
2324
2325static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002326com_sliceobj(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002327{
2328 int i=0;
2329 int ns=2; /* number of slice arguments */
Guido van Rossum8861b741996-07-30 16:49:37 +00002330 node *ch;
2331
2332 /* first argument */
2333 if (TYPE(CHILD(n,i)) == COLON) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002334 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002335 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002336 i++;
2337 }
2338 else {
2339 com_node(c, CHILD(n,i));
2340 i++;
2341 REQ(CHILD(n,i),COLON);
2342 i++;
2343 }
2344 /* second argument */
2345 if (i < NCH(n) && TYPE(CHILD(n,i)) == test) {
2346 com_node(c, CHILD(n,i));
2347 i++;
2348 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00002349 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002351 com_push(c, 1);
2352 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002353 /* remaining arguments */
2354 for (; i < NCH(n); i++) {
2355 ns++;
2356 ch=CHILD(n,i);
2357 REQ(ch, sliceop);
2358 if (NCH(ch) == 1) {
2359 /* right argument of ':' missing */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002361 com_push(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002362 }
2363 else
2364 com_node(c, CHILD(ch,1));
2365 }
2366 com_addoparg(c, BUILD_SLICE, ns);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002367 com_pop(c, 1 + (ns == 3));
Guido van Rossum8861b741996-07-30 16:49:37 +00002368}
2369
2370static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002371com_subscript(struct compiling *c, node *n)
Guido van Rossum8861b741996-07-30 16:49:37 +00002372{
2373 node *ch;
2374 REQ(n, subscript);
2375 ch = CHILD(n,0);
2376 /* check for rubber index */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002377 if (TYPE(ch) == DOT && TYPE(CHILD(n,1)) == DOT) {
Guido van Rossume449af71996-10-11 16:25:41 +00002378 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_Ellipsis));
Guido van Rossum8b993a91997-01-17 21:04:03 +00002379 com_push(c, 1);
2380 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002381 else {
2382 /* check for slice */
2383 if ((TYPE(ch) == COLON || NCH(n) > 1))
2384 com_sliceobj(c, n);
2385 else {
2386 REQ(ch, test);
2387 com_node(c, ch);
2388 }
2389 }
2390}
2391
2392static void
Thomas Wouters434d0822000-08-24 20:11:32 +00002393com_subscriptlist(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum8861b741996-07-30 16:49:37 +00002394{
2395 int i, op;
2396 REQ(n, subscriptlist);
2397 /* Check to make backward compatible slice behavior for '[i:j]' */
2398 if (NCH(n) == 1) {
2399 node *sub = CHILD(n, 0); /* subscript */
Thomas Wouterse8643c42000-08-05 21:37:50 +00002400 /* 'Basic' slice, should have exactly one colon. */
2401 if ((TYPE(CHILD(sub, 0)) == COLON
2402 || (NCH(sub) > 1 && TYPE(CHILD(sub, 1)) == COLON))
2403 && (TYPE(CHILD(sub,NCH(sub)-1)) != sliceop))
2404 {
Thomas Wouters434d0822000-08-24 20:11:32 +00002405 switch (assigning) {
2406 case OP_DELETE:
2407 op = DELETE_SLICE;
2408 break;
2409 case OP_ASSIGN:
2410 op = STORE_SLICE;
2411 break;
2412 case OP_APPLY:
Guido van Rossum8861b741996-07-30 16:49:37 +00002413 op = SLICE;
Thomas Wouters434d0822000-08-24 20:11:32 +00002414 break;
2415 default:
2416 com_augassign_slice(c, sub, assigning, augn);
2417 return;
2418 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002419 com_slice(c, sub, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002420 if (op == STORE_SLICE)
2421 com_pop(c, 2);
2422 else if (op == DELETE_SLICE)
2423 com_pop(c, 1);
Guido van Rossum8861b741996-07-30 16:49:37 +00002424 return;
2425 }
2426 }
2427 /* Else normal subscriptlist. Compile each subscript. */
2428 for (i = 0; i < NCH(n); i += 2)
2429 com_subscript(c, CHILD(n, i));
2430 /* Put multiple subscripts into a tuple */
Guido van Rossum8b993a91997-01-17 21:04:03 +00002431 if (NCH(n) > 1) {
2432 i = (NCH(n)+1) / 2;
2433 com_addoparg(c, BUILD_TUPLE, i);
2434 com_pop(c, i-1);
2435 }
Thomas Wouters434d0822000-08-24 20:11:32 +00002436 switch (assigning) {
2437 case OP_DELETE:
Guido van Rossum8b993a91997-01-17 21:04:03 +00002438 op = DELETE_SUBSCR;
2439 i = 2;
Thomas Wouters434d0822000-08-24 20:11:32 +00002440 break;
2441 default:
2442 case OP_ASSIGN:
2443 op = STORE_SUBSCR;
2444 i = 3;
2445 break;
2446 case OP_APPLY:
2447 op = BINARY_SUBSCR;
2448 i = 1;
2449 break;
2450 }
2451 if (assigning > OP_APPLY) {
2452 com_addoparg(c, DUP_TOPX, 2);
2453 com_push(c, 2);
2454 com_addbyte(c, BINARY_SUBSCR);
2455 com_pop(c, 1);
2456 com_node(c, augn);
2457 com_addbyte(c, assigning);
2458 com_pop(c, 1);
2459 com_addbyte(c, ROT_THREE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002460 }
Guido van Rossum8861b741996-07-30 16:49:37 +00002461 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002462 com_pop(c, i);
Guido van Rossum8861b741996-07-30 16:49:37 +00002463}
2464
2465static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002466com_apply_trailer(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002467{
2468 REQ(n, trailer);
2469 switch (TYPE(CHILD(n, 0))) {
2470 case LPAR:
2471 com_call_function(c, CHILD(n, 1));
2472 break;
2473 case DOT:
2474 com_select_member(c, CHILD(n, 1));
2475 break;
2476 case LSQB:
Thomas Wouters434d0822000-08-24 20:11:32 +00002477 com_subscriptlist(c, CHILD(n, 1), OP_APPLY, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002478 break;
2479 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002480 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002481 "com_apply_trailer: unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002482 }
2483}
2484
2485static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002486com_power(struct compiling *c, node *n)
Guido van Rossum50564e81996-01-12 01:13:16 +00002487{
2488 int i;
2489 REQ(n, power);
2490 com_atom(c, CHILD(n, 0));
2491 for (i = 1; i < NCH(n); i++) {
2492 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
2493 com_factor(c, CHILD(n, i+1));
2494 com_addbyte(c, BINARY_POWER);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002495 com_pop(c, 1);
Guido van Rossum50564e81996-01-12 01:13:16 +00002496 break;
2497 }
2498 else
2499 com_apply_trailer(c, CHILD(n, i));
2500 }
2501}
2502
2503static void
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002504com_invert_constant(struct compiling *c, node *n)
2505{
2506 /* Compute the inverse of int and longs and use them directly,
2507 but be prepared to generate code for all other
2508 possibilities (invalid numbers, floats, complex).
2509 */
2510 PyObject *num, *inv = NULL;
2511 int i;
2512
2513 REQ(n, NUMBER);
2514 num = parsenumber(c, STR(n));
2515 if (num == NULL)
2516 i = 255;
2517 else {
2518 inv = PyNumber_Invert(num);
2519 if (inv == NULL) {
2520 PyErr_Clear();
2521 i = com_addconst(c, num);
2522 } else {
2523 i = com_addconst(c, inv);
2524 Py_DECREF(inv);
2525 }
2526 Py_DECREF(num);
2527 }
2528 com_addoparg(c, LOAD_CONST, i);
2529 com_push(c, 1);
2530 if (num != NULL && inv == NULL)
2531 com_addbyte(c, UNARY_INVERT);
2532}
2533
Tim Peters51e26512001-09-07 08:45:55 +00002534static int
2535is_float_zero(const char *p)
2536{
2537 int found_radix_point = 0;
2538 int ch;
2539 while ((ch = Py_CHARMASK(*p++)) != '\0') {
2540 switch (ch) {
2541 case '0':
2542 /* no reason to believe it's not 0 -- continue */
2543 break;
2544
2545 case 'e': case 'E': case 'j': case 'J':
2546 /* If this was a hex constant, we already would have
2547 returned 0 due to the 'x' or 'X', so 'e' or 'E'
2548 must be an exponent marker, and we haven't yet
2549 seen a non-zero digit, and it doesn't matter what
2550 the exponent is then. For 'j' or 'J' similarly,
2551 except that this is an imaginary 0 then. */
2552 return 1;
2553
2554 case '.':
2555 found_radix_point = 1;
2556 break;
2557
2558 default:
2559 return 0;
2560 }
2561 }
2562 return found_radix_point;
2563}
2564
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002565static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002566com_factor(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002567{
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002568 int childtype = TYPE(CHILD(n, 0));
Tim Peters51e26512001-09-07 08:45:55 +00002569 node *pfactor, *ppower, *patom, *pnum;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002570 REQ(n, factor);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002571 /* If the unary +, -, or ~ operator is applied to a constant,
Tim Peters51e26512001-09-07 08:45:55 +00002572 don't generate a UNARY_xxx opcode. Just store the
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002573 approriate value as a constant. If the value is negative,
2574 extend the string containing the constant and insert a
Tim Peters51e26512001-09-07 08:45:55 +00002575 negative in the 0th position -- unless we're doing unary minus
2576 of a floating zero! In that case the sign is significant, but
2577 the const dict can't distinguish +0.0 from -0.0.
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002578 */
2579 if ((childtype == PLUS || childtype == MINUS || childtype == TILDE)
Fred Drake14ef2442001-08-30 18:53:25 +00002580 && NCH(n) == 2
Tim Peters51e26512001-09-07 08:45:55 +00002581 && TYPE((pfactor = CHILD(n, 1))) == factor
2582 && NCH(pfactor) == 1
2583 && TYPE((ppower = CHILD(pfactor, 0))) == power
2584 && NCH(ppower) == 1
2585 && TYPE((patom = CHILD(ppower, 0))) == atom
2586 && TYPE((pnum = CHILD(patom, 0))) == NUMBER
Guido van Rossum66b12592003-02-12 16:57:47 +00002587 && !(childtype == MINUS &&
2588 (STR(pnum)[0] == '0' || is_float_zero(STR(pnum))))) {
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002589 if (childtype == TILDE) {
Tim Peters51e26512001-09-07 08:45:55 +00002590 com_invert_constant(c, pnum);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002591 return;
2592 }
2593 if (childtype == MINUS) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002594 char *s = PyObject_MALLOC(strlen(STR(pnum)) + 2);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002595 if (s == NULL) {
2596 com_error(c, PyExc_MemoryError, "");
2597 com_addbyte(c, 255);
2598 return;
2599 }
2600 s[0] = '-';
Tim Peters51e26512001-09-07 08:45:55 +00002601 strcpy(s + 1, STR(pnum));
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00002602 PyObject_FREE(STR(pnum));
Tim Peters51e26512001-09-07 08:45:55 +00002603 STR(pnum) = s;
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002604 }
Tim Peters51e26512001-09-07 08:45:55 +00002605 com_atom(c, patom);
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002606 }
2607 else if (childtype == PLUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002608 com_factor(c, CHILD(n, 1));
2609 com_addbyte(c, UNARY_POSITIVE);
2610 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002611 else if (childtype == MINUS) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002612 com_factor(c, CHILD(n, 1));
2613 com_addbyte(c, UNARY_NEGATIVE);
2614 }
Jeremy Hyltond5e5a2a2001-08-12 01:54:38 +00002615 else if (childtype == TILDE) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002616 com_factor(c, CHILD(n, 1));
2617 com_addbyte(c, UNARY_INVERT);
2618 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002619 else {
Guido van Rossum50564e81996-01-12 01:13:16 +00002620 com_power(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002621 }
2622}
2623
2624static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002625com_term(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002626{
2627 int i;
2628 int op;
2629 REQ(n, term);
2630 com_factor(c, CHILD(n, 0));
2631 for (i = 2; i < NCH(n); i += 2) {
2632 com_factor(c, CHILD(n, i));
2633 switch (TYPE(CHILD(n, i-1))) {
2634 case STAR:
2635 op = BINARY_MULTIPLY;
2636 break;
2637 case SLASH:
Guido van Rossum4668b002001-08-08 05:00:18 +00002638 if (c->c_flags & CO_FUTURE_DIVISION)
2639 op = BINARY_TRUE_DIVIDE;
2640 else
2641 op = BINARY_DIVIDE;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002642 break;
2643 case PERCENT:
2644 op = BINARY_MODULO;
2645 break;
Guido van Rossum4668b002001-08-08 05:00:18 +00002646 case DOUBLESLASH:
2647 op = BINARY_FLOOR_DIVIDE;
2648 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002649 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002650 com_error(c, PyExc_SystemError,
Guido van Rossum4668b002001-08-08 05:00:18 +00002651 "com_term: operator not *, /, // or %");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002652 op = 255;
2653 }
2654 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002655 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002656 }
2657}
2658
2659static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002660com_arith_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002661{
2662 int i;
2663 int op;
2664 REQ(n, arith_expr);
2665 com_term(c, CHILD(n, 0));
2666 for (i = 2; i < NCH(n); i += 2) {
2667 com_term(c, CHILD(n, i));
2668 switch (TYPE(CHILD(n, i-1))) {
2669 case PLUS:
2670 op = BINARY_ADD;
2671 break;
2672 case MINUS:
2673 op = BINARY_SUBTRACT;
2674 break;
2675 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002676 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002677 "com_arith_expr: operator not + or -");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002678 op = 255;
2679 }
2680 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002681 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002682 }
2683}
2684
2685static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002686com_shift_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002687{
2688 int i;
2689 int op;
2690 REQ(n, shift_expr);
2691 com_arith_expr(c, CHILD(n, 0));
2692 for (i = 2; i < NCH(n); i += 2) {
2693 com_arith_expr(c, CHILD(n, i));
2694 switch (TYPE(CHILD(n, i-1))) {
2695 case LEFTSHIFT:
2696 op = BINARY_LSHIFT;
2697 break;
2698 case RIGHTSHIFT:
2699 op = BINARY_RSHIFT;
2700 break;
2701 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002702 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002703 "com_shift_expr: operator not << or >>");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002704 op = 255;
2705 }
2706 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002707 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002708 }
2709}
2710
2711static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002712com_and_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002713{
2714 int i;
2715 int op;
2716 REQ(n, and_expr);
2717 com_shift_expr(c, CHILD(n, 0));
2718 for (i = 2; i < NCH(n); i += 2) {
2719 com_shift_expr(c, CHILD(n, i));
2720 if (TYPE(CHILD(n, i-1)) == AMPER) {
2721 op = BINARY_AND;
2722 }
2723 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002724 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002725 "com_and_expr: operator not &");
Guido van Rossum7928cd71991-10-24 14:59:31 +00002726 op = 255;
2727 }
2728 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002729 com_pop(c, 1);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002730 }
2731}
2732
2733static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002734com_xor_expr(struct compiling *c, node *n)
Guido van Rossum7928cd71991-10-24 14:59:31 +00002735{
2736 int i;
2737 int op;
2738 REQ(n, xor_expr);
2739 com_and_expr(c, CHILD(n, 0));
2740 for (i = 2; i < NCH(n); i += 2) {
2741 com_and_expr(c, CHILD(n, i));
2742 if (TYPE(CHILD(n, i-1)) == CIRCUMFLEX) {
2743 op = BINARY_XOR;
2744 }
2745 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002746 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002747 "com_xor_expr: operator not ^");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002748 op = 255;
2749 }
2750 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002751 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002752 }
2753}
2754
2755static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002756com_expr(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002757{
2758 int i;
2759 int op;
2760 REQ(n, expr);
Guido van Rossum7928cd71991-10-24 14:59:31 +00002761 com_xor_expr(c, CHILD(n, 0));
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002762 for (i = 2; i < NCH(n); i += 2) {
Guido van Rossum7928cd71991-10-24 14:59:31 +00002763 com_xor_expr(c, CHILD(n, i));
2764 if (TYPE(CHILD(n, i-1)) == VBAR) {
2765 op = BINARY_OR;
2766 }
2767 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002768 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002769 "com_expr: expr operator not |");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002770 op = 255;
2771 }
2772 com_addbyte(c, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002773 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002774 }
2775}
2776
2777static enum cmp_op
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002778cmp_type(node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002779{
2780 REQ(n, comp_op);
Tim Peters12d55a72003-05-12 19:16:52 +00002781 /* comp_op: '<' | '>' | '>=' | '<=' | '<>' | '!=' | '=='
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002782 | 'in' | 'not' 'in' | 'is' | 'is' not' */
2783 if (NCH(n) == 1) {
2784 n = CHILD(n, 0);
2785 switch (TYPE(n)) {
Martin v. Löwis7198a522002-01-01 19:59:11 +00002786 case LESS: return PyCmp_LT;
2787 case GREATER: return PyCmp_GT;
Tim Peters12d55a72003-05-12 19:16:52 +00002788 case EQEQUAL: return PyCmp_EQ;
Martin v. Löwis7198a522002-01-01 19:59:11 +00002789 case LESSEQUAL: return PyCmp_LE;
2790 case GREATEREQUAL: return PyCmp_GE;
2791 case NOTEQUAL: return PyCmp_NE; /* <> or != */
2792 case NAME: if (strcmp(STR(n), "in") == 0) return PyCmp_IN;
2793 if (strcmp(STR(n), "is") == 0) return PyCmp_IS;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002794 }
2795 }
2796 else if (NCH(n) == 2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002797 switch (TYPE(CHILD(n, 0))) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002798 case NAME: if (strcmp(STR(CHILD(n, 1)), "in") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002799 return PyCmp_NOT_IN;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002800 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
Martin v. Löwis7198a522002-01-01 19:59:11 +00002801 return PyCmp_IS_NOT;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002802 }
2803 }
Martin v. Löwis7198a522002-01-01 19:59:11 +00002804 return PyCmp_BAD;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002805}
2806
2807static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002808com_comparison(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002809{
2810 int i;
2811 enum cmp_op op;
2812 int anchor;
2813 REQ(n, comparison); /* comparison: expr (comp_op expr)* */
2814 com_expr(c, CHILD(n, 0));
2815 if (NCH(n) == 1)
2816 return;
2817
2818 /****************************************************************
2819 The following code is generated for all but the last
2820 comparison in a chain:
2821
2822 label: on stack: opcode: jump to:
2823
2824 a <code to load b>
2825 a, b DUP_TOP
2826 a, b, b ROT_THREE
2827 b, a, b COMPARE_OP
2828 b, 0-or-1 JUMP_IF_FALSE L1
2829 b, 1 POP_TOP
2830 b
2831
2832 We are now ready to repeat this sequence for the next
2833 comparison in the chain.
2834
2835 For the last we generate:
2836
2837 b <code to load c>
2838 b, c COMPARE_OP
2839 0-or-1
2840
2841 If there were any jumps to L1 (i.e., there was more than one
2842 comparison), we generate:
2843
2844 0-or-1 JUMP_FORWARD L2
2845 L1: b, 0 ROT_TWO
2846 0, b POP_TOP
2847 0
Guido van Rossum8b993a91997-01-17 21:04:03 +00002848 L2: 0-or-1
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002849 ****************************************************************/
2850
2851 anchor = 0;
2852
2853 for (i = 2; i < NCH(n); i += 2) {
2854 com_expr(c, CHILD(n, i));
2855 if (i+2 < NCH(n)) {
2856 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002857 com_push(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002858 com_addbyte(c, ROT_THREE);
2859 }
2860 op = cmp_type(CHILD(n, i-1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00002861 if (op == PyCmp_BAD) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002862 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00002863 "com_comparison: unknown comparison op");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002864 }
2865 com_addoparg(c, COMPARE_OP, op);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002866 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002867 if (i+2 < NCH(n)) {
2868 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2869 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002870 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002871 }
2872 }
2873
2874 if (anchor) {
2875 int anchor2 = 0;
2876 com_addfwref(c, JUMP_FORWARD, &anchor2);
2877 com_backpatch(c, anchor);
2878 com_addbyte(c, ROT_TWO);
2879 com_addbyte(c, POP_TOP);
2880 com_backpatch(c, anchor2);
2881 }
2882}
2883
2884static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002885com_not_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002886{
2887 REQ(n, not_test); /* 'not' not_test | comparison */
2888 if (NCH(n) == 1) {
2889 com_comparison(c, CHILD(n, 0));
2890 }
2891 else {
2892 com_not_test(c, CHILD(n, 1));
2893 com_addbyte(c, UNARY_NOT);
2894 }
2895}
2896
2897static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002898com_and_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002899{
2900 int i;
2901 int anchor;
2902 REQ(n, and_test); /* not_test ('and' not_test)* */
2903 anchor = 0;
2904 i = 0;
2905 for (;;) {
2906 com_not_test(c, CHILD(n, i));
2907 if ((i += 2) >= NCH(n))
2908 break;
2909 com_addfwref(c, JUMP_IF_FALSE, &anchor);
2910 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002911 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002912 }
2913 if (anchor)
2914 com_backpatch(c, anchor);
2915}
2916
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002917static int
2918com_make_closure(struct compiling *c, PyCodeObject *co)
2919{
Jeremy Hylton733c8932001-12-13 19:51:56 +00002920 int i, free = PyCode_GetNumFree(co);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002921 if (free == 0)
2922 return 0;
2923 for (i = 0; i < free; ++i) {
2924 /* Bypass com_addop_varname because it will generate
2925 LOAD_DEREF but LOAD_CLOSURE is needed.
2926 */
2927 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
2928 int arg, reftype;
2929
2930 /* Special case: If a class contains a method with a
2931 free variable that has the same name as a method,
2932 the name will be considered free *and* local in the
2933 class. It should be handled by the closure, as
2934 well as by the normal name loookup logic.
2935 */
2936 reftype = get_ref_type(c, PyString_AS_STRING(name));
2937 if (reftype == CELL)
2938 arg = com_lookup_arg(c->c_cellvars, name);
2939 else /* (reftype == FREE) */
2940 arg = com_lookup_arg(c->c_freevars, name);
2941 if (arg == -1) {
Jeremy Hylton78891072001-03-01 06:09:34 +00002942 fprintf(stderr, "lookup %s in %s %d %d\n"
2943 "freevars of %s: %s\n",
2944 PyObject_REPR(name),
2945 c->c_name,
2946 reftype, arg,
2947 PyString_AS_STRING(co->co_name),
2948 PyObject_REPR(co->co_freevars));
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002949 Py_FatalError("com_make_closure()");
2950 }
2951 com_addoparg(c, LOAD_CLOSURE, arg);
2952
2953 }
2954 com_push(c, free);
2955 return 1;
2956}
2957
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002958static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002959com_test(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002960{
Guido van Rossum8b993a91997-01-17 21:04:03 +00002961 REQ(n, test); /* and_test ('or' and_test)* | lambdef */
Guido van Rossum57531fe1993-11-30 14:57:42 +00002962 if (NCH(n) == 1 && TYPE(CHILD(n, 0)) == lambdef) {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002963 PyCodeObject *co;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002964 int i, closure;
Guido van Rossum681d79a1995-07-18 14:51:37 +00002965 int ndefs = com_argdefs(c, CHILD(n, 0));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00002966 symtable_enter_scope(c->c_symtable, "lambda", lambdef,
2967 n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002968 co = icompile(CHILD(n, 0), c);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00002969 if (co == NULL) {
2970 c->c_errors++;
2971 return;
2972 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00002973 symtable_exit_scope(c->c_symtable);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002974 i = com_addconst(c, (PyObject *)co);
2975 closure = com_make_closure(c, co);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002976 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002977 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002978 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002979 com_addoparg(c, MAKE_CLOSURE, ndefs);
Jeremy Hylton733c8932001-12-13 19:51:56 +00002980 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002981 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00002982 com_addoparg(c, MAKE_FUNCTION, ndefs);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00002983 Py_DECREF(co);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002984 com_pop(c, ndefs);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00002985 }
Guido van Rossum57531fe1993-11-30 14:57:42 +00002986 else {
2987 int anchor = 0;
2988 int i = 0;
2989 for (;;) {
2990 com_and_test(c, CHILD(n, i));
2991 if ((i += 2) >= NCH(n))
2992 break;
2993 com_addfwref(c, JUMP_IF_TRUE, &anchor);
2994 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00002995 com_pop(c, 1);
Guido van Rossum57531fe1993-11-30 14:57:42 +00002996 }
2997 if (anchor)
2998 com_backpatch(c, anchor);
2999 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003000}
3001
3002static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003003com_list(struct compiling *c, node *n, int toplevel)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003004{
3005 /* exprlist: expr (',' expr)* [',']; likewise for testlist */
Guido van Rossum288a60f1991-12-16 13:05:10 +00003006 if (NCH(n) == 1 && !toplevel) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003007 com_node(c, CHILD(n, 0));
3008 }
3009 else {
3010 int i;
3011 int len;
3012 len = (NCH(n) + 1) / 2;
3013 for (i = 0; i < NCH(n); i += 2)
3014 com_node(c, CHILD(n, i));
3015 com_addoparg(c, BUILD_TUPLE, len);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003016 com_pop(c, len-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003017 }
3018}
3019
3020
3021/* Begin of assignment compilation */
3022
Thomas Wouters434d0822000-08-24 20:11:32 +00003023
3024static void
3025com_augassign_attr(struct compiling *c, node *n, int opcode, node *augn)
3026{
3027 com_addbyte(c, DUP_TOP);
3028 com_push(c, 1);
3029 com_addopname(c, LOAD_ATTR, n);
Thomas Wouters434d0822000-08-24 20:11:32 +00003030 com_node(c, augn);
3031 com_addbyte(c, opcode);
3032 com_pop(c, 1);
3033 com_addbyte(c, ROT_TWO);
3034 com_addopname(c, STORE_ATTR, n);
3035 com_pop(c, 2);
3036}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003037
3038static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003039com_assign_attr(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003040{
Guido van Rossum3ac99d42002-08-16 02:13:49 +00003041 if (none_assignment_check(c, STR(n), assigning))
3042 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003043 com_addopname(c, assigning ? STORE_ATTR : DELETE_ATTR, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003044 com_pop(c, assigning ? 2 : 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003045}
3046
3047static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003048com_assign_trailer(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003049{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003050 REQ(n, trailer);
3051 switch (TYPE(CHILD(n, 0))) {
3052 case LPAR: /* '(' [exprlist] ')' */
Jeremy Hylton05ab2e62002-05-31 14:08:29 +00003053 if (assigning == OP_DELETE)
3054 com_error(c, PyExc_SyntaxError,
3055 "can't delete function call");
3056 else
3057 com_error(c, PyExc_SyntaxError,
3058 "can't assign to function call");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003059 break;
3060 case DOT: /* '.' NAME */
Thomas Wouters434d0822000-08-24 20:11:32 +00003061 if (assigning > OP_APPLY)
3062 com_augassign_attr(c, CHILD(n, 1), assigning, augn);
3063 else
3064 com_assign_attr(c, CHILD(n, 1), assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003065 break;
Guido van Rossum8861b741996-07-30 16:49:37 +00003066 case LSQB: /* '[' subscriptlist ']' */
Thomas Wouters434d0822000-08-24 20:11:32 +00003067 com_subscriptlist(c, CHILD(n, 1), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003068 break;
3069 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003070 com_error(c, PyExc_SystemError, "unknown trailer type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003071 }
3072}
3073
3074static void
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003075com_assign_sequence(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003076{
3077 int i;
Raymond Hettinger354433a2004-05-19 08:20:33 +00003078 if (TYPE(n) != testlist && TYPE(n) != testlist_gexp &&
3079 TYPE(n) != listmaker)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003080 REQ(n, exprlist);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003081 if (assigning) {
3082 i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003083 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003084 com_push(c, i-1);
3085 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003086 for (i = 0; i < NCH(n); i += 2)
Thomas Wouters434d0822000-08-24 20:11:32 +00003087 com_assign(c, CHILD(n, i), assigning, NULL);
3088}
3089
3090static void
3091com_augassign_name(struct compiling *c, node *n, int opcode, node *augn)
3092{
3093 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003094 com_addop_varname(c, VAR_LOAD, STR(n));
Thomas Wouters434d0822000-08-24 20:11:32 +00003095 com_push(c, 1);
3096 com_node(c, augn);
3097 com_addbyte(c, opcode);
3098 com_pop(c, 1);
3099 com_assign_name(c, n, OP_ASSIGN);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003100}
3101
3102static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003103com_assign_name(struct compiling *c, node *n, int assigning)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003104{
3105 REQ(n, NAME);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003106 com_addop_varname(c, assigning ? VAR_STORE : VAR_DELETE, STR(n));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003107 if (assigning)
3108 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003109}
3110
3111static void
Thomas Wouters434d0822000-08-24 20:11:32 +00003112com_assign(struct compiling *c, node *n, int assigning, node *augn)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003113{
3114 /* Loop to avoid trivial recursion */
3115 for (;;) {
3116 switch (TYPE(n)) {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003117
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003118 case exprlist:
3119 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003120 case testlist1:
Raymond Hettinger354433a2004-05-19 08:20:33 +00003121 case testlist_gexp:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003122 if (NCH(n) > 1) {
Raymond Hettinger354433a2004-05-19 08:20:33 +00003123 if (TYPE(CHILD(n, 1)) == gen_for) {
3124 com_error(c, PyExc_SystemError,
3125 "assign to generator expression not possible");
3126 return;
3127 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003128 if (assigning > OP_APPLY) {
3129 com_error(c, PyExc_SyntaxError,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00003130 "augmented assign to tuple not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003131 return;
3132 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003133 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003134 return;
3135 }
3136 n = CHILD(n, 0);
3137 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003138
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003139 case test:
3140 case and_test:
3141 case not_test:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003142 case comparison:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003143 case expr:
Guido van Rossum7928cd71991-10-24 14:59:31 +00003144 case xor_expr:
3145 case and_expr:
3146 case shift_expr:
3147 case arith_expr:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003148 case term:
Guido van Rossum50564e81996-01-12 01:13:16 +00003149 case factor:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003150 if (NCH(n) > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003151 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003152 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003153 return;
3154 }
3155 n = CHILD(n, 0);
3156 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003157
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003158 case power: /* atom trailer* ('**' power)*
3159 ('+'|'-'|'~') factor | atom trailer* */
Guido van Rossum50564e81996-01-12 01:13:16 +00003160 if (TYPE(CHILD(n, 0)) != atom) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003161 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003162 "can't assign to operator");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003163 return;
3164 }
Guido van Rossum50564e81996-01-12 01:13:16 +00003165 if (NCH(n) > 1) { /* trailer or exponent present */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003166 int i;
3167 com_node(c, CHILD(n, 0));
3168 for (i = 1; i+1 < NCH(n); i++) {
Guido van Rossum50564e81996-01-12 01:13:16 +00003169 if (TYPE(CHILD(n, i)) == DOUBLESTAR) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003170 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003171 "can't assign to operator");
Guido van Rossum50564e81996-01-12 01:13:16 +00003172 return;
3173 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003174 com_apply_trailer(c, CHILD(n, i));
3175 } /* NB i is still alive */
3176 com_assign_trailer(c,
Thomas Wouters434d0822000-08-24 20:11:32 +00003177 CHILD(n, i), assigning, augn);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003178 return;
3179 }
3180 n = CHILD(n, 0);
3181 break;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003182
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003183 case atom:
3184 switch (TYPE(CHILD(n, 0))) {
3185 case LPAR:
3186 n = CHILD(n, 1);
3187 if (TYPE(n) == RPAR) {
3188 /* XXX Should allow () = () ??? */
Guido van Rossum79f25d91997-04-29 20:08:16 +00003189 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003190 "can't assign to ()");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003191 return;
3192 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003193 if (assigning > OP_APPLY) {
3194 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003195 "augmented assign to tuple literal not possible");
Thomas Wouters434d0822000-08-24 20:11:32 +00003196 return;
3197 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003198 break;
3199 case LSQB:
3200 n = CHILD(n, 1);
3201 if (TYPE(n) == RSQB) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003202 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003203 "can't assign to []");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003204 return;
3205 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003206 if (assigning > OP_APPLY) {
3207 com_error(c, PyExc_SyntaxError,
Neal Norwitza1d654e2003-05-22 22:00:04 +00003208 "augmented assign to list literal not possible");
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003209 return;
3210 }
3211 if (NCH(n) > 1
3212 && TYPE(CHILD(n, 1)) == list_for) {
3213 com_error(c, PyExc_SyntaxError,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00003214 "can't assign to list comprehension");
Thomas Wouters434d0822000-08-24 20:11:32 +00003215 return;
3216 }
Thomas Wouters0be5aab2000-08-11 22:15:52 +00003217 com_assign_sequence(c, n, assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003218 return;
3219 case NAME:
Thomas Wouters434d0822000-08-24 20:11:32 +00003220 if (assigning > OP_APPLY)
3221 com_augassign_name(c, CHILD(n, 0),
3222 assigning, augn);
3223 else
3224 com_assign_name(c, CHILD(n, 0),
3225 assigning);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003226 return;
3227 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003228 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003229 "can't assign to literal");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003230 return;
3231 }
3232 break;
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003233
3234 case lambdef:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003235 com_error(c, PyExc_SyntaxError,
3236 "can't assign to lambda");
Guido van Rossum15cc9a01996-08-08 18:51:04 +00003237 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003238
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003239 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00003240 com_error(c, PyExc_SystemError,
3241 "com_assign: bad node");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003242 return;
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003243
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003244 }
3245 }
3246}
Guido van Rossum7c531111997-03-11 18:42:21 +00003247
Thomas Wouters434d0822000-08-24 20:11:32 +00003248static void
3249com_augassign(struct compiling *c, node *n)
3250{
3251 int opcode;
3252
3253 switch (STR(CHILD(CHILD(n, 1), 0))[0]) {
3254 case '+': opcode = INPLACE_ADD; break;
3255 case '-': opcode = INPLACE_SUBTRACT; break;
Guido van Rossum4668b002001-08-08 05:00:18 +00003256 case '/':
3257 if (STR(CHILD(CHILD(n, 1), 0))[1] == '/')
3258 opcode = INPLACE_FLOOR_DIVIDE;
3259 else if (c->c_flags & CO_FUTURE_DIVISION)
3260 opcode = INPLACE_TRUE_DIVIDE;
3261 else
3262 opcode = INPLACE_DIVIDE;
3263 break;
Thomas Wouters434d0822000-08-24 20:11:32 +00003264 case '%': opcode = INPLACE_MODULO; break;
3265 case '<': opcode = INPLACE_LSHIFT; break;
3266 case '>': opcode = INPLACE_RSHIFT; break;
3267 case '&': opcode = INPLACE_AND; break;
3268 case '^': opcode = INPLACE_XOR; break;
3269 case '|': opcode = INPLACE_OR; break;
3270 case '*':
3271 if (STR(CHILD(CHILD(n, 1), 0))[1] == '*')
3272 opcode = INPLACE_POWER;
3273 else
3274 opcode = INPLACE_MULTIPLY;
3275 break;
3276 default:
3277 com_error(c, PyExc_SystemError, "com_augassign: bad operator");
3278 return;
3279 }
3280 com_assign(c, CHILD(n, 0), opcode, CHILD(n, 2));
3281}
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003282
3283static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003284com_expr_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003285{
Thomas Wouters434d0822000-08-24 20:11:32 +00003286 REQ(n, expr_stmt);
3287 /* testlist (('=' testlist)* | augassign testlist) */
Guido van Rossum8b993a91997-01-17 21:04:03 +00003288 /* Forget it if we have just a doc string here */
Guido van Rossum5f5e8171997-04-06 03:41:40 +00003289 if (!c->c_interactive && NCH(n) == 1 && get_rawdocstring(n) != NULL)
Guido van Rossum8b993a91997-01-17 21:04:03 +00003290 return;
Thomas Wouters434d0822000-08-24 20:11:32 +00003291 if (NCH(n) == 1) {
3292 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003293 if (c->c_interactive)
3294 com_addbyte(c, PRINT_EXPR);
3295 else
3296 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003297 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003298 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003299 else if (TYPE(CHILD(n,1)) == augassign)
3300 com_augassign(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003301 else {
3302 int i;
Thomas Wouters434d0822000-08-24 20:11:32 +00003303 com_node(c, CHILD(n, NCH(n)-1));
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003304 for (i = 0; i < NCH(n)-2; i+=2) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003305 if (i+2 < NCH(n)-2) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003306 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003307 com_push(c, 1);
3308 }
Thomas Wouters434d0822000-08-24 20:11:32 +00003309 com_assign(c, CHILD(n, i), OP_ASSIGN, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003310 }
3311 }
3312}
3313
3314static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003315com_assert_stmt(struct compiling *c, node *n)
Guido van Rossum228d7f31997-04-02 05:24:36 +00003316{
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003317 int a = 0;
Guido van Rossum228d7f31997-04-02 05:24:36 +00003318 int i;
3319 REQ(n, assert_stmt); /* 'assert' test [',' test] */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003320 if (Py_OptimizeFlag)
3321 return;
3322 /* Generate code like
Guido van Rossum228d7f31997-04-02 05:24:36 +00003323
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003324 if not <test>:
Guido van Rossum228d7f31997-04-02 05:24:36 +00003325 raise AssertionError [, <message>]
3326
3327 where <message> is the second test, if present.
3328 */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003329 com_node(c, CHILD(n, 1));
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003330 com_addfwref(c, JUMP_IF_TRUE, &a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003331 com_addbyte(c, POP_TOP);
3332 com_pop(c, 1);
3333 /* Raise that exception! */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003334 com_addop_name(c, LOAD_GLOBAL, "AssertionError");
Guido van Rossum228d7f31997-04-02 05:24:36 +00003335 com_push(c, 1);
3336 i = NCH(n)/2; /* Either 2 or 4 */
3337 if (i > 1)
3338 com_node(c, CHILD(n, 3));
3339 com_addoparg(c, RAISE_VARARGS, i);
3340 com_pop(c, i);
3341 /* The interpreter does not fall through */
Neil Schemenauer89e3ee02002-04-26 01:58:53 +00003342 /* Jump ends up here */
Guido van Rossum228d7f31997-04-02 05:24:36 +00003343 com_backpatch(c, a);
Guido van Rossum228d7f31997-04-02 05:24:36 +00003344 com_addbyte(c, POP_TOP);
3345}
3346
3347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003348com_print_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003349{
Barry Warsaw29c574e2000-08-21 15:38:56 +00003350 int i = 1;
3351 node* stream = NULL;
3352
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003353 REQ(n, print_stmt); /* 'print' (test ',')* [test] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003354
3355 /* are we using the extended print form? */
3356 if (NCH(n) >= 2 && TYPE(CHILD(n, 1)) == RIGHTSHIFT) {
3357 stream = CHILD(n, 2);
Barry Warsaw24703a02000-08-21 17:07:20 +00003358 com_node(c, stream);
3359 /* stack: [...] => [... stream] */
3360 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003361 if (NCH(n) > 3 && TYPE(CHILD(n, 3)) == COMMA)
3362 i = 4;
3363 else
3364 i = 3;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003365 }
Barry Warsaw29c574e2000-08-21 15:38:56 +00003366 for (; i < NCH(n); i += 2) {
3367 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003368 com_addbyte(c, DUP_TOP);
3369 /* stack: [stream] => [stream stream] */
3370 com_push(c, 1);
Barry Warsaw29c574e2000-08-21 15:38:56 +00003371 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003372 /* stack: [stream stream] => [stream stream obj] */
3373 com_addbyte(c, ROT_TWO);
3374 /* stack: [stream stream obj] => [stream obj stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003375 com_addbyte(c, PRINT_ITEM_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003376 /* stack: [stream obj stream] => [stream] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003377 com_pop(c, 2);
3378 }
3379 else {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003380 com_node(c, CHILD(n, i));
Barry Warsaw24703a02000-08-21 17:07:20 +00003381 /* stack: [...] => [... obj] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003382 com_addbyte(c, PRINT_ITEM);
3383 com_pop(c, 1);
3384 }
3385 }
3386 /* XXX Alternatively, LOAD_CONST '\n' and then PRINT_ITEM */
Barry Warsaw24703a02000-08-21 17:07:20 +00003387 if (TYPE(CHILD(n, NCH(n)-1)) == COMMA) {
Barry Warsaw29c574e2000-08-21 15:38:56 +00003388 if (stream != NULL) {
Barry Warsaw24703a02000-08-21 17:07:20 +00003389 /* must pop the extra stream object off the stack */
3390 com_addbyte(c, POP_TOP);
3391 /* stack: [... stream] => [...] */
3392 com_pop(c, 1);
3393 }
3394 }
3395 else {
3396 if (stream != NULL) {
3397 /* this consumes the last stream object on stack */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003398 com_addbyte(c, PRINT_NEWLINE_TO);
Barry Warsaw24703a02000-08-21 17:07:20 +00003399 /* stack: [... stream] => [...] */
Barry Warsaw29c574e2000-08-21 15:38:56 +00003400 com_pop(c, 1);
3401 }
3402 else
3403 com_addbyte(c, PRINT_NEWLINE);
3404 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003405}
3406
3407static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003408com_return_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003409{
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003410 REQ(n, return_stmt); /* 'return' [testlist] */
Guido van Rossum3f5da241990-12-20 15:06:42 +00003411 if (!c->c_infunction) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003412 com_error(c, PyExc_SyntaxError, "'return' outside function");
Guido van Rossum3f5da241990-12-20 15:06:42 +00003413 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003414 if (c->c_flags & CO_GENERATOR) {
3415 if (NCH(n) > 1) {
3416 com_error(c, PyExc_SyntaxError,
3417 "'return' with argument inside generator");
3418 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003419 }
3420 if (NCH(n) < 2) {
3421 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003422 com_push(c, 1);
3423 }
Tim Petersad1a18b2001-06-23 06:19:16 +00003424 else
3425 com_node(c, CHILD(n, 1));
3426 com_addbyte(c, RETURN_VALUE);
Tim Peters5ca576e2001-06-18 22:08:13 +00003427 com_pop(c, 1);
3428}
3429
3430static void
3431com_yield_stmt(struct compiling *c, node *n)
3432{
Tim Peters95c80f82001-06-23 02:07:08 +00003433 int i;
Tim Peters5ca576e2001-06-18 22:08:13 +00003434 REQ(n, yield_stmt); /* 'yield' testlist */
3435 if (!c->c_infunction) {
3436 com_error(c, PyExc_SyntaxError, "'yield' outside function");
3437 }
Tim Peters95c80f82001-06-23 02:07:08 +00003438
3439 for (i = 0; i < c->c_nblocks; ++i) {
3440 if (c->c_block[i] == SETUP_FINALLY) {
3441 com_error(c, PyExc_SyntaxError,
3442 "'yield' not allowed in a 'try' block "
3443 "with a 'finally' clause");
3444 return;
3445 }
3446 }
Tim Peters5ca576e2001-06-18 22:08:13 +00003447 com_node(c, CHILD(n, 1));
3448 com_addbyte(c, YIELD_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003449 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003450}
3451
3452static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003453com_raise_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003454{
Guido van Rossum8b993a91997-01-17 21:04:03 +00003455 int i;
Guido van Rossumd295f121998-04-09 21:39:57 +00003456 REQ(n, raise_stmt); /* 'raise' [test [',' test [',' test]]] */
3457 if (NCH(n) > 1) {
3458 com_node(c, CHILD(n, 1));
3459 if (NCH(n) > 3) {
3460 com_node(c, CHILD(n, 3));
3461 if (NCH(n) > 5)
3462 com_node(c, CHILD(n, 5));
3463 }
Guido van Rossumf10570b1995-07-07 22:53:21 +00003464 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003465 i = NCH(n)/2;
3466 com_addoparg(c, RAISE_VARARGS, i);
3467 com_pop(c, i);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003468}
3469
3470static void
Thomas Wouters52152252000-08-17 22:55:00 +00003471com_from_import(struct compiling *c, node *n)
3472{
3473 com_addopname(c, IMPORT_FROM, CHILD(n, 0));
3474 com_push(c, 1);
3475 if (NCH(n) > 1) {
3476 if (strcmp(STR(CHILD(n, 1)), "as") != 0) {
3477 com_error(c, PyExc_SyntaxError, "invalid syntax");
3478 return;
3479 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003480 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003481 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003482 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Thomas Wouters52152252000-08-17 22:55:00 +00003483 com_pop(c, 1);
3484}
3485
3486static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003487com_import_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003488{
3489 int i;
3490 REQ(n, import_stmt);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003491 /* 'import' dotted_name (',' dotted_name)* |
3492 'from' dotted_name 'import' ('*' | NAME (',' NAME)*) */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003493 if (STR(CHILD(n, 0))[0] == 'f') {
Guido van Rossum83fb0732000-11-27 22:22:36 +00003494 PyObject *tup;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003495 /* 'from' dotted_name 'import' ... */
3496 REQ(CHILD(n, 1), dotted_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003497
3498 if (TYPE(CHILD(n, 3)) == STAR) {
3499 tup = Py_BuildValue("(s)", "*");
3500 } else {
3501 tup = PyTuple_New((NCH(n) - 2)/2);
3502 for (i = 3; i < NCH(n); i += 2) {
3503 PyTuple_SET_ITEM(tup, (i-3)/2,
Guido van Rossum633d90c2002-12-23 16:51:42 +00003504 PyString_FromString(STR(
3505 CHILD(CHILD(n, i), 0))));
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003506 }
3507 }
3508 com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
Guido van Rossum83fb0732000-11-27 22:22:36 +00003509 Py_DECREF(tup);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003510 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003511 com_addopname(c, IMPORT_NAME, CHILD(n, 1));
Thomas Wouters52152252000-08-17 22:55:00 +00003512 if (TYPE(CHILD(n, 3)) == STAR)
3513 com_addbyte(c, IMPORT_STAR);
3514 else {
3515 for (i = 3; i < NCH(n); i += 2)
3516 com_from_import(c, CHILD(n, i));
3517 com_addbyte(c, POP_TOP);
3518 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003519 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003520 }
3521 else {
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003522 /* 'import' ... */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003523 for (i = 1; i < NCH(n); i += 2) {
Thomas Wouters52152252000-08-17 22:55:00 +00003524 node *subn = CHILD(n, i);
3525 REQ(subn, dotted_as_name);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003526 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003527 com_push(c, 1);
Thomas Woutersdd13e4f2000-08-27 20:31:27 +00003528 com_addopname(c, IMPORT_NAME, CHILD(subn, 0));
Thomas Wouters52152252000-08-17 22:55:00 +00003529 if (NCH(subn) > 1) {
Thomas Wouterse753ef82000-08-27 20:16:32 +00003530 int j;
3531 if (strcmp(STR(CHILD(subn, 1)), "as") != 0) {
Thomas Wouters52152252000-08-17 22:55:00 +00003532 com_error(c, PyExc_SyntaxError,
3533 "invalid syntax");
3534 return;
3535 }
Thomas Wouterse753ef82000-08-27 20:16:32 +00003536 for (j=2 ; j < NCH(CHILD(subn, 0)); j += 2)
3537 com_addopname(c, LOAD_ATTR,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003538 CHILD(CHILD(subn, 0),
3539 j));
3540 com_addop_varname(c, VAR_STORE,
3541 STR(CHILD(subn, 2)));
Thomas Wouters52152252000-08-17 22:55:00 +00003542 } else
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003543 com_addop_varname(c, VAR_STORE,
3544 STR(CHILD(CHILD(subn, 0),
3545 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003546 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003547 }
3548 }
3549}
3550
3551static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003552com_exec_stmt(struct compiling *c, node *n)
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003553{
3554 REQ(n, exec_stmt);
3555 /* exec_stmt: 'exec' expr ['in' expr [',' expr]] */
3556 com_node(c, CHILD(n, 1));
3557 if (NCH(n) >= 4)
3558 com_node(c, CHILD(n, 3));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003559 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003560 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003561 com_push(c, 1);
3562 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003563 if (NCH(n) >= 6)
3564 com_node(c, CHILD(n, 5));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003565 else {
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003566 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003567 com_push(c, 1);
3568 }
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003569 com_addbyte(c, EXEC_STMT);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003570 com_pop(c, 3);
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003571}
3572
Guido van Rossum7c531111997-03-11 18:42:21 +00003573static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003574is_constant_false(struct compiling *c, node *n)
Guido van Rossum7c531111997-03-11 18:42:21 +00003575{
Guido van Rossum79f25d91997-04-29 20:08:16 +00003576 PyObject *v;
Guido van Rossum7c531111997-03-11 18:42:21 +00003577 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00003578 /* argument c will be NULL when called from symtable_node() */
Guido van Rossum7c531111997-03-11 18:42:21 +00003579
3580 /* Label to avoid tail recursion */
3581 next:
3582 switch (TYPE(n)) {
3583
3584 case suite:
3585 if (NCH(n) == 1) {
3586 n = CHILD(n, 0);
3587 goto next;
3588 }
3589 /* Fall through */
3590 case file_input:
3591 for (i = 0; i < NCH(n); i++) {
3592 node *ch = CHILD(n, i);
3593 if (TYPE(ch) == stmt) {
3594 n = ch;
3595 goto next;
3596 }
3597 }
3598 break;
3599
3600 case stmt:
3601 case simple_stmt:
3602 case small_stmt:
3603 n = CHILD(n, 0);
3604 goto next;
3605
3606 case expr_stmt:
3607 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00003608 case testlist1:
Guido van Rossum7c531111997-03-11 18:42:21 +00003609 case test:
3610 case and_test:
3611 case not_test:
3612 case comparison:
3613 case expr:
3614 case xor_expr:
3615 case and_expr:
3616 case shift_expr:
3617 case arith_expr:
3618 case term:
3619 case factor:
3620 case power:
3621 case atom:
3622 if (NCH(n) == 1) {
3623 n = CHILD(n, 0);
3624 goto next;
3625 }
3626 break;
3627
3628 case NAME:
3629 if (Py_OptimizeFlag && strcmp(STR(n), "__debug__") == 0)
3630 return 1;
3631 break;
3632
3633 case NUMBER:
3634 v = parsenumber(c, STR(n));
3635 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003636 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003637 break;
3638 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003639 i = PyObject_IsTrue(v);
3640 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003641 return i == 0;
3642
3643 case STRING:
Martin v. Löwis339d0f72001-08-17 18:39:25 +00003644 v = parsestr(c, STR(n));
Guido van Rossum7c531111997-03-11 18:42:21 +00003645 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003646 PyErr_Clear();
Guido van Rossum7c531111997-03-11 18:42:21 +00003647 break;
3648 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00003649 i = PyObject_IsTrue(v);
3650 Py_DECREF(v);
Guido van Rossum7c531111997-03-11 18:42:21 +00003651 return i == 0;
3652
3653 }
3654 return 0;
3655}
3656
Tim Peters08a898f2001-06-28 01:52:22 +00003657
3658/* Look under n for a return stmt with an expression.
3659 * This hack is used to find illegal returns under "if 0:" blocks in
3660 * functions already known to be generators (as determined by the symtable
3661 * pass).
3662 * Return the offending return node if found, else NULL.
3663 */
3664static node *
3665look_for_offending_return(node *n)
3666{
3667 int i;
3668
3669 for (i = 0; i < NCH(n); ++i) {
3670 node *kid = CHILD(n, i);
3671
3672 switch (TYPE(kid)) {
3673 case classdef:
3674 case funcdef:
3675 case lambdef:
3676 /* Stuff in nested functions & classes doesn't
3677 affect the code block we started in. */
3678 return NULL;
3679
3680 case return_stmt:
3681 if (NCH(kid) > 1)
3682 return kid;
3683 break;
3684
3685 default: {
3686 node *bad = look_for_offending_return(kid);
3687 if (bad != NULL)
3688 return bad;
3689 }
3690 }
3691 }
3692
3693 return NULL;
3694}
3695
Guido van Rossumdb3165e1993-10-18 17:06:59 +00003696static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003697com_if_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003698{
3699 int i;
3700 int anchor = 0;
3701 REQ(n, if_stmt);
3702 /*'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] */
3703 for (i = 0; i+3 < NCH(n); i+=4) {
3704 int a = 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +00003705 node *ch = CHILD(n, i+1);
Tim Peters08a898f2001-06-28 01:52:22 +00003706 if (is_constant_false(c, ch)) {
3707 /* We're going to skip this block. However, if this
3708 is a generator, we have to check the dead code
3709 anyway to make sure there aren't any return stmts
3710 with expressions, in the same scope. */
3711 if (c->c_flags & CO_GENERATOR) {
3712 node *p = look_for_offending_return(n);
3713 if (p != NULL) {
3714 int savelineno = c->c_lineno;
3715 c->c_lineno = p->n_lineno;
3716 com_error(c, PyExc_SyntaxError,
3717 "'return' with argument "
3718 "inside generator");
3719 c->c_lineno = savelineno;
3720 }
3721 }
Guido van Rossum7c531111997-03-11 18:42:21 +00003722 continue;
Tim Peters08a898f2001-06-28 01:52:22 +00003723 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00003724 if (i > 0)
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003725 com_set_lineno(c, ch->n_lineno);
Guido van Rossum7c531111997-03-11 18:42:21 +00003726 com_node(c, ch);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003727 com_addfwref(c, JUMP_IF_FALSE, &a);
3728 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003729 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003730 com_node(c, CHILD(n, i+3));
3731 com_addfwref(c, JUMP_FORWARD, &anchor);
3732 com_backpatch(c, a);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003733 /* We jump here with an extra entry which we now pop */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003734 com_addbyte(c, POP_TOP);
3735 }
3736 if (i+2 < NCH(n))
3737 com_node(c, CHILD(n, i+2));
Guido van Rossum7c531111997-03-11 18:42:21 +00003738 if (anchor)
3739 com_backpatch(c, anchor);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003740}
3741
3742static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003743com_while_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003744{
3745 int break_anchor = 0;
3746 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003747 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003748 REQ(n, while_stmt); /* 'while' test ':' suite ['else' ':' suite] */
3749 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003750 block_push(c, SETUP_LOOP);
3751 c->c_begin = c->c_nexti;
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003752 com_set_lineno(c, n->n_lineno);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003753 com_node(c, CHILD(n, 1));
3754 com_addfwref(c, JUMP_IF_FALSE, &anchor);
3755 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003756 com_pop(c, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003757 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003758 com_node(c, CHILD(n, 3));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003759 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003760 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3761 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003762 com_backpatch(c, anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003763 /* We jump here with one entry more on the stack */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003764 com_addbyte(c, POP_TOP);
3765 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003766 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003767 if (NCH(n) > 4)
3768 com_node(c, CHILD(n, 6));
3769 com_backpatch(c, break_anchor);
3770}
3771
3772static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003773com_for_stmt(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003774{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003775 int break_anchor = 0;
3776 int anchor = 0;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003777 int save_begin = c->c_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003778 REQ(n, for_stmt);
3779 /* 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite] */
3780 com_addfwref(c, SETUP_LOOP, &break_anchor);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003781 block_push(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003782 com_node(c, CHILD(n, 3));
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003783 com_addbyte(c, GET_ITER);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003784 c->c_begin = c->c_nexti;
Michael W. Hudson26848a32003-04-29 17:07:36 +00003785 com_set_lineno(c, c->c_last_line);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003786 com_addfwref(c, FOR_ITER, &anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003787 com_push(c, 1);
Thomas Wouters434d0822000-08-24 20:11:32 +00003788 com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);
Guido van Rossum3f5da241990-12-20 15:06:42 +00003789 c->c_loops++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003790 com_node(c, CHILD(n, 5));
Guido van Rossum3f5da241990-12-20 15:06:42 +00003791 c->c_loops--;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003792 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
3793 c->c_begin = save_begin;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003794 com_backpatch(c, anchor);
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00003795 com_pop(c, 1); /* FOR_ITER has popped this */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003796 com_addbyte(c, POP_BLOCK);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00003797 block_pop(c, SETUP_LOOP);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003798 if (NCH(n) > 8)
3799 com_node(c, CHILD(n, 8));
3800 com_backpatch(c, break_anchor);
3801}
3802
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003803/* Code generated for "try: S finally: Sf" is as follows:
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003804
3805 SETUP_FINALLY L
3806 <code for S>
3807 POP_BLOCK
3808 LOAD_CONST <nil>
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003809 L: <code for Sf>
3810 END_FINALLY
3811
3812 The special instructions use the block stack. Each block
3813 stack entry contains the instruction that created it (here
3814 SETUP_FINALLY), the level of the value stack at the time the
3815 block stack entry was created, and a label (here L).
3816
3817 SETUP_FINALLY:
3818 Pushes the current value stack level and the label
3819 onto the block stack.
3820 POP_BLOCK:
3821 Pops en entry from the block stack, and pops the value
3822 stack until its level is the same as indicated on the
3823 block stack. (The label is ignored.)
3824 END_FINALLY:
Guido van Rossum3f5da241990-12-20 15:06:42 +00003825 Pops a variable number of entries from the *value* stack
3826 and re-raises the exception they specify. The number of
3827 entries popped depends on the (pseudo) exception type.
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003828
3829 The block stack is unwound when an exception is raised:
3830 when a SETUP_FINALLY entry is found, the exception is pushed
3831 onto the value stack (and the exception condition is cleared),
3832 and the interpreter jumps to the label gotten from the block
3833 stack.
3834
3835 Code generated for "try: S except E1, V1: S1 except E2, V2: S2 ...":
Guido van Rossum3f5da241990-12-20 15:06:42 +00003836 (The contents of the value stack is shown in [], with the top
3837 at the right; 'tb' is trace-back info, 'val' the exception's
3838 associated value, and 'exc' the exception.)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003839
3840 Value stack Label Instruction Argument
3841 [] SETUP_EXCEPT L1
3842 [] <code for S>
3843 [] POP_BLOCK
3844 [] JUMP_FORWARD L0
3845
Guido van Rossum3f5da241990-12-20 15:06:42 +00003846 [tb, val, exc] L1: DUP )
3847 [tb, val, exc, exc] <evaluate E1> )
3848 [tb, val, exc, exc, E1] COMPARE_OP EXC_MATCH ) only if E1
3849 [tb, val, exc, 1-or-0] JUMP_IF_FALSE L2 )
3850 [tb, val, exc, 1] POP )
3851 [tb, val, exc] POP
3852 [tb, val] <assign to V1> (or POP if no V1)
3853 [tb] POP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003854 [] <code for S1>
3855 JUMP_FORWARD L0
3856
Guido van Rossum3f5da241990-12-20 15:06:42 +00003857 [tb, val, exc, 0] L2: POP
3858 [tb, val, exc] DUP
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003859 .............................etc.......................
3860
Guido van Rossum3f5da241990-12-20 15:06:42 +00003861 [tb, val, exc, 0] Ln+1: POP
3862 [tb, val, exc] END_FINALLY # re-raise exception
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00003863
3864 [] L0: <next statement>
3865
3866 Of course, parts are not generated if Vi or Ei is not present.
3867*/
3868
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003869static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003870com_try_except(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003871{
3872 int except_anchor = 0;
3873 int end_anchor = 0;
3874 int else_anchor = 0;
3875 int i;
3876 node *ch;
3877
3878 com_addfwref(c, SETUP_EXCEPT, &except_anchor);
3879 block_push(c, SETUP_EXCEPT);
3880 com_node(c, CHILD(n, 2));
3881 com_addbyte(c, POP_BLOCK);
3882 block_pop(c, SETUP_EXCEPT);
3883 com_addfwref(c, JUMP_FORWARD, &else_anchor);
3884 com_backpatch(c, except_anchor);
3885 for (i = 3;
3886 i < NCH(n) && TYPE(ch = CHILD(n, i)) == except_clause;
3887 i += 3) {
Guido van Rossum8b993a91997-01-17 21:04:03 +00003888 /* except_clause: 'except' [expr [',' var]] */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003889 if (except_anchor == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00003890 com_error(c, PyExc_SyntaxError,
Guido van Rossum452a9831996-09-17 14:32:04 +00003891 "default 'except:' must be last");
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003892 break;
3893 }
3894 except_anchor = 0;
Guido van Rossum8b993a91997-01-17 21:04:03 +00003895 com_push(c, 3); /* tb, val, exc pushed by exception */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003896 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003897 if (NCH(ch) > 1) {
3898 com_addbyte(c, DUP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003899 com_push(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003900 com_node(c, CHILD(ch, 1));
Martin v. Löwis7198a522002-01-01 19:59:11 +00003901 com_addoparg(c, COMPARE_OP, PyCmp_EXC_MATCH);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003902 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003903 com_addfwref(c, JUMP_IF_FALSE, &except_anchor);
3904 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003905 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003906 }
3907 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003908 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003909 if (NCH(ch) > 3)
Thomas Wouters434d0822000-08-24 20:11:32 +00003910 com_assign(c, CHILD(ch, 3), OP_ASSIGN, NULL);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003911 else {
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003912 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003913 com_pop(c, 1);
3914 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003915 com_addbyte(c, POP_TOP);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003916 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003917 com_node(c, CHILD(n, i+2));
3918 com_addfwref(c, JUMP_FORWARD, &end_anchor);
3919 if (except_anchor) {
3920 com_backpatch(c, except_anchor);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003921 /* We come in with [tb, val, exc, 0] on the
3922 stack; one pop and it's the same as
3923 expected at the start of the loop */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003924 com_addbyte(c, POP_TOP);
3925 }
3926 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003927 /* We actually come in here with [tb, val, exc] but the
3928 END_FINALLY will zap those and jump around.
3929 The c_stacklevel does not reflect them so we need not pop
3930 anything. */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003931 com_addbyte(c, END_FINALLY);
3932 com_backpatch(c, else_anchor);
3933 if (i < NCH(n))
3934 com_node(c, CHILD(n, i+2));
3935 com_backpatch(c, end_anchor);
3936}
3937
3938static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003939com_try_finally(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003940{
3941 int finally_anchor = 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003942 node *ch;
Guido van Rossum94fb82e1992-04-05 14:24:50 +00003943
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003944 com_addfwref(c, SETUP_FINALLY, &finally_anchor);
3945 block_push(c, SETUP_FINALLY);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003946 com_node(c, CHILD(n, 2));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003947 com_addbyte(c, POP_BLOCK);
3948 block_pop(c, SETUP_FINALLY);
3949 block_push(c, END_FINALLY);
Guido van Rossum79f25d91997-04-29 20:08:16 +00003950 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
Guido van Rossum8b993a91997-01-17 21:04:03 +00003951 /* While the generated code pushes only one item,
3952 the try-finally handling can enter here with
3953 up to three items. OK, here are the details:
3954 3 for an exception, 2 for RETURN, 1 for BREAK. */
3955 com_push(c, 3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003956 com_backpatch(c, finally_anchor);
3957 ch = CHILD(n, NCH(n)-1);
Michael W. Hudsondd32a912002-08-15 14:59:02 +00003958 com_set_lineno(c, ch->n_lineno);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003959 com_node(c, ch);
3960 com_addbyte(c, END_FINALLY);
3961 block_pop(c, END_FINALLY);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003962 com_pop(c, 3); /* Matches the com_push above */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003963}
3964
3965static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003966com_try_stmt(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00003967{
3968 REQ(n, try_stmt);
3969 /* 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
3970 | 'try' ':' suite 'finally' ':' suite */
3971 if (TYPE(CHILD(n, 3)) != except_clause)
3972 com_try_finally(c, n);
3973 else
3974 com_try_except(c, n);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00003975}
3976
Guido van Rossum8b993a91997-01-17 21:04:03 +00003977static node *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00003978get_rawdocstring(node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003979{
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003980 int i;
3981
Guido van Rossum8b993a91997-01-17 21:04:03 +00003982 /* Label to avoid tail recursion */
3983 next:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003984 switch (TYPE(n)) {
3985
3986 case suite:
Guido van Rossum8b993a91997-01-17 21:04:03 +00003987 if (NCH(n) == 1) {
3988 n = CHILD(n, 0);
3989 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00003990 }
Guido van Rossum8b993a91997-01-17 21:04:03 +00003991 /* Fall through */
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003992 case file_input:
3993 for (i = 0; i < NCH(n); i++) {
3994 node *ch = CHILD(n, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00003995 if (TYPE(ch) == stmt) {
3996 n = ch;
3997 goto next;
3998 }
Guido van Rossum164d4ff1995-01-26 00:40:09 +00003999 }
4000 break;
4001
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004002 case stmt:
4003 case simple_stmt:
4004 case small_stmt:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004005 n = CHILD(n, 0);
4006 goto next;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004007
4008 case expr_stmt:
4009 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004010 case testlist1:
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004011 case test:
4012 case and_test:
4013 case not_test:
4014 case comparison:
4015 case expr:
4016 case xor_expr:
4017 case and_expr:
4018 case shift_expr:
4019 case arith_expr:
4020 case term:
4021 case factor:
Guido van Rossum50564e81996-01-12 01:13:16 +00004022 case power:
Guido van Rossum8b993a91997-01-17 21:04:03 +00004023 if (NCH(n) == 1) {
4024 n = CHILD(n, 0);
4025 goto next;
4026 }
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004027 break;
4028
4029 case atom:
4030 if (TYPE(CHILD(n, 0)) == STRING)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004031 return n;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004032 break;
4033
4034 }
4035 return NULL;
4036}
4037
Guido van Rossum79f25d91997-04-29 20:08:16 +00004038static PyObject *
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004039get_docstring(struct compiling *c, node *n)
Guido van Rossum8b993a91997-01-17 21:04:03 +00004040{
Guido van Rossum541563e1999-01-28 15:08:09 +00004041 /* Don't generate doc-strings if run with -OO */
4042 if (Py_OptimizeFlag > 1)
4043 return NULL;
Guido van Rossum8b993a91997-01-17 21:04:03 +00004044 n = get_rawdocstring(n);
4045 if (n == NULL)
4046 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004047 return parsestrplus(c, n);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004048}
4049
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004050static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004051com_suite(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004052{
4053 REQ(n, suite);
4054 /* simple_stmt | NEWLINE INDENT NEWLINE* (stmt NEWLINE*)+ DEDENT */
4055 if (NCH(n) == 1) {
4056 com_node(c, CHILD(n, 0));
4057 }
4058 else {
4059 int i;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004060 for (i = 0; i < NCH(n) && c->c_errors == 0; i++) {
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004061 node *ch = CHILD(n, i);
4062 if (TYPE(ch) == stmt)
4063 com_node(c, ch);
4064 }
4065 }
4066}
4067
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004068/* ARGSUSED */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004069static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004070com_continue_stmt(struct compiling *c, node *n)
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004071{
4072 int i = c->c_nblocks;
4073 if (i-- > 0 && c->c_block[i] == SETUP_LOOP) {
4074 com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
4075 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004076 else if (i <= 0) {
4077 /* at the outer level */
4078 com_error(c, PyExc_SyntaxError,
4079 "'continue' not properly in loop");
4080 }
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004081 else {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004082 int j;
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004083 for (j = i-1; j >= 0; --j) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004084 if (c->c_block[j] == SETUP_LOOP)
4085 break;
4086 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004087 if (j >= 0) {
Fred Drakefd1f1be2000-09-08 16:31:24 +00004088 /* there is a loop, but something interferes */
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004089 for (; i > j; --i) {
4090 if (c->c_block[i] == SETUP_EXCEPT ||
4091 c->c_block[i] == SETUP_FINALLY) {
4092 com_addoparg(c, CONTINUE_LOOP,
4093 c->c_begin);
Fred Drakefd1f1be2000-09-08 16:31:24 +00004094 return;
4095 }
Jeremy Hylton3faa52e2001-02-01 22:48:12 +00004096 if (c->c_block[i] == END_FINALLY) {
4097 com_error(c, PyExc_SyntaxError,
4098 "'continue' not supported inside 'finally' clause");
4099 return;
4100 }
Fred Drakefd1f1be2000-09-08 16:31:24 +00004101 }
4102 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00004103 com_error(c, PyExc_SyntaxError,
4104 "'continue' not properly in loop");
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004105 }
4106 /* XXX Could allow it inside a 'finally' clause
4107 XXX if we could pop the exception still on the stack */
4108}
4109
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004110/* Return the number of default values in the argument list.
4111
4112 If a non-default argument follows a default argument, set an
4113 exception and return -1.
4114*/
4115
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004116static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004117com_argdefs(struct compiling *c, node *n)
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004118{
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004119 int i, nch, ndefs;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004120 if (TYPE(n) == lambdef) {
4121 /* lambdef: 'lambda' [varargslist] ':' test */
4122 n = CHILD(n, 1);
4123 }
4124 else {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004125 REQ(n, funcdef);
4126 /* funcdef: [decorators] 'def' NAME parameters ':' suite */
4127 n = RCHILD(n, -3);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004128 REQ(n, parameters); /* parameters: '(' [varargslist] ')' */
4129 n = CHILD(n, 1);
4130 }
4131 if (TYPE(n) != varargslist)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004132 return 0;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004133 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004134 (fpdef ['=' test] ',')* '*' ....... |
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004135 fpdef ['=' test] (',' fpdef ['=' test])* [','] */
4136 nch = NCH(n);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004137 ndefs = 0;
4138 for (i = 0; i < nch; i++) {
4139 int t;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004140 if (TYPE(CHILD(n, i)) == STAR ||
4141 TYPE(CHILD(n, i)) == DOUBLESTAR)
Guido van Rossumf10570b1995-07-07 22:53:21 +00004142 break;
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004143 i++;
4144 if (i >= nch)
Guido van Rossuma1e7e621995-09-18 21:44:04 +00004145 t = RPAR; /* Anything except EQUAL or COMMA */
4146 else
4147 t = TYPE(CHILD(n, i));
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004148 if (t == EQUAL) {
4149 i++;
4150 ndefs++;
4151 com_node(c, CHILD(n, i));
4152 i++;
4153 if (i >= nch)
4154 break;
4155 t = TYPE(CHILD(n, i));
4156 }
4157 else {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004158 /* Treat "(a=1, b)" as an error */
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004159 if (ndefs) {
Guido van Rossum29d38cd1998-10-02 13:41:54 +00004160 com_error(c, PyExc_SyntaxError,
Guido van Rossumdfede311998-10-02 14:06:56 +00004161 "non-default argument follows default argument");
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004162 return -1;
4163 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004164 }
4165 if (t != COMMA)
4166 break;
4167 }
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004168 return ndefs;
4169}
4170
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004171static void
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004172com_decorator_name(struct compiling *c, node *n)
4173{
4174 /* dotted_name: NAME ('.' NAME)* */
4175
4176 int i, nch;
4177 node *varname;
4178
4179 REQ(n, dotted_name);
4180 nch = NCH(n);
4181 assert(nch >= 1 && nch % 2 == 1);
4182
4183 varname = CHILD(n, 0);
4184 REQ(varname, NAME);
4185 com_addop_varname(c, VAR_LOAD, STR(varname));
Anthony Baxter4e7785a2004-08-02 11:08:15 +00004186 com_push(c, 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004187
4188 for (i = 1; i < nch; i += 2) {
4189 node *attrname;
4190
4191 REQ(CHILD(n, i), DOT);
4192
4193 attrname = CHILD(n, i + 1);
4194 REQ(attrname, NAME);
4195 com_addop_name(c, LOAD_ATTR, STR(attrname));
4196 }
4197}
4198
4199static void
4200com_decorator(struct compiling *c, node *n)
4201{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004202 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004203 int nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004204 assert(nch >= 3);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004205 REQ(CHILD(n, 0), AT);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004206 REQ(RCHILD(n, -1), NEWLINE);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004207 com_decorator_name(c, CHILD(n, 1));
4208
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004209 if (nch > 3) {
4210 assert(nch == 5 || nch == 6);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004211 REQ(CHILD(n, 2), LPAR);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004212 REQ(RCHILD(n, -2), RPAR);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004213 com_call_function(c, CHILD(n, 3));
4214 }
4215}
4216
4217static int
4218com_decorators(struct compiling *c, node *n)
4219{
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004220 int i, nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004221
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004222 /* decorator+ */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004223 nch = NCH(n);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004224 assert(nch >= 1);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004225
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004226 for (i = 0; i < nch; ++i) {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004227 node *ch = CHILD(n, i);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004228 REQ(ch, decorator);
4229
4230 com_decorator(c, ch);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004231 }
4232
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004233 return nch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004234}
4235
4236static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004237com_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004238{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004239 PyObject *co;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004240 int ndefs, ndecorators;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004241
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004242 REQ(n, funcdef);
4243 /* -6 -5 -4 -3 -2 -1
4244 funcdef: [decorators] 'def' NAME parameters ':' suite */
4245
4246 if (NCH(n) == 6)
4247 ndecorators = com_decorators(c, CHILD(n, 0));
4248 else
4249 ndecorators = 0;
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004250
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004251 ndefs = com_argdefs(c, n);
Jeremy Hylton376e63d2003-08-28 14:42:14 +00004252 if (ndefs < 0)
4253 return;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004254 symtable_enter_scope(c->c_symtable, STR(RCHILD(n, -4)), TYPE(n),
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004255 n->n_lineno);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004256 co = (PyObject *)icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004257 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004258 if (co == NULL)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004259 c->c_errors++;
4260 else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004261 int closure = com_make_closure(c, (PyCodeObject *)co);
4262 int i = com_addconst(c, co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004263 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004264 com_push(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004265 if (closure)
4266 com_addoparg(c, MAKE_CLOSURE, ndefs);
4267 else
4268 com_addoparg(c, MAKE_FUNCTION, ndefs);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004269 com_pop(c, ndefs);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004270
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004271 while (ndecorators > 0) {
4272 com_addoparg(c, CALL_FUNCTION, 1);
4273 com_pop(c, 1);
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004274 --ndecorators;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004275 }
Michael W. Hudson0ccff072004-08-17 17:29:16 +00004276
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004277 com_addop_varname(c, VAR_STORE, STR(RCHILD(n, -4)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004278 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004279 Py_DECREF(co);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004280 }
4281}
4282
4283static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004284com_bases(struct compiling *c, node *n)
Guido van Rossumc5e96291991-12-10 13:53:51 +00004285{
Guido van Rossumf1aeab71992-03-27 17:28:26 +00004286 int i;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004287 REQ(n, testlist);
4288 /* testlist: test (',' test)* [','] */
4289 for (i = 0; i < NCH(n); i += 2)
4290 com_node(c, CHILD(n, i));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004291 i = (NCH(n)+1) / 2;
4292 com_addoparg(c, BUILD_TUPLE, i);
4293 com_pop(c, i-1);
Guido van Rossumc5e96291991-12-10 13:53:51 +00004294}
4295
4296static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004297com_classdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004298{
Guido van Rossum25831651993-05-19 14:50:45 +00004299 int i;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004300 PyObject *v;
4301 PyCodeObject *co;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004302 char *name;
4303
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004304 REQ(n, classdef);
Guido van Rossum25831651993-05-19 14:50:45 +00004305 /* classdef: class NAME ['(' testlist ')'] ':' suite */
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004306 if ((v = PyString_InternFromString(STR(CHILD(n, 1)))) == NULL) {
Guido van Rossum25831651993-05-19 14:50:45 +00004307 c->c_errors++;
4308 return;
4309 }
4310 /* Push the class name on the stack */
4311 i = com_addconst(c, v);
4312 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004313 com_push(c, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004314 Py_DECREF(v);
Guido van Rossum25831651993-05-19 14:50:45 +00004315 /* Push the tuple of base classes on the stack */
Guido van Rossum8b993a91997-01-17 21:04:03 +00004316 if (TYPE(CHILD(n, 2)) != LPAR) {
Guido van Rossumc5e96291991-12-10 13:53:51 +00004317 com_addoparg(c, BUILD_TUPLE, 0);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004318 com_push(c, 1);
4319 }
Guido van Rossum25831651993-05-19 14:50:45 +00004320 else
4321 com_bases(c, CHILD(n, 3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004322 name = STR(CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004323 symtable_enter_scope(c->c_symtable, name, TYPE(n), n->n_lineno);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004324 co = icompile(n, c);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004325 symtable_exit_scope(c->c_symtable);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004326 if (co == NULL)
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004327 c->c_errors++;
4328 else {
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004329 int closure = com_make_closure(c, co);
4330 i = com_addconst(c, (PyObject *)co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004331 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004332 com_push(c, 1);
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004333 if (closure) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004334 com_addoparg(c, MAKE_CLOSURE, 0);
Jeremy Hylton733c8932001-12-13 19:51:56 +00004335 com_pop(c, PyCode_GetNumFree(co));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004336 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004337 com_addoparg(c, MAKE_FUNCTION, 0);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004338 com_addoparg(c, CALL_FUNCTION, 0);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004339 com_addbyte(c, BUILD_CLASS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004340 com_pop(c, 2);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004341 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 1)));
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004342 com_pop(c, 1);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004343 Py_DECREF(co);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004344 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004345}
4346
4347static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004348com_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004349{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004350 loop:
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004351 if (c->c_errors)
4352 return;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004353 switch (TYPE(n)) {
4354
4355 /* Definition nodes */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004356
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004357 case funcdef:
4358 com_funcdef(c, n);
4359 break;
4360 case classdef:
4361 com_classdef(c, n);
4362 break;
4363
4364 /* Trivial parse tree nodes */
4365
4366 case stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004367 case small_stmt:
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004368 case flow_stmt:
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004369 n = CHILD(n, 0);
4370 goto loop;
Guido van Rossum3f5da241990-12-20 15:06:42 +00004371
4372 case simple_stmt:
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004373 /* small_stmt (';' small_stmt)* [';'] NEWLINE */
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004374 com_set_lineno(c, n->n_lineno);
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004375 {
4376 int i;
4377 for (i = 0; i < NCH(n)-1; i += 2)
4378 com_node(c, CHILD(n, i));
4379 }
4380 break;
4381
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004382 case compound_stmt:
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004383 com_set_lineno(c, n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004384 n = CHILD(n, 0);
4385 goto loop;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004386
4387 /* Statement nodes */
4388
4389 case expr_stmt:
4390 com_expr_stmt(c, n);
4391 break;
4392 case print_stmt:
4393 com_print_stmt(c, n);
4394 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004395 case del_stmt: /* 'del' exprlist */
Thomas Wouters434d0822000-08-24 20:11:32 +00004396 com_assign(c, CHILD(n, 1), OP_DELETE, NULL);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004397 break;
4398 case pass_stmt:
4399 break;
4400 case break_stmt:
Guido van Rossum3f5da241990-12-20 15:06:42 +00004401 if (c->c_loops == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00004402 com_error(c, PyExc_SyntaxError,
4403 "'break' outside loop");
Guido van Rossum3f5da241990-12-20 15:06:42 +00004404 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004405 com_addbyte(c, BREAK_LOOP);
4406 break;
Guido van Rossum4bad92c1991-07-27 21:34:52 +00004407 case continue_stmt:
4408 com_continue_stmt(c, n);
4409 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004410 case return_stmt:
4411 com_return_stmt(c, n);
4412 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00004413 case yield_stmt:
4414 com_yield_stmt(c, n);
4415 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004416 case raise_stmt:
4417 com_raise_stmt(c, n);
4418 break;
4419 case import_stmt:
4420 com_import_stmt(c, n);
4421 break;
Guido van Rossumc5e96291991-12-10 13:53:51 +00004422 case global_stmt:
Guido van Rossumc5e96291991-12-10 13:53:51 +00004423 break;
Guido van Rossumdb3165e1993-10-18 17:06:59 +00004424 case exec_stmt:
4425 com_exec_stmt(c, n);
4426 break;
Guido van Rossum228d7f31997-04-02 05:24:36 +00004427 case assert_stmt:
4428 com_assert_stmt(c, n);
4429 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004430 case if_stmt:
4431 com_if_stmt(c, n);
4432 break;
4433 case while_stmt:
4434 com_while_stmt(c, n);
4435 break;
4436 case for_stmt:
4437 com_for_stmt(c, n);
4438 break;
4439 case try_stmt:
4440 com_try_stmt(c, n);
4441 break;
4442 case suite:
4443 com_suite(c, n);
4444 break;
4445
4446 /* Expression nodes */
4447
4448 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00004449 case testlist1:
Guido van Rossum1c917072001-10-15 15:44:05 +00004450 case testlist_safe:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004451 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004452 break;
4453 case test:
4454 com_test(c, n);
4455 break;
4456 case and_test:
4457 com_and_test(c, n);
4458 break;
4459 case not_test:
4460 com_not_test(c, n);
4461 break;
4462 case comparison:
4463 com_comparison(c, n);
4464 break;
4465 case exprlist:
Guido van Rossum288a60f1991-12-16 13:05:10 +00004466 com_list(c, n, 0);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004467 break;
4468 case expr:
4469 com_expr(c, n);
4470 break;
Guido van Rossum7928cd71991-10-24 14:59:31 +00004471 case xor_expr:
4472 com_xor_expr(c, n);
4473 break;
4474 case and_expr:
4475 com_and_expr(c, n);
4476 break;
4477 case shift_expr:
4478 com_shift_expr(c, n);
4479 break;
4480 case arith_expr:
4481 com_arith_expr(c, n);
4482 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004483 case term:
4484 com_term(c, n);
4485 break;
4486 case factor:
4487 com_factor(c, n);
4488 break;
Guido van Rossum50564e81996-01-12 01:13:16 +00004489 case power:
4490 com_power(c, n);
4491 break;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004492 case atom:
4493 com_atom(c, n);
4494 break;
4495
4496 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004497 com_error(c, PyExc_SystemError,
4498 "com_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004499 }
4500}
4501
Tim Petersdbd9ba62000-07-09 03:09:57 +00004502static void com_fplist(struct compiling *, node *);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004503
4504static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004505com_fpdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004506{
4507 REQ(n, fpdef); /* fpdef: NAME | '(' fplist ')' */
4508 if (TYPE(CHILD(n, 0)) == LPAR)
4509 com_fplist(c, CHILD(n, 1));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004510 else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004511 com_addop_varname(c, VAR_STORE, STR(CHILD(n, 0)));
Guido van Rossum8b993a91997-01-17 21:04:03 +00004512 com_pop(c, 1);
4513 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004514}
4515
4516static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004517com_fplist(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004518{
Guido van Rossuma9df32a1991-12-31 13:13:35 +00004519 REQ(n, fplist); /* fplist: fpdef (',' fpdef)* [','] */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004520 if (NCH(n) == 1) {
4521 com_fpdef(c, CHILD(n, 0));
4522 }
4523 else {
Guido van Rossum8b993a91997-01-17 21:04:03 +00004524 int i = (NCH(n)+1)/2;
Thomas Wouters0be5aab2000-08-11 22:15:52 +00004525 com_addoparg(c, UNPACK_SEQUENCE, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004526 com_push(c, i-1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004527 for (i = 0; i < NCH(n); i += 2)
4528 com_fpdef(c, CHILD(n, i));
4529 }
4530}
4531
4532static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004533com_arglist(struct compiling *c, node *n)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004534{
Guido van Rossum633d90c2002-12-23 16:51:42 +00004535 int nch, i, narg;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004536 int complex = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004537 char nbuf[30];
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004538 REQ(n, varargslist);
Guido van Rossumacbefef1992-01-19 16:33:51 +00004539 /* varargslist:
Guido van Rossum681d79a1995-07-18 14:51:37 +00004540 (fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
Guido van Rossum633d90c2002-12-23 16:51:42 +00004541 nch = NCH(n);
4542 /* Enter all arguments in table of locals */
4543 for (i = 0, narg = 0; i < nch; i++) {
4544 node *ch = CHILD(n, i);
4545 node *fp;
4546 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004547 break;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004548 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4549 fp = CHILD(ch, 0);
4550 if (TYPE(fp) != NAME) {
4551 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
4552 complex = 1;
Guido van Rossum9c8a0862002-12-23 16:35:23 +00004553 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00004554 narg++;
4555 /* all name updates handled by symtable */
4556 if (++i >= nch)
4557 break;
4558 ch = CHILD(n, i);
4559 if (TYPE(ch) == EQUAL)
4560 i += 2;
4561 else
4562 REQ(ch, COMMA);
4563 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004564 if (complex) {
4565 /* Generate code for complex arguments only after
4566 having counted the simple arguments */
4567 int ilocal = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004568 for (i = 0; i < nch; i++) {
Guido van Rossum681d79a1995-07-18 14:51:37 +00004569 node *ch = CHILD(n, i);
4570 node *fp;
Guido van Rossum50564e81996-01-12 01:13:16 +00004571 if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004572 break;
4573 REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
4574 fp = CHILD(ch, 0);
4575 if (TYPE(fp) != NAME) {
4576 com_addoparg(c, LOAD_FAST, ilocal);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004577 com_push(c, 1);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004578 com_fpdef(c, ch);
4579 }
4580 ilocal++;
Guido van Rossum633d90c2002-12-23 16:51:42 +00004581 if (++i >= nch)
Guido van Rossum681d79a1995-07-18 14:51:37 +00004582 break;
4583 ch = CHILD(n, i);
4584 if (TYPE(ch) == EQUAL)
4585 i += 2;
4586 else
4587 REQ(ch, COMMA);
4588 }
4589 }
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004590}
4591
4592static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004593com_file_input(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004594{
4595 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004596 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004597 REQ(n, file_input); /* (NEWLINE | stmt)* ENDMARKER */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004598 doc = get_docstring(c, n);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004599 if (doc != NULL) {
4600 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004601 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004602 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004603 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004604 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004605 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004606 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004607 for (i = 0; i < NCH(n); i++) {
4608 node *ch = CHILD(n, i);
4609 if (TYPE(ch) != ENDMARKER && TYPE(ch) != NEWLINE)
4610 com_node(c, ch);
4611 }
4612}
4613
4614/* Top-level compile-node interface */
4615
4616static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004617compile_funcdef(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004618{
Guido van Rossum79f25d91997-04-29 20:08:16 +00004619 PyObject *doc;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004620 node *ch;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004621 REQ(n, funcdef);
4622 /* -6 -5 -4 -3 -2 -1
4623 funcdef: [decorators] 'def' NAME parameters ':' suite */
4624 c->c_name = STR(RCHILD(n, -4));
4625 doc = get_docstring(c, RCHILD(n, -1));
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004626 if (doc != NULL) {
4627 (void) com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004628 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004629 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004630 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004631 (void) com_addconst(c, Py_None); /* No docstring */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004632 ch = RCHILD(n, -3); /* parameters: '(' [varargslist] ')' */
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004633 ch = CHILD(ch, 1); /* ')' | varargslist */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004634 if (TYPE(ch) == varargslist)
Guido van Rossum49d6dc41992-01-14 18:30:26 +00004635 com_arglist(c, ch);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004636 c->c_infunction = 1;
Anthony Baxterc2a5a632004-08-02 06:10:11 +00004637 com_node(c, RCHILD(n, -1));
Guido van Rossum3f5da241990-12-20 15:06:42 +00004638 c->c_infunction = 0;
Armin Rigo80d937e2004-03-22 17:52:53 +00004639 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004640 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4641 com_push(c, 1);
4642 com_addbyte(c, RETURN_VALUE);
4643 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004644}
4645
4646static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004647compile_lambdef(struct compiling *c, node *n)
Guido van Rossum12d12c51993-10-26 17:58:25 +00004648{
Guido van Rossum590baa41993-11-30 13:40:46 +00004649 node *ch;
Guido van Rossum681d79a1995-07-18 14:51:37 +00004650 REQ(n, lambdef); /* lambdef: 'lambda' [varargslist] ':' test */
Guido van Rossum363ac7d1994-11-10 22:40:34 +00004651 c->c_name = "<lambda>";
Guido van Rossum590baa41993-11-30 13:40:46 +00004652
4653 ch = CHILD(n, 1);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004654 (void) com_addconst(c, Py_None); /* No docstring */
Guido van Rossum681d79a1995-07-18 14:51:37 +00004655 if (TYPE(ch) == varargslist) {
Guido van Rossum590baa41993-11-30 13:40:46 +00004656 com_arglist(c, ch);
Guido van Rossum681d79a1995-07-18 14:51:37 +00004657 ch = CHILD(n, 3);
Guido van Rossum590baa41993-11-30 13:40:46 +00004658 }
Guido van Rossum681d79a1995-07-18 14:51:37 +00004659 else
4660 ch = CHILD(n, 2);
4661 com_node(c, ch);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004662 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004663 com_pop(c, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00004664}
4665
4666static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004667compile_classdef(struct compiling *c, node *n)
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004668{
4669 node *ch;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004670 PyObject *doc;
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004671 REQ(n, classdef);
4672 /* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
4673 c->c_name = STR(CHILD(n, 1));
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004674 c->c_private = c->c_name;
Guido van Rossum340cbe72002-01-15 21:06:07 +00004675 /* Initialize local __module__ from global __name__ */
4676 com_addop_name(c, LOAD_GLOBAL, "__name__");
4677 com_addop_name(c, STORE_NAME, "__module__");
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004678 ch = CHILD(n, NCH(n)-1); /* The suite */
Martin v. Löwis339d0f72001-08-17 18:39:25 +00004679 doc = get_docstring(c, ch);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004680 if (doc != NULL) {
4681 int i = com_addconst(c, doc);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004682 Py_DECREF(doc);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004683 com_addoparg(c, LOAD_CONST, i);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004684 com_push(c, 1);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004685 com_addop_name(c, STORE_NAME, "__doc__");
Guido van Rossum8b993a91997-01-17 21:04:03 +00004686 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004687 }
4688 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00004689 (void) com_addconst(c, Py_None);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004690 com_node(c, ch);
Armin Rigo80d937e2004-03-22 17:52:53 +00004691 com_strip_lnotab(c);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004692 com_addbyte(c, LOAD_LOCALS);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004693 com_push(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004694 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004695 com_pop(c, 1);
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004696}
4697
4698static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00004699compile_generator_expression(struct compiling *c, node *n)
4700{
4701 /* testlist_gexp: test gen_for */
4702 /* argument: test gen_for */
4703 REQ(CHILD(n, 0), test);
4704 REQ(CHILD(n, 1), gen_for);
4705
4706 c->c_name = "<generator expression>";
4707 com_gen_for(c, CHILD(n, 1), CHILD(n, 0), 1);
4708
4709 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4710 com_push(c, 1);
4711 com_addbyte(c, RETURN_VALUE);
4712 com_pop(c, 1);
4713}
4714
4715static void
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004716compile_node(struct compiling *c, node *n)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004717{
Michael W. Hudsondd32a912002-08-15 14:59:02 +00004718 com_set_lineno(c, n->n_lineno);
Guido van Rossum3f5da241990-12-20 15:06:42 +00004719
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004720 switch (TYPE(n)) {
4721
Guido van Rossum4c417781991-01-21 16:09:22 +00004722 case single_input: /* One interactive command */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004723 /* NEWLINE | simple_stmt | compound_stmt NEWLINE */
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004724 c->c_interactive++;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004725 n = CHILD(n, 0);
4726 if (TYPE(n) != NEWLINE)
4727 com_node(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004728 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004729 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4730 com_push(c, 1);
4731 com_addbyte(c, RETURN_VALUE);
4732 com_pop(c, 1);
Guido van Rossum4ca6c9d1994-08-29 12:16:12 +00004733 c->c_interactive--;
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004734 break;
4735
Guido van Rossum4c417781991-01-21 16:09:22 +00004736 case file_input: /* A whole file, or built-in function exec() */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004737 com_file_input(c, n);
Armin Rigo80d937e2004-03-22 17:52:53 +00004738 com_strip_lnotab(c);
Michael W. Hudson53d58bb2002-08-30 13:09:51 +00004739 com_addoparg(c, LOAD_CONST, com_addconst(c, Py_None));
4740 com_push(c, 1);
4741 com_addbyte(c, RETURN_VALUE);
4742 com_pop(c, 1);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004743 break;
4744
Guido van Rossum590baa41993-11-30 13:40:46 +00004745 case eval_input: /* Built-in function input() */
Guido van Rossum4c417781991-01-21 16:09:22 +00004746 com_node(c, CHILD(n, 0));
4747 com_addbyte(c, RETURN_VALUE);
Guido van Rossum8b993a91997-01-17 21:04:03 +00004748 com_pop(c, 1);
Guido van Rossum4c417781991-01-21 16:09:22 +00004749 break;
4750
Guido van Rossum590baa41993-11-30 13:40:46 +00004751 case lambdef: /* anonymous function definition */
4752 compile_lambdef(c, n);
4753 break;
4754
Guido van Rossum4c417781991-01-21 16:09:22 +00004755 case funcdef: /* A function definition */
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004756 compile_funcdef(c, n);
4757 break;
4758
Guido van Rossum4c417781991-01-21 16:09:22 +00004759 case classdef: /* A class definition */
Guido van Rossum1f4fa501995-01-07 12:41:23 +00004760 compile_classdef(c, n);
Guido van Rossumd6f3bc21990-11-18 17:35:03 +00004761 break;
4762
Raymond Hettinger354433a2004-05-19 08:20:33 +00004763 case testlist_gexp: /* A generator expression */
4764 case argument: /* A generator expression */
4765 compile_generator_expression(c, n);
4766 break;
4767
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004768 default:
Guido van Rossum79f25d91997-04-29 20:08:16 +00004769 com_error(c, PyExc_SystemError,
Guido van Rossum452a9831996-09-17 14:32:04 +00004770 "compile_node: unexpected node type");
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004771 }
4772}
4773
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004774static PyObject *
4775dict_keys_inorder(PyObject *dict, int offset)
4776{
4777 PyObject *tuple, *k, *v;
4778 int i, pos = 0, size = PyDict_Size(dict);
4779
4780 tuple = PyTuple_New(size);
4781 if (tuple == NULL)
4782 return NULL;
4783 while (PyDict_Next(dict, &pos, &k, &v)) {
4784 i = PyInt_AS_LONG(v);
4785 Py_INCREF(k);
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00004786 assert((i - offset) < size);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004787 PyTuple_SET_ITEM(tuple, i - offset, k);
4788 }
4789 return tuple;
4790}
4791
Guido van Rossum79f25d91997-04-29 20:08:16 +00004792PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004793PyNode_Compile(node *n, const char *filename)
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004794{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004795 return PyNode_CompileFlags(n, filename, NULL);
4796}
4797
4798PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004799PyNode_CompileFlags(node *n, const char *filename, PyCompilerFlags *flags)
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004800{
4801 return jcompile(n, filename, NULL, flags);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004802}
4803
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004804struct symtable *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004805PyNode_CompileSymtable(node *n, const char *filename)
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004806{
4807 struct symtable *st;
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004808 PyFutureFeatures *ff;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004809
Jeremy Hyltonded4bd72001-03-21 19:01:33 +00004810 ff = PyNode_Future(n, filename);
4811 if (ff == NULL)
4812 return NULL;
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004813 st = symtable_build(n, ff, filename);
Tim Peters8c5e4152001-11-04 19:26:58 +00004814 if (st == NULL) {
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00004815 PyObject_FREE((void *)ff);
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004816 return NULL;
Tim Peters8c5e4152001-11-04 19:26:58 +00004817 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004818 return st;
4819}
4820
Guido van Rossum79f25d91997-04-29 20:08:16 +00004821static PyCodeObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004822icompile(node *n, struct compiling *base)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004823{
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004824 return jcompile(n, base->c_filename, base, NULL);
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004825}
4826
Guido van Rossum79f25d91997-04-29 20:08:16 +00004827static PyCodeObject *
Martin v. Löwis95292d62002-12-11 14:04:59 +00004828jcompile(node *n, const char *filename, struct compiling *base,
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004829 PyCompilerFlags *flags)
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004830{
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004831 struct compiling sc;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004832 PyCodeObject *co;
Guido van Rossum590baa41993-11-30 13:40:46 +00004833 if (!com_init(&sc, filename))
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004834 return NULL;
Just van Rossum3aaf42c2003-02-10 08:21:10 +00004835 if (flags && flags->cf_flags & PyCF_SOURCE_IS_UTF8) {
4836 sc.c_encoding = "utf-8";
4837 } else if (TYPE(n) == encoding_decl) {
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004838 sc.c_encoding = STR(n);
4839 n = CHILD(n, 0);
4840 } else {
4841 sc.c_encoding = NULL;
4842 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004843 if (base) {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004844 sc.c_private = base->c_private;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004845 sc.c_symtable = base->c_symtable;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004846 /* c_symtable still points to parent's symbols */
4847 if (base->c_nested
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004848 || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004849 sc.c_nested = 1;
Jeremy Hylton93a569d2001-10-17 13:22:22 +00004850 sc.c_flags |= base->c_flags & PyCF_MASK;
Martin v. Löwis00f1e3f2002-08-04 17:29:52 +00004851 if (base->c_encoding != NULL) {
4852 assert(sc.c_encoding == NULL);
4853 sc.c_encoding = base->c_encoding;
4854 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004855 } else {
Guido van Rossum8ff077b1996-08-24 06:21:31 +00004856 sc.c_private = NULL;
Jeremy Hylton4db62b12001-02-27 19:07:02 +00004857 sc.c_future = PyNode_Future(n, filename);
Jeremy Hylton9f324e92001-03-01 22:59:14 +00004858 if (sc.c_future == NULL) {
4859 com_free(&sc);
4860 return NULL;
4861 }
Jeremy Hylton481081e2001-08-14 20:01:59 +00004862 if (flags) {
4863 int merged = sc.c_future->ff_features |
4864 flags->cf_flags;
4865 sc.c_future->ff_features = merged;
4866 flags->cf_flags = merged;
4867 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004868 sc.c_symtable = symtable_build(n, sc.c_future, sc.c_filename);
4869 if (sc.c_symtable == NULL) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004870 com_free(&sc);
4871 return NULL;
4872 }
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004873 /* reset symbol table for second pass */
4874 sc.c_symtable->st_nscopes = 1;
4875 sc.c_symtable->st_pass = 2;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004876 }
4877 co = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004878 if (symtable_load_symbols(&sc) < 0) {
4879 sc.c_errors++;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004880 goto exit;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00004881 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004882 compile_node(&sc, n);
4883 com_done(&sc);
Guido van Rossum9bfef441993-03-29 10:43:31 +00004884 if (sc.c_errors == 0) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004885 PyObject *consts, *names, *varnames, *filename, *name,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004886 *freevars, *cellvars, *code;
Guido van Rossum79f25d91997-04-29 20:08:16 +00004887 consts = PyList_AsTuple(sc.c_consts);
4888 names = PyList_AsTuple(sc.c_names);
4889 varnames = PyList_AsTuple(sc.c_varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004890 cellvars = dict_keys_inorder(sc.c_cellvars, 0);
4891 freevars = dict_keys_inorder(sc.c_freevars,
4892 PyTuple_GET_SIZE(cellvars));
Michael W. Hudsone51c4f92004-08-04 10:26:08 +00004893 filename = PyString_InternFromString(sc.c_filename);
Guido van Rossum7b89b6a1997-01-18 08:02:57 +00004894 name = PyString_InternFromString(sc.c_name);
Raymond Hettingerfd2d1f72004-08-23 23:37:48 +00004895 code = optimize_code(sc.c_code, consts, names, sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004896 if (!PyErr_Occurred())
4897 co = PyCode_New(sc.c_argcount,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004898 sc.c_nlocals,
4899 sc.c_maxstacklevel,
4900 sc.c_flags,
Raymond Hettinger1a789292004-08-18 05:22:06 +00004901 code,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004902 consts,
4903 names,
4904 varnames,
4905 freevars,
4906 cellvars,
4907 filename,
4908 name,
4909 sc.c_firstlineno,
4910 sc.c_lnotab);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004911 Py_XDECREF(consts);
4912 Py_XDECREF(names);
4913 Py_XDECREF(varnames);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004914 Py_XDECREF(freevars);
4915 Py_XDECREF(cellvars);
Guido van Rossum79f25d91997-04-29 20:08:16 +00004916 Py_XDECREF(filename);
4917 Py_XDECREF(name);
Raymond Hettinger1a789292004-08-18 05:22:06 +00004918 Py_XDECREF(code);
Guido van Rossuma082ce41991-06-04 19:41:56 +00004919 }
Guido van Rossum6c2f0c72000-08-07 19:22:43 +00004920 else if (!PyErr_Occurred()) {
4921 /* This could happen if someone called PyErr_Clear() after an
4922 error was reported above. That's not supposed to happen,
4923 but I just plugged one case and I'm not sure there can't be
4924 others. In that case, raise SystemError so that at least
4925 it gets reported instead dumping core. */
4926 PyErr_SetString(PyExc_SystemError, "lost syntax error");
4927 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004928 exit:
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004929 if (base == NULL) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00004930 PySymtable_Free(sc.c_symtable);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00004931 sc.c_symtable = NULL;
4932 }
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004933 com_free(&sc);
Guido van Rossum10dc2e81990-11-18 17:27:39 +00004934 return co;
4935}
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004936
4937int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00004938PyCode_Addr2Line(PyCodeObject *co, int addrq)
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004939{
4940 int size = PyString_Size(co->co_lnotab) / 2;
Guido van Rossum2174dcb1999-09-15 22:48:09 +00004941 unsigned char *p = (unsigned char*)PyString_AsString(co->co_lnotab);
Guido van Rossumda4eb5c1997-01-24 03:43:35 +00004942 int line = co->co_firstlineno;
4943 int addr = 0;
4944 while (--size >= 0) {
4945 addr += *p++;
4946 if (addr > addrq)
4947 break;
4948 line += *p++;
4949 }
4950 return line;
4951}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004952
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004953/* The test for LOCAL must come before the test for FREE in order to
4954 handle classes where name is both local and free. The local var is
4955 a method and the free var is a free var referenced within a method.
4956*/
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004957
4958static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004959get_ref_type(struct compiling *c, char *name)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004960{
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004961 char buf[350];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004962 PyObject *v;
Jeremy Hylton51257732001-03-01 00:42:55 +00004963
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004964 if (PyDict_GetItemString(c->c_cellvars, name) != NULL)
4965 return CELL;
4966 if (PyDict_GetItemString(c->c_locals, name) != NULL)
4967 return LOCAL;
4968 if (PyDict_GetItemString(c->c_freevars, name) != NULL)
4969 return FREE;
4970 v = PyDict_GetItemString(c->c_globals, name);
4971 if (v) {
4972 if (v == Py_None)
4973 return GLOBAL_EXPLICIT;
4974 else {
4975 return GLOBAL_IMPLICIT;
4976 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00004977 }
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00004978 PyOS_snprintf(buf, sizeof(buf),
Jeremy Hylton1abf6102001-08-11 21:51:24 +00004979 "unknown scope for %.100s in %.100s(%s) "
4980 "in %s\nsymbols: %s\nlocals: %s\nglobals: %s\n",
4981 name, c->c_name,
4982 PyObject_REPR(c->c_symtable->st_cur->ste_id),
4983 c->c_filename,
4984 PyObject_REPR(c->c_symtable->st_cur->ste_symbols),
4985 PyObject_REPR(c->c_locals),
4986 PyObject_REPR(c->c_globals)
4987 );
4988
4989 Py_FatalError(buf);
4990 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00004991}
4992
Guido van Rossum207fda62001-03-02 03:30:41 +00004993/* Helper functions to issue warnings */
4994
4995static int
Martin v. Löwis95292d62002-12-11 14:04:59 +00004996issue_warning(const char *msg, const char *filename, int lineno)
Guido van Rossum207fda62001-03-02 03:30:41 +00004997{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00004998 if (PyErr_Occurred()) {
4999 /* This can happen because symtable_node continues
5000 processing even after raising a SyntaxError.
5001 Calling PyErr_WarnExplicit now would clobber the
5002 pending exception; instead we fail and let that
5003 exception propagate.
5004 */
5005 return -1;
5006 }
Guido van Rossum207fda62001-03-02 03:30:41 +00005007 if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, filename,
5008 lineno, NULL, NULL) < 0) {
5009 if (PyErr_ExceptionMatches(PyExc_SyntaxWarning)) {
5010 PyErr_SetString(PyExc_SyntaxError, msg);
5011 PyErr_SyntaxLocation(filename, lineno);
5012 }
5013 return -1;
5014 }
5015 return 0;
5016}
Guido van Rossumee34ac12001-02-28 22:08:12 +00005017
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005018static int
Guido van Rossumee34ac12001-02-28 22:08:12 +00005019symtable_warn(struct symtable *st, char *msg)
5020{
Guido van Rossum207fda62001-03-02 03:30:41 +00005021 if (issue_warning(msg, st->st_filename, st->st_cur->ste_lineno) < 0) {
Guido van Rossumee34ac12001-02-28 22:08:12 +00005022 st->st_errors++;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005023 return -1;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005024 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005025 return 0;
Guido van Rossumee34ac12001-02-28 22:08:12 +00005026}
5027
Jeremy Hylton9f1b9932001-02-28 07:07:43 +00005028/* Helper function for setting lineno and filename */
5029
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005030static struct symtable *
5031symtable_build(node *n, PyFutureFeatures *ff, const char *filename)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005032{
Jeremy Hylton1955fcf2003-07-15 20:23:26 +00005033 struct symtable *st;
5034
5035 st = symtable_init();
5036 if (st == NULL)
5037 return NULL;
5038 st->st_future = ff;
5039 st->st_filename = filename;
5040 symtable_enter_scope(st, TOP, TYPE(n), n->n_lineno);
5041 if (st->st_errors > 0)
5042 goto fail;
5043 symtable_node(st, n);
5044 if (st->st_errors > 0)
5045 goto fail;
5046 return st;
5047 fail:
5048 if (!PyErr_Occurred()) {
5049 /* This could happen because after a syntax error is
5050 detected, the symbol-table-building continues for
5051 a while, and PyErr_Clear() might erroneously be
5052 called during that process. One such case has been
5053 fixed, but there might be more (now or later).
5054 */
5055 PyErr_SetString(PyExc_SystemError, "lost exception");
5056 }
5057 st->st_future = NULL;
5058 st->st_filename = NULL;
5059 PySymtable_Free(st);
5060 return NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005061}
5062
5063static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005064symtable_init_compiling_symbols(struct compiling *c)
5065{
5066 PyObject *varnames;
5067
5068 varnames = c->c_symtable->st_cur->ste_varnames;
5069 if (varnames == NULL) {
5070 varnames = PyList_New(0);
5071 if (varnames == NULL)
5072 return -1;
5073 c->c_symtable->st_cur->ste_varnames = varnames;
5074 Py_INCREF(varnames);
5075 } else
5076 Py_INCREF(varnames);
5077 c->c_varnames = varnames;
5078
5079 c->c_globals = PyDict_New();
5080 if (c->c_globals == NULL)
5081 return -1;
5082 c->c_freevars = PyDict_New();
5083 if (c->c_freevars == NULL)
5084 return -1;
5085 c->c_cellvars = PyDict_New();
5086 if (c->c_cellvars == NULL)
5087 return -1;
5088 return 0;
5089}
5090
5091struct symbol_info {
5092 int si_nlocals;
5093 int si_ncells;
5094 int si_nfrees;
5095 int si_nimplicit;
5096};
5097
5098static void
5099symtable_init_info(struct symbol_info *si)
5100{
5101 si->si_nlocals = 0;
5102 si->si_ncells = 0;
5103 si->si_nfrees = 0;
5104 si->si_nimplicit = 0;
5105}
5106
5107static int
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005108symtable_resolve_free(struct compiling *c, PyObject *name, int flags,
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005109 struct symbol_info *si)
5110{
5111 PyObject *dict, *v;
5112
5113 /* Seperate logic for DEF_FREE. If it occurs in a function,
5114 it indicates a local that we must allocate storage for (a
5115 cell var). If it occurs in a class, then the class has a
5116 method and a free variable with the same name.
5117 */
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005118 if (c->c_symtable->st_cur->ste_type == TYPE_FUNCTION) {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005119 /* If it isn't declared locally, it can't be a cell. */
5120 if (!(flags & (DEF_LOCAL | DEF_PARAM)))
5121 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005122 v = PyInt_FromLong(si->si_ncells++);
5123 dict = c->c_cellvars;
5124 } else {
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005125 /* If it is free anyway, then there is no need to do
5126 anything here.
5127 */
5128 if (is_free(flags ^ DEF_FREE_CLASS)
Jeremy Hylton9c901052001-05-08 04:12:34 +00005129 || (flags == DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005130 return 0;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005131 v = PyInt_FromLong(si->si_nfrees++);
5132 dict = c->c_freevars;
5133 }
5134 if (v == NULL)
5135 return -1;
5136 if (PyDict_SetItem(dict, name, v) < 0) {
5137 Py_DECREF(v);
5138 return -1;
5139 }
5140 Py_DECREF(v);
5141 return 0;
5142}
5143
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005144/* If a variable is a cell and an argument, make sure that appears in
5145 co_cellvars before any variable to its right in varnames.
5146*/
5147
5148
5149static int
5150symtable_cellvar_offsets(PyObject **cellvars, int argcount,
5151 PyObject *varnames, int flags)
5152{
Tim Petersb39903b2003-03-24 17:22:24 +00005153 PyObject *v = NULL;
5154 PyObject *w, *d, *list = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005155 int i, pos;
5156
5157 if (flags & CO_VARARGS)
5158 argcount++;
5159 if (flags & CO_VARKEYWORDS)
5160 argcount++;
5161 for (i = argcount; --i >= 0; ) {
5162 v = PyList_GET_ITEM(varnames, i);
5163 if (PyDict_GetItem(*cellvars, v)) {
5164 if (list == NULL) {
5165 list = PyList_New(1);
5166 if (list == NULL)
5167 return -1;
5168 PyList_SET_ITEM(list, 0, v);
5169 Py_INCREF(v);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005170 } else {
5171 if (PyList_Insert(list, 0, v) < 0) {
5172 Py_DECREF(list);
5173 return -1;
5174 }
5175 }
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005176 }
5177 }
Jeremy Hylton521482d2003-05-22 15:47:02 +00005178 if (list == NULL)
5179 return 0;
5180
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005181 /* There are cellvars that are also arguments. Create a dict
5182 to replace cellvars and put the args at the front.
5183 */
5184 d = PyDict_New();
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005185 if (d == NULL)
5186 return -1;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005187 for (i = PyList_GET_SIZE(list); --i >= 0; ) {
5188 v = PyInt_FromLong(i);
5189 if (v == NULL)
5190 goto fail;
5191 if (PyDict_SetItem(d, PyList_GET_ITEM(list, i), v) < 0)
5192 goto fail;
5193 if (PyDict_DelItem(*cellvars, PyList_GET_ITEM(list, i)) < 0)
5194 goto fail;
Tim Petersb39903b2003-03-24 17:22:24 +00005195 Py_DECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005196 }
5197 pos = 0;
5198 i = PyList_GET_SIZE(list);
5199 Py_DECREF(list);
5200 while (PyDict_Next(*cellvars, &pos, &v, &w)) {
5201 w = PyInt_FromLong(i++); /* don't care about the old key */
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005202 if (w == NULL)
5203 goto fail;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005204 if (PyDict_SetItem(d, v, w) < 0) {
5205 Py_DECREF(w);
Tim Petersb39903b2003-03-24 17:22:24 +00005206 v = NULL;
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005207 goto fail;
5208 }
5209 Py_DECREF(w);
5210 }
5211 Py_DECREF(*cellvars);
5212 *cellvars = d;
5213 return 1;
5214 fail:
5215 Py_DECREF(d);
Tim Petersb39903b2003-03-24 17:22:24 +00005216 Py_XDECREF(v);
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005217 return -1;
5218}
5219
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005220static int
5221symtable_freevar_offsets(PyObject *freevars, int offset)
5222{
5223 PyObject *name, *v;
5224 int pos;
5225
5226 /* The cell vars are the first elements of the closure,
5227 followed by the free vars. Update the offsets in
5228 c_freevars to account for number of cellvars. */
5229 pos = 0;
5230 while (PyDict_Next(freevars, &pos, &name, &v)) {
5231 int i = PyInt_AS_LONG(v) + offset;
5232 PyObject *o = PyInt_FromLong(i);
5233 if (o == NULL)
5234 return -1;
5235 if (PyDict_SetItem(freevars, name, o) < 0) {
5236 Py_DECREF(o);
5237 return -1;
5238 }
5239 Py_DECREF(o);
5240 }
5241 return 0;
5242}
5243
5244static int
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005245symtable_check_unoptimized(struct compiling *c,
5246 PySymtableEntryObject *ste,
5247 struct symbol_info *si)
5248{
5249 char buf[300];
5250
5251 if (!(si->si_ncells || si->si_nfrees || ste->ste_child_free
5252 || (ste->ste_nested && si->si_nimplicit)))
5253 return 0;
5254
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005255#define ILLEGAL_CONTAINS "contains a nested function with free variables"
5256
5257#define ILLEGAL_IS "is a nested function"
5258
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005259#define ILLEGAL_IMPORT_STAR \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005260"import * is not allowed in function '%.100s' because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005261
5262#define ILLEGAL_BARE_EXEC \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005263"unqualified exec is not allowed in function '%.100s' it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005264
5265#define ILLEGAL_EXEC_AND_IMPORT_STAR \
Neal Norwitz150d09d2002-01-29 00:56:37 +00005266"function '%.100s' uses import * and bare exec, which are illegal " \
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005267"because it %s"
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005268
5269 /* XXX perhaps the linenos for these opt-breaking statements
5270 should be stored so the exception can point to them. */
5271
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005272 if (ste->ste_child_free) {
5273 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005274 PyOS_snprintf(buf, sizeof(buf),
5275 ILLEGAL_IMPORT_STAR,
5276 PyString_AS_STRING(ste->ste_name),
5277 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005278 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005279 PyOS_snprintf(buf, sizeof(buf),
5280 ILLEGAL_BARE_EXEC,
5281 PyString_AS_STRING(ste->ste_name),
5282 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005283 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005284 PyOS_snprintf(buf, sizeof(buf),
5285 ILLEGAL_EXEC_AND_IMPORT_STAR,
5286 PyString_AS_STRING(ste->ste_name),
5287 ILLEGAL_CONTAINS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005288 }
5289 } else {
5290 if (ste->ste_optimized == OPT_IMPORT_STAR)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005291 PyOS_snprintf(buf, sizeof(buf),
5292 ILLEGAL_IMPORT_STAR,
5293 PyString_AS_STRING(ste->ste_name),
5294 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005295 else if (ste->ste_optimized == (OPT_BARE_EXEC | OPT_EXEC))
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005296 PyOS_snprintf(buf, sizeof(buf),
5297 ILLEGAL_BARE_EXEC,
5298 PyString_AS_STRING(ste->ste_name),
5299 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005300 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00005301 PyOS_snprintf(buf, sizeof(buf),
5302 ILLEGAL_EXEC_AND_IMPORT_STAR,
5303 PyString_AS_STRING(ste->ste_name),
5304 ILLEGAL_IS);
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005305 }
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005306 }
Jeremy Hylton280e6bd2001-03-22 03:51:05 +00005307
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005308 PyErr_SetString(PyExc_SyntaxError, buf);
5309 PyErr_SyntaxLocation(c->c_symtable->st_filename,
5310 ste->ste_opt_lineno);
5311 return -1;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005312}
5313
5314static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005315symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste,
5316 struct symbol_info *si)
5317{
Jeremy Hyltonb857ba22001-08-10 21:41:33 +00005318 if (c->c_future)
5319 c->c_flags |= c->c_future->ff_features;
Tim Peters5ca576e2001-06-18 22:08:13 +00005320 if (ste->ste_generator)
5321 c->c_flags |= CO_GENERATOR;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005322 if (ste->ste_type != TYPE_MODULE)
5323 c->c_flags |= CO_NEWLOCALS;
5324 if (ste->ste_type == TYPE_FUNCTION) {
5325 c->c_nlocals = si->si_nlocals;
5326 if (ste->ste_optimized == 0)
5327 c->c_flags |= CO_OPTIMIZED;
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005328 else if (ste->ste_optimized != OPT_EXEC)
5329 return symtable_check_unoptimized(c, ste, si);
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005330 }
5331 return 0;
5332}
5333
5334static int
Jeremy Hylton98326132003-09-22 04:26:44 +00005335symtable_error(struct symtable *st, int lineno)
5336{
5337 if (lineno == 0)
5338 lineno = st->st_cur->ste_lineno;
5339 PyErr_SyntaxLocation(st->st_filename, lineno);
5340 st->st_errors++;
5341 return -1;
5342}
5343
5344static int
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005345symtable_load_symbols(struct compiling *c)
5346{
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005347 struct symtable *st = c->c_symtable;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005348 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005349 PyObject *name, *varnames, *v;
5350 int i, flags, pos;
5351 struct symbol_info si;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005352
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005353 v = NULL;
5354
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005355 if (symtable_init_compiling_symbols(c) < 0)
5356 goto fail;
5357 symtable_init_info(&si);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005358 varnames = st->st_cur->ste_varnames;
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005359 si.si_nlocals = PyList_GET_SIZE(varnames);
5360 c->c_argcount = si.si_nlocals;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005361
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005362 for (i = 0; i < si.si_nlocals; ++i) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005363 v = PyInt_FromLong(i);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005364 if (v == NULL)
5365 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005366 if (PyDict_SetItem(c->c_locals,
5367 PyList_GET_ITEM(varnames, i), v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005368 goto fail;
5369 Py_DECREF(v);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005370 }
5371
5372 /* XXX The cases below define the rules for whether a name is
5373 local or global. The logic could probably be clearer. */
5374 pos = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005375 while (PyDict_Next(ste->ste_symbols, &pos, &name, &v)) {
5376 flags = PyInt_AS_LONG(v);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005377
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005378 if (flags & DEF_FREE_GLOBAL)
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005379 /* undo the original DEF_FREE */
5380 flags &= ~(DEF_FREE | DEF_FREE_CLASS);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005381
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005382 /* Deal with names that need two actions:
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005383 1. Cell variables that are also locals.
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005384 2. Free variables in methods that are also class
5385 variables or declared global.
5386 */
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005387 if (flags & (DEF_FREE | DEF_FREE_CLASS))
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005388 symtable_resolve_free(c, name, flags, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005389
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005390 if (flags & DEF_STAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005391 c->c_argcount--;
5392 c->c_flags |= CO_VARARGS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005393 } else if (flags & DEF_DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005394 c->c_argcount--;
5395 c->c_flags |= CO_VARKEYWORDS;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005396 } else if (flags & DEF_INTUPLE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005397 c->c_argcount--;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005398 else if (flags & DEF_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005399 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00005400 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005401 PyString_AS_STRING(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005402 symtable_error(st, 0);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005403 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005404 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005405 if (PyDict_SetItem(c->c_globals, name, Py_None) < 0)
5406 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005407 } else if (flags & DEF_FREE_GLOBAL) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005408 si.si_nimplicit++;
Neal Norwitz06982222002-12-18 01:18:44 +00005409 if (PyDict_SetItem(c->c_globals, name, Py_True) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005410 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005411 } else if ((flags & DEF_LOCAL) && !(flags & DEF_PARAM)) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005412 v = PyInt_FromLong(si.si_nlocals++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005413 if (v == NULL)
5414 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005415 if (PyDict_SetItem(c->c_locals, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005416 goto fail;
5417 Py_DECREF(v);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005418 if (ste->ste_type != TYPE_CLASS)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005419 if (PyList_Append(c->c_varnames, name) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005420 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005421 } else if (is_free(flags)) {
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005422 if (ste->ste_nested) {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005423 v = PyInt_FromLong(si.si_nfrees++);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005424 if (v == NULL)
5425 goto fail;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005426 if (PyDict_SetItem(c->c_freevars, name, v) < 0)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005427 goto fail;
5428 Py_DECREF(v);
5429 } else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005430 si.si_nimplicit++;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005431 if (PyDict_SetItem(c->c_globals, name,
Neal Norwitz06982222002-12-18 01:18:44 +00005432 Py_True) < 0)
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005433 goto fail;
5434 if (st->st_nscopes != 1) {
5435 v = PyInt_FromLong(flags);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005436 if (v == NULL)
5437 goto fail;
Jeremy Hylton1abf6102001-08-11 21:51:24 +00005438 if (PyDict_SetItem(st->st_global,
5439 name, v))
5440 goto fail;
5441 Py_DECREF(v);
5442 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005443 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005444 }
5445 }
Jeremy Hyltonddc4fd02001-04-27 02:29:40 +00005446 assert(PyDict_Size(c->c_freevars) == si.si_nfrees);
5447
Jeremy Hylton220ae7c2001-03-21 16:43:47 +00005448 if (si.si_ncells > 1) { /* one cell is always in order */
5449 if (symtable_cellvar_offsets(&c->c_cellvars, c->c_argcount,
5450 c->c_varnames, c->c_flags) < 0)
5451 return -1;
5452 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005453 if (symtable_freevar_offsets(c->c_freevars, si.si_ncells) < 0)
5454 return -1;
5455 return symtable_update_flags(c, ste, &si);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005456 fail:
5457 /* is this always the right thing to do? */
5458 Py_XDECREF(v);
5459 return -1;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005460}
5461
5462static struct symtable *
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005463symtable_init()
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005464{
5465 struct symtable *st;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005466
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005467 st = (struct symtable *)PyObject_MALLOC(sizeof(struct symtable));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005468 if (st == NULL)
5469 return NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005470 st->st_pass = 1;
Tim Petersff1f8522001-08-11 01:06:35 +00005471
Jeremy Hylton5acc0c02001-02-02 20:01:10 +00005472 st->st_filename = NULL;
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005473 st->st_symbols = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005474 if ((st->st_stack = PyList_New(0)) == NULL)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005475 goto fail;
5476 if ((st->st_symbols = PyDict_New()) == NULL)
5477 goto fail;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005478 st->st_cur = NULL;
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005479 st->st_nscopes = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005480 st->st_errors = 0;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005481 st->st_private = NULL;
5482 return st;
5483 fail:
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005484 PySymtable_Free(st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005485 return NULL;
5486}
5487
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005488void
5489PySymtable_Free(struct symtable *st)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005490{
5491 Py_XDECREF(st->st_symbols);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005492 Py_XDECREF(st->st_stack);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005493 Py_XDECREF(st->st_cur);
Andrew MacIntyre80d4e2a2002-08-04 06:28:21 +00005494 PyObject_FREE((void *)st);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005495}
5496
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005497/* When the compiler exits a scope, it must should update the scope's
5498 free variable information with the list of free variables in its
5499 children.
5500
5501 Variables that are free in children and defined in the current
5502 scope are cellvars.
5503
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005504 If the scope being exited is defined at the top-level (ste_nested is
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005505 false), free variables in children that are not defined here are
5506 implicit globals.
5507
5508*/
5509
5510static int
5511symtable_update_free_vars(struct symtable *st)
5512{
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005513 int i, j, def;
5514 PyObject *o, *name, *list = NULL;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005515 PySymtableEntryObject *child, *ste = st->st_cur;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005516
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005517 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005518 def = DEF_FREE_CLASS;
5519 else
5520 def = DEF_FREE;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005521 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005522 int pos = 0;
5523
Jeremy Hyltonf9415e62003-05-22 16:22:33 +00005524 if (list && PyList_SetSlice(list, 0,
5525 PyList_GET_SIZE(list), 0) < 0)
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005526 return -1;
Barry Warsaw0372af72001-02-23 18:22:59 +00005527 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005528 PyList_GET_ITEM(ste->ste_children, i);
5529 while (PyDict_Next(child->ste_symbols, &pos, &name, &o)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005530 int flags = PyInt_AS_LONG(o);
5531 if (!(is_free(flags)))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005532 continue; /* avoids indentation */
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005533 if (list == NULL) {
5534 list = PyList_New(0);
5535 if (list == NULL)
5536 return -1;
5537 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005538 ste->ste_child_free = 1;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005539 if (PyList_Append(list, name) < 0) {
5540 Py_DECREF(list);
5541 return -1;
5542 }
5543 }
5544 for (j = 0; list && j < PyList_GET_SIZE(list); j++) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005545 PyObject *v;
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005546 name = PyList_GET_ITEM(list, j);
Jeremy Hylton78891072001-03-01 06:09:34 +00005547 v = PyDict_GetItem(ste->ste_symbols, name);
5548 /* If a name N is declared global in scope A and
5549 referenced in scope B contained (perhaps
5550 indirectly) in A and there are no scopes
5551 with bindings for N between B and A, then N
Jeremy Hylton9c901052001-05-08 04:12:34 +00005552 is global in B. Unless A is a class scope,
5553 because class scopes are not considered for
5554 nested scopes.
Jeremy Hylton78891072001-03-01 06:09:34 +00005555 */
Jeremy Hyltonce7ef592001-03-20 00:25:43 +00005556 if (v && (ste->ste_type != TYPE_CLASS)) {
Jeremy Hylton78891072001-03-01 06:09:34 +00005557 int flags = PyInt_AS_LONG(v);
5558 if (flags & DEF_GLOBAL) {
5559 symtable_undo_free(st, child->ste_id,
5560 name);
5561 continue;
5562 }
5563 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005564 if (ste->ste_nested) {
5565 if (symtable_add_def_o(st, ste->ste_symbols,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005566 name, def) < 0) {
5567 Py_DECREF(list);
5568 return -1;
5569 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005570 } else {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005571 if (symtable_check_global(st, child->ste_id,
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005572 name) < 0) {
5573 Py_DECREF(list);
5574 return -1;
5575 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005576 }
5577 }
5578 }
Jeremy Hyltond7f393e2001-02-12 16:01:03 +00005579
5580 Py_XDECREF(list);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005581 return 0;
5582}
5583
5584/* If the current scope is a non-nested class or if name is not
5585 defined in the current, non-nested scope, then it is an implicit
5586 global in all nested scopes.
5587*/
5588
5589static int
5590symtable_check_global(struct symtable *st, PyObject *child, PyObject *name)
5591{
5592 PyObject *o;
5593 int v;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005594 PySymtableEntryObject *ste = st->st_cur;
Jeremy Hylton78891072001-03-01 06:09:34 +00005595
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005596 if (ste->ste_type == TYPE_CLASS)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005597 return symtable_undo_free(st, child, name);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005598 o = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005599 if (o == NULL)
5600 return symtable_undo_free(st, child, name);
5601 v = PyInt_AS_LONG(o);
Jeremy Hylton78891072001-03-01 06:09:34 +00005602
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005603 if (is_free(v) || (v & DEF_GLOBAL))
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005604 return symtable_undo_free(st, child, name);
5605 else
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005606 return symtable_add_def_o(st, ste->ste_symbols,
5607 name, DEF_FREE);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005608}
5609
5610static int
5611symtable_undo_free(struct symtable *st, PyObject *id,
5612 PyObject *name)
5613{
5614 int i, v, x;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005615 PyObject *info;
5616 PySymtableEntryObject *ste;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005617
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005618 ste = (PySymtableEntryObject *)PyDict_GetItem(st->st_symbols, id);
5619 if (ste == NULL)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005620 return -1;
Jeremy Hylton78891072001-03-01 06:09:34 +00005621
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005622 info = PyDict_GetItem(ste->ste_symbols, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005623 if (info == NULL)
5624 return 0;
5625 v = PyInt_AS_LONG(info);
5626 if (is_free(v)) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005627 if (symtable_add_def_o(st, ste->ste_symbols, name,
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005628 DEF_FREE_GLOBAL) < 0)
5629 return -1;
5630 } else
5631 /* If the name is defined here or declared global,
5632 then the recursion stops. */
5633 return 0;
5634
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005635 for (i = 0; i < PyList_GET_SIZE(ste->ste_children); ++i) {
5636 PySymtableEntryObject *child;
Barry Warsaw0372af72001-02-23 18:22:59 +00005637 child = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005638 PyList_GET_ITEM(ste->ste_children, i);
5639 x = symtable_undo_free(st, child->ste_id, name);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005640 if (x < 0)
5641 return x;
5642 }
5643 return 0;
5644}
5645
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005646/* symtable_enter_scope() gets a reference via PySymtableEntry_New().
5647 This reference is released when the scope is exited, via the DECREF
5648 in symtable_exit_scope().
5649*/
5650
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005651static int
5652symtable_exit_scope(struct symtable *st)
5653{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005654 int end;
5655
Jeremy Hylton4419ac12001-02-28 22:54:51 +00005656 if (st->st_pass == 1)
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005657 symtable_update_free_vars(st);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005658 Py_DECREF(st->st_cur);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005659 end = PyList_GET_SIZE(st->st_stack) - 1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005660 st->st_cur = (PySymtableEntryObject *)PyList_GET_ITEM(st->st_stack,
5661 end);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005662 if (PySequence_DelItem(st->st_stack, end) < 0)
5663 return -1;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005664 return 0;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005665}
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005666
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005667static void
5668symtable_enter_scope(struct symtable *st, char *name, int type,
5669 int lineno)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005670{
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005671 PySymtableEntryObject *prev = NULL;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005672
5673 if (st->st_cur) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005674 prev = st->st_cur;
5675 if (PyList_Append(st->st_stack, (PyObject *)st->st_cur) < 0) {
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005676 st->st_errors++;
5677 return;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005678 }
5679 }
Barry Warsaw0372af72001-02-23 18:22:59 +00005680 st->st_cur = (PySymtableEntryObject *)
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005681 PySymtableEntry_New(st, name, type, lineno);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005682 if (st->st_cur == NULL) {
5683 st->st_errors++;
5684 return;
5685 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005686 if (strcmp(name, TOP) == 0)
5687 st->st_global = st->st_cur->ste_symbols;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005688 if (prev && st->st_pass == 1) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005689 if (PyList_Append(prev->ste_children,
5690 (PyObject *)st->st_cur) < 0)
5691 st->st_errors++;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +00005692 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005693}
5694
5695static int
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005696symtable_lookup(struct symtable *st, char *name)
5697{
5698 char buffer[MANGLE_LEN];
5699 PyObject *v;
5700 int flags;
5701
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005702 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005703 name = buffer;
5704 v = PyDict_GetItemString(st->st_cur->ste_symbols, name);
5705 if (v == NULL) {
5706 if (PyErr_Occurred())
5707 return -1;
5708 else
5709 return 0;
5710 }
5711
5712 flags = PyInt_AS_LONG(v);
5713 return flags;
5714}
5715
5716static int
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005717symtable_add_def(struct symtable *st, char *name, int flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005718{
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005719 PyObject *s;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005720 char buffer[MANGLE_LEN];
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005721 int ret;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005722
Guido van Rossumb7164622002-08-16 02:48:11 +00005723 /* Warn about None, except inside a tuple (where the assignment
5724 code already issues a warning). */
5725 if ((flag & DEF_PARAM) && !(flag & DEF_INTUPLE) &&
5726 *name == 'N' && strcmp(name, "None") == 0)
5727 {
Raymond Hettinger11a70c72004-07-17 21:46:25 +00005728 PyErr_SetString(PyExc_SyntaxError,
5729 "Invalid syntax. Assignment to None.");
5730 symtable_error(st, 0);
5731 return -1;
Guido van Rossumb7164622002-08-16 02:48:11 +00005732 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00005733 if (_Py_Mangle(st->st_private, name, buffer, sizeof(buffer)))
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005734 name = buffer;
5735 if ((s = PyString_InternFromString(name)) == NULL)
5736 return -1;
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00005737 ret = symtable_add_def_o(st, st->st_cur->ste_symbols, s, flag);
5738 Py_DECREF(s);
5739 return ret;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005740}
5741
5742/* Must only be called with mangled names */
5743
5744static int
5745symtable_add_def_o(struct symtable *st, PyObject *dict,
5746 PyObject *name, int flag)
5747{
5748 PyObject *o;
5749 int val;
5750
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005751 if ((o = PyDict_GetItem(dict, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005752 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005753 if ((flag & DEF_PARAM) && (val & DEF_PARAM)) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005754 PyErr_Format(PyExc_SyntaxError, DUPLICATE_ARGUMENT,
Jeremy Hylton483638c2001-02-01 20:20:45 +00005755 PyString_AsString(name));
Jeremy Hylton98326132003-09-22 04:26:44 +00005756 return symtable_error(st, 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005757 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005758 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005759 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005760 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005761 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005762 if (o == NULL)
5763 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005764 if (PyDict_SetItem(dict, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005765 Py_DECREF(o);
5766 return -1;
5767 }
5768 Py_DECREF(o);
5769
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005770 if (flag & DEF_PARAM) {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00005771 if (PyList_Append(st->st_cur->ste_varnames, name) < 0)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005772 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005773 } else if (flag & DEF_GLOBAL) {
5774 /* XXX need to update DEF_GLOBAL for other flags too;
5775 perhaps only DEF_FREE_GLOBAL */
5776 if ((o = PyDict_GetItem(st->st_global, name))) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005777 val = PyInt_AS_LONG(o);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005778 val |= flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005779 } else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005780 val = flag;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005781 o = PyInt_FromLong(val);
Martin v. Löwiscd12bfc2003-05-03 10:53:08 +00005782 if (o == NULL)
5783 return -1;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005784 if (PyDict_SetItem(st->st_global, name, o) < 0) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005785 Py_DECREF(o);
5786 return -1;
5787 }
5788 Py_DECREF(o);
5789 }
5790 return 0;
5791}
5792
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005793#define symtable_add_use(ST, NAME) symtable_add_def((ST), (NAME), USE)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005794
Tim Peters08a898f2001-06-28 01:52:22 +00005795/* Look for a yield stmt under n. Return 1 if found, else 0.
5796 This hack is used to look inside "if 0:" blocks (which are normally
5797 ignored) in case those are the only places a yield occurs (so that this
5798 function is a generator). */
Tim Petersb6c3cea2001-06-26 03:36:28 +00005799static int
5800look_for_yield(node *n)
5801{
5802 int i;
5803
5804 for (i = 0; i < NCH(n); ++i) {
5805 node *kid = CHILD(n, i);
5806
5807 switch (TYPE(kid)) {
5808
5809 case classdef:
5810 case funcdef:
Tim Peters08a898f2001-06-28 01:52:22 +00005811 case lambdef:
Tim Petersb6c3cea2001-06-26 03:36:28 +00005812 /* Stuff in nested functions and classes can't make
5813 the parent a generator. */
5814 return 0;
5815
5816 case yield_stmt:
Raymond Hettinger354433a2004-05-19 08:20:33 +00005817 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005818
5819 default:
5820 if (look_for_yield(kid))
Raymond Hettinger354433a2004-05-19 08:20:33 +00005821 return GENERATOR;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005822 }
5823 }
5824 return 0;
5825}
5826
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005827static void
5828symtable_node(struct symtable *st, node *n)
5829{
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005830 int i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005831
5832 loop:
5833 switch (TYPE(n)) {
5834 case funcdef: {
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005835 char *func_name;
5836 if (NCH(n) == 6)
5837 symtable_node(st, CHILD(n, 0));
5838 func_name = STR(RCHILD(n, -4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005839 symtable_add_def(st, func_name, DEF_LOCAL);
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005840 symtable_default_args(st, RCHILD(n, -3));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005841 symtable_enter_scope(st, func_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005842 symtable_funcdef(st, n);
5843 symtable_exit_scope(st);
5844 break;
5845 }
5846 case lambdef:
5847 if (NCH(n) == 4)
5848 symtable_default_args(st, CHILD(n, 1));
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005849 symtable_enter_scope(st, "lambda", TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005850 symtable_funcdef(st, n);
5851 symtable_exit_scope(st);
5852 break;
5853 case classdef: {
5854 char *tmp, *class_name = STR(CHILD(n, 1));
5855 symtable_add_def(st, class_name, DEF_LOCAL);
5856 if (TYPE(CHILD(n, 2)) == LPAR) {
5857 node *bases = CHILD(n, 3);
5858 int i;
5859 for (i = 0; i < NCH(bases); i += 2) {
5860 symtable_node(st, CHILD(bases, i));
5861 }
5862 }
Jeremy Hylton4b38da62001-02-02 18:19:15 +00005863 symtable_enter_scope(st, class_name, TYPE(n), n->n_lineno);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005864 tmp = st->st_private;
5865 st->st_private = class_name;
5866 symtable_node(st, CHILD(n, NCH(n) - 1));
5867 st->st_private = tmp;
5868 symtable_exit_scope(st);
5869 break;
5870 }
5871 case if_stmt:
5872 for (i = 0; i + 3 < NCH(n); i += 4) {
Tim Petersb6c3cea2001-06-26 03:36:28 +00005873 if (is_constant_false(NULL, (CHILD(n, i + 1)))) {
5874 if (st->st_cur->ste_generator == 0)
5875 st->st_cur->ste_generator =
5876 look_for_yield(CHILD(n, i+3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005877 continue;
Tim Petersb6c3cea2001-06-26 03:36:28 +00005878 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005879 symtable_node(st, CHILD(n, i + 1));
5880 symtable_node(st, CHILD(n, i + 3));
5881 }
5882 if (i + 2 < NCH(n))
5883 symtable_node(st, CHILD(n, i + 2));
5884 break;
5885 case global_stmt:
5886 symtable_global(st, n);
5887 break;
5888 case import_stmt:
5889 symtable_import(st, n);
5890 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005891 case exec_stmt: {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005892 st->st_cur->ste_optimized |= OPT_EXEC;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005893 symtable_node(st, CHILD(n, 1));
5894 if (NCH(n) > 2)
5895 symtable_node(st, CHILD(n, 3));
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005896 else {
Jeremy Hylton29906ee2001-02-27 04:23:34 +00005897 st->st_cur->ste_optimized |= OPT_BARE_EXEC;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00005898 st->st_cur->ste_opt_lineno = n->n_lineno;
5899 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005900 if (NCH(n) > 4)
5901 symtable_node(st, CHILD(n, 5));
5902 break;
Jeremy Hylton483638c2001-02-01 20:20:45 +00005903
5904 }
Jeremy Hylton384639f2001-02-19 15:50:51 +00005905 case assert_stmt:
5906 if (Py_OptimizeFlag)
5907 return;
5908 if (NCH(n) == 2) {
5909 n = CHILD(n, 1);
5910 goto loop;
5911 } else {
5912 symtable_node(st, CHILD(n, 1));
5913 n = CHILD(n, 3);
5914 goto loop;
5915 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005916 case except_clause:
5917 if (NCH(n) == 4)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005918 symtable_assign(st, CHILD(n, 3), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005919 if (NCH(n) > 1) {
5920 n = CHILD(n, 1);
5921 goto loop;
5922 }
5923 break;
5924 case del_stmt:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005925 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005926 break;
Tim Peters5ca576e2001-06-18 22:08:13 +00005927 case yield_stmt:
5928 st->st_cur->ste_generator = 1;
5929 n = CHILD(n, 1);
5930 goto loop;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005931 case expr_stmt:
5932 if (NCH(n) == 1)
5933 n = CHILD(n, 0);
5934 else {
5935 if (TYPE(CHILD(n, 1)) == augassign) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005936 symtable_assign(st, CHILD(n, 0), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005937 symtable_node(st, CHILD(n, 2));
5938 break;
5939 } else {
5940 int i;
5941 for (i = 0; i < NCH(n) - 2; i += 2)
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00005942 symtable_assign(st, CHILD(n, i), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00005943 n = CHILD(n, NCH(n) - 1);
5944 }
5945 }
5946 goto loop;
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005947 case list_iter:
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005948 /* only occurs when there are multiple for loops
5949 in a list comprehension */
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005950 n = CHILD(n, 0);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00005951 if (TYPE(n) == list_for)
5952 symtable_list_for(st, n);
5953 else {
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005954 REQ(n, list_if);
5955 symtable_node(st, CHILD(n, 1));
5956 if (NCH(n) == 3) {
5957 n = CHILD(n, 2);
5958 goto loop;
5959 }
5960 }
5961 break;
5962 case for_stmt:
5963 symtable_assign(st, CHILD(n, 1), 0);
5964 for (i = 3; i < NCH(n); ++i)
5965 if (TYPE(CHILD(n, i)) >= single_input)
5966 symtable_node(st, CHILD(n, i));
5967 break;
Raymond Hettinger354433a2004-05-19 08:20:33 +00005968 case arglist:
5969 if (NCH(n) > 1)
5970 for (i = 0; i < NCH(n); ++i) {
5971 node *ch = CHILD(n, i);
5972 if (TYPE(ch) == argument && NCH(ch) == 2 &&
5973 TYPE(CHILD(ch, 1)) == gen_for) {
5974 PyErr_SetString(PyExc_SyntaxError,
5975 "invalid syntax");
5976 symtable_error(st, n->n_lineno);
5977 return;
5978 }
5979 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005980 /* The remaining cases fall through to default except in
5981 special circumstances. This requires the individual cases
5982 to be coded with great care, even though they look like
5983 rather innocuous. Each case must double-check TYPE(n).
5984 */
Anthony Baxterc2a5a632004-08-02 06:10:11 +00005985 case decorator:
5986 if (TYPE(n) == decorator) {
5987 /* decorator: '@' dotted_name [ '(' [arglist] ')' ] */
5988 node *name, *varname;
5989 name = CHILD(n, 1);
5990 REQ(name, dotted_name);
5991 varname = CHILD(name, 0);
5992 REQ(varname, NAME);
5993 symtable_add_use(st, STR(varname));
5994 }
5995 /* fall through */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005996 case argument:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00005997 if (TYPE(n) == argument && NCH(n) == 3) {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00005998 n = CHILD(n, 2);
5999 goto loop;
6000 }
Raymond Hettinger354433a2004-05-19 08:20:33 +00006001 else if (TYPE(n) == argument && NCH(n) == 2 &&
6002 TYPE(CHILD(n, 1)) == gen_for) {
6003 symtable_generator_expression(st, n);
6004 break;
6005 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006006 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006007 case listmaker:
6008 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006009 symtable_list_comprehension(st, n);
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006010 break;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006011 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006012 /* fall through */
Raymond Hettinger354433a2004-05-19 08:20:33 +00006013 case testlist_gexp:
6014 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6015 symtable_generator_expression(st, n);
6016 break;
6017 }
6018 /* fall through */
6019
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006020 case atom:
6021 if (TYPE(n) == atom && TYPE(CHILD(n, 0)) == NAME) {
6022 symtable_add_use(st, STR(CHILD(n, 0)));
6023 break;
6024 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006025 /* fall through */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006026 default:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006027 /* Walk over every non-token child with a special case
6028 for one child.
6029 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006030 if (NCH(n) == 1) {
6031 n = CHILD(n, 0);
6032 goto loop;
6033 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006034 for (i = 0; i < NCH(n); ++i)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006035 if (TYPE(CHILD(n, i)) >= single_input)
6036 symtable_node(st, CHILD(n, i));
6037 }
6038}
6039
6040static void
6041symtable_funcdef(struct symtable *st, node *n)
6042{
6043 node *body;
6044
6045 if (TYPE(n) == lambdef) {
6046 if (NCH(n) == 4)
6047 symtable_params(st, CHILD(n, 1));
6048 } else
Anthony Baxterc2a5a632004-08-02 06:10:11 +00006049 symtable_params(st, RCHILD(n, -3));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006050 body = CHILD(n, NCH(n) - 1);
6051 symtable_node(st, body);
6052}
6053
6054/* The next two functions parse the argument tuple.
Guido van Rossumb7164622002-08-16 02:48:11 +00006055 symtable_default_args() checks for names in the default arguments,
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006056 which are references in the defining scope. symtable_params()
6057 parses the parameter names, which are defined in the function's
6058 body.
6059
6060 varargslist:
6061 (fpdef ['=' test] ',')* ('*' NAME [',' '**' NAME] | '**' NAME)
6062 | fpdef ['=' test] (',' fpdef ['=' test])* [',']
6063*/
6064
6065static void
6066symtable_default_args(struct symtable *st, node *n)
6067{
6068 node *c;
6069 int i;
6070
6071 if (TYPE(n) == parameters) {
6072 n = CHILD(n, 1);
6073 if (TYPE(n) == RPAR)
6074 return;
6075 }
6076 REQ(n, varargslist);
6077 for (i = 0; i < NCH(n); i += 2) {
6078 c = CHILD(n, i);
6079 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6080 break;
6081 }
6082 if (i > 0 && (TYPE(CHILD(n, i - 1)) == EQUAL))
6083 symtable_node(st, CHILD(n, i));
6084 }
6085}
6086
6087static void
6088symtable_params(struct symtable *st, node *n)
6089{
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006090 int i, complex = -1, ext = 0;
Guido van Rossum633d90c2002-12-23 16:51:42 +00006091 node *c = NULL;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006092
6093 if (TYPE(n) == parameters) {
6094 n = CHILD(n, 1);
6095 if (TYPE(n) == RPAR)
6096 return;
6097 }
6098 REQ(n, varargslist);
6099 for (i = 0; i < NCH(n); i += 2) {
6100 c = CHILD(n, i);
6101 if (TYPE(c) == STAR || TYPE(c) == DOUBLESTAR) {
6102 ext = 1;
6103 break;
6104 }
6105 if (TYPE(c) == test) {
6106 continue;
6107 }
Guido van Rossum633d90c2002-12-23 16:51:42 +00006108 if (TYPE(CHILD(c, 0)) == NAME)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006109 symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
Guido van Rossum633d90c2002-12-23 16:51:42 +00006110 else {
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006111 char nbuf[30];
6112 PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006113 symtable_add_def(st, nbuf, DEF_PARAM);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006114 complex = i;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006115 }
6116 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006117 if (ext) {
6118 c = CHILD(n, i);
6119 if (TYPE(c) == STAR) {
6120 i++;
6121 symtable_add_def(st, STR(CHILD(n, i)),
6122 DEF_PARAM | DEF_STAR);
6123 i += 2;
Jeremy Hylton1113cfc2001-01-23 00:50:52 +00006124 if (i >= NCH(n))
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006125 c = NULL;
6126 else
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006127 c = CHILD(n, i);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006128 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006129 if (c && TYPE(c) == DOUBLESTAR) {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006130 i++;
6131 symtable_add_def(st, STR(CHILD(n, i)),
6132 DEF_PARAM | DEF_DOUBLESTAR);
6133 }
6134 }
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006135 if (complex >= 0) {
6136 int j;
6137 for (j = 0; j <= complex; j++) {
6138 c = CHILD(n, j);
6139 if (TYPE(c) == COMMA)
Jeremy Hylton2b3f0ca2001-02-19 23:52:49 +00006140 c = CHILD(n, ++j);
6141 else if (TYPE(c) == EQUAL)
6142 c = CHILD(n, j += 3);
Jeremy Hyltona6ebc482001-01-25 17:01:49 +00006143 if (TYPE(CHILD(c, 0)) == LPAR)
6144 symtable_params_fplist(st, CHILD(c, 1));
6145 }
6146 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006147}
6148
6149static void
6150symtable_params_fplist(struct symtable *st, node *n)
6151{
6152 int i;
6153 node *c;
6154
6155 REQ(n, fplist);
6156 for (i = 0; i < NCH(n); i += 2) {
6157 c = CHILD(n, i);
6158 REQ(c, fpdef);
6159 if (NCH(c) == 1)
6160 symtable_add_def(st, STR(CHILD(c, 0)),
6161 DEF_PARAM | DEF_INTUPLE);
6162 else
6163 symtable_params_fplist(st, CHILD(c, 1));
6164 }
6165
6166}
6167
6168static void
6169symtable_global(struct symtable *st, node *n)
6170{
6171 int i;
6172
Jeremy Hylton9f324e92001-03-01 22:59:14 +00006173 /* XXX It might be helpful to warn about module-level global
6174 statements, but it's hard to tell the difference between
6175 module-level and a string passed to exec.
6176 */
Jeremy Hyltonc1761322001-02-28 23:44:45 +00006177
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006178 for (i = 1; i < NCH(n); i += 2) {
6179 char *name = STR(CHILD(n, i));
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006180 int flags;
6181
6182 flags = symtable_lookup(st, name);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006183 if (flags < 0)
6184 continue;
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006185 if (flags && flags != DEF_GLOBAL) {
6186 char buf[500];
6187 if (flags & DEF_PARAM) {
Martin v. Löwisdd7eb142003-10-18 22:05:25 +00006188 PyErr_Format(PyExc_SyntaxError, PARAM_GLOBAL,
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006189 name);
Jeremy Hylton98326132003-09-22 04:26:44 +00006190 symtable_error(st, 0);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006191 return;
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006192 }
6193 else {
6194 if (flags & DEF_LOCAL)
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006195 PyOS_snprintf(buf, sizeof(buf),
6196 GLOBAL_AFTER_ASSIGN,
6197 name);
Guido van Rossum0bba7f82001-02-28 21:55:38 +00006198 else
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006199 PyOS_snprintf(buf, sizeof(buf),
6200 GLOBAL_AFTER_USE, name);
Guido van Rossumee34ac12001-02-28 22:08:12 +00006201 symtable_warn(st, buf);
Jeremy Hyltonbe77cf72001-02-27 05:15:57 +00006202 }
6203 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006204 symtable_add_def(st, name, DEF_GLOBAL);
6205 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006206}
6207
6208static void
6209symtable_list_comprehension(struct symtable *st, node *n)
6210{
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006211 /* listmaker: test list_for */
Barry Warsaw8f6d8682001-11-28 21:10:39 +00006212 char tmpname[30];
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006213
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006214 REQ(n, listmaker);
6215 PyOS_snprintf(tmpname, sizeof(tmpname), "_[%d]",
6216 ++st->st_cur->ste_tmpname);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006217 symtable_add_def(st, tmpname, DEF_LOCAL);
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006218 symtable_list_for(st, CHILD(n, 1));
6219 symtable_node(st, CHILD(n, 0));
6220 --st->st_cur->ste_tmpname;
6221}
6222
6223static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006224symtable_generator_expression(struct symtable *st, node *n)
6225{
6226 /* testlist_gexp: test gen_for */
6227 REQ(CHILD(n, 0), test);
6228 REQ(CHILD(n, 1), gen_for);
6229
6230 symtable_enter_scope(st, "<genexpr>", TYPE(n), n->n_lineno);
6231 st->st_cur->ste_generator = GENERATOR_EXPRESSION;
6232
6233 symtable_add_def(st, "[outmost-iterable]", DEF_PARAM);
6234
6235 symtable_gen_for(st, CHILD(n, 1), 1);
6236 symtable_node(st, CHILD(n, 0));
6237 symtable_exit_scope(st);
6238
6239 /* for outmost iterable precomputation */
6240 symtable_node(st, CHILD(CHILD(n, 1), 3));
6241}
6242
6243static void
Jeremy Hylton4d508ad2003-05-21 17:34:50 +00006244symtable_list_for(struct symtable *st, node *n)
6245{
6246 REQ(n, list_for);
6247 /* list_for: for v in expr [list_iter] */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006248 symtable_assign(st, CHILD(n, 1), 0);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006249 symtable_node(st, CHILD(n, 3));
6250 if (NCH(n) == 5)
6251 symtable_node(st, CHILD(n, 4));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006252}
6253
6254static void
Raymond Hettinger354433a2004-05-19 08:20:33 +00006255symtable_gen_for(struct symtable *st, node *n, int is_outmost)
6256{
6257 REQ(n, gen_for);
6258
6259 /* gen_for: for v in test [gen_iter] */
6260 symtable_assign(st, CHILD(n, 1), 0);
6261 if (is_outmost)
6262 symtable_add_use(st, "[outmost-iterable]");
6263 else
6264 symtable_node(st, CHILD(n, 3));
6265
6266 if (NCH(n) == 5)
6267 symtable_gen_iter(st, CHILD(n, 4));
6268}
6269
6270static void
6271symtable_gen_iter(struct symtable *st, node *n)
6272{
6273 REQ(n, gen_iter);
6274
6275 n = CHILD(n, 0);
6276 if (TYPE(n) == gen_for)
6277 symtable_gen_for(st, n, 0);
6278 else {
6279 REQ(n, gen_if);
6280 symtable_node(st, CHILD(n, 1));
6281
6282 if (NCH(n) == 3)
6283 symtable_gen_iter(st, CHILD(n, 2));
6284 }
6285}
6286
6287static void
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006288symtable_import(struct symtable *st, node *n)
6289{
6290 int i;
Jeremy Hylton483638c2001-02-01 20:20:45 +00006291 /* import_stmt: 'import' dotted_as_name (',' dotted_as_name)*
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006292 | 'from' dotted_name 'import'
6293 ('*' | import_as_name (',' import_as_name)*)
Jeremy Hylton483638c2001-02-01 20:20:45 +00006294 import_as_name: NAME [NAME NAME]
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006295 */
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006296 if (STR(CHILD(n, 0))[0] == 'f') { /* from */
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006297 node *dotname = CHILD(n, 1);
6298 if (strcmp(STR(CHILD(dotname, 0)), "__future__") == 0) {
6299 /* check for bogus imports */
6300 if (n->n_lineno >= st->st_future->ff_last_lineno) {
6301 PyErr_SetString(PyExc_SyntaxError,
6302 LATE_FUTURE);
Jeremy Hylton98326132003-09-22 04:26:44 +00006303 symtable_error(st, n->n_lineno);
Jeremy Hylton39e2f3f2001-02-28 01:58:08 +00006304 return;
6305 }
6306 }
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006307 if (TYPE(CHILD(n, 3)) == STAR) {
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006308 if (st->st_cur->ste_type != TYPE_MODULE) {
Jeremy Hylton6a53bd82001-08-06 20:34:25 +00006309 if (symtable_warn(st,
6310 "import * only allowed at module level") < 0)
6311 return;
Jeremy Hylton8a6f2952001-08-06 19:45:40 +00006312 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006313 st->st_cur->ste_optimized |= OPT_IMPORT_STAR;
Jeremy Hylton2e2cded2001-03-22 03:57:58 +00006314 st->st_cur->ste_opt_lineno = n->n_lineno;
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006315 } else {
6316 for (i = 3; i < NCH(n); i += 2) {
6317 node *c = CHILD(n, i);
6318 if (NCH(c) > 1) /* import as */
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006319 symtable_assign(st, CHILD(c, 2),
6320 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006321 else
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006322 symtable_assign(st, CHILD(c, 0),
6323 DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006324 }
6325 }
Jeremy Hylton29906ee2001-02-27 04:23:34 +00006326 } else {
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006327 for (i = 1; i < NCH(n); i += 2) {
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006328 symtable_assign(st, CHILD(n, i), DEF_IMPORT);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006329 }
6330 }
6331}
6332
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006333/* The third argument to symatble_assign() is a flag to be passed to
6334 symtable_add_def() if it is eventually called. The flag is useful
6335 to specify the particular type of assignment that should be
6336 recorded, e.g. an assignment caused by import.
6337 */
6338
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006339static void
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006340symtable_assign(struct symtable *st, node *n, int def_flag)
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006341{
6342 node *tmp;
6343 int i;
6344
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006345 loop:
6346 switch (TYPE(n)) {
6347 case lambdef:
Jeremy Hyltoneab156f2001-01-30 01:24:43 +00006348 /* invalid assignment, e.g. lambda x:x=2. The next
6349 pass will catch this error. */
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006350 return;
6351 case power:
6352 if (NCH(n) > 2) {
6353 for (i = 2; i < NCH(n); ++i)
6354 if (TYPE(CHILD(n, i)) != DOUBLESTAR)
6355 symtable_node(st, CHILD(n, i));
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006356 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006357 if (NCH(n) > 1) {
6358 symtable_node(st, CHILD(n, 0));
6359 symtable_node(st, CHILD(n, 1));
6360 } else {
6361 n = CHILD(n, 0);
6362 goto loop;
6363 }
6364 return;
6365 case listmaker:
Jeremy Hylton23b42272001-03-19 20:38:06 +00006366 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == list_for) {
6367 /* XXX This is an error, but the next pass
6368 will catch it. */
6369 return;
6370 } else {
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006371 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 }
6374 return;
Raymond Hettinger354433a2004-05-19 08:20:33 +00006375 case testlist_gexp:
6376 if (NCH(n) > 1 && TYPE(CHILD(n, 1)) == gen_for) {
6377 /* XXX This is an error, but the next pass
6378 will catch it. */
6379 return;
6380 } else {
6381 for (i = 0; i < NCH(n); i += 2)
6382 symtable_assign(st, CHILD(n, i), def_flag);
6383 }
6384 return;
6385
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006386 case exprlist:
6387 case testlist:
Guido van Rossum2d3b9862002-05-24 15:47:06 +00006388 case testlist1:
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006389 if (NCH(n) == 1) {
6390 n = CHILD(n, 0);
6391 goto loop;
6392 }
6393 else {
6394 int i;
6395 for (i = 0; i < NCH(n); i += 2)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006396 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006397 return;
6398 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006399 case atom:
6400 tmp = CHILD(n, 0);
6401 if (TYPE(tmp) == LPAR || TYPE(tmp) == LSQB) {
6402 n = CHILD(n, 1);
6403 goto loop;
Jeremy Hylton897b8212001-03-23 14:08:38 +00006404 } else if (TYPE(tmp) == NAME) {
Jeremy Hylton778e2652001-11-09 19:50:08 +00006405 if (strcmp(STR(tmp), "__debug__") == 0) {
6406 PyErr_SetString(PyExc_SyntaxError,
6407 ASSIGN_DEBUG);
Jeremy Hylton98326132003-09-22 04:26:44 +00006408 symtable_error(st, n->n_lineno);
6409 return;
Jeremy Hylton778e2652001-11-09 19:50:08 +00006410 }
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006411 symtable_add_def(st, STR(tmp), DEF_LOCAL | def_flag);
Jeremy Hylton897b8212001-03-23 14:08:38 +00006412 }
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006413 return;
6414 case dotted_as_name:
6415 if (NCH(n) == 3)
6416 symtable_add_def(st, STR(CHILD(n, 2)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006417 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006418 else
6419 symtable_add_def(st,
6420 STR(CHILD(CHILD(n,
6421 0), 0)),
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006422 DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006423 return;
6424 case dotted_name:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006425 symtable_add_def(st, STR(CHILD(n, 0)), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006426 return;
6427 case NAME:
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006428 symtable_add_def(st, STR(n), DEF_LOCAL | def_flag);
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006429 return;
6430 default:
6431 if (NCH(n) == 0)
6432 return;
Jeremy Hylton17820c42001-02-19 15:33:10 +00006433 if (NCH(n) == 1) {
6434 n = CHILD(n, 0);
6435 goto loop;
Jeremy Hylton64949cb2001-01-25 20:06:59 +00006436 }
Jeremy Hylton17820c42001-02-19 15:33:10 +00006437 /* Should only occur for errors like x + 1 = 1,
6438 which will be caught in the next pass. */
6439 for (i = 0; i < NCH(n); ++i)
6440 if (TYPE(CHILD(n, i)) >= single_input)
Jeremy Hylton961dfe02001-10-18 16:15:10 +00006441 symtable_assign(st, CHILD(n, i), def_flag);
Jeremy Hyltone36f7782001-01-19 03:21:30 +00006442 }
6443}